#37 added input validation to the trigger creation

This commit is contained in:
Fabio Formosa
2021-11-09 00:11:47 +01:00
parent 233b56f282
commit 34f21a58c9
7 changed files with 83 additions and 13 deletions

View File

@@ -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>
@@ -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>

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;
}

View File

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

View File

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

View File

@@ -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))