Skip to content

Commit

Permalink
spring-boot-starter-web to spring-boot-starter-webflux migration
Browse files Browse the repository at this point in the history
  • Loading branch information
musab.bozkurt committed Feb 26, 2024
1 parent d8aad0a commit e435357
Show file tree
Hide file tree
Showing 7 changed files with 237 additions and 474 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

### How to test the application

* Swagger Url: http://localhost:8001/swagger-ui/index.html
* Swagger Url: http://localhost:8001/swagger-ui.html
* Actuator Url: http://localhost:8001/actuator
* Metric Url: http://localhost:8001/actuator/metrics
* Run `mvn test` command to run all the tests
Expand Down
7 changes: 5 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,14 @@
<org.projectlombok.version>1.18.30</org.projectlombok.version>
<lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>
<dockerfile-maven-plugin.version>1.4.13</dockerfile-maven-plugin.version>
<!--suppress UnresolvedMavenProperty -->
<registry>${env.CI_REGISTRY}/${env.CI_REGION}/${project.artifactId}</registry>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

<dependency>
Expand All @@ -51,7 +52,7 @@

<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<artifactId>springdoc-openapi-starter-webflux-ui</artifactId>
<version>2.3.0</version>
</dependency>

Expand Down Expand Up @@ -209,9 +210,11 @@
</executions>
<configuration>
<repository>${registry}</repository>
<!--suppress UnresolvedMavenProperty -->
<tag>${env.CI_REGISTRY_TAG}</tag>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
<!--suppress UnresolvedMavenProperty -->
<VERSION>${env.BRANCH_NAME}</VERSION>
<MODULENAME>${project.artifactId}</MODULENAME>
</buildArgs>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.mb.brokerageprovider.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.data.web.ReactivePageableHandlerMethodArgumentResolver;
import org.springframework.web.reactive.config.WebFluxConfigurer;
import org.springframework.web.reactive.result.method.annotation.ArgumentResolverConfigurer;

