From 003d00daa9e5070f5f32bec31f81bc2031249b67 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Thu, 28 Apr 2022 17:12:20 +0100 Subject: [PATCH] [JAVA-8148] Fix code so application starts and some clean up --- .../reactive/webflux/EmployeeRepository.java | 44 ++++------- .../annotation/EmployeeSpringApplication.java | 7 ++ .../webflux/annotation/EmployeeWebClient.java | 12 +-- .../EmployeeControllerIntegrationTest.java | 76 ++++++++++++------- 4 files changed, 77 insertions(+), 62 deletions(-) diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeRepository.java b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeRepository.java index 9aebc577b0..01d32ea57a 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeRepository.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/EmployeeRepository.java @@ -10,46 +10,32 @@ import java.util.Map; @Repository public class EmployeeRepository { - static Map employeeData; - - static Map employeeAccessData; + private static final Map EMPLOYEE_DATA; static { - employeeData = new HashMap<>(); - employeeData.put("1", new Employee("1", "Employee 1")); - employeeData.put("2", new Employee("2", "Employee 2")); - employeeData.put("3", new Employee("3", "Employee 3")); - employeeData.put("4", new Employee("4", "Employee 4")); - employeeData.put("5", new Employee("5", "Employee 5")); - employeeData.put("6", new Employee("6", "Employee 6")); - employeeData.put("7", new Employee("7", "Employee 7")); - employeeData.put("8", new Employee("8", "Employee 8")); - employeeData.put("9", new Employee("9", "Employee 9")); - employeeData.put("10", new Employee("10", "Employee 10")); - - employeeAccessData = new HashMap<>(); - employeeAccessData.put("1", "Employee 1 Access Key"); - employeeAccessData.put("2", "Employee 2 Access Key"); - employeeAccessData.put("3", "Employee 3 Access Key"); - employeeAccessData.put("4", "Employee 4 Access Key"); - employeeAccessData.put("5", "Employee 5 Access Key"); - employeeAccessData.put("6", "Employee 6 Access Key"); - employeeAccessData.put("7", "Employee 7 Access Key"); - employeeAccessData.put("8", "Employee 8 Access Key"); - employeeAccessData.put("9", "Employee 9 Access Key"); - employeeAccessData.put("10", "Employee 10 Access Key"); + EMPLOYEE_DATA = new HashMap<>(); + EMPLOYEE_DATA.put("1", new Employee("1", "Employee 1")); + EMPLOYEE_DATA.put("2", new Employee("2", "Employee 2")); + EMPLOYEE_DATA.put("3", new Employee("3", "Employee 3")); + EMPLOYEE_DATA.put("4", new Employee("4", "Employee 4")); + EMPLOYEE_DATA.put("5", new Employee("5", "Employee 5")); + EMPLOYEE_DATA.put("6", new Employee("6", "Employee 6")); + EMPLOYEE_DATA.put("7", new Employee("7", "Employee 7")); + EMPLOYEE_DATA.put("8", new Employee("8", "Employee 8")); + EMPLOYEE_DATA.put("9", new Employee("9", "Employee 9")); + EMPLOYEE_DATA.put("10", new Employee("10", "Employee 10")); } public Mono findEmployeeById(String id) { - return Mono.just(employeeData.get(id)); + return Mono.just(EMPLOYEE_DATA.get(id)); } public Flux findAllEmployees() { - return Flux.fromIterable(employeeData.values()); + return Flux.fromIterable(EMPLOYEE_DATA.values()); } public Mono updateEmployee(Employee employee) { - Employee existingEmployee = employeeData.get(employee.getId()); + Employee existingEmployee = EMPLOYEE_DATA.get(employee.getId()); if (existingEmployee != null) { existingEmployee.setName(employee.getName()); } diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeSpringApplication.java b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeSpringApplication.java index f1d21bdc77..0e3cc6bf99 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeSpringApplication.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeSpringApplication.java @@ -1,12 +1,19 @@ package com.baeldung.reactive.webflux.annotation; +import com.baeldung.reactive.webflux.EmployeeRepository; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration; +import org.springframework.context.annotation.Bean; @SpringBootApplication(exclude = MongoReactiveAutoConfiguration.class) public class EmployeeSpringApplication { + @Bean + EmployeeRepository employeeRepository() { + return new EmployeeRepository(); + } + public static void main(String[] args) { SpringApplication.run(EmployeeSpringApplication.class, args); diff --git a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebClient.java b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebClient.java index 611a261a1b..62978e1f58 100644 --- a/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebClient.java +++ b/spring-reactive/src/main/java/com/baeldung/reactive/webflux/annotation/EmployeeWebClient.java @@ -10,9 +10,9 @@ import reactor.core.publisher.Mono; public class EmployeeWebClient { private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeWebClient.class); - + WebClient client = WebClient.create("http://localhost:8080"); - + public void consume() { Mono employeeMono = client.get() @@ -20,13 +20,13 @@ public class EmployeeWebClient { .retrieve() .bodyToMono(Employee.class); - employeeMono.subscribe(employee -> LOGGER.debug("Employee: {}", employee)); - + employeeMono.subscribe(employee -> LOGGER.info("Employee: {}", employee)); + Flux employeeFlux = client.get() .uri("/employees") .retrieve() .bodyToFlux(Employee.class); - - employeeFlux.subscribe(employee -> LOGGER.debug("Employee: {}", employee)); + + employeeFlux.subscribe(employee -> LOGGER.info("Employee: {}", employee)); } } \ No newline at end of file diff --git a/spring-reactive/src/test/java/com/baeldung/reactive/webflux/annotation/EmployeeControllerIntegrationTest.java b/spring-reactive/src/test/java/com/baeldung/reactive/webflux/annotation/EmployeeControllerIntegrationTest.java index 24c4303e83..c4a11e7f3b 100644 --- a/spring-reactive/src/test/java/com/baeldung/reactive/webflux/annotation/EmployeeControllerIntegrationTest.java +++ b/spring-reactive/src/test/java/com/baeldung/reactive/webflux/annotation/EmployeeControllerIntegrationTest.java @@ -2,27 +2,27 @@ package com.baeldung.reactive.webflux.annotation; import com.baeldung.reactive.webflux.Employee; import com.baeldung.reactive.webflux.EmployeeRepository; -import com.baeldung.reactive.webflux.annotation.EmployeeSpringApplication; -import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; @RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes= EmployeeSpringApplication.class) -@FixMethodOrder(MethodSorters.NAME_ASCENDING) +@SpringBootTest(webEnvironment = RANDOM_PORT, classes= EmployeeSpringApplication.class) public class EmployeeControllerIntegrationTest { @Autowired @@ -35,40 +35,62 @@ public class EmployeeControllerIntegrationTest { public void givenEmployeeId_whenGetEmployeeById_thenCorrectEmployee() { Employee employee = new Employee("1", "Employee 1 Name"); - + given(employeeRepository.findEmployeeById("1")).willReturn(Mono.just(employee)); + testClient.get() .uri("/employees/1") .exchange() - .expectStatus() - .isOk() - .expectBody(Employee.class) - .isEqualTo(employee); + .expectStatus().isOk() + .expectBody(Employee.class).isEqualTo(employee); } @Test public void whenGetAllEmployees_thenCorrectEmployees() { - - List employeeList = new ArrayList<>(); - - Employee employee1 = new Employee("1", "Employee 1 Name"); - Employee employee2 = new Employee("2", "Employee 2 Name"); - Employee employee3 = new Employee("3", "Employee 3 Name"); - - employeeList.add(employee1); - employeeList.add(employee2); - employeeList.add(employee3); - + List employeeList = Arrays.asList( + new Employee("1", "Employee 1 Name"), + new Employee("2", "Employee 2 Name"), + new Employee("3", "Employee 3 Name") + ); Flux employeeFlux = Flux.fromIterable(employeeList); given(employeeRepository.findAllEmployees()).willReturn(employeeFlux); + testClient.get() .uri("/employees") .exchange() - .expectStatus() - .isOk() - .expectBodyList(Employee.class) - .hasSize(3) - .isEqualTo(employeeList); + .expectStatus().isOk() + .expectBodyList(Employee.class).isEqualTo(employeeList); + } + + @Test + @WithMockUser(username = "admin", roles = {"ADMIN"}) + public void givenValidUser_whenUpdateEmployee_thenEmployeeUpdated() { + Employee employee = new Employee("10", "Employee 10 Updated"); + + given(employeeRepository.updateEmployee(employee)).willReturn(Mono.just(employee)); + + testClient.post() + .uri("/employees/update") + .body(Mono.just(employee), Employee.class) + .exchange() + .expectStatus().isOk() + .expectBody(Employee.class).isEqualTo(employee); + + verify(employeeRepository).updateEmployee(employee); + } + + @Test + @WithMockUser + public void givenInvalidUser_whenUpdateEmployee_thenForbidden() { + Employee employee = new Employee("10", "Employee 10 Updated"); + + testClient.post() + .uri("/employees/update") + .body(Mono.just(employee), Employee.class) + .exchange() + .expectStatus().isForbidden(); + + verifyNoInteractions(employeeRepository); } }