diff --git a/quartz-manager-parent/quartz-manager-starter-api/pom.xml b/quartz-manager-parent/quartz-manager-starter-api/pom.xml index 47bf449..1156d07 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/pom.xml +++ b/quartz-manager-parent/quartz-manager-starter-api/pom.xml @@ -48,6 +48,10 @@ org.springframework.security spring-security-core + + org.springframework.boot + spring-boot-starter-validation + org.springframework.boot spring-boot-starter-test @@ -78,7 +82,21 @@ metamorphosis-core 3.0.0 - + + javax.validation + validation-api + 2.0.1.Final + + + org.hibernate.validator + hibernate-validator + 6.0.2.Final + + + org.glassfish + javax.el + 3.0.0 + diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java index ebd4887..dba69cb 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java @@ -46,7 +46,7 @@ public class SchedulerController { 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; } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/TriggerController.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/TriggerController.java index 7330769..d2ea4f1 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/TriggerController.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/TriggerController.java @@ -10,6 +10,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; + @Slf4j @RequestMapping(TriggerController.TRIGGER_CONTROLLER_BASE_URL) @RestController @@ -34,7 +36,7 @@ public class TriggerController { @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); diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/SchedulerConfigParam.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/SchedulerConfigParam.java index f259a96..4b78d62 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/SchedulerConfigParam.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/SchedulerConfigParam.java @@ -5,12 +5,16 @@ import lombok.Builder; 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; } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/controllers/TriggerControllerTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/controllers/TriggerControllerTest.java index 0eec481..c0e33ec 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/controllers/TriggerControllerTest.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/controllers/TriggerControllerTest.java @@ -1,6 +1,7 @@ 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; @@ -8,6 +9,8 @@ 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; @@ -18,8 +21,7 @@ import org.springframework.test.web.servlet.MockMvc; 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 = { @@ -40,10 +42,9 @@ class TriggerControllerTest { @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) @@ -54,9 +55,18 @@ class TriggerControllerTest { ; } + @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") @@ -64,4 +74,21 @@ class TriggerControllerTest { .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(); + } + } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/controllers/utils/InvalidSchedulerConfigParamProvider.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/controllers/utils/InvalidSchedulerConfigParamProvider.java new file mode 100644 index 0000000..486f29e --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/controllers/utils/InvalidSchedulerConfigParamProvider.java @@ -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 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()) + ); + } +} diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/controllers/utils/TriggerUtils.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/controllers/utils/TriggerUtils.java index 6c04827..2fb9080 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/controllers/utils/TriggerUtils.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/controllers/utils/TriggerUtils.java @@ -9,7 +9,7 @@ import java.time.LocalDateTime; public class TriggerUtils { - static public TriggerDTO getTriggerInstance(){ + static public TriggerDTO getTriggerInstance(String triggerName){ return TriggerDTO.builder() .description("sample trigger") .endTime(DateUtils.getHoursFromNow(2L)) @@ -21,7 +21,7 @@ public class TriggerUtils { .mayFireAgain(true) .triggerKeyDTO(TriggerKeyDTO.builder() .group("defaultTriggerGroup") - .name("sampleTrigger") + .name(triggerName) .build()) .misfireInstruction(1) .nextFireTime(DateUtils.getHoursFromNow(1L))