From 4c32727955bdcd6322f8a8e692dd02c917d10a3c Mon Sep 17 00:00:00 2001 From: bilal yakut Date: Mon, 27 Feb 2023 20:36:38 +0300 Subject: [PATCH 1/3] complated service layer --- .../controller/EmployeeController.java | 60 +++++++ .../controller/EmployeeControllerTest.java | 158 ++++++++++++++++++ 2 files changed, 218 insertions(+) create mode 100644 src/main/java/net/tigrisTesting/controller/EmployeeController.java create mode 100644 src/test/java/net/tigrisTesting/controller/EmployeeControllerTest.java diff --git a/src/main/java/net/tigrisTesting/controller/EmployeeController.java b/src/main/java/net/tigrisTesting/controller/EmployeeController.java new file mode 100644 index 0000000..89b8a68 --- /dev/null +++ b/src/main/java/net/tigrisTesting/controller/EmployeeController.java @@ -0,0 +1,60 @@ +package net.tigrisTesting.controller; + +import net.tigrisTesting.model.Employee; +import net.tigrisTesting.service.EmployeeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/employee/") +public class EmployeeController { + private EmployeeService employeeService; + + public EmployeeController(EmployeeService employeeService){ + this.employeeService=employeeService; + } + + @PostMapping() + @ResponseStatus(HttpStatus.CREATED) + public Employee createEmployee(@RequestBody Employee employee){ + + return employeeService.saveEmployee(employee); + } + + @GetMapping + public List getAllEmployees(){ + return employeeService.getAllEmployees(); + } + + @GetMapping("{id}") + public ResponseEntity getEmployeeById(@PathVariable("id") long employeeId){ + return employeeService.getEmployeeById(employeeId) + .map(ResponseEntity::ok) + .orElseGet(()->ResponseEntity.notFound().build()); + } + + @PutMapping("{id}") + public ResponseEntity updateEmployee(@PathVariable("id") long employeeId,@RequestBody Employee employee){ + + return employeeService.getEmployeeById(employeeId) + .map(savedEmployee->{ + savedEmployee.setFirstName(employee.getFirstName()); + savedEmployee.setLastName(employee.getLastName()); + savedEmployee.setEmail(employee.getEmail()); + Employee updatedEmployee= employeeService.updateEmployee(savedEmployee); + return new ResponseEntity<>(updatedEmployee,HttpStatus.OK); + }).orElseGet(()->ResponseEntity.notFound().build()); + } + + @DeleteMapping("{id}") + public ResponseEntity deleteEmployee(@PathVariable("id") long employeeId){ + + employeeService.deleteEmployee(employeeId); + return new ResponseEntity("Employee deleted successfully!",HttpStatus.OK); + + } +} diff --git a/src/test/java/net/tigrisTesting/controller/EmployeeControllerTest.java b/src/test/java/net/tigrisTesting/controller/EmployeeControllerTest.java new file mode 100644 index 0000000..0f9840f --- /dev/null +++ b/src/test/java/net/tigrisTesting/controller/EmployeeControllerTest.java @@ -0,0 +1,158 @@ +package net.tigrisTesting.controller; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import net.tigrisTesting.model.Employee; +import net.tigrisTesting.service.EmployeeService; +import org.hamcrest.CoreMatchers; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + + +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.given; +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.ResultActions; + +import static org.mockito.BDDMockito.willDoNothing; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; + +@WebMvcTest +class EmployeeControllerTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private EmployeeService employeeService; + + @Autowired + private ObjectMapper objectMapper; + + //test for create employee controller layer + @Test + @DisplayName("Test for Create employee controller") + public void givenEmployeeObject_whenEmployeeCreate_thenReturnEmployeeObject() throws Exception { + //given --precondition operation + Employee employee = Employee.builder() + .firstName("bilal") + .lastName("yakut") + .email("bilal@mail.com") + .build(); + given(employeeService.saveEmployee(any(Employee.class))) + .willAnswer((invocationOnMock -> invocationOnMock.getArgument(0))); + + //when --action that we are going test + + ResultActions response = mockMvc.perform(post("/api/employee/") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(employee))); + + //then verify the output + response + .andDo(print()) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.firstName", CoreMatchers.is(employee.getFirstName()))) + .andExpect(jsonPath("$.lastName", CoreMatchers.is(employee.getLastName()))) + .andExpect(jsonPath("$.email", CoreMatchers.is(employee.getEmail()))); + + } + + //test for get All Employee Rest Api + @Test + @DisplayName("Test for get All employee Rest Api") + public void givenListOfEmployee_whenGetAllEmployees_thenReturnListOfEmployees() throws Exception { + //given --precondition operation + List listOfEmployees = new ArrayList<>(); + listOfEmployees.add(Employee.builder().firstName("bilal").lastName("yakut").email("bilal@mail.com").build()); + listOfEmployees.add(Employee.builder().firstName("jenny").lastName("jenny").email("jenn@mail.com").build()); + given(employeeService.getAllEmployees()).willReturn(listOfEmployees); + + //when --action that we are going test + ResultActions response = mockMvc.perform(get("/api/employee/")); + + //then verify the output + response.andExpect(status().isOk()) + .andExpect(jsonPath("$.size()", CoreMatchers.is(listOfEmployees.size()))); + } + + + //test for get Employee ById Rest Api + //positive scenario -if employee id valid + @Test + @DisplayName("GetEmployeeById rest controller operation") + public void givenEmployeeId_whenGetEmployeeById_thenReturnEmployeeObject() throws Exception { + //given --precondition operation + long employeeId = 1L; + Employee employee = Employee.builder().firstName("bilal").lastName("yakut").email("bilal@mail.com").build(); + given(employeeService.getEmployeeById(employeeId)).willReturn(Optional.of(employee)); + + //when --action that we are going test + ResultActions response = mockMvc.perform(get("/api/employee/{id}", employeeId)); + + //then verify the output + response + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.firstName", CoreMatchers.is(employee.getFirstName()))) + .andExpect(jsonPath("$.lastName", CoreMatchers.is(employee.getLastName()))) + .andExpect(jsonPath("$.email", CoreMatchers.is(employee.getEmail()))); + + } + + //Test for update Employee Rest Api + @Test + public void givenUpdatedEmployee_whenUpdatedEmployee_thenReturnUpdateObject() throws Exception { + //given --precondition operation + long employeeId = 1L; + Employee savedEmployee = Employee.builder() + .firstName("bilal").lastName("yakut").email("bilal@mail.com").build(); + + Employee updatedEmployee = Employee.builder() + .firstName("billy").lastName("billy").email("billy@mail.com").build(); + + given(employeeService.getEmployeeById(employeeId)).willReturn(Optional.ofNullable(savedEmployee)); + given(employeeService.updateEmployee(any(Employee.class))).willAnswer((invocation) -> invocation.getArgument(0)); + + //when --action that we are going test + ResultActions response = mockMvc.perform(put("/api/employee/{id}", employeeId) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(updatedEmployee))); + + //then verify the output + + response + .andExpect(status().isOk()) + .andDo(print()) + .andExpect(jsonPath("$.firstName", CoreMatchers.is(updatedEmployee.getFirstName()))) + .andExpect(jsonPath("$.lastName", CoreMatchers.is(updatedEmployee.getLastName()))) + .andExpect(jsonPath("$.email", CoreMatchers.is(updatedEmployee.getEmail()))); + + } + + //test for delete employee Rest Api + @Test + public void givenEmployeeId_whenDeleteEmployee_thenReturn200() throws Exception { + //given --precondition operation + long employeeId=1L; + willDoNothing().given(employeeService).deleteEmployee(employeeId); + + //when --action that we are going test + ResultActions response = mockMvc.perform(delete("/api/employee/{id}", employeeId)); + + //then verify the output + response.andExpect(status().isOk()) + .andDo(print()); + + } +} \ No newline at end of file From e5ce64994b26385aac304e82143339cd151815fc Mon Sep 17 00:00:00 2001 From: bilal yakut Date: Tue, 28 Feb 2023 17:37:08 +0300 Subject: [PATCH 2/3] complated integration controller layer --- pom.xml | 10 +- .../repository/EmployeeRepository.java | 2 +- src/main/resources/application.properties | 6 +- .../integration/EmployeeConrollerITest.java | 182 ++++++++++++++ .../repository/EmployeeRepositoryITest.java | 232 ++++++++++++++++++ .../repository/EmployeeRepositoryTest.java | 10 +- 6 files changed, 434 insertions(+), 8 deletions(-) create mode 100644 src/test/java/net/tigrisTesting/integration/EmployeeConrollerITest.java create mode 100644 src/test/java/net/tigrisTesting/repository/EmployeeRepositoryITest.java diff --git a/pom.xml b/pom.xml index cb70553..82ba751 100644 --- a/pom.xml +++ b/pom.xml @@ -23,17 +23,25 @@ spring-boot-starter-data-jpa + org.springframework.boot spring-boot-starter-web - + + + + mysql + mysql-connector-java + 8.0.12 + org.projectlombok lombok diff --git a/src/main/java/net/tigrisTesting/repository/EmployeeRepository.java b/src/main/java/net/tigrisTesting/repository/EmployeeRepository.java index 9207cb3..426ee73 100644 --- a/src/main/java/net/tigrisTesting/repository/EmployeeRepository.java +++ b/src/main/java/net/tigrisTesting/repository/EmployeeRepository.java @@ -26,4 +26,4 @@ public interface EmployeeRepository extends JpaRepository { @Query(value = "select * from employee e where e.first_name =:firstName and e.last_name =:lastName",nativeQuery = true) public Employee findByNativeNamedParams(@Param("firstName") String firstName, @Param("lastName") String lastName); -} +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b13789..338150f 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,5 @@ - +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/emptest?allowPublicKeyRetrieval=true&useSSL=false +spring.datasource.username=root +spring.datasource.password=root +spring.jpa.hibernate.ddl-auto=update \ No newline at end of file diff --git a/src/test/java/net/tigrisTesting/integration/EmployeeConrollerITest.java b/src/test/java/net/tigrisTesting/integration/EmployeeConrollerITest.java new file mode 100644 index 0000000..0a9b22d --- /dev/null +++ b/src/test/java/net/tigrisTesting/integration/EmployeeConrollerITest.java @@ -0,0 +1,182 @@ +package net.tigrisTesting.integration; + +import com.fasterxml.jackson.databind.ObjectMapper; +import net.tigrisTesting.model.Employee; +import net.tigrisTesting.repository.EmployeeRepository; +import static org.hamcrest.CoreMatchers.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +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 org.springframework.test.web.servlet.ResultActions; +import java.util.ArrayList; +import java.util.List; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT) +@AutoConfigureMockMvc +public class EmployeeConrollerITest { + + @Autowired + private MockMvc mockMvc; + @Autowired + private EmployeeRepository employeeRepository; + + @Autowired + private ObjectMapper objectMapper; + + @BeforeEach + void setup(){ + employeeRepository.deleteAll(); + } + + @Test + public void givenEmployeeObject_whenEmployeeCreate_thenReturnEmployeeObject() throws Exception { + //given --precondition operation + Employee employee = Employee.builder() + .firstName("bilal") + .lastName("yakut") + .email("bilal@mail.com") + .build(); + //when --action that we are going test + + ResultActions response = mockMvc.perform(post("/api/employee/") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(employee))); + + //then verify the output + response + .andDo(print()) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.firstName", is(employee.getFirstName()))) + .andExpect(jsonPath("$.lastName", is(employee.getLastName()))) + .andExpect(jsonPath("$.email", is(employee.getEmail()))); + + } + + @Test + @DisplayName("Test for get All employee Rest Api") + public void givenListOfEmployee_whenGetAllEmployees_thenReturnListOfEmployees() throws Exception { + //given --precondition operation + List listOfEmployees = new ArrayList<>(); + listOfEmployees.add(Employee.builder().firstName("bilal").lastName("yakut").email("bilal@mail.com").build()); + listOfEmployees.add(Employee.builder().firstName("jenny").lastName("jenny").email("jenn@mail.com").build()); + employeeRepository.saveAll(listOfEmployees); + + //when --action that we are going test + ResultActions response = mockMvc.perform(get("/api/employee/")); + + //then verify the output + response.andExpect(status().isOk()) + .andExpect(jsonPath("$.size()", is(listOfEmployees.size()))); + } + + @Test + @DisplayName("GetEmployeeById rest controller operation") + public void givenEmployeeId_whenGetEmployeeById_thenReturnEmployeeObject() throws Exception { + //given --precondition operation + + Employee employee = Employee.builder().firstName("bilal").lastName("yakut").email("bilal@mail.com").build(); + employeeRepository.save(employee); + + //when --action that we are going test + ResultActions response = mockMvc.perform(get("/api/employee/{id}", employee.getId())); + + //then verify the output + response + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.firstName", is(employee.getFirstName()))) + .andExpect(jsonPath("$.lastName", is(employee.getLastName()))) + .andExpect(jsonPath("$.email", is(employee.getEmail()))); + + } + + // JUnit test for update employee REST API - positive scenario + @Test + public void givenUpdatedEmployee_whenUpdateEmployee_thenReturnUpdateEmployeeObject() throws Exception{ + // given - precondition or setup + Employee savedEmployee = Employee.builder() + .firstName("bilal") + .lastName("yakut") + .email("bilal@mail.com") + .build(); + employeeRepository.save(savedEmployee); + + Employee updatedEmployee = Employee.builder() + .firstName("Billy") + .lastName("ykt") + .email("billy@mail.com") + .build(); + + // when - action or the behaviour that we are going test + ResultActions response = mockMvc.perform(put("/api/employee/{id}", savedEmployee.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(updatedEmployee))); + + + // then - verify the output + response.andExpect(status().isOk()) + .andDo(print()) + .andExpect(jsonPath("$.firstName", is(updatedEmployee.getFirstName()))) + .andExpect(jsonPath("$.lastName", is(updatedEmployee.getLastName()))) + .andExpect(jsonPath("$.email", is(updatedEmployee.getEmail()))); + } + + // JUnit test for update employee REST API - negative scenario + @Test + public void givenUpdatedEmployee_whenUpdateEmployee_thenReturn404() throws Exception{ + // given - precondition or setup + long employeeId = 1L; + Employee savedEmployee = Employee.builder() + .firstName("bilal") + .lastName("yakut") + .email("bilal@mail.com") + .build(); + employeeRepository.save(savedEmployee); + + Employee updatedEmployee = Employee.builder() + .firstName("Billy") + .lastName("ykt") + .email("billy@mail.com") + .build(); + + // when - action or the behaviour that we are going test + ResultActions response = mockMvc.perform(put("/api/employee/{id}", employeeId) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(updatedEmployee))); + + // then - verify the output + response.andExpect(status().isNotFound()) + .andDo(print()); + } + + + //test for delete employee Rest Api + @Test + public void givenEmployeeId_whenDeleteEmployee_thenReturn200() throws Exception { + //given --precondition operation + Employee savedEmployee = Employee.builder() + .firstName("bilal") + .lastName("yakut") + .email("bilal@mail.com") + .build(); + employeeRepository.save(savedEmployee); + + //when --action that we are going test + ResultActions response = mockMvc.perform(delete("/api/employee/{id}", savedEmployee.getId())); + + //then verify the output + response.andExpect(status().isOk()) + .andDo(print()); + + } + +} diff --git a/src/test/java/net/tigrisTesting/repository/EmployeeRepositoryITest.java b/src/test/java/net/tigrisTesting/repository/EmployeeRepositoryITest.java new file mode 100644 index 0000000..8d87833 --- /dev/null +++ b/src/test/java/net/tigrisTesting/repository/EmployeeRepositoryITest.java @@ -0,0 +1,232 @@ +package net.tigrisTesting.repository; + +import net.tigrisTesting.model.Employee; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + + +@DataJpaTest +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +class EmployeeRepositoryITest { + + @Autowired + private EmployeeRepository employeeRepository; + private Employee employee; + + @BeforeEach + public void setup(){ + employee = Employee.builder() + .firstName("bilal") + .lastName("yakut") + .email("bilalykt@mail.com") + .build(); + } + + //JUnit test for save employee operation + + @Test + @DisplayName("Saving employee operation") + public void givenEmployeeObject_whenSave_thenReturnSavedEmployee() { + + //given - precondition or setup + /* Employee employee = Employee.builder() + .firstName("bilal") + .lastName("yakut") + .email("bilalykt@mail.com") + .build();*/ + + //when -action or the behavior that we are going test + + Employee savedEmployee = employeeRepository.save(employee); + + //then verify the output + + assertThat(savedEmployee).isNotNull(); + assertThat(savedEmployee.getId()).isGreaterThan(0); + + } + + //JUnit test for + @Test + @DisplayName("Get All Employee operation") + public void givenEmployeeList_whenFindAll_thenEmployeeList() { + //given --precondition operation + Employee employee1 = Employee.builder() + .firstName("bilal") + .lastName("yakut") + .email("bilalykt@mail.com") + .build(); + Employee employee2 = Employee.builder() + .firstName("jennifer") + .lastName("jennifer") + .email("jennifer@mail.com") + .build(); + Employee employee3 = Employee.builder() + .firstName("ema") + .lastName("ema") + .email("ema@mail.com") + .build(); + + employeeRepository.save(employee1); + employeeRepository.save(employee2); + employeeRepository.save(employee3); + + //when --action that we are going test + List employeeList = employeeRepository.findAll(); + + + //then verify the output + assertThat(employeeList).isNotNull(); + assertThat(employeeList.size()).isEqualTo(3); + } + + + //test for getOneEmployeeById operation + @Test + @DisplayName("Get Employee By Id operation") + public void givenEmployeeObject_whenFindEmployeeById_thenReturnEmployeeObject() { + //given --precondition operation + employeeRepository.save(employee); + + //when --action that we are going test + Employee employeeDb = employeeRepository.findById(employee.getId()).get(); + + //then verify the output + assertThat(employeeDb).isNotNull(); + + + } + + //test for get Employee by Email operation + @Test + @DisplayName("Get Employee By Email operation") + public void givenEmployeeMail_whenFindEmployeeByEmail_thenEmployeeObject() { + //given --precondition operation + + employeeRepository.save(employee); + + //when --action that we are going test + Employee employeeDb = employeeRepository.findByEmail(employee.getEmail()); + + //then verify the output + assertThat(employeeDb).isNotNull(); + } + + //test for update employee operation + @Test + @DisplayName("update Employee with by id operation") + public void givenEmployeeObject_whenUpdateEmployee_thenReturnEmployeeObject() { + //given --precondition operation + employeeRepository.save(employee); + + //when --action that we are going test + + Employee employeeDb = employeeRepository.findById(employee.getId()).get(); + employeeDb.setEmail("billy@mail.com"); + employeeDb.setFirstName("bilal"); + employeeDb.setLastName("yakut"); + Employee updatedEmployee = employeeRepository.save(employeeDb); + //then verify the output + assertThat(updatedEmployee.getEmail()).isEqualTo("billy@mail.com"); + assertThat(updatedEmployee.getFirstName()).isEqualTo("bilal"); + assertThat(updatedEmployee.getLastName()).isEqualTo("yakut"); + + + } + + + //test for delete employee operation + @Test + @DisplayName("delete employee operation") + public void givenEmployeeObject_whenDeleteEmployee_thenRemoveEmployee() { + //given --precondition operation + employeeRepository.save(employee); + + //when --action that we are going test + //employeeRepository.deleteById(employee.getId()); + employeeRepository.delete(employee); + Optional optionalEmployee = employeeRepository.findById(employee.getId()); + + //then verify the output + assertThat(optionalEmployee).isEmpty(); + } + + + //test for custom query jpql get employee custom query with index + @Test + @DisplayName("Find Employee by firstName and lastName") + public void givenFirstNameAndLastName_whenFindEmployeeJPQL_thenReturnEmployeeObject() { + //given --precondition operation + employeeRepository.save(employee); + String firstName="bilal"; + String lastName="yakut"; + + //when --action that we are going test + Employee employeeDb = employeeRepository.findByJPQL(firstName, lastName); + + //then verify the output + assertThat(employeeDb).isNotNull(); + + } + + //test for custom query jpql get employee custom query with name params + @Test + @DisplayName("Find Employee by firstName and lastName with params") + public void givenFirstNameAndLastName_whenFindEmployeeJPQLParams_thenReturnEmployeeObject() { + //given --precondition operation + employeeRepository.save(employee); + String firstName="bilal"; + String lastName="yakut"; + + //when --action that we are going test + Employee employeeDb = employeeRepository.findByJPQLParams(firstName, lastName); + + //then verify the output + assertThat(employeeDb).isNotNull(); + + } + + + //test for custom native query get employee ,custom query with index params + @Test + @DisplayName("Find Employee by firstName and lastName ") + public void givenFirstNameAndLastName_whenFindEmployeeNativeIndexSQL_thenReturnEmployeeObject() { + //given --precondition operation + employeeRepository.save(employee); + String firstName="bilal"; + String lastName="yakut"; + + //when --action that we are going test + Employee employeeDb = employeeRepository.findByNativeSql(firstName, lastName); + + //then verify the output + assertThat(employeeDb).isNotNull(); + + } + + //test for custom native query get employee ,custom query with named params + @Test + @DisplayName("Find Employee by firstName and lastName ") + public void givenFirstNameAndLastName_whenFindEmployeeNativeNamedSQL_thenReturnEmployeeObject() { + //given --precondition operation + employeeRepository.save(employee); + String firstName="bilal"; + String lastName="yakut"; + + //when --action that we are going test + Employee employeeDb = employeeRepository.findByNativeNamedParams(firstName, lastName); + + //then verify the output + assertThat(employeeDb).isNotNull(); + + } +} \ No newline at end of file diff --git a/src/test/java/net/tigrisTesting/repository/EmployeeRepositoryTest.java b/src/test/java/net/tigrisTesting/repository/EmployeeRepositoryTest.java index 02a0936..6e58189 100644 --- a/src/test/java/net/tigrisTesting/repository/EmployeeRepositoryTest.java +++ b/src/test/java/net/tigrisTesting/repository/EmployeeRepositoryTest.java @@ -22,11 +22,11 @@ class EmployeeRepositoryTest { @BeforeEach public void setup(){ - employee = Employee.builder() - .firstName("bilal") - .lastName("yakut") - .email("bilalykt@mail.com") - .build(); + employee = Employee.builder() + .firstName("bilal") + .lastName("yakut") + .email("bilalykt@mail.com") + .build(); } //JUnit test for save employee operation From e69f288b2eb87a3770262c7b9f43a1affe4c23df Mon Sep 17 00:00:00 2001 From: bilal yakut Date: Sat, 4 Mar 2023 13:35:40 +0300 Subject: [PATCH 3/3] integraion test layer --- pom.xml | 17 ++ .../AbstractContainerBaseTest.java | 31 +++ .../integration/EmployeeControllerIT.java | 187 ++++++++++++++++++ ...Test.java => EmployeeControllerITest.java} | 2 +- .../repository/EmployeeRepositoryITest.java | 3 +- 5 files changed, 238 insertions(+), 2 deletions(-) create mode 100644 src/test/java/net/tigrisTesting/integration/AbstractContainerBaseTest.java create mode 100644 src/test/java/net/tigrisTesting/integration/EmployeeControllerIT.java rename src/test/java/net/tigrisTesting/integration/{EmployeeConrollerITest.java => EmployeeControllerITest.java} (99%) diff --git a/pom.xml b/pom.xml index 82ba751..e6d2eee 100644 --- a/pom.xml +++ b/pom.xml @@ -29,12 +29,29 @@ spring-boot-starter-web + + org.testcontainers + junit-jupiter + 1.17.6 + test + + + + + org.testcontainers + mysql + 1.17.6 + test + + + + mysql mysql-connector-java diff --git a/src/test/java/net/tigrisTesting/integration/AbstractContainerBaseTest.java b/src/test/java/net/tigrisTesting/integration/AbstractContainerBaseTest.java new file mode 100644 index 0000000..335b6a8 --- /dev/null +++ b/src/test/java/net/tigrisTesting/integration/AbstractContainerBaseTest.java @@ -0,0 +1,31 @@ +package net.tigrisTesting.integration; + +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.testcontainers.containers.MySQLContainer; + +public abstract class AbstractContainerBaseTest { + + static final MySQLContainer MY_SQL_CONTAINER ; + + + static { + MY_SQL_CONTAINER=new MySQLContainer("mysql:latest") + .withPassword("password") + .withUsername("username") + .withDatabaseName("databaseName"); + + MY_SQL_CONTAINER.start(); + } + + + @DynamicPropertySource + public static void dynamicPropertySource(DynamicPropertyRegistry registry){ + registry.add("spring.datasource.url",MY_SQL_CONTAINER::getJdbcUrl); + registry.add("spring.datasource.username",MY_SQL_CONTAINER::getUsername); + registry.add("spring.datasource.password",MY_SQL_CONTAINER::getPassword); + } + + + +} diff --git a/src/test/java/net/tigrisTesting/integration/EmployeeControllerIT.java b/src/test/java/net/tigrisTesting/integration/EmployeeControllerIT.java new file mode 100644 index 0000000..3db7953 --- /dev/null +++ b/src/test/java/net/tigrisTesting/integration/EmployeeControllerIT.java @@ -0,0 +1,187 @@ +package net.tigrisTesting.integration; + +import com.fasterxml.jackson.databind.ObjectMapper; +import net.tigrisTesting.model.Employee; +import net.tigrisTesting.repository.EmployeeRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +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 org.springframework.test.web.servlet.ResultActions; +import org.testcontainers.junit.jupiter.Testcontainers; + +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.CoreMatchers.is; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT) +@AutoConfigureMockMvc +@Testcontainers +public class EmployeeControllerIT extends AbstractContainerBaseTest { + + @Autowired + private MockMvc mockMvc; + @Autowired + private EmployeeRepository employeeRepository; + + @Autowired + private ObjectMapper objectMapper; + + @BeforeEach + void setup(){ + employeeRepository.deleteAll(); + } + + @Test + public void givenEmployeeObject_whenEmployeeCreate_thenReturnEmployeeObject() throws Exception { + + //given --precondition operation + Employee employee = Employee.builder() + .firstName("bilal") + .lastName("yakut") + .email("bilal@mail.com") + .build(); + //when --action that we are going test + + ResultActions response = mockMvc.perform(post("/api/employee/") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(employee))); + + //then verify the output + response + .andDo(print()) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.firstName", is(employee.getFirstName()))) + .andExpect(jsonPath("$.lastName", is(employee.getLastName()))) + .andExpect(jsonPath("$.email", is(employee.getEmail()))); + + } + + @Test + @DisplayName("Test for get All employee Rest Api") + public void givenListOfEmployee_whenGetAllEmployees_thenReturnListOfEmployees() throws Exception { + //given --precondition operation + List listOfEmployees = new ArrayList<>(); + listOfEmployees.add(Employee.builder().firstName("bilal").lastName("yakut").email("bilal@mail.com").build()); + listOfEmployees.add(Employee.builder().firstName("jenny").lastName("jenny").email("jenn@mail.com").build()); + employeeRepository.saveAll(listOfEmployees); + + //when --action that we are going test + ResultActions response = mockMvc.perform(get("/api/employee/")); + + //then verify the output + response.andExpect(status().isOk()) + .andExpect(jsonPath("$.size()", is(listOfEmployees.size()))); + } + + @Test + @DisplayName("GetEmployeeById rest controller operation") + public void givenEmployeeId_whenGetEmployeeById_thenReturnEmployeeObject() throws Exception { + //given --precondition operation + + Employee employee = Employee.builder().firstName("bilal").lastName("yakut").email("bilal@mail.com").build(); + employeeRepository.save(employee); + + //when --action that we are going test + ResultActions response = mockMvc.perform(get("/api/employee/{id}", employee.getId())); + + //then verify the output + response + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.firstName", is(employee.getFirstName()))) + .andExpect(jsonPath("$.lastName", is(employee.getLastName()))) + .andExpect(jsonPath("$.email", is(employee.getEmail()))); + + } + + // JUnit test for update employee REST API - positive scenario + @Test + public void givenUpdatedEmployee_whenUpdateEmployee_thenReturnUpdateEmployeeObject() throws Exception{ + // given - precondition or setup + Employee savedEmployee = Employee.builder() + .firstName("bilal") + .lastName("yakut") + .email("bilal@mail.com") + .build(); + employeeRepository.save(savedEmployee); + + Employee updatedEmployee = Employee.builder() + .firstName("Billy") + .lastName("ykt") + .email("billy@mail.com") + .build(); + + // when - action or the behaviour that we are going test + ResultActions response = mockMvc.perform(put("/api/employee/{id}", savedEmployee.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(updatedEmployee))); + + + // then - verify the output + response.andExpect(status().isOk()) + .andDo(print()) + .andExpect(jsonPath("$.firstName", is(updatedEmployee.getFirstName()))) + .andExpect(jsonPath("$.lastName", is(updatedEmployee.getLastName()))) + .andExpect(jsonPath("$.email", is(updatedEmployee.getEmail()))); + } + + // JUnit test for update employee REST API - negative scenario + @Test + public void givenUpdatedEmployee_whenUpdateEmployee_thenReturn404() throws Exception{ + // given - precondition or setup + long employeeId = 1L; + Employee savedEmployee = Employee.builder() + .firstName("bilal") + .lastName("yakut") + .email("bilal@mail.com") + .build(); + employeeRepository.save(savedEmployee); + + Employee updatedEmployee = Employee.builder() + .firstName("Billy") + .lastName("ykt") + .email("billy@mail.com") + .build(); + + // when - action or the behaviour that we are going test + ResultActions response = mockMvc.perform(put("/api/employee/{id}", employeeId) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(updatedEmployee))); + + // then - verify the output + response.andExpect(status().isNotFound()) + .andDo(print()); + } + + + //test for delete employee Rest Api + @Test + public void givenEmployeeId_whenDeleteEmployee_thenReturn200() throws Exception { + //given --precondition operation + Employee savedEmployee = Employee.builder() + .firstName("bilal") + .lastName("yakut") + .email("bilal@mail.com") + .build(); + employeeRepository.save(savedEmployee); + + //when --action that we are going test + ResultActions response = mockMvc.perform(delete("/api/employee/{id}", savedEmployee.getId())); + + //then verify the output + response.andExpect(status().isOk()) + .andDo(print()); + + } + +} diff --git a/src/test/java/net/tigrisTesting/integration/EmployeeConrollerITest.java b/src/test/java/net/tigrisTesting/integration/EmployeeControllerITest.java similarity index 99% rename from src/test/java/net/tigrisTesting/integration/EmployeeConrollerITest.java rename to src/test/java/net/tigrisTesting/integration/EmployeeControllerITest.java index 0a9b22d..56cca02 100644 --- a/src/test/java/net/tigrisTesting/integration/EmployeeConrollerITest.java +++ b/src/test/java/net/tigrisTesting/integration/EmployeeControllerITest.java @@ -22,7 +22,7 @@ @SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT) @AutoConfigureMockMvc -public class EmployeeConrollerITest { +public class EmployeeControllerITest { @Autowired private MockMvc mockMvc; diff --git a/src/test/java/net/tigrisTesting/repository/EmployeeRepositoryITest.java b/src/test/java/net/tigrisTesting/repository/EmployeeRepositoryITest.java index 8d87833..d2ded54 100644 --- a/src/test/java/net/tigrisTesting/repository/EmployeeRepositoryITest.java +++ b/src/test/java/net/tigrisTesting/repository/EmployeeRepositoryITest.java @@ -1,5 +1,6 @@ package net.tigrisTesting.repository; +import net.tigrisTesting.integration.AbstractContainerBaseTest; import net.tigrisTesting.model.Employee; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -16,7 +17,7 @@ @DataJpaTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) -class EmployeeRepositoryITest { +class EmployeeRepositoryITest extends AbstractContainerBaseTest { @Autowired private EmployeeRepository employeeRepository;