diff --git a/.github/workflows/build-and-publish-antora.yml b/.github/workflows/build-and-publish-antora.yml index a418be81..c13eb2a2 100644 --- a/.github/workflows/build-and-publish-antora.yml +++ b/.github/workflows/build-and-publish-antora.yml @@ -54,7 +54,7 @@ jobs: path: build/site - name: Setup Pages - uses: actions/configure-pages@v5 + uses: actions/configure-pages@v6 - name: Upload Pages artifact uses: actions/upload-pages-artifact@v4 @@ -63,4 +63,4 @@ jobs: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml new file mode 100644 index 00000000..2909e96e --- /dev/null +++ b/.github/workflows/copilot-setup-steps.yml @@ -0,0 +1,30 @@ +name: "Copilot Setup Steps" + +on: + workflow_dispatch: + push: + paths: + - .github/workflows/copilot-setup-steps.yml + pull_request: + paths: + - .github/workflows/copilot-setup-steps.yml + +jobs: + copilot-setup-steps: + runs-on: ubuntu-latest + + permissions: + contents: read + + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Set up JDK 25 + uses: actions/setup-java@v5 + with: + java-version: "25" + distribution: "temurin" + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v6 diff --git a/.github/workflows/gradle-build.yml b/.github/workflows/gradle-build.yml index bb4207b3..f2805b07 100644 --- a/.github/workflows/gradle-build.yml +++ b/.github/workflows/gradle-build.yml @@ -66,7 +66,7 @@ jobs: java-version: '25' distribution: 'temurin' - name: Setup Gradle - uses: gradle/actions/setup-gradle@v5 + uses: gradle/actions/setup-gradle@v6 with: add-job-summary-as-pr-comment: on-failure build-scan-publish: true @@ -98,7 +98,7 @@ jobs: distribution: 'temurin' java-version: 25 - name: Generate and submit dependency graph - uses: gradle/actions/dependency-submission@v5 + uses: gradle/actions/dependency-submission@v6 with: build-scan-publish: true build-scan-terms-of-use-url: "https://gradle.com/terms-of-service" @@ -119,7 +119,7 @@ jobs: java-version: '25' distribution: 'temurin' - name: Setup Gradle - uses: gradle/actions/setup-gradle@v5 + uses: gradle/actions/setup-gradle@v6 with: add-job-summary-as-pr-comment: on-failure build-scan-publish: true diff --git a/README.adoc b/README.adoc index 68c2aa2d..d99d9d2e 100644 --- a/README.adoc +++ b/README.adoc @@ -9,7 +9,7 @@ Spring Data, Spring Batch, Spring Cloud, Spring Security, Spring GraphQL, and Sp with source code in individual submodules and can be found on {url-quickref}[GitHub]. image:https://img.shields.io/badge/Java_-25-blue?style=flat-square[Static Badge] -image:https://img.shields.io/badge/Spring_Boot-3.5.6-blue?style=flat-square&logo=springboot[Spring Boot version] +image:https://img.shields.io/badge/Spring_Boot-4.0.5-blue?style=flat-square&logo=springboot[Spring Boot version] image:https://img.shields.io/github/actions/workflow/status/rashidi/spring-boot-tutorials/gradle-build.yml?style=flat-square&logo=githubactions&color=blue[Gradle Build] image:https://img.shields.io/github/actions/workflow/status/rashidi/spring-boot-tutorials/build-and-publish-antora.yml?style=flat-square&logo=antora&label=Antora&color=blue[Antora Site Status, link={url-docs}] image:https://img.shields.io/sonar/coverage/rashidi_spring-boot-tutorials?server=https%3A%2F%2Fsonarcloud.io&style=flat-square&color=blue[Sonar Coverage] @@ -28,7 +28,7 @@ and always will be, my primary goal. With the help of https://github.com/dependabot[Dependabot], each tutorial is also kept up-to-date with the latest dependencies. Currently, we are using Java https://adoptium.net/en-GB/temurin/releases?version=25[Temurin 25] -with https://plugins.gradle.org/plugin/org.springframework.boot/3.5.6[Spring Boot 3.5.6]. +with https://plugins.gradle.org/plugin/org.springframework.boot/4.0.5[Spring Boot 4.0.5]. == Documentation diff --git a/batch-rest-repository/README.adoc b/batch-rest-repository/README.adoc index 7ea8ecc9..199bec87 100644 --- a/batch-rest-repository/README.adoc +++ b/batch-rest-repository/README.adoc @@ -115,7 +115,7 @@ class UserBatchJobTests { private final static MongoDBContainer MONGO_DB_CONTAINER = new MongoDBContainer("mongo:latest"); @Autowired - private JobLauncherTestUtils launcher; + private JobOperatorTestUtils operator; @Autowired private MongoOperations mongoOperations; @@ -125,7 +125,7 @@ class UserBatchJobTests { void launch() { await().atMost(ofSeconds(30)).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); diff --git a/batch-rest-repository/build.gradle.kts b/batch-rest-repository/build.gradle.kts index 967f6ee6..f6d85a7b 100644 --- a/batch-rest-repository/build.gradle.kts +++ b/batch-rest-repository/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,14 +20,15 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-batch") implementation("org.springframework.boot:spring-boot-starter-data-mongodb") - implementation("com.fasterxml.jackson.core:jackson-databind") + implementation("tools.jackson.core:jackson-databind") runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-starter-jdbc") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.springframework.batch:spring-batch-test") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java b/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java index e5e86bc3..7362cc3f 100644 --- a/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java +++ b/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java @@ -1,41 +1,46 @@ package zin.rashidi.boot.batch.rest.user; import java.net.MalformedURLException; - -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.json.JsonMapper; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; -import org.springframework.batch.item.data.MongoItemWriter; -import org.springframework.batch.item.data.builder.MongoItemWriterBuilder; -import org.springframework.batch.item.json.JacksonJsonObjectReader; -import org.springframework.batch.item.json.JsonItemReader; -import org.springframework.batch.item.json.builder.JsonItemReaderBuilder; +import org.springframework.batch.infrastructure.item.data.MongoItemWriter; +import org.springframework.batch.infrastructure.item.data.builder.MongoItemWriterBuilder; +import org.springframework.batch.infrastructure.item.json.JacksonJsonObjectReader; +import org.springframework.batch.infrastructure.item.json.JsonItemReader; +import org.springframework.batch.infrastructure.item.json.builder.JsonItemReaderBuilder; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.UrlResource; +import org.springframework.core.io.Resource; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.transaction.PlatformTransactionManager; -import com.fasterxml.jackson.databind.ObjectMapper; - /** * @author Rashidi Zin */ @Configuration class UserJobConfiguration { - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + private static final JsonMapper OBJECT_MAPPER = JsonMapper.builder() + .disable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS) + .build(); private final JobRepository jobRepository; private final PlatformTransactionManager transactionManager; private final MongoOperations mongo; + private final Resource usersResource; - UserJobConfiguration(JobRepository jobRepository, PlatformTransactionManager transactionManager, MongoOperations mongo) { + UserJobConfiguration(JobRepository jobRepository, PlatformTransactionManager transactionManager, MongoOperations mongo, + @Value("${batch.users.resource:https://jsonplaceholder.typicode.com/users}") Resource usersResource) { this.jobRepository = jobRepository; this.transactionManager = transactionManager; this.mongo = mongo; + this.usersResource = usersResource; } @Bean @@ -45,13 +50,14 @@ public Job userJob() throws MalformedURLException { private Step step() throws MalformedURLException { return new StepBuilder("userStep", jobRepository) - .chunk(10, transactionManager) + .chunk(10) + .transactionManager(transactionManager) .reader(reader()) .writer(writer()) .build(); } - private JsonItemReader reader() throws MalformedURLException { + private JsonItemReader reader() { JacksonJsonObjectReader jsonObjectReader = new JacksonJsonObjectReader<>(User.class); jsonObjectReader.setMapper(OBJECT_MAPPER); @@ -59,7 +65,7 @@ private JsonItemReader reader() throws MalformedURLException { return new JsonItemReaderBuilder() .name("userReader") .jsonObjectReader(jsonObjectReader) - .resource(new UrlResource("https://jsonplaceholder.typicode.com/users")) + .resource(usersResource) .build(); } diff --git a/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java b/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java index a54d89e6..a1c27f4f 100644 --- a/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java +++ b/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java @@ -4,8 +4,9 @@ import com.mongodb.MongoClientSettings; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; -import org.springframework.batch.test.JobLauncherTestUtils; +import org.springframework.batch.core.configuration.support.JdbcDefaultBatchConfiguration; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.test.JobOperatorTestUtils; import org.springframework.batch.test.context.SpringBatchTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.jdbc.DataSourceBuilder; @@ -17,10 +18,10 @@ import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.jdbc.support.JdbcTransactionManager; import org.springframework.transaction.PlatformTransactionManager; -import org.testcontainers.containers.MongoDBContainer; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; +import org.testcontainers.mysql.MySQLContainer; import javax.sql.DataSource; @@ -28,7 +29,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.batch.core.ExitStatus.COMPLETED; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; -import static org.testcontainers.shaded.org.awaitility.Awaitility.await; +import static org.awaitility.Awaitility.await; import static zin.rashidi.boot.batch.rest.user.UserBatchJobTests.BatchTestConfiguration; import static zin.rashidi.boot.batch.rest.user.UserBatchJobTests.MongoTestConfiguration; @@ -37,12 +38,13 @@ */ @Testcontainers @SpringBatchTest -@SpringBootTest(classes = { BatchTestConfiguration.class, MongoTestConfiguration.class, UserJobConfiguration.class }, webEnvironment = NONE) +@SpringBootTest(classes = { BatchTestConfiguration.class, MongoTestConfiguration.class, UserJobConfiguration.class }, webEnvironment = NONE, + properties = "batch.users.resource=classpath:users.json") class UserBatchJobTests { @Container @ServiceConnection - private final static MySQLContainer MYSQL_CONTAINER = new MySQLContainer<>("mysql:lts") + private final static MySQLContainer MYSQL_CONTAINER = new MySQLContainer("mysql:lts") .withInitScript("org/springframework/batch/core/schema-mysql.sql"); @Container @@ -50,7 +52,7 @@ class UserBatchJobTests { private final static MongoDBContainer MONGO_DB_CONTAINER = new MongoDBContainer("mongo:latest"); @Autowired - private JobLauncherTestUtils launcher; + private JobOperatorTestUtils operator; @Autowired private MongoOperations mongoOperations; @@ -60,7 +62,7 @@ class UserBatchJobTests { void launch() { await().atMost(ofSeconds(30)).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); @@ -71,7 +73,7 @@ void launch() { } @TestConfiguration - static class BatchTestConfiguration extends DefaultBatchConfiguration { + static class BatchTestConfiguration extends JdbcDefaultBatchConfiguration { @Override protected DataSource getDataSource() { diff --git a/batch-rest-repository/src/test/resources/users.json b/batch-rest-repository/src/test/resources/users.json new file mode 100644 index 00000000..65c972e7 --- /dev/null +++ b/batch-rest-repository/src/test/resources/users.json @@ -0,0 +1,12 @@ +[ + {"id": 1, "username": "Bret"}, + {"id": 2, "username": "Antonette"}, + {"id": 3, "username": "Samantha"}, + {"id": 4, "username": "Karianne"}, + {"id": 5, "username": "Kamren"}, + {"id": 6, "username": "Leopoldo_Corkery"}, + {"id": 7, "username": "Elwyn.Skiles"}, + {"id": 8, "username": "Maxime_Nienow"}, + {"id": 9, "username": "Delphine"}, + {"id": 10, "username": "Moriah.Stiedemann"} +] diff --git a/batch-skip-step/README.adoc b/batch-skip-step/README.adoc index 20cf9e81..494b7067 100644 --- a/batch-skip-step/README.adoc +++ b/batch-skip-step/README.adoc @@ -125,7 +125,7 @@ class UserBatchJobTests { private final static MySQLContainer MYSQL_CONTAINER = new MySQLContainer<>("mysql:lts"); @Autowired - private JobLauncherTestUtils launcher; + private JobOperatorTestUtils operator; @Autowired private JdbcTemplate jdbc; @@ -135,7 +135,7 @@ class UserBatchJobTests { void findAll() { await().atMost(10, SECONDS).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); diff --git a/batch-skip-step/build.gradle.kts b/batch-skip-step/build.gradle.kts index 4b03d08c..ee8c24b0 100644 --- a/batch-skip-step/build.gradle.kts +++ b/batch-skip-step/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,13 +20,13 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-batch") implementation("org.springframework.boot:spring-boot-starter-data-jdbc") - implementation("com.fasterxml.jackson.core:jackson-databind") + implementation("tools.jackson.core:jackson-databind") runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.springframework.batch:spring-batch-test") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java b/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java index 1588bf0f..bcf428b2 100644 --- a/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java +++ b/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java @@ -1,17 +1,18 @@ package zin.rashidi.boot.batch.user; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.json.JsonMapper; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; -import org.springframework.batch.item.ItemProcessor; -import org.springframework.batch.item.database.JdbcBatchItemWriter; -import org.springframework.batch.item.database.builder.JdbcBatchItemWriterBuilder; -import org.springframework.batch.item.json.JacksonJsonObjectReader; -import org.springframework.batch.item.json.JsonItemReader; -import org.springframework.batch.item.json.builder.JsonItemReaderBuilder; +import org.springframework.batch.infrastructure.item.ItemProcessor; +import org.springframework.batch.infrastructure.item.database.JdbcBatchItemWriter; +import org.springframework.batch.infrastructure.item.database.builder.JdbcBatchItemWriterBuilder; +import org.springframework.batch.infrastructure.item.json.JacksonJsonObjectReader; +import org.springframework.batch.infrastructure.item.json.JsonItemReader; +import org.springframework.batch.infrastructure.item.json.builder.JsonItemReaderBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; @@ -25,7 +26,9 @@ @Configuration class UserJobConfiguration { - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + private static final JsonMapper OBJECT_MAPPER = JsonMapper.builder() + .disable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS) + .build(); private JsonItemReader reader() { JacksonJsonObjectReader reader = new JacksonJsonObjectReader<>(UserFile.class); @@ -61,7 +64,8 @@ private JdbcBatchItemWriter writer(DataSource dataSource) { private Step step(JobRepository jobRepository, PlatformTransactionManager transactionManager, DataSource dataSource) { return new StepBuilder("userStep", jobRepository) - .chunk(10, transactionManager) + .chunk(10) + .transactionManager(transactionManager) .reader(reader()) .processor(processor()) .writer(writer(dataSource)) diff --git a/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java b/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java index 54540225..38c14e71 100644 --- a/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java +++ b/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java @@ -3,8 +3,9 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; -import org.springframework.batch.test.JobLauncherTestUtils; +import org.springframework.batch.core.configuration.support.JdbcDefaultBatchConfiguration; +import org.springframework.batch.core.job.JobExecution; +import org.springframework.batch.test.JobOperatorTestUtils; import org.springframework.batch.test.context.SpringBatchTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.jdbc.DataSourceBuilder; @@ -16,9 +17,9 @@ import org.springframework.jdbc.support.JdbcTransactionManager; import org.springframework.test.context.jdbc.Sql; import org.springframework.transaction.PlatformTransactionManager; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import javax.sql.DataSource; @@ -26,7 +27,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.batch.core.ExitStatus.COMPLETED; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; -import static org.testcontainers.shaded.org.awaitility.Awaitility.await; +import static org.awaitility.Awaitility.await; import static zin.rashidi.boot.batch.user.UserBatchJobTests.BatchTestConfiguration; import static zin.rashidi.boot.batch.user.UserBatchJobTests.JdbcTestConfiguration; @@ -51,10 +52,10 @@ class UserBatchJobTests { @Container @ServiceConnection - private final static MySQLContainer MYSQL_CONTAINER = new MySQLContainer<>("mysql:lts"); + private final static MySQLContainer MYSQL_CONTAINER = new MySQLContainer("mysql:lts"); @Autowired - private JobLauncherTestUtils launcher; + private JobOperatorTestUtils operator; @Autowired private JdbcTemplate jdbc; @@ -64,7 +65,7 @@ class UserBatchJobTests { void findAll() { await().atMost(10, SECONDS).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); @@ -80,7 +81,7 @@ void findAll() { void skipByNullOutput() { await().atMost(10, SECONDS).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); @@ -95,7 +96,7 @@ void skipByNullOutput() { void skipByException() { await().atMost(10, SECONDS).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); @@ -111,7 +112,7 @@ void truncateUsers() { } @TestConfiguration - static class BatchTestConfiguration extends DefaultBatchConfiguration { + static class BatchTestConfiguration extends JdbcDefaultBatchConfiguration { @Override @Bean diff --git a/build.gradle.kts b/build.gradle.kts index c9db1bc8..6d0af3d4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,7 @@ import org.springframework.boot.gradle.plugin.SpringBootPlugin plugins { java - id("org.springframework.boot") version "3.5.7" apply false + id("org.springframework.boot") version "4.0.5" apply false id("io.spring.dependency-management") version "1.1.7" id("org.sonarqube") version "7.2.3.7755" id("jacoco-report-aggregation") diff --git a/cloud-jdbc-env-repo/build.gradle.kts b/cloud-jdbc-env-repo/build.gradle.kts index 1365b130..91627f02 100644 --- a/cloud-jdbc-env-repo/build.gradle.kts +++ b/cloud-jdbc-env-repo/build.gradle.kts @@ -1,13 +1,13 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } group = "zin.rashidi.boot" version = "0.0.1-SNAPSHOT" -val springCloudVersion = "2025.0.0" +val springCloudVersion = "2025.1.1" java { toolchain { @@ -32,11 +32,12 @@ dependencies { implementation("org.springframework.cloud:spring-cloud-starter-bootstrap") implementation("org.springframework.cloud:spring-cloud-config-server") runtimeOnly("com.mysql:mysql-connector-j") + testImplementation("org.springframework.boot:spring-boot-resttestclient") annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/cloud-jdbc-env-repo/src/test/java/zin/rashidi/boot/cloud/jdbcenvrepo/CloudJdbcEnvRepoApplicationTests.java b/cloud-jdbc-env-repo/src/test/java/zin/rashidi/boot/cloud/jdbcenvrepo/CloudJdbcEnvRepoApplicationTests.java index ba2d8cfa..5f470386 100644 --- a/cloud-jdbc-env-repo/src/test/java/zin/rashidi/boot/cloud/jdbcenvrepo/CloudJdbcEnvRepoApplicationTests.java +++ b/cloud-jdbc-env-repo/src/test/java/zin/rashidi/boot/cloud/jdbcenvrepo/CloudJdbcEnvRepoApplicationTests.java @@ -3,21 +3,23 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.testcontainers.containers.MySQLContainer; +import org.springframework.boot.resttestclient.TestRestTemplate; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +@AutoConfigureTestRestTemplate @Testcontainers @SpringBootTest(properties = "spring.datasource.url=jdbc:tc:mysql:lts:///test?TC_INITSCRIPT=init-script.sql", webEnvironment = RANDOM_PORT) class CloudJdbcEnvRepoApplicationTests { @Container - private static final MySQLContainer MYSQL = new MySQLContainer<>("mysql:lts"); + private static final MySQLContainer MYSQL = new MySQLContainer("mysql:lts"); @Autowired private TestRestTemplate restClient; diff --git a/cloud-jdbc-env-repo/src/test/resources/META-INF/spring.factories b/cloud-jdbc-env-repo/src/test/resources/META-INF/spring.factories new file mode 100644 index 00000000..f2d56675 --- /dev/null +++ b/cloud-jdbc-env-repo/src/test/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.cloud.bootstrap.BootstrapConfiguration=\ +org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration,\ +org.springframework.boot.jdbc.autoconfigure.JdbcTemplateAutoConfiguration diff --git a/data-domain-events/build.gradle.kts b/data-domain-events/build.gradle.kts index 86a71724..52ae3c3f 100644 --- a/data-domain-events/build.gradle.kts +++ b/data-domain-events/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -19,12 +19,14 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-webmvc") runtimeOnly("com.mysql:mysql-connector-j") + testImplementation("org.springframework.boot:spring-boot-restclient") + testImplementation("org.springframework.boot:spring-boot-resttestclient") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/data-domain-events/src/test/java/zin/rashidi/boot/data/de/TestDataDomainEventsApplication.java b/data-domain-events/src/test/java/zin/rashidi/boot/data/de/TestDataDomainEventsApplication.java index e2ab7bbf..69ce8800 100644 --- a/data-domain-events/src/test/java/zin/rashidi/boot/data/de/TestDataDomainEventsApplication.java +++ b/data-domain-events/src/test/java/zin/rashidi/boot/data/de/TestDataDomainEventsApplication.java @@ -4,15 +4,15 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.mysql.MySQLContainer; @TestConfiguration(proxyBeanMethods = false) public class TestDataDomainEventsApplication { @Bean @ServiceConnection - MySQLContainer mysqlContainer() { - return new MySQLContainer<>("mysql:lts"); + MySQLContainer mysqlContainer() { + return new MySQLContainer("mysql:lts"); } public static void main(String[] args) { diff --git a/data-domain-events/src/test/java/zin/rashidi/boot/data/de/availability/BookPurchaseTests.java b/data-domain-events/src/test/java/zin/rashidi/boot/data/de/availability/BookPurchaseTests.java index cee9c59f..1267d064 100644 --- a/data-domain-events/src/test/java/zin/rashidi/boot/data/de/availability/BookPurchaseTests.java +++ b/data-domain-events/src/test/java/zin/rashidi/boot/data/de/availability/BookPurchaseTests.java @@ -6,9 +6,10 @@ 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.beans.factory.annotation.Autowired; +import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.resttestclient.TestRestTemplate; import zin.rashidi.boot.data.de.TestDataDomainEventsApplication; import zin.rashidi.boot.data.de.book.Book; @@ -17,6 +18,7 @@ /** * @author Rashidi Zin */ +@AutoConfigureTestRestTemplate @SpringBootTest( classes = TestDataDomainEventsApplication.class, properties = "spring.jpa.hibernate.ddl-auto=create", diff --git a/data-envers-audit/build.gradle.kts b/data-envers-audit/build.gradle.kts index a67ef353..e7bcf2ef 100644 --- a/data-envers-audit/build.gradle.kts +++ b/data-envers-audit/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -23,8 +23,8 @@ dependencies { runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/data-envers-audit/src/test/java/zin/rashidi/boot/data/envers/BookAuditRevisionTests.java b/data-envers-audit/src/test/java/zin/rashidi/boot/data/envers/BookAuditRevisionTests.java index 0d9249cd..f3a61d38 100644 --- a/data-envers-audit/src/test/java/zin/rashidi/boot/data/envers/BookAuditRevisionTests.java +++ b/data-envers-audit/src/test/java/zin/rashidi/boot/data/envers/BookAuditRevisionTests.java @@ -12,10 +12,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.data.history.Revision; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; - +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import zin.rashidi.boot.data.envers.book.Book; import zin.rashidi.boot.data.envers.book.BookRepository; @@ -28,7 +27,7 @@ class BookAuditRevisionTests { @Container @ServiceConnection - private static final MySQLContainer MYSQL = new MySQLContainer<>("mysql:lts"); + private static final MySQLContainer MYSQL = new MySQLContainer("mysql:lts"); @Autowired private BookRepository repository; diff --git a/data-jdbc-audit/build.gradle.kts b/data-jdbc-audit/build.gradle.kts index d99dfabb..93d69db3 100644 --- a/data-jdbc-audit/build.gradle.kts +++ b/data-jdbc-audit/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -21,9 +21,10 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jdbc") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-jdbc-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/TestcontainersConfiguration.java b/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/TestcontainersConfiguration.java index 6f705f7f..7b2c81a3 100644 --- a/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/TestcontainersConfiguration.java +++ b/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } } diff --git a/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/user/UserAuditTests.java b/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/user/UserAuditTests.java index 58924736..bf0b13f1 100644 --- a/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/user/UserAuditTests.java +++ b/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/user/UserAuditTests.java @@ -3,15 +3,15 @@ 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.data.jdbc.DataJdbcTest; +import org.springframework.boot.data.jdbc.test.autoconfigure.DataJdbcTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.data.jdbc.repository.config.EnableJdbcAuditing; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.util.ReflectionTestUtils; -import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; import java.time.Instant; @@ -32,7 +32,7 @@ class UserAuditTests { @Container @ServiceConnection - private static final PostgreSQLContainer postgres = new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + private static final PostgreSQLContainer postgres = new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); @Autowired private UserRepository repository; diff --git a/data-jdbc-schema-generation/build.gradle.kts b/data-jdbc-schema-generation/build.gradle.kts index 9f2c6af0..dc973e3f 100644 --- a/data-jdbc-schema-generation/build.gradle.kts +++ b/data-jdbc-schema-generation/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -19,12 +19,13 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jdbc") - implementation("org.liquibase:liquibase-core") + implementation("org.springframework.boot:spring-boot-starter-liquibase") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-jdbc-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/TestcontainersConfiguration.java b/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/TestcontainersConfiguration.java index 4a4c29e8..8b9b6ebd 100644 --- a/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/TestcontainersConfiguration.java +++ b/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ public class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } } diff --git a/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/book/BookRepositoryTests.java b/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/book/BookRepositoryTests.java index 1dc3b6c7..68cfc6be 100644 --- a/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/book/BookRepositoryTests.java +++ b/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/book/BookRepositoryTests.java @@ -4,7 +4,7 @@ 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.data.jdbc.DataJdbcTest; +import org.springframework.boot.data.jdbc.test.autoconfigure.DataJdbcTest; import org.springframework.context.annotation.Import; import org.springframework.core.io.FileSystemResource; import org.springframework.data.jdbc.core.mapping.schema.LiquibaseChangeSetWriter; diff --git a/data-jpa-audit/build.gradle.kts b/data-jpa-audit/build.gradle.kts index 65c861c6..e18df045 100644 --- a/data-jpa-audit/build.gradle.kts +++ b/data-jpa-audit/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,10 +20,11 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") runtimeOnly("com.mysql:mysql-connector-j") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/data-jpa-audit/src/test/java/zin/rashidi/boot/data/user/UserAuditTests.java b/data-jpa-audit/src/test/java/zin/rashidi/boot/data/user/UserAuditTests.java index b1244e8b..02594bf7 100644 --- a/data-jpa-audit/src/test/java/zin/rashidi/boot/data/user/UserAuditTests.java +++ b/data-jpa-audit/src/test/java/zin/rashidi/boot/data/user/UserAuditTests.java @@ -3,15 +3,15 @@ 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.orm.jpa.DataJpaTest; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.util.ReflectionTestUtils; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import java.time.Instant; @@ -26,7 +26,7 @@ class UserAuditTests { @Container @ServiceConnection - private final static MySQLContainer MYSQL = new MySQLContainer<>("mysql:lts"); + private final static MySQLContainer MYSQL = new MySQLContainer("mysql:lts"); @Autowired private UserRepository repository; diff --git a/data-jpa-event/build.gradle.kts b/data-jpa-event/build.gradle.kts index 7bdc163b..2f21e37e 100644 --- a/data-jpa-event/build.gradle.kts +++ b/data-jpa-event/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,10 +20,11 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") runtimeOnly("org.postgresql:postgresql") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/data-jpa-event/src/test/java/zin/rashidi/data/event/TestcontainersConfiguration.java b/data-jpa-event/src/test/java/zin/rashidi/data/event/TestcontainersConfiguration.java index c83abe78..fbd5fc2c 100644 --- a/data-jpa-event/src/test/java/zin/rashidi/data/event/TestcontainersConfiguration.java +++ b/data-jpa-event/src/test/java/zin/rashidi/data/event/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } } diff --git a/data-jpa-event/src/test/java/zin/rashidi/data/event/user/UserRepositoryTests.java b/data-jpa-event/src/test/java/zin/rashidi/data/event/user/UserRepositoryTests.java index 268c7242..9c0c4545 100644 --- a/data-jpa-event/src/test/java/zin/rashidi/data/event/user/UserRepositoryTests.java +++ b/data-jpa-event/src/test/java/zin/rashidi/data/event/user/UserRepositoryTests.java @@ -3,13 +3,13 @@ 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.orm.jpa.DataJpaTest; -import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; +import org.springframework.boot.jpa.test.autoconfigure.TestEntityManager; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; -import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -24,7 +24,7 @@ class UserRepositoryTests { @Container @ServiceConnection - private static final PostgreSQLContainer postgresql = new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + private static final PostgreSQLContainer postgresql = new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); @Autowired private TestEntityManager em; diff --git a/data-jpa-filtered-query/build.gradle.kts b/data-jpa-filtered-query/build.gradle.kts index 65c861c6..e18df045 100644 --- a/data-jpa-filtered-query/build.gradle.kts +++ b/data-jpa-filtered-query/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,10 +20,11 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") runtimeOnly("com.mysql:mysql-connector-j") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/TestDataJpaFilteredQueryApplication.java b/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/TestDataJpaFilteredQueryApplication.java index fb58524f..7ad7f51f 100644 --- a/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/TestDataJpaFilteredQueryApplication.java +++ b/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/TestDataJpaFilteredQueryApplication.java @@ -4,7 +4,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.mysql.MySQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -12,8 +12,8 @@ public class TestDataJpaFilteredQueryApplication { @Bean @ServiceConnection - MySQLContainer mysqlContainer() { - return new MySQLContainer<>(DockerImageName.parse("mysql:lts")); + MySQLContainer mysqlContainer() { + return new MySQLContainer(DockerImageName.parse("mysql:lts")); } public static void main(String[] args) { diff --git a/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/country/CountryRepositoryTests.java b/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/country/CountryRepositoryTests.java index 4b122294..9b5b4c5a 100644 --- a/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/country/CountryRepositoryTests.java +++ b/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/country/CountryRepositoryTests.java @@ -4,13 +4,13 @@ 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.orm.jpa.DataJpaTest; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import java.util.List; @@ -29,7 +29,7 @@ class CountryRepositoryTests { @Container @ServiceConnection - private static final MySQLContainer mysql = new MySQLContainer<>("mysql:lts"); + private static final MySQLContainer mysql = new MySQLContainer("mysql:lts"); @Autowired private CountryRepository countries; diff --git a/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/user/UserRepositoryTests.java b/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/user/UserRepositoryTests.java index e92210b6..26315ad9 100644 --- a/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/user/UserRepositoryTests.java +++ b/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/user/UserRepositoryTests.java @@ -4,13 +4,13 @@ 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.orm.jpa.DataJpaTest; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import java.util.List; @@ -31,7 +31,7 @@ class UserRepositoryTests { @Container @ServiceConnection - private static final MySQLContainer mysql = new MySQLContainer<>("mysql:lts"); + private static final MySQLContainer mysql = new MySQLContainer("mysql:lts"); @Autowired private UserRepository users; diff --git a/data-jpa-hibernate-cache/build.gradle.kts b/data-jpa-hibernate-cache/build.gradle.kts index 80c66512..17aec68e 100644 --- a/data-jpa-hibernate-cache/build.gradle.kts +++ b/data-jpa-hibernate-cache/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -18,14 +18,15 @@ repositories { } dependencies { - implementation("org.ehcache:ehcache::jakarta") + implementation("org.ehcache:ehcache:3.10.9:jakarta") implementation("org.hibernate.orm:hibernate-jcache") implementation("org.springframework.boot:spring-boot-starter-data-jpa") runtimeOnly("org.postgresql:postgresql") - testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") + testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/TestcontainersConfiguration.java b/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/TestcontainersConfiguration.java index bedc6fa6..3a3d0532 100644 --- a/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/TestcontainersConfiguration.java +++ b/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ public class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } } diff --git a/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/customer/CustomerRepositoryTests.java b/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/customer/CustomerRepositoryTests.java index 82090a63..8f456daa 100644 --- a/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/customer/CustomerRepositoryTests.java +++ b/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/customer/CustomerRepositoryTests.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.*; import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; import org.springframework.transaction.annotation.Transactional; diff --git a/data-mongodb-audit/build.gradle.kts b/data-mongodb-audit/build.gradle.kts index 0a0874b9..305d8adc 100644 --- a/data-mongodb-audit/build.gradle.kts +++ b/data-mongodb-audit/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,9 +20,10 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-mongodb-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") } tasks.named("test") { diff --git a/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java b/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java index 5469b91d..30318bc2 100644 --- a/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java +++ b/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java @@ -3,18 +3,18 @@ import static java.time.Duration.ofSeconds; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.context.annotation.FilterType.ANNOTATION; -import static org.testcontainers.shaded.org.awaitility.Awaitility.await; +import static org.awaitility.Awaitility.await; 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.data.mongo.DataMongoTest; +import org.springframework.boot.data.mongodb.test.autoconfigure.DataMongoTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.data.mongodb.config.EnableMongoAuditing; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; /** * @author Rashidi Zin diff --git a/data-mongodb-full-text-search/build.gradle.kts b/data-mongodb-full-text-search/build.gradle.kts index 0a0874b9..305d8adc 100644 --- a/data-mongodb-full-text-search/build.gradle.kts +++ b/data-mongodb-full-text-search/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,9 +20,10 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-mongodb-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") } tasks.named("test") { diff --git a/data-mongodb-full-text-search/src/test/java/zin/rashidi/boot/data/mongodb/character/CharacterRepositoryTests.java b/data-mongodb-full-text-search/src/test/java/zin/rashidi/boot/data/mongodb/character/CharacterRepositoryTests.java index 9ce38f34..00d083e7 100644 --- a/data-mongodb-full-text-search/src/test/java/zin/rashidi/boot/data/mongodb/character/CharacterRepositoryTests.java +++ b/data-mongodb-full-text-search/src/test/java/zin/rashidi/boot/data/mongodb/character/CharacterRepositoryTests.java @@ -9,15 +9,15 @@ 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.data.mongo.DataMongoTest; +import org.springframework.boot.data.mongodb.test.autoconfigure.DataMongoTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.index.TextIndexDefinition; import org.springframework.data.mongodb.core.query.TextCriteria; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; /** * @author Rashidi Zin diff --git a/data-mongodb-tc-data-load/build.gradle.kts b/data-mongodb-tc-data-load/build.gradle.kts index 3b9aa08a..4c1004a1 100644 --- a/data-mongodb-tc-data-load/build.gradle.kts +++ b/data-mongodb-tc-data-load/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,10 +20,11 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-mongodb-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") - testImplementation("com.fasterxml.jackson.core:jackson-databind") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") + testImplementation("tools.jackson.core:jackson-databind") } tasks.named("test") { diff --git a/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java b/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java index c1a647d7..1d18c9aa 100644 --- a/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java +++ b/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java @@ -3,17 +3,17 @@ 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.data.mongo.DataMongoTest; +import org.springframework.boot.data.mongodb.test.autoconfigure.DataMongoTest; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.data.repository.init.Jackson2RepositoryPopulatorFactoryBean; -import org.testcontainers.containers.MongoDBContainer; +import org.springframework.data.repository.init.JacksonRepositoryPopulatorFactoryBean; import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.context.annotation.FilterType.ASSIGNABLE_TYPE; @@ -54,8 +54,8 @@ void findByUsernameWithNonExistingUsername() { static class RepositoryPopulatorTestConfiguration { @Bean - public Jackson2RepositoryPopulatorFactoryBean jacksonRepositoryPopulator() { - var populator = new Jackson2RepositoryPopulatorFactoryBean(); + public JacksonRepositoryPopulatorFactoryBean jacksonRepositoryPopulator() { + var populator = new JacksonRepositoryPopulatorFactoryBean(); populator.setResources(new Resource[] { new ClassPathResource("users.json") }); return populator; } diff --git a/data-mongodb-transactional/build.gradle.kts b/data-mongodb-transactional/build.gradle.kts index 1a614a13..d6fbef38 100644 --- a/data-mongodb-transactional/build.gradle.kts +++ b/data-mongodb-transactional/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -19,11 +19,13 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-webmvc") + testImplementation("org.springframework.boot:spring-boot-restclient") + testImplementation("org.springframework.boot:spring-boot-resttestclient") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") } tasks.named("test") { diff --git a/data-mongodb-transactional/src/test/java/zin/rashidi/boot/data/mongodb/tm/user/CreateUserTests.java b/data-mongodb-transactional/src/test/java/zin/rashidi/boot/data/mongodb/tm/user/CreateUserTests.java index 588f0d3e..38d5d2e2 100644 --- a/data-mongodb-transactional/src/test/java/zin/rashidi/boot/data/mongodb/tm/user/CreateUserTests.java +++ b/data-mongodb-transactional/src/test/java/zin/rashidi/boot/data/mongodb/tm/user/CreateUserTests.java @@ -1,15 +1,16 @@ package zin.rashidi.boot.data.mongodb.tm.user; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.resttestclient.TestRestTemplate; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; @@ -20,13 +21,14 @@ /** * @author Rashidi Zin */ +@AutoConfigureTestRestTemplate @SpringBootTest(webEnvironment = RANDOM_PORT) @Testcontainers class CreateUserTests { @Container @ServiceConnection - private static final MongoDBContainer mongo = new MongoDBContainer("mongo:latest"); + private static final MongoDBContainer mongo = new MongoDBContainer("mongo:latest").withReplicaSet(); @Autowired private TestRestTemplate restTemplate; diff --git a/data-redis-cache/build.gradle.kts b/data-redis-cache/build.gradle.kts index 7cded78d..ca12ead4 100644 --- a/data-redis-cache/build.gradle.kts +++ b/data-redis-cache/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -22,9 +22,12 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-redis") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") + testImplementation("org.springframework.boot:spring-boot-cache") + testImplementation("org.springframework.boot:spring-boot-data-redis") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testImplementation("com.redis:testcontainers-redis") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/data-redis-cache/src/main/java/zin/rashidi/dataredis/cache/cache/CacheConfiguration.java b/data-redis-cache/src/main/java/zin/rashidi/dataredis/cache/cache/CacheConfiguration.java index 93004ca2..91c9fc2d 100644 --- a/data-redis-cache/src/main/java/zin/rashidi/dataredis/cache/cache/CacheConfiguration.java +++ b/data-redis-cache/src/main/java/zin/rashidi/dataredis/cache/cache/CacheConfiguration.java @@ -4,6 +4,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; import org.springframework.data.redis.connection.RedisConnectionFactory; /** @@ -11,11 +12,13 @@ */ @Configuration @EnableCaching -class CacheConfiguration { +public class CacheConfiguration { @Bean public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) { - return RedisCacheManager.create(connectionFactory); + var cacheWriter = RedisCacheWriter.create(connectionFactory, + configurer -> configurer.immediateWrites()); + return RedisCacheManager.builder(cacheWriter).build(); } } diff --git a/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/TestcontainersConfiguration.java b/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/TestcontainersConfiguration.java index 9c5bfa07..a6096101 100644 --- a/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/TestcontainersConfiguration.java +++ b/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/TestcontainersConfiguration.java @@ -4,7 +4,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -12,8 +12,8 @@ public class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } @Bean diff --git a/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java b/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java index 2d971d2e..c05ee1bc 100644 --- a/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java +++ b/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java @@ -3,16 +3,10 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.ImportAutoConfiguration; -import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cache.CacheManager; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; -import org.springframework.transaction.annotation.Transactional; import zin.rashidi.dataredis.cache.TestcontainersConfiguration; import static org.assertj.core.api.Assertions.assertThat; @@ -22,9 +16,8 @@ * @author Rashidi Zin */ @Import(TestcontainersConfiguration.class) -@ImportAutoConfiguration({ RedisAutoConfiguration.class, CacheAutoConfiguration.class }) @Sql(executionPhase = BEFORE_TEST_CLASS, statements = "INSERT INTO customer (id, name) VALUES (1, 'Rashidi Zin')") -@DataJpaTest(properties = "spring.jpa.hibernate.ddl-auto=create-drop", includeFilters = @Filter(EnableCaching.class)) +@SpringBootTest(properties = "spring.jpa.hibernate.ddl-auto=create-drop") class CustomerRepositoryTests { @Autowired @@ -34,7 +27,6 @@ class CustomerRepositoryTests { private CacheManager caches; @Test - @Transactional(readOnly = true) @DisplayName("Given the method name is configured as the cache's key Then subsequent retrieval should return the same value as initial retrieval") void findAll() { var persisted = customers.findAll(); @@ -44,7 +36,6 @@ void findAll() { } @Test - @Transactional(readOnly = true) @DisplayName("Given the cache is configured Then subsequent retrieval with the same key should return the same value as initial retrieval") void findById() { var persisted = customers.findById(1L).get(); diff --git a/data-repository-definition/build.gradle.kts b/data-repository-definition/build.gradle.kts index da037a33..4e3f36bd 100644 --- a/data-repository-definition/build.gradle.kts +++ b/data-repository-definition/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -21,9 +21,10 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jdbc") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-jdbc-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/TestcontainersConfiguration.java b/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/TestcontainersConfiguration.java index 53dc6aa5..07d88da0 100644 --- a/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/TestcontainersConfiguration.java +++ b/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ public class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } } diff --git a/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/note/NoteRepositoryTests.java b/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/note/NoteRepositoryTests.java index dfde6ed7..a11141d4 100644 --- a/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/note/NoteRepositoryTests.java +++ b/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/note/NoteRepositoryTests.java @@ -3,7 +3,7 @@ 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.data.jdbc.DataJdbcTest; +import org.springframework.boot.data.jdbc.test.autoconfigure.DataJdbcTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.SqlMergeMode; diff --git a/data-rest-composite-id/build.gradle.kts b/data-rest-composite-id/build.gradle.kts index 344efc23..db3ef48c 100644 --- a/data-rest-composite-id/build.gradle.kts +++ b/data-rest-composite-id/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -22,9 +22,10 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-rest") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/TestcontainersConfiguration.java b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/TestcontainersConfiguration.java index 8de66d22..687287cf 100644 --- a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/TestcontainersConfiguration.java +++ b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ public class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } } diff --git a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateAuthorTests.java b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateAuthorTests.java index ab75b0e2..5385cdf4 100644 --- a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateAuthorTests.java +++ b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateAuthorTests.java @@ -4,12 +4,11 @@ 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.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.testcontainers.junit.jupiter.Testcontainers; -import org.testcontainers.shaded.org.apache.commons.lang3.math.NumberUtils; import zin.rashidi.datarest.compositeid.TestcontainersConfiguration; import static org.assertj.core.api.Assertions.assertThat; @@ -48,7 +47,7 @@ void create() { } private Condition numeric() { - return new Condition<>(NumberUtils::isDigits, "is a number"); + return new Condition<>(s -> s != null && s.chars().allMatch(Character::isDigit), "is a number"); } private String idFromLocation(String location) { diff --git a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateBookTests.java b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateBookTests.java index bf9a2637..c601a875 100644 --- a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateBookTests.java +++ b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateBookTests.java @@ -3,7 +3,7 @@ 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.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; diff --git a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/GetBookTests.java b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/GetBookTests.java index da81f84d..b20e6733 100644 --- a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/GetBookTests.java +++ b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/GetBookTests.java @@ -3,7 +3,7 @@ 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.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; diff --git a/data-rest-validation/build.gradle.kts b/data-rest-validation/build.gradle.kts index 429c4cc9..24b25a77 100644 --- a/data-rest-validation/build.gradle.kts +++ b/data-rest-validation/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -22,11 +22,13 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") implementation("org.springframework.boot:spring-boot-starter-data-rest") runtimeOnly("com.mysql:mysql-connector-j") + testImplementation("org.springframework.boot:spring-boot-restclient") + testImplementation("org.springframework.boot:spring-boot-resttestclient") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/TestDataRestValidationApplication.java b/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/TestDataRestValidationApplication.java index d64dbe7e..ad063386 100644 --- a/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/TestDataRestValidationApplication.java +++ b/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/TestDataRestValidationApplication.java @@ -4,8 +4,8 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.MongoDBContainer; -import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.mongodb.MongoDBContainer; +import org.testcontainers.mysql.MySQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -19,8 +19,8 @@ MongoDBContainer mongoDbContainer() { @Bean @ServiceConnection - MySQLContainer mysqlContainer() { - return new MySQLContainer<>(DockerImageName.parse("mysql:lts")); + MySQLContainer mysqlContainer() { + return new MySQLContainer(DockerImageName.parse("mysql:lts")); } public static void main(String[] args) { diff --git a/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/book/CreateBookTests.java b/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/book/CreateBookTests.java index 2bc17a61..2f9c1967 100644 --- a/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/book/CreateBookTests.java +++ b/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/book/CreateBookTests.java @@ -13,10 +13,10 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.resttestclient.TestRestTemplate; import org.springframework.context.annotation.Import; -import org.springframework.data.rest.webmvc.support.RepositoryConstraintViolationExceptionMessage.ValidationError; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -25,6 +25,7 @@ /** * @author Rashidi Zin */ +@AutoConfigureTestRestTemplate @Import(TestDataRestValidationApplication.class) @SpringBootTest(webEnvironment = RANDOM_PORT, properties = "spring.jpa.hibernate.ddl-auto=create-drop") class CreateBookTests { @@ -73,6 +74,35 @@ private HttpHeaders headers() { return headers; } + static class ValidationError { + + private String entity; + private String property; + private Object invalidValue; + private String message; + + public String getMessage() { + return message; + } + + public void setEntity(String entity) { + this.entity = entity; + } + + public void setProperty(String property) { + this.property = property; + } + + public void setInvalidValue(Object invalidValue) { + this.invalidValue = invalidValue; + } + + public void setMessage(String message) { + this.message = message; + } + + } + static class RepositoryRestErrorResponse { private List errors = new ArrayList<>(); diff --git a/docs/modules/ROOT/pages/batch-rest-repository.adoc b/docs/modules/ROOT/pages/batch-rest-repository.adoc index e21427a4..d456b727 100644 --- a/docs/modules/ROOT/pages/batch-rest-repository.adoc +++ b/docs/modules/ROOT/pages/batch-rest-repository.adoc @@ -114,7 +114,7 @@ class UserBatchJobTests { private final static MongoDBContainer MONGO_DB_CONTAINER = new MongoDBContainer("mongo:latest"); @Autowired - private JobLauncherTestUtils launcher; + private JobOperatorTestUtils operator; @Autowired private MongoOperations mongoOperations; @@ -124,7 +124,7 @@ class UserBatchJobTests { void launch() { await().atMost(ofSeconds(30)).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); diff --git a/docs/modules/ROOT/pages/batch-skip-step.adoc b/docs/modules/ROOT/pages/batch-skip-step.adoc index 2c48cb61..d6d49579 100644 --- a/docs/modules/ROOT/pages/batch-skip-step.adoc +++ b/docs/modules/ROOT/pages/batch-skip-step.adoc @@ -123,7 +123,7 @@ class UserBatchJobTests { private final static MySQLContainer MYSQL_CONTAINER = new MySQLContainer<>("mysql:lts"); @Autowired - private JobLauncherTestUtils launcher; + private JobOperatorTestUtils operator; @Autowired private JdbcTemplate jdbc; @@ -133,7 +133,7 @@ class UserBatchJobTests { void findAll() { await().atMost(10, SECONDS).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 92ed9434..8e61ef12 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=60ea723356d81263e8002fec0fcf9e2b0eee0c0850c7a3d7ab0a63f2ccc601f3 -distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip +distributionSha256Sum=2ab2958f2a1e51120c326cad6f385153bb11ee93b3c216c5fccebfdfbb7ec6cb +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 0262dcbd..739907df 100755 --- a/gradlew +++ b/gradlew @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/b631911858264c0b6e4d6603d677ff5218766cee/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/graphql/build.gradle.kts b/graphql/build.gradle.kts index d41f2071..415cb14f 100644 --- a/graphql/build.gradle.kts +++ b/graphql/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,8 +20,9 @@ repositories { dependencies { implementation("com.graphql-java:graphql-java-extended-scalars:24.0") implementation("org.springframework.boot:spring-boot-starter-graphql") - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-webmvc") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-graphql-test") testImplementation("org.springframework:spring-webflux") testImplementation("org.springframework.graphql:spring-graphql-test") } diff --git a/graphql/src/test/java/zin/rashidi/boot/graphql/book/BookResourceTests.java b/graphql/src/test/java/zin/rashidi/boot/graphql/book/BookResourceTests.java index d9ba40dd..2377158f 100644 --- a/graphql/src/test/java/zin/rashidi/boot/graphql/book/BookResourceTests.java +++ b/graphql/src/test/java/zin/rashidi/boot/graphql/book/BookResourceTests.java @@ -3,7 +3,7 @@ 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.graphql.GraphQlTest; +import org.springframework.boot.graphql.test.autoconfigure.GraphQlTest; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; import org.springframework.graphql.test.tester.GraphQlTester; diff --git a/jooq/build.gradle.kts b/jooq/build.gradle.kts index 2ae28a05..615338df 100644 --- a/jooq/build.gradle.kts +++ b/jooq/build.gradle.kts @@ -3,7 +3,7 @@ import org.jooq.meta.kotlin.* plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" id("nu.studer.jooq") version "10.2" } @@ -27,9 +27,10 @@ dependencies { jooqGenerator("com.mysql:mysql-connector-j") runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-jooq-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mysql") } dependencyManagement { diff --git a/jooq/src/test/java/zin/rashidi/boot/jooq/TestJooqApplication.java b/jooq/src/test/java/zin/rashidi/boot/jooq/TestJooqApplication.java index 7fed606d..7fce3bb8 100644 --- a/jooq/src/test/java/zin/rashidi/boot/jooq/TestJooqApplication.java +++ b/jooq/src/test/java/zin/rashidi/boot/jooq/TestJooqApplication.java @@ -4,7 +4,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.mysql.MySQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -16,8 +16,8 @@ public static void main(String[] args) { @Bean @ServiceConnection - MySQLContainer mysqlContainer() { - return new MySQLContainer<>(DockerImageName.parse("mysql:lts")); + MySQLContainer mysqlContainer() { + return new MySQLContainer(DockerImageName.parse("mysql:lts")); } } diff --git a/jooq/src/test/java/zin/rashidi/boot/jooq/user/UserRepositoryTests.java b/jooq/src/test/java/zin/rashidi/boot/jooq/user/UserRepositoryTests.java index 3bd5e91a..8b123df6 100644 --- a/jooq/src/test/java/zin/rashidi/boot/jooq/user/UserRepositoryTests.java +++ b/jooq/src/test/java/zin/rashidi/boot/jooq/user/UserRepositoryTests.java @@ -3,14 +3,14 @@ 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.jooq.JooqTest; +import org.springframework.boot.jooq.test.autoconfigure.JooqTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.stereotype.Repository; import org.springframework.test.context.jdbc.Sql; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import static org.assertj.core.api.Assertions.assertThat; @@ -24,7 +24,7 @@ class UserRepositoryTests { @Container @ServiceConnection - private static final MySQLContainer container = new MySQLContainer<>("mysql:lts"); + private static final MySQLContainer container = new MySQLContainer("mysql:lts"); @Autowired private UserRepository repository; diff --git a/modulith/build.gradle.kts b/modulith/build.gradle.kts index e3be53c8..4cc0fe7e 100644 --- a/modulith/build.gradle.kts +++ b/modulith/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -18,7 +18,7 @@ repositories { } dependencies { - implementation(platform("org.springframework.modulith:spring-modulith-bom:1.4.4")) + implementation(platform("org.springframework.modulith:spring-modulith-bom:2.0.5")) implementation("org.springframework.boot:spring-boot-starter-data-jdbc") implementation("org.springframework.modulith:spring-modulith-starter-core") @@ -27,8 +27,8 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.springframework.modulith:spring-modulith-starter-test") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/modulith/docs/components.puml b/modulith/docs/components.puml index 98a6ec7b..614e913f 100644 --- a/modulith/docs/components.puml +++ b/modulith/docs/components.puml @@ -1,21 +1,32 @@ @startuml -set separator none -title ModulithApplication +title ModulithApplication +set separator none top to bottom direction + + !include !include !include -Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { - Component(ModulithApplication.ModulithApplication.Course, "Course", $techn="Module", $descr="", $tags="", $link="") - Component(ModulithApplication.ModulithApplication.Student, "Student", $techn="Module", $descr="", $tags="", $link="") - Component(ModulithApplication.ModulithApplication.Subscription, "Subscription", $techn="Module", $descr="", $tags="", $link="") +System_Boundary("ModulithApplication_boundary", "ModulithApplication", $tags="") { + Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { + Component(ModulithApplication.ModulithApplication.Course, "Course", $techn="Module", $descr="", $tags="", $link="") + Component(ModulithApplication.ModulithApplication.Student, "Student", $techn="Module", $descr="", $tags="", $link="") + Component(ModulithApplication.ModulithApplication.Subscription, "Subscription", $techn="Module", $descr="", $tags="", $link="") + } + } Rel(ModulithApplication.ModulithApplication.Subscription, ModulithApplication.ModulithApplication.Student, "listens to", $techn="", $tags="", $link="") Rel(ModulithApplication.ModulithApplication.Subscription, ModulithApplication.ModulithApplication.Course, "listens to", $techn="", $tags="", $link="") SHOW_LEGEND(true) +hide stereotypes @enduml \ No newline at end of file diff --git a/modulith/docs/module-course.puml b/modulith/docs/module-course.puml index c55ecda2..71eb846b 100644 --- a/modulith/docs/module-course.puml +++ b/modulith/docs/module-course.puml @@ -1,17 +1,27 @@ @startuml -set separator none -title Course +title Course +set separator none top to bottom direction + + !include !include !include -Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { - Component(ModulithApplication.ModulithApplication.Course, "Course", $techn="Module", $descr="", $tags="", $link="") -} +System_Boundary("ModulithApplication_boundary", "ModulithApplication", $tags="") { + Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { + Component(ModulithApplication.ModulithApplication.Course, "Course", $techn="Module", $descr="", $tags="", $link="") + } +} SHOW_LEGEND(true) +hide stereotypes @enduml \ No newline at end of file diff --git a/modulith/docs/module-student.puml b/modulith/docs/module-student.puml index 882e78c1..189f2a6b 100644 --- a/modulith/docs/module-student.puml +++ b/modulith/docs/module-student.puml @@ -1,17 +1,27 @@ @startuml -set separator none -title Student +title Student +set separator none top to bottom direction + + !include !include !include -Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { - Component(ModulithApplication.ModulithApplication.Student, "Student", $techn="Module", $descr="", $tags="", $link="") -} +System_Boundary("ModulithApplication_boundary", "ModulithApplication", $tags="") { + Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { + Component(ModulithApplication.ModulithApplication.Student, "Student", $techn="Module", $descr="", $tags="", $link="") + } +} SHOW_LEGEND(true) +hide stereotypes @enduml \ No newline at end of file diff --git a/modulith/docs/module-subscription.puml b/modulith/docs/module-subscription.puml index 1ab59aad..ec2a1859 100644 --- a/modulith/docs/module-subscription.puml +++ b/modulith/docs/module-subscription.puml @@ -1,21 +1,32 @@ @startuml -set separator none -title Subscription +title Subscription +set separator none top to bottom direction + + !include !include !include -Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { - Component(ModulithApplication.ModulithApplication.Course, "Course", $techn="Module", $descr="", $tags="", $link="") - Component(ModulithApplication.ModulithApplication.Student, "Student", $techn="Module", $descr="", $tags="", $link="") - Component(ModulithApplication.ModulithApplication.Subscription, "Subscription", $techn="Module", $descr="", $tags="", $link="") +System_Boundary("ModulithApplication_boundary", "ModulithApplication", $tags="") { + Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { + Component(ModulithApplication.ModulithApplication.Course, "Course", $techn="Module", $descr="", $tags="", $link="") + Component(ModulithApplication.ModulithApplication.Student, "Student", $techn="Module", $descr="", $tags="", $link="") + Component(ModulithApplication.ModulithApplication.Subscription, "Subscription", $techn="Module", $descr="", $tags="", $link="") + } + } Rel(ModulithApplication.ModulithApplication.Subscription, ModulithApplication.ModulithApplication.Student, "listens to", $techn="", $tags="", $link="") Rel(ModulithApplication.ModulithApplication.Subscription, ModulithApplication.ModulithApplication.Course, "listens to", $techn="", $tags="", $link="") SHOW_LEGEND(true) +hide stereotypes @enduml \ No newline at end of file diff --git a/modulith/src/test/java/zin/rashidi/boot/modulith/TestcontainersConfiguration.java b/modulith/src/test/java/zin/rashidi/boot/modulith/TestcontainersConfiguration.java index 87c21c0c..059ed31a 100644 --- a/modulith/src/test/java/zin/rashidi/boot/modulith/TestcontainersConfiguration.java +++ b/modulith/src/test/java/zin/rashidi/boot/modulith/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ public class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")) + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")) .withInitScripts("schema.sql", "schema-data.sql"); } diff --git a/supplemental-ui/partials/footer-content.hbs b/supplemental-ui/partials/footer-content.hbs index 62314704..218ad68c 100644 --- a/supplemental-ui/partials/footer-content.hbs +++ b/supplemental-ui/partials/footer-content.hbs @@ -2,6 +2,6 @@

