Skip to content

Commit

Permalink
#37 added input validation to the trigger creation
Browse files Browse the repository at this point in the history
  • Loading branch information
fabioformosa committed Nov 8, 2021
1 parent 233b56f commit 34f21a5
Show file tree
Hide file tree
Showing 7 changed files with 83 additions and 13 deletions.
20 changes: 19 additions & 1 deletion quartz-manager-parent/quartz-manager-starter-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
Expand Down Expand Up @@ -78,7 +82,21 @@
<artifactId>metamorphosis-core</artifactId>
<version>3.0.0</version>
</dependency>

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.2.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.0</version>
</dependency>

<!-- QUARTZ -->
<dependency>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public SchedulerConfigParam getConfig() throws SchedulerException {
log.debug("SCHEDULER - GET CONFIG params");
SchedulerConfigParam schedulerConfigParam = schedulerService.getOneSimpleTrigger()
.map(SchedulerController::fromSimpleTriggerToSchedulerConfigParam)
.orElse(new SchedulerConfigParam(0, 0, 0));
.orElse(new SchedulerConfigParam(0L, 0, 0));
return schedulerConfigParam;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@Slf4j
@RequestMapping(TriggerController.TRIGGER_CONTROLLER_BASE_URL)
@RestController
Expand All @@ -34,7 +36,7 @@ public TriggerDTO getTrigger(@PathVariable String name) throws SchedulerExceptio

@ResponseStatus(HttpStatus.CREATED)
@PostMapping("/{name}")
public TriggerDTO postTrigger(@PathVariable String name, @RequestBody SchedulerConfigParam config) throws SchedulerException, ClassNotFoundException {
public TriggerDTO postTrigger(@PathVariable String name, @Valid @RequestBody SchedulerConfigParam config) throws SchedulerException, ClassNotFoundException {
log.info("TRIGGER - CREATING a trigger {} {}", name, config);
TriggerDTO newTriggerDTO = schedulerService.scheduleNewTrigger(name, jobClassname, config);
log.info("TRIGGER - CREATED a trigger {}", newTriggerDTO);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,16 @@
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;

@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
public class SchedulerConfigParam {
public long triggerPerDay;
public int maxCount;
@NotNull
public Long triggerPerDay;
@NotNull
public Integer maxCount;
public int timesTriggered;
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package it.fabioformosa.quartzmanager.controllers;

import it.fabioformosa.quartzmanager.QuartManagerApplicationTests;
import it.fabioformosa.quartzmanager.controllers.utils.InvalidSchedulerConfigParamProvider;
import it.fabioformosa.quartzmanager.controllers.utils.TestUtils;
import it.fabioformosa.quartzmanager.controllers.utils.TriggerUtils;
import it.fabioformosa.quartzmanager.dto.SchedulerConfigParam;
import it.fabioformosa.quartzmanager.dto.TriggerDTO;
import it.fabioformosa.quartzmanager.services.SchedulerService;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ArgumentsSource;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
Expand All @@ -18,8 +21,7 @@
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import static org.mockito.ArgumentMatchers.any;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;

@ContextConfiguration(classes = {QuartManagerApplicationTests.class})
@WebMvcTest(controllers = TriggerController.class, properties = {
Expand All @@ -40,10 +42,9 @@ void cleanUp(){

@Test
void givenASchedulerConfigParam_whenPosted_thenANewTriggerIsCreated() throws Exception {
TriggerDTO expectedTriggerDTO = TriggerUtils.getTriggerInstance();
SchedulerConfigParam configParamToPost = buildSimpleSchedulerConfigParam();
TriggerDTO expectedTriggerDTO = TriggerUtils.getTriggerInstance("mytrigger");
Mockito.when(schedulerService.scheduleNewTrigger(any(), any(), any())).thenReturn(expectedTriggerDTO);

SchedulerConfigParam configParamToPost = SchedulerConfigParam.builder().maxCount(20).triggerPerDay(20000L).build();
mockMvc.perform(
post(TriggerController.TRIGGER_CONTROLLER_BASE_URL + "/mytrigger")
.contentType(MediaType.APPLICATION_JSON)
Expand All @@ -54,14 +55,40 @@ void givenASchedulerConfigParam_whenPosted_thenANewTriggerIsCreated() throws Exc
;
}

@ParameterizedTest
@ArgumentsSource(InvalidSchedulerConfigParamProvider.class)
void givenAnInvalidSchedulerConfigParam_whenPosted_thenAnErrorIsReturned(SchedulerConfigParam invalidSchedulerConfigParam) throws Exception {
mockMvc.perform(post(TriggerController.TRIGGER_CONTROLLER_BASE_URL + "/mytrigger")
.contentType(MediaType.APPLICATION_JSON)
.content(TestUtils.toJson(invalidSchedulerConfigParam)))
.andExpect(MockMvcResultMatchers.status().is4xxClientError());
}

@Test
void whenGetIsCalled_thenATriggerIsReturned() throws Exception {
TriggerDTO expectedTriggerDTO = TriggerUtils.getTriggerInstance();
TriggerDTO expectedTriggerDTO = TriggerUtils.getTriggerInstance("mytrigger");
Mockito.when(schedulerService.getTriggerByName("mytrigger")).thenReturn(expectedTriggerDTO);

mockMvc.perform(get(TriggerController.TRIGGER_CONTROLLER_BASE_URL + "/mytrigger")
.contentType(MediaType.APPLICATION_JSON)).andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().json(TestUtils.toJson(expectedTriggerDTO)));
}

@Test
void givenATriggerName_whenPutSchedulerConfigParam_thenTheTriggerIsRescheduled() throws Exception {
SchedulerConfigParam expectedConfigParam = buildSimpleSchedulerConfigParam();
TriggerDTO expectedTriggerDTO = TriggerUtils.getTriggerInstance("mytrigger");
Mockito.when(schedulerService.rescheduleTrigger("mytrigger", buildSimpleSchedulerConfigParam())).thenReturn(expectedTriggerDTO);

mockMvc.perform(put(TriggerController.TRIGGER_CONTROLLER_BASE_URL + "/mytrigger")
.contentType(MediaType.APPLICATION_JSON)
.content(TestUtils.toJson(expectedConfigParam)))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().json(TestUtils.toJson(expectedTriggerDTO)));
}

private SchedulerConfigParam buildSimpleSchedulerConfigParam() {
return SchedulerConfigParam.builder().maxCount(20).triggerPerDay(20000L).build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package it.fabioformosa.quartzmanager.controllers.utils;

import it.fabioformosa.quartzmanager.dto.SchedulerConfigParam;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsProvider;

import java.util.stream.Stream;

public class InvalidSchedulerConfigParamProvider implements ArgumentsProvider {
@Override
public Stream<? extends Arguments> provideArguments(ExtensionContext extensionContext) throws Exception {
return Stream.of(
Arguments.of(SchedulerConfigParam.builder().build()),
Arguments.of(SchedulerConfigParam.builder().maxCount(1).build()),
Arguments.of(SchedulerConfigParam.builder().triggerPerDay(1L).build())
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

public class TriggerUtils {

static public TriggerDTO getTriggerInstance(){
static public TriggerDTO getTriggerInstance(String triggerName){
return TriggerDTO.builder()
.description("sample trigger")
.endTime(DateUtils.getHoursFromNow(2L))
Expand All @@ -21,7 +21,7 @@ static public TriggerDTO getTriggerInstance(){
.mayFireAgain(true)
.triggerKeyDTO(TriggerKeyDTO.builder()
.group("defaultTriggerGroup")
.name("sampleTrigger")
.name(triggerName)
.build())
.misfireInstruction(1)
.nextFireTime(DateUtils.getHoursFromNow(1L))
Expand Down

0 comments on commit 34f21a5

Please sign in to comment.