diff --git a/applications/spring-shell/src/test/java/org/springframework/sbm/BootUpgrade_27_30_IntegrationTest.java b/applications/spring-shell/src/test/java/org/springframework/sbm/BootUpgrade_27_30_IntegrationTest.java index 59351959a..d0a0d7504 100644 --- a/applications/spring-shell/src/test/java/org/springframework/sbm/BootUpgrade_27_30_IntegrationTest.java +++ b/applications/spring-shell/src/test/java/org/springframework/sbm/BootUpgrade_27_30_IntegrationTest.java @@ -59,7 +59,7 @@ private void verifyCrudRepoAddition() { import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.PagingAndSortingRepository; - public interface StudentRepo extends PagingAndSortingRepository, Long>, CrudRepository, Long> { + public interface StudentRepo extends PagingAndSortingRepository, CrudRepository { } """); } @@ -98,41 +98,45 @@ private void verifyYamlConfigurationUpdate() { String micrometerClass = loadFile(Path.of("src/main/resources/application.yaml")); assertThat(micrometerClass).isEqualTo( "spring:\n" + - " elasticsearch:\n" + - " connection-timeout: '1'\n" + - " password: testpassword\n" + - " socket-timeout: '2'\n" + - " restclient.sniffer.delay-after-failure: '3'\n" + - " restclient.sniffer.interval: '4'\n" + - " username: username\n" + - " security:\n" + - " saml2:\n" + - " relyingparty:\n" + - " registration:\n" + - " idpone:\n" + - " assertingparty:\n" + - " verification:\n" + - " credentials:\n" + - " certificate-location: classpath:saml/idpone.crt\n" + - " entity-id: https://idpone.com\n" + - " sso-url: https://idpone.com\n" + - " elasticsearch.connection-timeout: '1000'\n" + - " elasticsearch.webclient.max-in-memory-size: '122'\n" + - " elasticsearch.password: abc\n" + - " elasticsearch.socket-timeout: '100'\n" + - " elasticsearch.username: testUser\n" + - " sql.init.data-locations: testdata\n" + - " sql.init.password: password\n" + - " sql.init.username: username-data\n" + - " sql.init.mode: mode1\n" + - " sql.init.platform: pls\n" + - " sql.init.schema-locations: table1\n" + - " sql.init.password: password2\n" + - " sql.init.username: username-schema\n" + - " sql.init.separator: k\n" + - " sql.init.encoding: UTF-8\n" + - "server.reactive.session.cookie.same-site: 'true'" + - "\n"); + " datasource:\n" + + " url: jdbc:h2:mem:testdb\n" + + " driverClassName: org.h2.Driver\n" + + " jpa:\n" + + " database-platform: org.hibernate.dialect.H2Dialect\n" + + " elasticsearch:\n" + + " connection-timeout: '1'\n" + + " password: testpassword\n" + + " socket-timeout: '2'\n" + + " restclient.sniffer.delay-after-failure: '3'\n" + + " restclient.sniffer.interval: '4'\n" + + " username: username\n" + + " security:\n" + + " saml2:\n" + + " relyingparty:\n" + + " registration:\n" + + " idpone:\n" + + " assertingparty:\n" + + " verification:\n" + + " credentials:\n" + + " certificate-location: classpath:saml/idpone.crt\n" + + " entity-id: https://idpone.com\n" + + " sso-url: https://idpone.com\n" + + " elasticsearch.connection-timeout: '1000'\n" + + " elasticsearch.webclient.max-in-memory-size: '122'\n" + + " elasticsearch.password: abc\n" + + " elasticsearch.socket-timeout: '100'\n" + + " elasticsearch.username: testUser\n" + + " sql.init.data-locations: testdata\n" + + " sql.init.password: password\n" + + " sql.init.username: sa\n" + + " sql.init.mode: mode1\n" + + " sql.init.platform: pls\n" + + " sql.init.schema-locations: table1\n" + + " sql.init.password: password\n" + + " sql.init.username: sa\n" + + " sql.init.separator: k\n" + + " sql.init.encoding: UTF-8\n" + + "server.reactive.session.cookie.same-site: 'true'\n"); } @@ -141,34 +145,40 @@ private void verifyPropertyConfigurationUpdate() { String applicationProperties = loadFile(Path.of("src/main/resources/application.properties")); assertThat(applicationProperties).isEqualTo( "spring.elasticsearch.connection-timeout=1000\n" + - "spring.elasticsearch.webclient.max-in-memory-size=122\n" + - "spring.elasticsearch.password=abc\n" + - "spring.elasticsearch.socket-timeout=100\n" + - "spring.elasticsearch.username=testUser\n" + - "\n" + - "spring.sql.init.data-locations=testdata\n" + - "spring.sql.init.password=password\n" + - "spring.sql.init.username=username\n" + - "spring.sql.init.mode=mode1\n" + - "spring.sql.init.platform=pls\n" + - "spring.sql.init.schema-locations=table1\n" + - "spring.sql.init.password=password2\n" + - "spring.sql.init.username=username2\n" + - "spring.sql.init.separator=k\n" + - "spring.sql.init.encoding=UTF-8\n" + - "\n" + - "spring.elasticsearch.connection-timeout=1\n" + - "spring.elasticsearch.password=testpassword\n" + - "spring.elasticsearch.socket-timeout=2\n" + - "spring.elasticsearch.restclient.sniffer.delay-after-failure=3\n" + - "spring.elasticsearch.restclient.sniffer.interval=4\n" + - "spring.elasticsearch.username=username\n" + - "\n" + - "spring.security.saml2.relyingparty.registration.idpone.assertingparty.entity-id=https://idpone.com\n" + - "spring.security.saml2.relyingparty.registration.idpone.assertingparty.sso-url=https://idpone.com\n" + - "spring.security.saml2.relyingparty.registration.idpone.assertingparty.verification.credentials.certificate-location=classpath:saml/idpone.crt\n" + - "\n" + - "server.reactive.session.cookie.same-site=true\n"); + "spring.elasticsearch.webclient.max-in-memory-size=122\n" + + "spring.elasticsearch.password=abc\n" + + "spring.elasticsearch.socket-timeout=100\n" + + "spring.elasticsearch.username=testUser\n" + + "\n" + + "spring.sql.init.data-locations=testdata\n" + + "spring.sql.init.password=password\n" + + "spring.sql.init.username=username\n" + + "spring.sql.init.mode=mode1\n" + + "spring.sql.init.platform=pls\n" + + "spring.sql.init.schema-locations=table1\n" + + "spring.sql.init.password=password2\n" + + "spring.sql.init.username=username2\n" + + "spring.sql.init.separator=k\n" + + "spring.sql.init.encoding=UTF-8\n" + + "\n" + + "spring.elasticsearch.connection-timeout=1\n" + + "spring.elasticsearch.password=testpassword\n" + + "spring.elasticsearch.socket-timeout=2\n" + + "spring.elasticsearch.restclient.sniffer.delay-after-failure=3\n" + + "spring.elasticsearch.restclient.sniffer.interval=4\n" + + "spring.elasticsearch.username=username\n" + + "\n" + + "spring.security.saml2.relyingparty.registration.idpone.assertingparty.entity-id=https://idpone.com\n" + + "spring.security.saml2.relyingparty.registration.idpone.assertingparty.sso-url=https://idpone.com\n" + + "spring.security.saml2.relyingparty.registration.idpone.assertingparty.verification.credentials.certificate-location=classpath:saml/idpone.crt\n" + + "\n" + + "server.reactive.session.cookie.same-site=true\n" + + "\n" + + "spring.datasource.url=jdbc:h2:mem:testdb\n" + + "spring.datasource.driverClassName=org.h2.Driver\n" + + "spring.datasource.username=sa\n" + + "spring.datasource.password=password\n" + + "spring.jpa.database-platform=org.hibernate.dialect.H2Dialect\n"); } private void verifyParentPomVersion() { diff --git a/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/pom.xml b/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/pom.xml index c5d896f33..65b7c2172 100644 --- a/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/pom.xml +++ b/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/pom.xml @@ -16,6 +16,7 @@ 17 + org.springframework.boot @@ -29,6 +30,11 @@ org.springframework.boot spring-boot-starter-data-jpa + + com.h2database + h2 + runtime + org.springframework.boot spring-boot-starter-test diff --git a/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/java/org/springboot/example/upgrade/Student.java b/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/java/org/springboot/example/upgrade/Student.java index 1716b290d..ff60b3718 100644 --- a/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/java/org/springboot/example/upgrade/Student.java +++ b/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/java/org/springboot/example/upgrade/Student.java @@ -1,5 +1,11 @@ package org.springboot.example.upgrade; -public class Student { - private T name; +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class Student { + @Id + private long id; + private String name; } diff --git a/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/java/org/springboot/example/upgrade/StudentRepo.java b/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/java/org/springboot/example/upgrade/StudentRepo.java index 32e1889fb..f7c054510 100644 --- a/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/java/org/springboot/example/upgrade/StudentRepo.java +++ b/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/java/org/springboot/example/upgrade/StudentRepo.java @@ -2,5 +2,5 @@ import org.springframework.data.repository.PagingAndSortingRepository; -public interface StudentRepo extends PagingAndSortingRepository, Long> { +public interface StudentRepo extends PagingAndSortingRepository { } diff --git a/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/resources/application.properties b/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/resources/application.properties index efb355fce..ca4a5204b 100644 --- a/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/resources/application.properties +++ b/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/resources/application.properties @@ -78,9 +78,9 @@ spring.graphql.cors.allowed-headers=hello spring.graphql.cors.allow-credentials=true spring.h2.console.enabled=true -spring.h2.console.path="/tmp" +spring.h2.console.path=/tmp spring.h2.console.settings.trace=true -spring.h2.console.settings.web-admin-password="password" +spring.h2.console.settings.web-admin-password=password spring.h2.console.settings.web-allow-others=true spring.jersey.type=type1 @@ -113,3 +113,9 @@ spring.security.saml2.relyingparty.registration.idpone.identityprovider.sso-url= spring.security.saml2.relyingparty.registration.idpone.identityprovider.verification.credentials.certificate-location=classpath:saml/idpone.crt spring.webflux.session.cookie.same-site=true + +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password=password +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect diff --git a/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/resources/application.yaml b/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/resources/application.yaml index 6bd2957bd..b3bda7b38 100644 --- a/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/resources/application.yaml +++ b/applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/src/main/resources/application.yaml @@ -1,15 +1,19 @@ spring: datasource: data: testdata - data-username: username-data - schema-username: username-schema - schema-password: password2 + url: jdbc:h2:mem:testdb + data-username: sa + schema-username: sa + schema-password: password + driverClassName: org.h2.Driver schema: table1 initialization-mode: mode1 data-password: password sql-script-encoding: UTF-8 platform: pls separator: k + jpa: + database-platform: org.hibernate.dialect.H2Dialect activemq: pool: max-sessions-per-connection: '300' @@ -83,9 +87,9 @@ spring: username: testUser h2: console: - path: '"/tmp"' + path: "/tmp" settings: - web-admin-password: '"password"' + web-admin-password: "password" web-allow-others: 'true' trace: 'true' enabled: 'true' diff --git a/components/sbm-core/src/test/java/org/springframework/sbm/engine/precondition/PreconditionVerifierIntegrationTest.java b/components/sbm-core/src/test/java/org/springframework/sbm/engine/precondition/PreconditionVerifierIntegrationTest.java index f6e467f85..eb83a5cd3 100644 --- a/components/sbm-core/src/test/java/org/springframework/sbm/engine/precondition/PreconditionVerifierIntegrationTest.java +++ b/components/sbm-core/src/test/java/org/springframework/sbm/engine/precondition/PreconditionVerifierIntegrationTest.java @@ -17,6 +17,7 @@ import org.eclipse.jgit.api.Git; import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.springframework.beans.factory.annotation.Autowired; diff --git a/components/sbm-recipes-boot-upgrade/src/main/java/org/springframework/sbm/boot/upgrade_27_30/UpgradeBomVersion27_30.java b/components/sbm-recipes-boot-upgrade/src/main/java/org/springframework/sbm/boot/upgrade_27_30/UpgradeBomVersion27_30.java new file mode 100644 index 000000000..591b4802e --- /dev/null +++ b/components/sbm-recipes-boot-upgrade/src/main/java/org/springframework/sbm/boot/upgrade_27_30/UpgradeBomVersion27_30.java @@ -0,0 +1,10 @@ +package org.springframework.sbm.boot.upgrade_27_30; + +import org.openrewrite.Recipe; + +public class UpgradeBomVersion27_30 extends Recipe { + @Override + public String getDisplayName() { + return "UpgradeBomVersion27_30"; + } +} diff --git a/components/sbm-recipes-boot-upgrade/src/main/resources/recipes/boot-2.7-3.0-dependency-version-update.yaml b/components/sbm-recipes-boot-upgrade/src/main/resources/recipes/boot-2.7-3.0-dependency-version-update.yaml index cf1a225ac..309abdf0f 100644 --- a/components/sbm-recipes-boot-upgrade/src/main/resources/recipes/boot-2.7-3.0-dependency-version-update.yaml +++ b/components/sbm-recipes-boot-upgrade/src/main/resources/recipes/boot-2.7-3.0-dependency-version-update.yaml @@ -27,6 +27,7 @@ type: org.springframework.sbm.boot.upgrade.common.conditions.HasSpringBootParentOfVersion versionStartingWith: "2.7." description: Add Spring Milestone Repository and bump parent pom to 3.0.0-M3 + openRewriteRecipe: |- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.spring.boot3.data.UpgradeSpringData30 @@ -37,6 +38,10 @@ groupId: org.springframework.boot artifactId: spring-boot-starter-parent newVersion: 3.0.0-M3 + - org.openrewrite.maven.UpgradeDependencyVersion: + groupId: org.springframework.boot + artifactId: spring-boot-dependencies + newVersion: 3.0.0-M3 - type: org.springframework.sbm.engine.recipe.OpenRewriteDeclarativeRecipeAdapter condition: diff --git a/components/sbm-recipes-boot-upgrade/src/test/java/org/springframework/sbm/boot/upgrade_27_30/UpgradeBomTo30Test.java b/components/sbm-recipes-boot-upgrade/src/test/java/org/springframework/sbm/boot/upgrade_27_30/UpgradeBomTo30Test.java new file mode 100644 index 000000000..8da6b42bc --- /dev/null +++ b/components/sbm-recipes-boot-upgrade/src/test/java/org/springframework/sbm/boot/upgrade_27_30/UpgradeBomTo30Test.java @@ -0,0 +1,202 @@ +package org.springframework.sbm.boot.upgrade_27_30; + +import org.junit.jupiter.api.Test; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.Recipe; +import org.openrewrite.Result; +import org.openrewrite.java.JavaParser; +import org.openrewrite.java.tree.J; +import org.openrewrite.maven.MavenParser; +import org.openrewrite.maven.UpgradeDependencyVersion; +import org.openrewrite.xml.tree.Xml; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class UpgradeBomTo30Test { + + @Test + void shouldUpdateBomVersionTo30() { + Recipe recipe = new UpgradeDependencyVersion( + "org.springframework.boot", + "spring-boot-dependencies", + "3.0.0-M3", + null, + null + ); + + List errors = new ArrayList<>(); + InMemoryExecutionContext ctx = new InMemoryExecutionContext((ex) -> { + ex.printStackTrace(); + errors.add(ex); + }); + + MavenParser parser = MavenParser.builder().build(); + List documentList = parser.parse(""" + + + 4.0.0 + + test + test + 1.0.0-SNAPSHOT + + + 2.7.1 + + Test + + + + + org.springframework.boot + spring-boot-dependencies + ${spring.version} + pom + import + + + + + + spring-milestone + https://repo.spring.io/milestone + + false + + + + + + + spring-milestone + https://repo.spring.io/milestone + + false + + + + + """); + + List result = recipe.run(documentList, ctx); + + assertThat(result).hasSize(1); + + assertThat(result.get(0).getAfter().printAll()) + .isEqualTo(""" + + + 4.0.0 + + test + test + 1.0.0-SNAPSHOT + + + 3.0.0-M3 + + Test + + + + + org.springframework.boot + spring-boot-dependencies + ${spring.version} + pom + import + + + + + + spring-milestone + https://repo.spring.io/milestone + + false + + + + + + + spring-milestone + https://repo.spring.io/milestone + + false + + + + + """); + } + + @Test + public void whenThereIsNoBomNoChanges() { + Recipe recipe = new UpgradeDependencyVersion( + "org.springframework.boot", + "spring-boot-dependencies", + "3.0.0-M3", + null, + null + ); + + List errors = new ArrayList<>(); + InMemoryExecutionContext ctx = new InMemoryExecutionContext((ex) -> { + ex.printStackTrace(); + errors.add(ex); + }); + + MavenParser parser = MavenParser.builder().build(); + List documentList = parser.parse(""" + + + 4.0.0 + + test + test + 1.0.0-SNAPSHOT + + + 2.7.1 + + Test + + + org.springframework.boot + spring-boot-starter-parent + 3.0.0-M3 + + + + spring-milestone + https://repo.spring.io/milestone + + false + + + + + + + spring-milestone + https://repo.spring.io/milestone + + false + + + + + """); + + List result = recipe.run(documentList, ctx); + + assertThat(result).hasSize(0); + } +}