Spring Boot Tutorials by Rashidi Zin

Java version - Spring Boot version + Spring Boot version License - Unlicense diff --git a/test-execution-listeners/build.gradle.kts b/test-execution-listeners/build.gradle.kts index 0a0874b9..305d8adc 100644 --- a/test-execution-listeners/build.gradle.kts +++ b/test-execution-listeners/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,9 +20,10 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-mongodb-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") } tasks.named("test") { diff --git a/test-execution-listeners/src/test/java/zin/rashidi/boot/test/user/UserRepositoryTests.java b/test-execution-listeners/src/test/java/zin/rashidi/boot/test/user/UserRepositoryTests.java index 0a96596d..018fd05b 100644 --- a/test-execution-listeners/src/test/java/zin/rashidi/boot/test/user/UserRepositoryTests.java +++ b/test-execution-listeners/src/test/java/zin/rashidi/boot/test/user/UserRepositoryTests.java @@ -7,12 +7,12 @@ 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.data.mongo.DataMongoTest; +import org.springframework.boot.data.mongodb.test.autoconfigure.DataMongoTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.test.context.TestExecutionListeners; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; /** * @author Rashidi Zin diff --git a/test-rest-assured/build.gradle.kts b/test-rest-assured/build.gradle.kts index 7e676fb6..cfe871c5 100644 --- a/test-rest-assured/build.gradle.kts +++ b/test-rest-assured/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -19,12 +19,13 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-webmvc") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") - testImplementation("io.rest-assured:rest-assured") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") + testImplementation("io.rest-assured:rest-assured:6.0.0") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.4") } tasks.named("test") { diff --git a/test-rest-assured/src/main/java/zin/rashidi/boot/test/restassured/user/UserReadOnly.java b/test-rest-assured/src/main/java/zin/rashidi/boot/test/restassured/user/UserReadOnly.java index 212e67df..2f4d914d 100644 --- a/test-rest-assured/src/main/java/zin/rashidi/boot/test/restassured/user/UserReadOnly.java +++ b/test-rest-assured/src/main/java/zin/rashidi/boot/test/restassured/user/UserReadOnly.java @@ -2,8 +2,8 @@ import org.bson.types.ObjectId; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.ser.std.ToStringSerializer; /** * @author Rashidi Zin diff --git a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/TestTestRestAssuredApplication.java b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/TestTestRestAssuredApplication.java index aa7bcb9c..915094cb 100644 --- a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/TestTestRestAssuredApplication.java +++ b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/TestTestRestAssuredApplication.java @@ -4,7 +4,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.MongoDBContainer; +import org.testcontainers.mongodb.MongoDBContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) diff --git a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/CreateUserTests.java b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/CreateUserTests.java index 4390145f..0afdd1ae 100644 --- a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/CreateUserTests.java +++ b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/CreateUserTests.java @@ -8,14 +8,14 @@ import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.test.context.TestExecutionListeners; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; import static io.restassured.RestAssured.given; import static io.restassured.http.ContentType.JSON; -import static org.apache.http.HttpStatus.SC_BAD_REQUEST; -import static org.apache.http.HttpStatus.SC_CREATED; +import static org.apache.hc.core5.http.HttpStatus.SC_BAD_REQUEST; +import static org.apache.hc.core5.http.HttpStatus.SC_CREATED; import static org.hamcrest.Matchers.equalTo; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; import static org.springframework.test.context.TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS; diff --git a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/DeleteUserTests.java b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/DeleteUserTests.java index 589c5f71..6f9407ee 100644 --- a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/DeleteUserTests.java +++ b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/DeleteUserTests.java @@ -8,14 +8,14 @@ import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.test.context.TestExecutionListeners; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; import static io.restassured.RestAssured.get; import static io.restassured.RestAssured.when; -import static org.apache.http.HttpStatus.SC_NOT_FOUND; -import static org.apache.http.HttpStatus.SC_NO_CONTENT; +import static org.apache.hc.core5.http.HttpStatus.SC_NOT_FOUND; +import static org.apache.hc.core5.http.HttpStatus.SC_NO_CONTENT; import static org.hamcrest.Matchers.equalTo; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; import static org.springframework.test.context.TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS; diff --git a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/FindUserByUsernameTests.java b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/FindUserByUsernameTests.java index 758c8b87..3a328286 100644 --- a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/FindUserByUsernameTests.java +++ b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/FindUserByUsernameTests.java @@ -8,14 +8,14 @@ import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.test.context.TestExecutionListeners; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; import static io.restassured.RestAssured.given; import static io.restassured.http.ContentType.JSON; -import static org.apache.http.HttpStatus.SC_NOT_FOUND; -import static org.apache.http.HttpStatus.SC_OK; +import static org.apache.hc.core5.http.HttpStatus.SC_NOT_FOUND; +import static org.apache.hc.core5.http.HttpStatus.SC_OK; import static org.hamcrest.Matchers.equalTo; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; import static org.springframework.test.context.TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS; diff --git a/test-slice-tests-rest/build.gradle.kts b/test-slice-tests-rest/build.gradle.kts index 695922fa..ec92edf1 100644 --- a/test-slice-tests-rest/build.gradle.kts +++ b/test-slice-tests-rest/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -19,15 +19,18 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-webmvc") implementation("org.springframework.boot:spring-boot-starter-security") - testImplementation("org.springframework.security:spring-security-test") + testImplementation("org.springframework.boot:spring-boot-starter-security-test") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") + testImplementation("org.springframework.boot:spring-boot-restclient") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.springframework.batch:spring-batch-test") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/TestcontainersConfiguration.java b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/TestcontainersConfiguration.java index 473caa72..ce7fae89 100644 --- a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/TestcontainersConfiguration.java +++ b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ public class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } } diff --git a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/FindByUsernameTests.java b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/FindByUsernameTests.java index dad878a1..6051dd24 100644 --- a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/FindByUsernameTests.java +++ b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/FindByUsernameTests.java @@ -3,8 +3,9 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.resttestclient.TestRestTemplate; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; import zin.rashidi.boot.test.slices.TestcontainersConfiguration; @@ -18,6 +19,7 @@ /** * @author Rashidi Zin */ +@AutoConfigureTestRestTemplate @Import(TestcontainersConfiguration.class) @SpringBootTest(webEnvironment = RANDOM_PORT, properties = { "spring.jpa.hibernate.ddl-auto=create-drop", diff --git a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserRepositoryTests.java b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserRepositoryTests.java index 37da6957..0959ebfa 100644 --- a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserRepositoryTests.java +++ b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserRepositoryTests.java @@ -3,12 +3,12 @@ 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.orm.jpa.DataJpaTest; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.test.context.jdbc.Sql; -import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; import static org.assertj.core.api.Assertions.assertThat; @@ -23,7 +23,7 @@ class UserRepositoryTests { @Container @ServiceConnection - private static final PostgreSQLContainer postgresql = new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + private static final PostgreSQLContainer postgresql = new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); @Autowired private UserRepository repository; diff --git a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserResourceTests.java b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserResourceTests.java index 95fd4195..03377ab9 100644 --- a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserResourceTests.java +++ b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserResourceTests.java @@ -4,7 +4,7 @@ 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.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.test.context.support.WithMockUser; diff --git a/web-rest-client/build.gradle.kts b/web-rest-client/build.gradle.kts index 2f025664..e4f2d3a7 100644 --- a/web-rest-client/build.gradle.kts +++ b/web-rest-client/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -18,7 +18,9 @@ repositories { } dependencies { - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-restclient") + implementation("org.springframework.boot:spring-boot-starter-webmvc") + testImplementation("org.springframework.boot:spring-boot-starter-restclient-test") testImplementation("org.springframework.boot:spring-boot-starter-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/post/PostRepositoryTests.java b/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/post/PostRepositoryTests.java index fee5faa8..3d3473b2 100644 --- a/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/post/PostRepositoryTests.java +++ b/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/post/PostRepositoryTests.java @@ -1,13 +1,13 @@ package zin.rashidi.boot.web.restclient.post; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; 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.client.RestClientTest; +import org.springframework.boot.restclient.test.autoconfigure.RestClientTest; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.test.web.client.MockRestServiceServer; +import tools.jackson.core.JacksonException; import zin.rashidi.boot.web.restclient.post.PostRepositoryConfiguration.PostErrorResponseHandler.PostNotFoundException; import java.util.List; @@ -36,7 +36,7 @@ class PostRepositoryTests { @Test @DisplayName("When requesting for all posts then response should contain all posts available") - void findAll() throws JsonProcessingException { + void findAll() throws JacksonException { var content = mapper.writeValueAsString(posts()); mockServer.expect(requestTo("https://jsonplaceholder.typicode.com/posts")).andRespond(withSuccess(content, APPLICATION_JSON)); @@ -48,7 +48,7 @@ void findAll() throws JsonProcessingException { @Test @DisplayName("Given a post with requested id is available When requested Then a post with the id should be returned") - void findById() throws JsonProcessingException { + void findById() throws JacksonException { var content = mapper.writeValueAsString(new Post(1L, 84L, "Spring Web: REST Clients Example with RESTClient", "An example of using RESTClient")); mockServer.expect(requestTo("https://jsonplaceholder.typicode.com/posts/1")).andRespond(withSuccess(content, APPLICATION_JSON)); diff --git a/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/user/UserRepositoryTests.java b/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/user/UserRepositoryTests.java index 680edddb..5f807baf 100644 --- a/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/user/UserRepositoryTests.java +++ b/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/user/UserRepositoryTests.java @@ -1,12 +1,12 @@ package zin.rashidi.boot.web.restclient.user; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; 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.client.RestClientTest; +import org.springframework.boot.restclient.test.autoconfigure.RestClientTest; import org.springframework.test.web.client.MockRestServiceServer; +import tools.jackson.core.JacksonException; import zin.rashidi.boot.web.restclient.user.UserRestRepository.UserNotFoundException; import java.net.URI; @@ -36,7 +36,7 @@ class UserRepositoryTests { @Test @DisplayName("When findAll Then all users should be returned") - void findAll() throws JsonProcessingException { + void findAll() throws JacksonException { var response = mapper.writeValueAsString(List.of( new User(84L, "Rashidi Zin", "rashidi.zin", "rashidi@zin.my", URI.create("rashidi.zin.my")), new User(87L, "Zaid Zin", "zaid.zin", "zaid@zin.my", URI.create("zaid.zin.my")) @@ -51,7 +51,7 @@ void findAll() throws JsonProcessingException { @Test @DisplayName("When an id is provided Then user with the id should be returned") - void findById() throws JsonProcessingException { + void findById() throws JacksonException { var response = mapper.writeValueAsString( new User(84L, "Rashidi Zin", "rashidi.zin", "rashidi@zin.my", URI.create("rashidi.zin.my")) ); diff --git a/web-thymeleaf-xss/build.gradle.kts b/web-thymeleaf-xss/build.gradle.kts index 838b5453..6f857032 100644 --- a/web-thymeleaf-xss/build.gradle.kts +++ b/web-thymeleaf-xss/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,10 +20,11 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-thymeleaf") - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-webmvc") implementation("org.thymeleaf.extras:thymeleaf-extras-springsecurity6") testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("org.springframework.security:spring-security-test") + testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test") + testImplementation("org.springframework.boot:spring-boot-starter-security-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/web-thymeleaf-xss/src/test/java/zin/rashidi/web/xss/greet/GreetResourceTests.java b/web-thymeleaf-xss/src/test/java/zin/rashidi/web/xss/greet/GreetResourceTests.java index 4e6b3615..0228669c 100644 --- a/web-thymeleaf-xss/src/test/java/zin/rashidi/web/xss/greet/GreetResourceTests.java +++ b/web-thymeleaf-xss/src/test/java/zin/rashidi/web/xss/greet/GreetResourceTests.java @@ -3,7 +3,7 @@ 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.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.test.web.servlet.assertj.MockMvcTester;