diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index 1a3a8c41..6e60ef81 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -35,10 +35,15 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-webmvc-test + test + - org.springframework.security - spring-security-test + org.springframework.boot + spring-boot-starter-security-test test diff --git a/integration-tests/src/test/java/my/bookshop/it/FeatureTogglesIT.java b/integration-tests/src/test/java/my/bookshop/it/FeatureTogglesIT.java index e266e334..936c9802 100644 --- a/integration-tests/src/test/java/my/bookshop/it/FeatureTogglesIT.java +++ b/integration-tests/src/test/java/my/bookshop/it/FeatureTogglesIT.java @@ -7,8 +7,8 @@ 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.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; diff --git a/pom.xml b/pom.xml index 7456aae1..7890b18d 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 3.5.14 + 4.1.0 @@ -28,9 +28,9 @@ 25 - 4.9.0 + 5.0.0-m2624 5.30.0 - 3.7.3 + 4.0.0 4.2.0 1.5.0 diff --git a/srv/pom.xml b/srv/pom.xml index eca15c24..b05e2411 100644 --- a/srv/pom.xml +++ b/srv/pom.xml @@ -110,6 +110,11 @@ spring-boot-starter-security + + org.springframework.boot + spring-boot-starter-security-oauth2-resource-server + + org.springframework.boot spring-boot-starter-actuator @@ -122,14 +127,26 @@ - org.springframework.security - spring-security-test + org.springframework.boot + spring-boot-starter-security-test + test + + + + org.springframework.boot + spring-boot-starter-webclient + test + + + + org.springframework.boot + spring-boot-webtestclient test org.springframework.boot - spring-boot-starter-webflux + spring-boot-starter-webmvc-test test diff --git a/srv/src/main/java/my/bookshop/health/CustomHealthIndicator.java b/srv/src/main/java/my/bookshop/health/CustomHealthIndicator.java index 4ecd1295..c8abcec6 100644 --- a/srv/src/main/java/my/bookshop/health/CustomHealthIndicator.java +++ b/srv/src/main/java/my/bookshop/health/CustomHealthIndicator.java @@ -1,8 +1,8 @@ package my.bookshop.health; -import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator; -import org.springframework.boot.actuate.health.Health; -import org.springframework.boot.actuate.health.HealthIndicator; +import org.springframework.boot.health.autoconfigure.contributor.ConditionalOnEnabledHealthIndicator; +import org.springframework.boot.health.contributor.Health; +import org.springframework.boot.health.contributor.HealthIndicator; import org.springframework.stereotype.Component; /** Custom health indicator implementation. */ diff --git a/srv/src/test/java/my/bookshop/AdminServiceAddress_default_ITest.java b/srv/src/test/java/my/bookshop/AdminServiceAddress_default_ITest.java index 63eef15f..90f4a4b9 100644 --- a/srv/src/test/java/my/bookshop/AdminServiceAddress_default_ITest.java +++ b/srv/src/test/java/my/bookshop/AdminServiceAddress_default_ITest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.webtestclient.autoconfigure.AutoConfigureWebTestClient; import org.springframework.test.context.ActiveProfiles; /** @@ -12,6 +13,7 @@ */ @ActiveProfiles("default") @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@AutoConfigureWebTestClient class AdminServiceAddress_default_ITest extends AdminServiceAddressITestBase { @Test diff --git a/srv/src/test/java/my/bookshop/AdminServiceAddress_mocked_ITest.java b/srv/src/test/java/my/bookshop/AdminServiceAddress_mocked_ITest.java index bd43bb1b..c2f63def 100644 --- a/srv/src/test/java/my/bookshop/AdminServiceAddress_mocked_ITest.java +++ b/srv/src/test/java/my/bookshop/AdminServiceAddress_mocked_ITest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.webtestclient.autoconfigure.AutoConfigureWebTestClient; import org.springframework.test.context.ActiveProfiles; /** @@ -16,6 +17,7 @@ webEnvironment = WebEnvironment.RANDOM_PORT, properties = "cds.remote.services.'[API_BUSINESS_PARTNER]'.destination.name=myself-AdminServiceAddressITest") +@AutoConfigureWebTestClient class AdminServiceAddress_mocked_ITest extends AdminServiceAddressITestBase { @Test diff --git a/srv/src/test/java/my/bookshop/CatalogServiceITest.java b/srv/src/test/java/my/bookshop/CatalogServiceITest.java index ee71ea3e..0902d7ee 100644 --- a/srv/src/test/java/my/bookshop/CatalogServiceITest.java +++ b/srv/src/test/java/my/bookshop/CatalogServiceITest.java @@ -1,12 +1,7 @@ package my.bookshop; import static cds.gen.catalogservice.CatalogService_.REVIEWS; -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.not; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; import cds.gen.catalogservice.Reviews; import com.sap.cds.ql.Delete; @@ -14,14 +9,14 @@ import org.junit.jupiter.api.AfterEach; 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.resttestclient.autoconfigure.AutoConfigureRestTestClient; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.client.RestTestClient; @SpringBootTest -@AutoConfigureMockMvc +@AutoConfigureRestTestClient class CatalogServiceITest { private static final String booksURI = "/api/browse/Books"; @@ -32,7 +27,7 @@ class CatalogServiceITest { private static final String USER_USER_STRING = "user"; private static final String ADMIN_USER_STRING = "admin"; - @Autowired private MockMvc mockMvc; + @Autowired private RestTestClient client; @Autowired private PersistenceService db; @@ -42,47 +37,76 @@ void cleanup() { } @Test - void discountApplied() throws Exception { - mockMvc - .perform(get(booksURI + "?$filter=stock gt 200&top=1")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.value[0].title").value(containsString("11% discount"))); + void discountApplied() { + client + .get() + .uri(booksURI + "?$filter=stock gt 200&top=1") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .jsonPath("$.value[0].title") + .value(String.class, title -> assertThat(title).contains("11% discount")); } @Test - void discountNotApplied() throws Exception { - mockMvc - .perform(get(booksURI + "?$filter=stock lt 100&top=1")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.value[0].title").value(not(containsString("11% discount")))); + void discountNotApplied() { + client + .get() + .uri(booksURI + "?$filter=stock lt 100&top=1") + .exchange() + .expectStatus() + .isOk() + .expectBody() + .jsonPath("$.value[0].title") + .value(String.class, title -> assertThat(title).doesNotContain("11% discount")); } @Test - void createReviewNotAuthenticated() throws Exception { + void createReviewNotAuthenticated() { String payload = createTestReview().toJson(); - mockMvc - .perform(post(addReviewURI).contentType(MediaType.APPLICATION_JSON).content(payload)) - .andExpect(status().isUnauthorized()); + client + .post() + .uri(addReviewURI) + .contentType(MediaType.APPLICATION_JSON) + .body(payload) + .exchange() + .expectStatus() + .isUnauthorized(); } @Test @WithMockUser(USER_USER_STRING) - void createReviewByUser() throws Exception { + void createReviewByUser() { String payload = createTestReview().toJson(); - mockMvc - .perform(post(addReviewURI).contentType(MediaType.APPLICATION_JSON).content(payload)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.createdBy").value(USER_USER_STRING)); + client + .post() + .uri(addReviewURI) + .contentType(MediaType.APPLICATION_JSON) + .body(payload) + .exchange() + .expectStatus() + .isOk() + .expectBody() + .jsonPath("$.createdBy") + .isEqualTo(USER_USER_STRING); } @Test @WithMockUser(ADMIN_USER_STRING) - void createReviewByAdmin() throws Exception { + void createReviewByAdmin() { String payload = createTestReview().toJson(); - mockMvc - .perform(post(addReviewURI).contentType(MediaType.APPLICATION_JSON).content(payload)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.createdBy").value(ADMIN_USER_STRING)); + client + .post() + .uri(addReviewURI) + .contentType(MediaType.APPLICATION_JSON) + .body(payload) + .exchange() + .expectStatus() + .isOk() + .expectBody() + .jsonPath("$.createdBy") + .isEqualTo(ADMIN_USER_STRING); } private Reviews createTestReview() { diff --git a/srv/src/test/java/my/bookshop/GenreHierarchyTest.java b/srv/src/test/java/my/bookshop/GenreHierarchyTest.java index d01f82ea..cb855973 100644 --- a/srv/src/test/java/my/bookshop/GenreHierarchyTest.java +++ b/srv/src/test/java/my/bookshop/GenreHierarchyTest.java @@ -7,8 +7,8 @@ import java.net.URI; 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.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.web.servlet.MockMvc; import org.springframework.web.util.UriComponentsBuilder; diff --git a/srv/src/test/java/my/bookshop/NotesServiceITest.java b/srv/src/test/java/my/bookshop/NotesServiceITest.java index cc6c68b2..b4179bf9 100644 --- a/srv/src/test/java/my/bookshop/NotesServiceITest.java +++ b/srv/src/test/java/my/bookshop/NotesServiceITest.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.webtestclient.autoconfigure.AutoConfigureWebTestClient; import org.springframework.http.HttpHeaders; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.reactive.server.WebTestClient; @@ -12,6 +13,7 @@ webEnvironment = WebEnvironment.RANDOM_PORT, properties = "cds.remote.services.'[API_BUSINESS_PARTNER]'.destination.name=myself-NotesServiceITest") +@AutoConfigureWebTestClient @ActiveProfiles({"default", "mocked"}) class NotesServiceITest {