From c1fe1fd28551cdeee717eec3f11c8300cdf62593 Mon Sep 17 00:00:00 2001
From: Eugene Kovko <37694937+eukovko@users.noreply.github.com>
Date: Thu, 29 Feb 2024 21:48:29 +0100
Subject: [PATCH] Bael 6131 (#15967)
* chore: Simple test setup
* chore: Authorization error
* feat: Removed using page parameter
* feat: Added MockMvc test
* feat: Added MockUser
* feat: Removed unused import
* feat: WebClientTest documentation
* feat: Working tests for WebMvc and WebTestClient
* feat: Working tests with RestAssured
* feat: Cleanup
* feat: Added a BookService
* feat: Suppressed a warning
* feat: Fixed typo
---
spring-5/pom.xml | 10 +++
.../baeldung/queryparamdoc/Application.java | 12 ++++
.../java/com/baeldung/queryparamdoc/Book.java | 5 ++
.../queryparamdoc/BookController.java | 23 +++++++
.../baeldung/queryparamdoc/BookService.java | 14 +++++
.../BookControllerMvcIntegrationTest.java | 55 +++++++++++++++++
...BookControllerReactiveIntegrationTest.java | 61 +++++++++++++++++++
...kControllerRestAssuredIntegrationTest.java | 52 ++++++++++++++++
8 files changed, 232 insertions(+)
create mode 100644 spring-5/src/main/java/com/baeldung/queryparamdoc/Application.java
create mode 100644 spring-5/src/main/java/com/baeldung/queryparamdoc/Book.java
create mode 100644 spring-5/src/main/java/com/baeldung/queryparamdoc/BookController.java
create mode 100644 spring-5/src/main/java/com/baeldung/queryparamdoc/BookService.java
create mode 100644 spring-5/src/test/java/com/baeldung/queryparamdoc/BookControllerMvcIntegrationTest.java
create mode 100644 spring-5/src/test/java/com/baeldung/queryparamdoc/BookControllerReactiveIntegrationTest.java
create mode 100644 spring-5/src/test/java/com/baeldung/queryparamdoc/BookControllerRestAssuredIntegrationTest.java
diff --git a/spring-5/pom.xml b/spring-5/pom.xml
index 65f1b77520..c41b8aa301 100644
--- a/spring-5/pom.xml
+++ b/spring-5/pom.xml
@@ -37,6 +37,10 @@
org.springframework.boot
spring-boot-starter-hateoas
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
javax.json.bind
javax.json.bind-api
@@ -96,6 +100,12 @@
spring-restdocs-restassured
test
+
+ org.springframework.restdocs
+ spring-restdocs-webtestclient
+ test
+
+
com.zaxxer
HikariCP
diff --git a/spring-5/src/main/java/com/baeldung/queryparamdoc/Application.java b/spring-5/src/main/java/com/baeldung/queryparamdoc/Application.java
new file mode 100644
index 0000000000..6189eeafa7
--- /dev/null
+++ b/spring-5/src/main/java/com/baeldung/queryparamdoc/Application.java
@@ -0,0 +1,12 @@
+package com.baeldung.queryparamdoc;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
+
+@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
+public class Application {
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+}
diff --git a/spring-5/src/main/java/com/baeldung/queryparamdoc/Book.java b/spring-5/src/main/java/com/baeldung/queryparamdoc/Book.java
new file mode 100644
index 0000000000..cb6e9e5a86
--- /dev/null
+++ b/spring-5/src/main/java/com/baeldung/queryparamdoc/Book.java
@@ -0,0 +1,5 @@
+package com.baeldung.queryparamdoc;
+
+public class Book {
+
+}
diff --git a/spring-5/src/main/java/com/baeldung/queryparamdoc/BookController.java b/spring-5/src/main/java/com/baeldung/queryparamdoc/BookController.java
new file mode 100644
index 0000000000..84357c3d6f
--- /dev/null
+++ b/spring-5/src/main/java/com/baeldung/queryparamdoc/BookController.java
@@ -0,0 +1,23 @@
+package com.baeldung.queryparamdoc;
+
+import java.util.List;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/books")
+public class BookController {
+
+ private final BookService service;
+
+ public BookController(BookService service) {
+ this.service = service;
+ }
+
+ @GetMapping
+ public List getBooks(@RequestParam(name = "page") Integer page) {
+ return service.getBooks(page);
+ }
+}
diff --git a/spring-5/src/main/java/com/baeldung/queryparamdoc/BookService.java b/spring-5/src/main/java/com/baeldung/queryparamdoc/BookService.java
new file mode 100644
index 0000000000..8d5192021c
--- /dev/null
+++ b/spring-5/src/main/java/com/baeldung/queryparamdoc/BookService.java
@@ -0,0 +1,14 @@
+package com.baeldung.queryparamdoc;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.springframework.stereotype.Service;
+
+@Service
+public class BookService {
+
+ @SuppressWarnings("unused")
+ public List getBooks(Integer page) {
+ return new ArrayList<>();
+ }
+}
diff --git a/spring-5/src/test/java/com/baeldung/queryparamdoc/BookControllerMvcIntegrationTest.java b/spring-5/src/test/java/com/baeldung/queryparamdoc/BookControllerMvcIntegrationTest.java
new file mode 100644
index 0000000000..ab96364e6a
--- /dev/null
+++ b/spring-5/src/test/java/com/baeldung/queryparamdoc/BookControllerMvcIntegrationTest.java
@@ -0,0 +1,55 @@
+package com.baeldung.queryparamdoc;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;
+import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
+import static org.springframework.restdocs.request.RequestDocumentation.requestParameters;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.restdocs.RestDocumentationContextProvider;
+import org.springframework.restdocs.RestDocumentationExtension;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.web.context.WebApplicationContext;
+
+@ExtendWith({RestDocumentationExtension.class, SpringExtension.class})
+@WebMvcTest(controllers = {BookController.class, BookService.class},
+ excludeAutoConfiguration = SecurityAutoConfiguration.class)
+class BookControllerMvcIntegrationTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @BeforeEach
+ public void setUp(WebApplicationContext webApplicationContext, RestDocumentationContextProvider restDocumentation) {
+ this.mockMvc = webAppContextSetup(webApplicationContext)
+ .apply(documentationConfiguration(restDocumentation))
+ .alwaysDo(document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint())))
+ .build();
+ }
+
+ @Test
+ void smokeTest() {
+ assertThat(mockMvc).isNotNull();
+ }
+
+ @Test
+ void givenEndpoint_whenSendGetRequest_thenSuccessfulResponse() throws Exception {
+ mockMvc.perform(get("/books?page=2"))
+ .andExpect(status().isOk())
+ .andDo(document("books",
+ requestParameters(parameterWithName("page").description("The page to retrieve"))));
+ }
+}
\ No newline at end of file
diff --git a/spring-5/src/test/java/com/baeldung/queryparamdoc/BookControllerReactiveIntegrationTest.java b/spring-5/src/test/java/com/baeldung/queryparamdoc/BookControllerReactiveIntegrationTest.java
new file mode 100644
index 0000000000..b2a6991f27
--- /dev/null
+++ b/spring-5/src/test/java/com/baeldung/queryparamdoc/BookControllerReactiveIntegrationTest.java
@@ -0,0 +1,61 @@
+package com.baeldung.queryparamdoc;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
+import static org.springframework.restdocs.request.RequestDocumentation.requestParameters;
+import static org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.document;
+import static org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.documentationConfiguration;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
+import org.springframework.boot.test.context.TestConfiguration;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.restdocs.RestDocumentationContextProvider;
+import org.springframework.restdocs.RestDocumentationExtension;
+import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.test.web.reactive.server.WebTestClient;
+
+@ExtendWith({RestDocumentationExtension.class, SpringExtension.class})
+@WebFluxTest
+class BookControllerReactiveIntegrationTest {
+
+ @Autowired
+ private WebTestClient webTestClient;
+
+ @BeforeEach
+ public void setUp(ApplicationContext webApplicationContext, RestDocumentationContextProvider restDocumentation) {
+ this.webTestClient = WebTestClient.bindToApplicationContext(webApplicationContext)
+ .configureClient()
+ .filter(documentationConfiguration(restDocumentation))
+ .build();
+ }
+
+ @Test
+ void smokeTest() {
+ assertThat(webTestClient).isNotNull();
+ }
+
+ @Test
+ @WithMockUser
+ void givenEndpoint_whenSendGetRequest_thenSuccessfulResponse() {
+ webTestClient.get().uri("/books?page=2")
+ .exchange().expectStatus().isOk().expectBody()
+ .consumeWith(document("books",
+ requestParameters(parameterWithName("page").description("The page to retrieve"))));
+ }
+
+ @TestConfiguration
+ public static class TestConfig {
+
+ @Bean
+ BookService bookService() {
+ return new BookService();
+ }
+ }
+
+}
diff --git a/spring-5/src/test/java/com/baeldung/queryparamdoc/BookControllerRestAssuredIntegrationTest.java b/spring-5/src/test/java/com/baeldung/queryparamdoc/BookControllerRestAssuredIntegrationTest.java
new file mode 100644
index 0000000000..44c6b27285
--- /dev/null
+++ b/spring-5/src/test/java/com/baeldung/queryparamdoc/BookControllerRestAssuredIntegrationTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.queryparamdoc;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.core.Is.is;
+import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
+import static org.springframework.restdocs.request.RequestDocumentation.requestParameters;
+import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document;
+import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.documentationConfiguration;
+
+import io.restassured.RestAssured;
+import io.restassured.builder.RequestSpecBuilder;
+import io.restassured.specification.RequestSpecification;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureWebMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.test.web.server.LocalServerPort;
+import org.springframework.restdocs.RestDocumentationContextProvider;
+import org.springframework.restdocs.RestDocumentationExtension;
+import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith({RestDocumentationExtension.class, SpringExtension.class})
+@AutoConfigureWebMvc
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+class BookControllerRestAssuredIntegrationTest {
+
+ private RequestSpecification spec;
+
+ @BeforeEach
+ void setUp(RestDocumentationContextProvider restDocumentation, @LocalServerPort int port) {
+ this.spec = new RequestSpecBuilder().addFilter(documentationConfiguration(restDocumentation))
+ .setPort(port)
+ .build();
+ }
+
+ @Test
+ void smokeTest() {
+ assertThat(spec).isNotNull();
+ }
+
+ @Test
+ @WithMockUser
+ void givenEndpoint_whenSendGetRequest_thenSuccessfulResponse() {
+ RestAssured.given(this.spec).filter(document("users", requestParameters(
+ parameterWithName("page").description("The page to retrieve"))))
+ .when().get("/books?page=2")
+ .then().assertThat().statusCode(is(200));
+ }
+}
\ No newline at end of file