Skip to content

Commit

Permalink
#37 added the mockMvcTest for the TriggerController
Browse files Browse the repository at this point in the history
  • Loading branch information
fabioformosa committed Nov 1, 2021
1 parent fb2d8da commit f37ad1a
Show file tree
Hide file tree
Showing 15 changed files with 278 additions and 18 deletions.
40 changes: 23 additions & 17 deletions quartz-manager-parent/quartz-manager-common/pom.xml
Original file line number Diff line number Diff line change
@@ -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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>it.fabioformosa.quartz-manager</groupId>
<artifactId>quartz-manager-parent</artifactId>
<version>3.0.2-SNAPSHOT</version>
</parent>
<artifactId>quartz-manager-common</artifactId>

<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
<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>
<parent>
<groupId>it.fabioformosa.quartz-manager</groupId>
<artifactId>quartz-manager-parent</artifactId>
<version>3.0.2-SNAPSHOT</version>
</parent>
<artifactId>quartz-manager-common</artifactId>

<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -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)));
}

}
7 changes: 7 additions & 0 deletions quartz-manager-parent/quartz-manager-starter-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,13 @@
<artifactId>springfox-swagger-ui</artifactId>
<version>${springfox.version}</version>
</dependency>

<!-- TEST -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,17 @@
import lombok.extern.slf4j.Slf4j;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RequestMapping("/quartz-manager/triggers")
@RequestMapping(TriggerController.TRIGGER_CONTROLLER_BASE_URL)
@RestController
@Api(value = "triggers")
public class TriggerController {

static public final String TRIGGER_CONTROLLER_BASE_URL = "/quartz-manager/triggers";

@Value("${quartz-manager.jobClass}")
private String jobClassname;

Expand All @@ -29,6 +32,7 @@ public TriggerDTO getTrigger(@PathVariable String name) throws SchedulerExceptio
return schedulerService.getTriggerByName(name);
}

@ResponseStatus(HttpStatus.CREATED)
@PostMapping("/{name}")
public TriggerDTO postTrigger(@PathVariable String name, @RequestBody SchedulerConfigParam config) throws SchedulerException, ClassNotFoundException {
log.info("TRIGGER - CREATING a trigger {} {}", name, config);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package it.fabioformosa.quartzmanager.dto;

import lombok.Builder;

@Builder
public class JobKeyDTO {
private String name;
private String group;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package it.fabioformosa.quartzmanager.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
public class SchedulerConfigParam {
public long triggerPerDay;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package it.fabioformosa.quartzmanager.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

Expand All @@ -9,6 +10,7 @@
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class TriggerDTO {
private TriggerKeyDTO triggerKeyDTO;
private int priority;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package it.fabioformosa.quartzmanager.dto;

import lombok.Builder;

@Builder
public class TriggerKeyDTO {
private String name;
private String group;
Expand Down
Original file line number Diff line number Diff line change
@@ -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() {
}

}
Original file line number Diff line number Diff line change
@@ -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)))
;
}
}
Original file line number Diff line number Diff line change
@@ -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);
};

}
Original file line number Diff line number Diff line change
@@ -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();
}

}
Original file line number Diff line number Diff line change
@@ -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)))
;
}
}
Original file line number Diff line number Diff line change
@@ -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);
};

}
Original file line number Diff line number Diff line change
@@ -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 comments on commit f37ad1a

Please sign in to comment.