#37 added the mockMvcTest for the TriggerController

This commit is contained in:
Fabio Formosa
2021-11-01 13:02:31 +01:00
parent fb2d8da53d
commit f37ad1ae58
15 changed files with 278 additions and 18 deletions

View File

@@ -1,17 +1,23 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>it.fabioformosa.quartz-manager</groupId> <groupId>it.fabioformosa.quartz-manager</groupId>
<artifactId>quartz-manager-parent</artifactId> <artifactId>quartz-manager-parent</artifactId>
<version>3.0.2-SNAPSHOT</version> <version>3.0.2-SNAPSHOT</version>
</parent> </parent>
<artifactId>quartz-manager-common</artifactId> <artifactId>quartz-manager-common</artifactId>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
</dependencies> <dependency>
</project> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,18 @@
package it.fabioformosa.quartzmanager.common.utils;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
public class DateUtils {
static public Date fromLocaleDateTimeToDate(LocalDateTime localDateTime){
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
static public Date getHoursFromNow(long hours){
return DateUtils.fromLocaleDateTimeToDate(LocalDateTime.now().plus(Duration.ofHours(hours)));
}
}

View File

@@ -130,6 +130,13 @@
<artifactId>springfox-swagger-ui</artifactId> <artifactId>springfox-swagger-ui</artifactId>
<version>${springfox.version}</version> <version>${springfox.version}</version>
</dependency> </dependency>
<!-- TEST -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -7,14 +7,17 @@ import it.fabioformosa.quartzmanager.services.SchedulerService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.quartz.SchedulerException; import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@Slf4j @Slf4j
@RequestMapping("/quartz-manager/triggers") @RequestMapping(TriggerController.TRIGGER_CONTROLLER_BASE_URL)
@RestController @RestController
@Api(value = "triggers") @Api(value = "triggers")
public class TriggerController { public class TriggerController {
static public final String TRIGGER_CONTROLLER_BASE_URL = "/quartz-manager/triggers";
@Value("${quartz-manager.jobClass}") @Value("${quartz-manager.jobClass}")
private String jobClassname; private String jobClassname;
@@ -29,6 +32,7 @@ public class TriggerController {
return schedulerService.getTriggerByName(name); return schedulerService.getTriggerByName(name);
} }
@ResponseStatus(HttpStatus.CREATED)
@PostMapping("/{name}") @PostMapping("/{name}")
public TriggerDTO postTrigger(@PathVariable String name, @RequestBody SchedulerConfigParam config) throws SchedulerException, ClassNotFoundException { public TriggerDTO postTrigger(@PathVariable String name, @RequestBody SchedulerConfigParam config) throws SchedulerException, ClassNotFoundException {
log.info("TRIGGER - CREATING a trigger {} {}", name, config); log.info("TRIGGER - CREATING a trigger {} {}", name, config);

View File

@@ -1,5 +1,8 @@
package it.fabioformosa.quartzmanager.dto; package it.fabioformosa.quartzmanager.dto;
import lombok.Builder;
@Builder
public class JobKeyDTO { public class JobKeyDTO {
private String name; private String name;
private String group; private String group;

View File

@@ -1,11 +1,13 @@
package it.fabioformosa.quartzmanager.dto; package it.fabioformosa.quartzmanager.dto;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Builder
@Data @Data
public class SchedulerConfigParam { public class SchedulerConfigParam {
public long triggerPerDay; public long triggerPerDay;

View File

@@ -1,6 +1,7 @@
package it.fabioformosa.quartzmanager.dto; package it.fabioformosa.quartzmanager.dto;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -9,6 +10,7 @@ import java.util.Date;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Data @Data
@Builder
public class TriggerDTO { public class TriggerDTO {
private TriggerKeyDTO triggerKeyDTO; private TriggerKeyDTO triggerKeyDTO;
private int priority; private int priority;

View File

@@ -1,5 +1,8 @@
package it.fabioformosa.quartzmanager.dto; package it.fabioformosa.quartzmanager.dto;
import lombok.Builder;
@Builder
public class TriggerKeyDTO { public class TriggerKeyDTO {
private String name; private String name;
private String group; private String group;

View File

@@ -0,0 +1,13 @@
package it.fabioformosa.quartzmanager;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class QuartManagerApplicationTests {
@Test
public void contextLoads() {
}
}

View File

@@ -0,0 +1,54 @@
package it.fabioformosa.quartzmanager.controllers;
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.Disabled;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
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.post;
@Disabled
@WebMvcTest(controllers = TriggerController.class, properties = {
"quartz-manager.jobClass=it.fabioformosa.quartzmanager.jobs.myjobs.SampleJob"
})
class TriggerControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private SchedulerService schedulerService;
@AfterEach
void cleanUp(){
Mockito.reset(schedulerService);
}
@Test
void givenASchedulerConfigParam_whenPosted_thenANewTriggerIsCreated() throws Exception {
TriggerDTO expectedTriggerDTO = TriggerUtils.getTriggerInstance();
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)
.content(TestUtils.toJson(configParamToPost))
)
.andExpect(MockMvcResultMatchers.status().isCreated())
.andExpect(MockMvcResultMatchers.content().json(TestUtils.toJson(expectedTriggerDTO)))
;
}
}

View File

@@ -0,0 +1,15 @@
package it.fabioformosa.quartzmanager.controllers.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
public class TestUtils {
static public ObjectMapper objectMapper = new ObjectMapper();
@SneakyThrows
static public String toJson(Object object){
return objectMapper.writeValueAsString(object);
};
}

View File

@@ -0,0 +1,33 @@
package it.fabioformosa.quartzmanager.controllers.utils;
import it.fabioformosa.quartzmanager.common.utils.DateUtils;
import it.fabioformosa.quartzmanager.dto.JobKeyDTO;
import it.fabioformosa.quartzmanager.dto.TriggerDTO;
import it.fabioformosa.quartzmanager.dto.TriggerKeyDTO;
import java.time.LocalDateTime;
public class TriggerUtils {
static public TriggerDTO getTriggerInstance(){
return TriggerDTO.builder()
.description("sample trigger")
.endTime(DateUtils.getHoursFromNow(2L))
.finalFireTime(DateUtils.getHoursFromNow(2L))
.jobKeyDTO(JobKeyDTO.builder()
.group("defaultJobGroup")
.name("sampleJob")
.build())
.mayFireAgain(true)
.triggerKeyDTO(TriggerKeyDTO.builder()
.group("defaultTriggerGroup")
.name("sampleTrigger")
.build())
.misfireInstruction(1)
.nextFireTime(DateUtils.getHoursFromNow(1L))
.priority(1)
.startTime(DateUtils.fromLocaleDateTimeToDate(LocalDateTime.now()))
.build();
}
}

View File

@@ -0,0 +1,52 @@
package it.fabioformosa.quartzmanager.controllers;
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.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
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.post;
@WebMvcTest(controllers = TriggerController.class, properties = {
"quartz-manager.jobClass=it.fabioformosa.quartzmanager.jobs.myjobs.SampleJob"
})
class TriggerControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private SchedulerService schedulerService;
@AfterEach
void cleanUp(){
Mockito.reset(schedulerService);
}
@Test
void givenASchedulerConfigParam_whenPosted_thenANewTriggerIsCreated() throws Exception {
TriggerDTO expectedTriggerDTO = TriggerUtils.getTriggerInstance();
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)
.content(TestUtils.toJson(configParamToPost))
)
.andExpect(MockMvcResultMatchers.status().isCreated())
.andExpect(MockMvcResultMatchers.content().json(TestUtils.toJson(expectedTriggerDTO)))
;
}
}

View File

@@ -0,0 +1,15 @@
package it.fabioformosa.quartzmanager.controllers.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
public class TestUtils {
static public ObjectMapper objectMapper = new ObjectMapper();
@SneakyThrows
static public String toJson(Object object){
return objectMapper.writeValueAsString(object);
};
}

View File

@@ -0,0 +1,33 @@
package it.fabioformosa.quartzmanager.controllers.utils;
import it.fabioformosa.quartzmanager.common.utils.DateUtils;
import it.fabioformosa.quartzmanager.dto.JobKeyDTO;
import it.fabioformosa.quartzmanager.dto.TriggerDTO;
import it.fabioformosa.quartzmanager.dto.TriggerKeyDTO;
import java.time.LocalDateTime;
public class TriggerUtils {
static public TriggerDTO getTriggerInstance(){
return TriggerDTO.builder()
.description("sample trigger")
.endTime(DateUtils.getHoursFromNow(2L))
.finalFireTime(DateUtils.getHoursFromNow(2L))
.jobKeyDTO(JobKeyDTO.builder()
.group("defaultJobGroup")
.name("sampleJob")
.build())
.mayFireAgain(true)
.triggerKeyDTO(TriggerKeyDTO.builder()
.group("defaultTriggerGroup")
.name("sampleTrigger")
.build())
.misfireInstruction(1)
.nextFireTime(DateUtils.getHoursFromNow(1L))
.priority(1)
.startTime(DateUtils.fromLocaleDateTimeToDate(LocalDateTime.now()))
.build();
}
}