mirror of
https://github.com/fabioformosa/quartz-manager.git
synced 2026-05-14 22:00:30 +09:00
#37 added the mockMvcTest for the TriggerController
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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)));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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)))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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)))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user