From 013e964be65247ffb42d44f540fda88f4c03df55 Mon Sep 17 00:00:00 2001 From: Phan Huy Tran Date: Wed, 25 Sep 2024 12:27:34 +0000 Subject: [PATCH] feat: Write Integration test for Create Project Route and ensure using Snake Case in JSON Format (SCRUM-7) (!14) Co-authored-by: Phan Huy Tran Reviewed-on: https://git.kjan.de/jank/LF8/pulls/14 Reviewed-by: Jan Gleytenhoover --- requests/createProject.http | 6 +- .../project/CreateProjectAction.java | 7 +- .../project/dto/CreateProjectDto.java | 3 + .../project/dto/GetProjectDto.java | 17 +---- .../project/CreateProjectActionTest.java | 71 +++++++++++++++++++ ...ss.java => ProjectFindAllSuccessTest.java} | 16 ++--- 6 files changed, 89 insertions(+), 31 deletions(-) create mode 100644 src/test/java/de/szut/lf8_starter/integration/project/CreateProjectActionTest.java rename src/test/java/de/szut/lf8_starter/integration/project/{ProjectFindAllSuccess.java => ProjectFindAllSuccessTest.java} (80%) diff --git a/requests/createProject.http b/requests/createProject.http index add2394..7b08e28 100644 --- a/requests/createProject.http +++ b/requests/createProject.http @@ -8,8 +8,8 @@ Content-Type: application/json "leading_employee": 1, "employees": [2, 3], "contractor": 4, - "contractorName": "Peter File", + "contractor_name": "Peter File", "comment": "goal of project", - "startDate": "01.01.2000", - "plannedEndDate": "01.01.2001" + "start_date": "01.01.2000", + "planned_end_date": "01.01.2001" } \ No newline at end of file diff --git a/src/main/java/de/szut/lf8_starter/project/CreateProjectAction.java b/src/main/java/de/szut/lf8_starter/project/CreateProjectAction.java index c41b134..d54318b 100644 --- a/src/main/java/de/szut/lf8_starter/project/CreateProjectAction.java +++ b/src/main/java/de/szut/lf8_starter/project/CreateProjectAction.java @@ -8,10 +8,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import jakarta.validation.Valid; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping(value = "/projects") @@ -30,6 +28,7 @@ public class CreateProjectAction { @ApiResponse(responseCode = "400", description = "invalid JSON posted", content = @Content), @ApiResponse(responseCode = "401", description = "not authorized", content = @Content)}) @PostMapping + @ResponseStatus(code = HttpStatus.CREATED) public GetProjectDto create(@RequestBody @Valid CreateProjectDto createProjectDto) { ProjectEntity projectEntity = this.projectMapper.mapCreateDtoToEntity(createProjectDto); diff --git a/src/main/java/de/szut/lf8_starter/project/dto/CreateProjectDto.java b/src/main/java/de/szut/lf8_starter/project/dto/CreateProjectDto.java index 4c6ab0d..ebf4393 100644 --- a/src/main/java/de/szut/lf8_starter/project/dto/CreateProjectDto.java +++ b/src/main/java/de/szut/lf8_starter/project/dto/CreateProjectDto.java @@ -1,6 +1,8 @@ package de.szut.lf8_starter.project.dto; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Getter; @@ -11,6 +13,7 @@ import java.util.List; @Getter @Setter +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) public class CreateProjectDto { @NotBlank private String name; diff --git a/src/main/java/de/szut/lf8_starter/project/dto/GetProjectDto.java b/src/main/java/de/szut/lf8_starter/project/dto/GetProjectDto.java index c90cd50..614ece1 100644 --- a/src/main/java/de/szut/lf8_starter/project/dto/GetProjectDto.java +++ b/src/main/java/de/szut/lf8_starter/project/dto/GetProjectDto.java @@ -1,6 +1,8 @@ package de.szut.lf8_starter.project.dto; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Getter; @@ -11,35 +13,22 @@ import java.util.List; @Getter @Setter +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) public class GetProjectDto { private long id; - - @NotBlank private String name; - - @NotNull private long leadingEmployee; - private List employees; - - @NotNull private long contractor; - - @NotBlank private String contractorName; - - @NotBlank private String comment; - @NotNull @JsonFormat(pattern = "dd.MM.yyyy") private LocalDate startDate; - @NotNull @JsonFormat(pattern = "dd.MM.yyyy") private LocalDate plannedEndDate; - @NotNull @JsonFormat(pattern = "dd.MM.yyyy") private LocalDate endDate; } diff --git a/src/test/java/de/szut/lf8_starter/integration/project/CreateProjectActionTest.java b/src/test/java/de/szut/lf8_starter/integration/project/CreateProjectActionTest.java new file mode 100644 index 0000000..36eee54 --- /dev/null +++ b/src/test/java/de/szut/lf8_starter/integration/project/CreateProjectActionTest.java @@ -0,0 +1,71 @@ +package de.szut.lf8_starter.integration.project; + +import de.szut.lf8_starter.project.ProjectRepository; +import org.json.JSONObject; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import java.time.LocalDate; +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.hamcrest.Matchers.is; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@AutoConfigureMockMvc(addFilters = false) +public class CreateProjectActionTest { + @Autowired + private MockMvc mockMvc; + @Autowired + private ProjectRepository projectRepository; + + @Test + void createProjectTest() throws Exception { + String content = """ + { + "name": "name", + "leading_employee": 1, + "employees": [2, 3], + "contractor": 4, + "contractor_name": "Peter File", + "comment": "goal of project", + "start_date": "01.01.2000", + "planned_end_date": "01.01.2001" + } + """; + + final var contentAsString = this.mockMvc.perform( + post("/projects").content(content).contentType(MediaType.APPLICATION_JSON) + ) + .andExpect(status().isCreated()) + .andExpect(jsonPath("name", is("name"))) + .andExpect(jsonPath("leading_employee", is(1))) + .andExpect(jsonPath("employees", is(Arrays.asList(2, 3)))) + .andExpect(jsonPath("contractor", is(4))) + .andExpect(jsonPath("contractor_name", is("Peter File"))) + .andExpect(jsonPath("comment", is("goal of project"))) + .andExpect(jsonPath("start_date", is("01.01.2000"))) + .andExpect(jsonPath("planned_end_date", is("01.01.2001"))) + .andReturn() + .getResponse() + .getContentAsString(); + + final var id = Long.parseLong(new JSONObject(contentAsString).get("id").toString()); + + final var project = this.projectRepository.findById(id); + assertThat(project.get().getName()).isEqualTo("name"); + assertThat(project.get().getLeadingEmployee()).isEqualTo(1); + assertThat(project.get().getContractor()).isEqualTo(4); + assertThat(project.get().getContractorName()).isEqualTo("Peter File"); + assertThat(project.get().getComment()).isEqualTo("goal of project"); + assertThat(project.get().getStartDate()).isEqualTo(LocalDate.of(2000, 1, 1)); + assertThat(project.get().getPlannedEndDate()).isEqualTo(LocalDate.of(2001, 1, 1)); + } +} diff --git a/src/test/java/de/szut/lf8_starter/integration/project/ProjectFindAllSuccess.java b/src/test/java/de/szut/lf8_starter/integration/project/ProjectFindAllSuccessTest.java similarity index 80% rename from src/test/java/de/szut/lf8_starter/integration/project/ProjectFindAllSuccess.java rename to src/test/java/de/szut/lf8_starter/integration/project/ProjectFindAllSuccessTest.java index 906b63f..8f1974a 100644 --- a/src/test/java/de/szut/lf8_starter/integration/project/ProjectFindAllSuccess.java +++ b/src/test/java/de/szut/lf8_starter/integration/project/ProjectFindAllSuccessTest.java @@ -6,7 +6,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.test.web.servlet.MockMvc; import java.time.LocalDate; @@ -19,18 +18,15 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @AutoConfigureMockMvc(addFilters = false) -public class ProjectFindAllSuccess { +public class ProjectFindAllSuccessTest { @Autowired private ProjectRepository projectRepository; @Autowired private MockMvc mockMvc; - @Autowired - private TestRestTemplate restTemplate; - @Test - void findAllProjects() throws Exception { + void findAllProjectsTest() throws Exception { var project = new ProjectEntity(); project.setId(1); project.setComment("comment"); @@ -49,11 +45,11 @@ public class ProjectFindAllSuccess { .andExpect(jsonPath("$[0].id").value(1)) .andExpect(jsonPath("$[0].comment").value("comment")) .andExpect(jsonPath("$[0].contractor").value(1)) - .andExpect(jsonPath("$[0].contractorName").value("contractorName")) - .andExpect(jsonPath("$[0].endDate").value("01.01.2024")) - .andExpect(jsonPath("$[0].leadingEmployee").value(1)) + .andExpect(jsonPath("$[0].contractor_name").value("contractorName")) + .andExpect(jsonPath("$[0].end_date").value("01.01.2024")) + .andExpect(jsonPath("$[0].leading_employee").value(1)) .andExpect(jsonPath("$[0].name").value("name")) - .andExpect(jsonPath("$[0].startDate").value("01.01.2021")) + .andExpect(jsonPath("$[0].start_date").value("01.01.2021")) .andExpect(jsonPath("$[0].employees").isArray()) .andExpect(jsonPath("$[0].employees", hasSize(3))); }