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 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())
+ );
+ }
+}
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))