@Configuration
public class PageableWebFluxConfiguration implements WebFluxConfigurer {

@Override
public void configureArgumentResolvers(ArgumentResolverConfigurer configurer) {
configurer.addCustomResolver(new ReactivePageableHandlerMethodArgumentResolver());
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
package com.mb.brokerageprovider.integration_tests.api.controller;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mb.brokerageprovider.api.request.ApiOrderRequest;
import com.mb.brokerageprovider.api.response.ApiOrderResponse;
import com.mb.brokerageprovider.base.BaseUnitTest;
import com.mb.brokerageprovider.config.RestResponsePage;
import com.mb.brokerageprovider.config.annotation.EnableTestcontainers;
import com.mb.brokerageprovider.exception.BaseException;
import com.mb.brokerageprovider.exception.BrokerageProviderErrorCode;
Expand All @@ -17,38 +14,32 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.http.MediaType;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.reactive.server.WebTestClient;
import reactor.core.publisher.Mono;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.BDDAssertions.then;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.hasSize;

@SpringBootTest
@EnableTestcontainers
@AutoConfigureMockMvc
@AutoConfigureWebTestClient
@ActiveProfiles("test-containers")
@TestMethodOrder(OrderAnnotation.class)
public class OrderControllerIntegrationTests extends BaseUnitTest {

@Autowired
private MockMvc mockMvc;
protected WebTestClient webTestClient;

@Autowired
private OrderService orderService;

@Autowired
private OrderMapper orderMapper;

@Autowired
private ObjectMapper objectMapper;

@Test
@Order(value = 1)
void testConnectionToDatabase() {
Expand All @@ -58,144 +49,93 @@ void testConnectionToDatabase() {

@Test
@Order(value = 2)
void testGetAllOrders() throws Exception {
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders
.get("/orders/")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status()
.isAccepted())
.andReturn();

String content = mvcResult.getResponse().getContentAsString();
Page<ApiOrderResponse> apiUserResponses = objectMapper.readValue(content, new TypeReference<RestResponsePage<ApiOrderResponse>>() {
});

then(apiUserResponses.getContent()).isEmpty();
assertThat(apiUserResponses.getContent()).hasSizeGreaterThanOrEqualTo(0);
void testGetAllOrders() {
webTestClient.get().uri("/orders/")
.accept(MediaType.APPLICATION_JSON)
.exchange()
.expectStatus().isAccepted()
.expectBody()
.jsonPath("$.content").isArray()
.jsonPath("$.content.length()").isEqualTo(0)
.jsonPath("$.content").value(hasSize(greaterThanOrEqualTo(0)))
.jsonPath("$.sort.empty").isEqualTo(true);
}

@Test
@Order(value = 3)
void testGetOrderById_ShouldFail_WhenOrderIsNotFound() throws Exception {
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders
.get("/orders/0")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status()
.isNotFound())
.andReturn();

String content = mvcResult.getResponse().getContentAsString();

BaseException baseException = objectMapper.readValue(content, BaseException.class);

then(baseException).isNotNull();
Assertions.assertEquals(BrokerageProviderErrorCode.ORDER_NOT_FOUND, baseException.getErrorCode());
void testGetOrderById_ShouldFail_WhenOrderIsNotFound() {
webTestClient.get().uri("/orders/0")
.accept(MediaType.APPLICATION_JSON)
.exchange()
.expectStatus().isNotFound()
.expectBody(BaseException.class)
.value(baseException -> Assertions.assertEquals(BrokerageProviderErrorCode.ORDER_NOT_FOUND, baseException.getErrorCode()));
}

@Test
@Order(value = 4)
void testBuyStockOrder() throws Exception {
void testBuyStockOrder() {
ApiOrderRequest apiOrderRequest = orderRequests.get(2);
String order = objectMapper.writeValueAsString(apiOrderRequest);

MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders
.post("/orders/buy")
.contentType(MediaType.APPLICATION_JSON)
.content(order))
.andExpect(status()
.isAccepted())
.andReturn();

String content = mvcResult.getResponse().getContentAsString();

ApiOrderResponse apiOrderResponse = objectMapper.readValue(content, ApiOrderResponse.class);

then(apiOrderResponse).isNotNull();
Assertions.assertEquals(apiOrderResponse.getUser().getId(), apiOrderRequest.getUserId());
webTestClient.post().uri("/orders/buy")
.contentType(MediaType.APPLICATION_JSON)
.body(Mono.just(apiOrderRequest), ApiOrderRequest.class)
.exchange()
.expectStatus().isAccepted()
.expectBody(ApiOrderResponse.class)
.value(apiOrderResponse -> Assertions.assertEquals(apiOrderResponse.getUser().getId(), apiOrderRequest.getUserId()));
}

@Test
@Order(value = 5)
void testBuyStockOrder_ShouldFail_WhenUserIsNotFound() throws Exception {
void testBuyStockOrder_ShouldFail_WhenUserIsNotFound() {
ApiOrderRequest apiOrderRequest = orderRequests.getFirst();
String order = objectMapper.writeValueAsString(apiOrderRequest);

MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders
.post("/orders/buy")
.contentType(MediaType.APPLICATION_JSON)
.content(order))
.andExpect(status()
.isNotFound())
.andReturn();

String content = mvcResult.getResponse().getContentAsString();


BaseException baseException = objectMapper.readValue(content, BaseException.class);

then(baseException).isNotNull();
Assertions.assertEquals(BrokerageProviderErrorCode.USER_NOT_FOUND, baseException.getErrorCode());
webTestClient.post().uri("/orders/buy")
.contentType(MediaType.APPLICATION_JSON)
.body(Mono.just(apiOrderRequest), ApiOrderRequest.class)
.exchange()
.expectStatus().isNotFound()
.expectBody(BaseException.class)
.value(baseException -> Assertions.assertEquals(BrokerageProviderErrorCode.USER_NOT_FOUND, baseException.getErrorCode()));
}

@Test
@Order(value = 6)
void testSellStockOrder() throws Exception {
void testSellStockOrder() {
ApiOrderRequest apiOrderRequest = orderRequests.get(1);
String order = objectMapper.writeValueAsString(apiOrderRequest);

MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders
.post("/orders/sell")
.contentType(MediaType.APPLICATION_JSON)
.content(order))
.andExpect(status()
.isAccepted())
.andReturn();

String content = mvcResult.getResponse().getContentAsString();

ApiOrderResponse apiOrderResponse = objectMapper.readValue(content, ApiOrderResponse.class);

then(apiOrderResponse).isNotNull();
Assertions.assertEquals(apiOrderResponse.getUser().getId(), apiOrderRequest.getUserId());
webTestClient.post().uri("/orders/sell")
.contentType(MediaType.APPLICATION_JSON)
.body(Mono.just(apiOrderRequest), ApiOrderRequest.class)
.exchange()
.expectStatus().isAccepted()
.expectBody(ApiOrderResponse.class)
.value(apiOrderResponse -> Assertions.assertEquals(apiOrderResponse.getUser().getId(), apiOrderRequest.getUserId()));
}

@Test
@Order(value = 7)
void testSellStockOrder_ShouldFail_WhenUserIsNotFound() throws Exception {
void testSellStockOrder_ShouldFail_WhenUserIsNotFound() {
ApiOrderRequest apiOrderRequest = orderRequests.getFirst();
String order = objectMapper.writeValueAsString(apiOrderRequest);

MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders
.post("/orders/sell")
.contentType(MediaType.APPLICATION_JSON)
.content(order))
.andExpect(status()
.isNotFound())
.andReturn();

String content = mvcResult.getResponse().getContentAsString();

BaseException baseException = objectMapper.readValue(content, BaseException.class);

then(baseException).isNotNull();
Assertions.assertEquals(BrokerageProviderErrorCode.USER_NOT_FOUND, baseException.getErrorCode());
webTestClient.post().uri("/orders/sell")
.contentType(MediaType.APPLICATION_JSON)
.body(Mono.just(apiOrderRequest), ApiOrderRequest.class)
.exchange()
.expectStatus().isNotFound()
.expectBody(BaseException.class)
.value(baseException -> Assertions.assertEquals(BrokerageProviderErrorCode.USER_NOT_FOUND, baseException.getErrorCode()));
}

@Test
@Order(value = 8)
void testCancelOrderById_ShouldFail_WhenOrderIsNotFound() throws Exception {
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders
.put("/orders/cancel/2")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status()
.isNotFound())
.andReturn();

String content = mvcResult.getResponse().getContentAsString();

BaseException baseException = objectMapper.readValue(content, BaseException.class);

then(baseException).isNotNull();
Assertions.assertEquals(BrokerageProviderErrorCode.ORDER_NOT_FOUND, baseException.getErrorCode());
void testCancelOrderById_ShouldFail_WhenOrderIsNotFound() {
webTestClient.put().uri("/orders/cancel/2")
.contentType(MediaType.APPLICATION_JSON)
.exchange()
.expectStatus().isNotFound()
.expectBody(BaseException.class)
.value(baseException -> Assertions.assertEquals(BrokerageProviderErrorCode.ORDER_NOT_FOUND, baseException.getErrorCode()));
}
}
Loading

0 comments on commit e435357

Please sign in to comment.