From 18736105742714be5c1fbedac74ac11491679915 Mon Sep 17 00:00:00 2001 From: seraphinandrieux Date: Wed, 15 Jun 2022 09:33:27 +0200 Subject: [PATCH] Use custom sql container --- .../database/mssql/domain/Mssql.java | 1 + .../mssql/domain/MssqlDomainService.java | 48 +++++++++++-------- .../config/MssqlBeanConfiguration.java | 10 ++-- .../MssqlTestContainerExtension.java.mustache | 29 +++++++++++ .../MssqlApplicationServiceIT.java | 10 ++++ .../domain/MssqlDomainServiceUnitTest.java | 19 ++++---- .../database/mssql/domain/MssqlTest.java | 15 ------ 7 files changed, 80 insertions(+), 52 deletions(-) create mode 100644 src/main/resources/generator/server/springboot/core/MssqlTestContainerExtension.java.mustache diff --git a/src/main/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/Mssql.java b/src/main/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/Mssql.java index 81ca2d0cb92..46ce884bc76 100644 --- a/src/main/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/Mssql.java +++ b/src/main/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/Mssql.java @@ -7,6 +7,7 @@ public class Mssql { public static final String MSSQL_DOCKER_IMAGE_NAME = "mcr.microsoft.com/mssql/server"; + public static final String MSSQL_TEST_CONTAINER_EXTENSION_FILE = "MssqlTestContainerExtension.java"; public static final String LICENSE_TEST_CONTAINER_FILE = "container-license-acceptance.txt"; private Mssql() {} diff --git a/src/main/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/MssqlDomainService.java b/src/main/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/MssqlDomainService.java index b471777e313..2c1c2ab47db 100644 --- a/src/main/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/MssqlDomainService.java +++ b/src/main/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/MssqlDomainService.java @@ -1,12 +1,12 @@ package tech.jhipster.lite.generator.server.springboot.database.mssql.domain; +import static tech.jhipster.lite.common.domain.FileUtils.*; import static tech.jhipster.lite.generator.project.domain.Constants.*; import static tech.jhipster.lite.generator.project.domain.DefaultConfig.*; import tech.jhipster.lite.error.domain.Assert; -import tech.jhipster.lite.error.domain.GeneratorException; import tech.jhipster.lite.generator.buildtool.generic.domain.BuildToolService; -import tech.jhipster.lite.generator.docker.domain.DockerService; +import tech.jhipster.lite.generator.docker.domain.DockerImages; import tech.jhipster.lite.generator.project.domain.DatabaseType; import tech.jhipster.lite.generator.project.domain.Project; import tech.jhipster.lite.generator.project.domain.ProjectFile; @@ -18,24 +18,26 @@ public class MssqlDomainService implements MssqlService { public static final String SOURCE = "server/sql"; + public static final String EXTENSION_TEST_CONTAINER = "server/springboot/core"; + public static final String EXTENSION_INTEGRATION_TEST_CLASS = "MssqlTestContainerExtension"; private final BuildToolService buildToolService; private final SpringBootCommonService springBootCommonService; private final SQLCommonService sqlCommonService; - private final DockerService dockerService; + private final DockerImages dockerImages; private final ProjectRepository projectRepository; public MssqlDomainService( BuildToolService buildToolService, SpringBootCommonService springBootCommonService, SQLCommonService sqlCommonService, - DockerService dockerService, + DockerImages dockerImages, ProjectRepository projectRepository ) { this.buildToolService = buildToolService; this.springBootCommonService = springBootCommonService; this.sqlCommonService = sqlCommonService; - this.dockerService = dockerService; + this.dockerImages = dockerImages; this.projectRepository = projectRepository; } @@ -65,14 +67,9 @@ private void addDriver(Project project) { private void addDockerCompose(Project project) { project.addDefaultConfig(BASE_NAME); - dockerService - .getImageNameWithVersion(Mssql.getDockerImageName()) - .ifPresentOrElse( - imageName -> project.addConfig("dockerImageName", imageName), - () -> { - throw new GeneratorException("Version not found for docker image: " + Mssql.getDockerImageName()); - } - ); + String dockerImage = dockerImages.get(Mssql.getDockerImageName()).fullName(); + project.addConfig("dockerImageName", dockerImage); + sqlCommonService.addDockerComposeTemplate(project, DatabaseType.MSSQL.id()); } @@ -94,14 +91,23 @@ private void addProperties(Project project) { } private void addTestcontainers(Project project) { - this.sqlCommonService.addTestcontainers( - project, - DatabaseType.MSSQL.id(), - Mssql.springPropertiesForTest(project.getBaseName().orElse("jhipster")) - ); - this.projectRepository.add( - ProjectFile.forProject(project).withSource(SOURCE, Mssql.LICENSE_TEST_CONTAINER_FILE).withDestinationFolder(TEST_RESOURCES) - ); + String packageNamePath = project.getPackageNamePath().orElse(getPath(PACKAGE_PATH)); + String integrationTestPath = getPath(TEST_JAVA, packageNamePath); + sqlCommonService.addTestcontainers( + project, + DatabaseType.MSSQL.id(), + Mssql.springPropertiesForTest(project.getBaseName().orElse("jhipster")) + ); + projectRepository.add( + ProjectFile.forProject(project).withSource(SOURCE, Mssql.LICENSE_TEST_CONTAINER_FILE).withDestinationFolder(TEST_RESOURCES) + ); + projectRepository.template( + ProjectFile + .forProject(project) + .withSource(EXTENSION_TEST_CONTAINER, Mssql.MSSQL_TEST_CONTAINER_EXTENSION_FILE) + .withDestinationFolder(getPath(integrationTestPath)) + ); + springBootCommonService.updateIntegrationTestAnnotation(project, EXTENSION_INTEGRATION_TEST_CLASS); } private void addHibernateCore(Project project) { diff --git a/src/main/java/tech/jhipster/lite/generator/server/springboot/database/mssql/infrastructure/config/MssqlBeanConfiguration.java b/src/main/java/tech/jhipster/lite/generator/server/springboot/database/mssql/infrastructure/config/MssqlBeanConfiguration.java index 5ea396556cf..e9002c1514f 100644 --- a/src/main/java/tech/jhipster/lite/generator/server/springboot/database/mssql/infrastructure/config/MssqlBeanConfiguration.java +++ b/src/main/java/tech/jhipster/lite/generator/server/springboot/database/mssql/infrastructure/config/MssqlBeanConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import tech.jhipster.lite.generator.buildtool.generic.domain.BuildToolService; -import tech.jhipster.lite.generator.docker.domain.DockerService; +import tech.jhipster.lite.generator.docker.domain.DockerImages; import tech.jhipster.lite.generator.project.domain.ProjectRepository; import tech.jhipster.lite.generator.server.springboot.common.domain.SpringBootCommonService; import tech.jhipster.lite.generator.server.springboot.database.mssql.domain.MssqlDomainService; @@ -16,25 +16,25 @@ public class MssqlBeanConfiguration { private final BuildToolService buildToolService; private final SpringBootCommonService springBootCommonService; private final SQLCommonService sqlCommonService; - private final DockerService dockerService; + private final DockerImages dockerImages; private final ProjectRepository projectRepository; public MssqlBeanConfiguration( BuildToolService buildToolService, SpringBootCommonService springBootCommonService, SQLCommonService sqlCommonService, - DockerService dockerService, + DockerImages dockerImages, ProjectRepository projectRepository ) { this.buildToolService = buildToolService; this.springBootCommonService = springBootCommonService; this.sqlCommonService = sqlCommonService; - this.dockerService = dockerService; + this.dockerImages = dockerImages; this.projectRepository = projectRepository; } @Bean public MssqlService mssqlService() { - return new MssqlDomainService(buildToolService, springBootCommonService, sqlCommonService, dockerService, projectRepository); + return new MssqlDomainService(buildToolService, springBootCommonService, sqlCommonService, dockerImages, projectRepository); } } diff --git a/src/main/resources/generator/server/springboot/core/MssqlTestContainerExtension.java.mustache b/src/main/resources/generator/server/springboot/core/MssqlTestContainerExtension.java.mustache new file mode 100644 index 00000000000..9f559192da3 --- /dev/null +++ b/src/main/resources/generator/server/springboot/core/MssqlTestContainerExtension.java.mustache @@ -0,0 +1,29 @@ +package {{packageName}}; + +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.testcontainers.containers.MSSQLServerContainer; +import org.testcontainers.utility.DockerImageName; + +import java.util.concurrent.atomic.AtomicBoolean; + +public class MssqlTestContainerExtension implements BeforeAllCallback { + + private static AtomicBoolean started = new AtomicBoolean(false); + + private static MSSQLServerContainer container = new MSSQLServerContainer<>(DockerImageName.parse("mcr.microsoft.com/mssql/server:latest").asCompatibleSubstituteFor("mcr.microsoft.com/mssql/server")) + .withUrlParam("trustServerCertificate","true") + .acceptLicense(); + + @Override + public void beforeAll(ExtensionContext extensionContext) throws Exception { + if (!started.get()) { + container.start(); + System.setProperty("spring.datasource.url", container.getJdbcUrl()); + System.setProperty("spring.datasource.password", container.getPassword()); + System.setProperty("spring.datasource.username", container.getUsername()); + System.setProperty("spring.datasource.driver-class-name","com.microsoft.sqlserver.jdbc.SQLServerDriver"); + started.set(true); + } + } +} diff --git a/src/test/java/tech/jhipster/lite/generator/server/springboot/database/mssql/application/MssqlApplicationServiceIT.java b/src/test/java/tech/jhipster/lite/generator/server/springboot/database/mssql/application/MssqlApplicationServiceIT.java index 3375e280e70..dab4eef1713 100644 --- a/src/test/java/tech/jhipster/lite/generator/server/springboot/database/mssql/application/MssqlApplicationServiceIT.java +++ b/src/test/java/tech/jhipster/lite/generator/server/springboot/database/mssql/application/MssqlApplicationServiceIT.java @@ -6,6 +6,7 @@ import static tech.jhipster.lite.generator.server.springboot.core.domain.SpringBoot.*; import java.util.List; +import java.util.Optional; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import tech.jhipster.lite.IntegrationTest; @@ -56,10 +57,12 @@ void shouldInit() { "spring.datasource.url=jdbc:sqlserver://localhost:1433;database=jhipster" ); assertTestContainersWasAdded(project); + assertExtensionForDatabaseContainerWasAdded(project); assertLoggerInConfig(project); } private void assertTestContainersWasAdded(Project project) { + Optional test = Optional.of("test"); assertFileContent(project, POM_XML, ""); assertFileContent(project, POM_XML, ""); assertFileContent(project, POM_XML, testcontainers()); @@ -77,6 +80,13 @@ private void assertTestContainersWasAdded(Project project) { assertFileExist(project, "src/test/resources/container-license-acceptance.txt"); } + private void assertExtensionForDatabaseContainerWasAdded(Project project) { + final String projectTestPath = "src/test/java/com/mycompany/myapp"; + assertFileExist(project, projectTestPath + "/MssqlTestContainerExtension.java"); + assertFileContent(project, getPath(projectTestPath, "IntegrationTest.java"), "@ExtendWith(MssqlTestContainerExtension.class)"); + assertFileContent(project, getPath(projectTestPath, "IntegrationTest.java"), "import org.junit.jupiter.api.extension.ExtendWith;"); + } + private void assertLoggerInConfig(Project project) { assertFileContent( project, diff --git a/src/test/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/MssqlDomainServiceUnitTest.java b/src/test/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/MssqlDomainServiceUnitTest.java index 10afa9e37e3..34b77bc72ce 100644 --- a/src/test/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/MssqlDomainServiceUnitTest.java +++ b/src/test/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/MssqlDomainServiceUnitTest.java @@ -16,7 +16,8 @@ import tech.jhipster.lite.error.domain.MissingMandatoryValueException; import tech.jhipster.lite.generator.buildtool.generic.domain.BuildToolService; import tech.jhipster.lite.generator.buildtool.generic.domain.Dependency; -import tech.jhipster.lite.generator.docker.domain.DockerService; +import tech.jhipster.lite.generator.docker.domain.DockerImage; +import tech.jhipster.lite.generator.docker.domain.DockerImages; import tech.jhipster.lite.generator.project.domain.Project; import tech.jhipster.lite.generator.project.domain.ProjectFile; import tech.jhipster.lite.generator.project.domain.ProjectRepository; @@ -41,7 +42,7 @@ class MssqlDomainServiceUnitTest { ProjectRepository projectRepository; @Mock - DockerService dockerService; + DockerImages dockerImages; @InjectMocks MssqlDomainService mssqlDomainService; @@ -57,7 +58,7 @@ void shouldNotInitWithoutProject() { void shouldInit() { Project project = tmpProjectWithPomXml(); - when(dockerService.getImageNameWithVersion("mcr.microsoft.com/mssql/server")).thenReturn(Optional.of("mssql:0.0.0")); + when(dockerImages.get("mcr.microsoft.com/mssql/server")).thenReturn(new DockerImage("mssql", "0.0.0")); mssqlDomainService.init(project); @@ -65,7 +66,6 @@ void shouldInit() { verify(springBootCommonService, times(4)).addLoggerTest(any(Project.class), anyString(), any(Level.class)); - verify(sqlCommonService).addTestcontainers(any(Project.class), anyString(), anyMap()); verify(sqlCommonService).addSpringDataJpa(project); verify(sqlCommonService).addHibernateCore(project); verify(sqlCommonService).addDockerComposeTemplate(project, "mssqlserver"); @@ -74,12 +74,9 @@ void shouldInit() { verify(springBootCommonService, times(7)).addProperties(eq(project), any(), any()); verify(springBootCommonService, times(2)).addLogger(eq(project), any(), any()); verify(sqlCommonService).addLoggers(project); - } - - @Test - void shouldThrowExceptionWhenImageVersionNotFound() { - Project project = tmpProject(); - - assertThatThrownBy(() -> mssqlDomainService.init(project)).isInstanceOf(GeneratorException.class).hasMessageContaining("mssql"); + verify(projectRepository).template(any(ProjectFile.class)); + verify(springBootCommonService).updateIntegrationTestAnnotation(project, "MssqlTestContainerExtension"); + verify(projectRepository).template(any(ProjectFile.class)); + verify(projectRepository).add(any(ProjectFile.class)); } } diff --git a/src/test/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/MssqlTest.java b/src/test/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/MssqlTest.java index 81c5e876389..1251880a446 100644 --- a/src/test/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/MssqlTest.java +++ b/src/test/java/tech/jhipster/lite/generator/server/springboot/database/mssql/domain/MssqlTest.java @@ -27,19 +27,4 @@ void shouldGetSpringProperties() { .containsEntry("spring.jpa.properties.hibernate.dialect", "org.hibernate.dialect.SQLServer2012Dialect") .containsEntry("spring.jpa.properties.hibernate.format_sql", true); } - - @Test - void shouldGetSpringPropertiesForTest() { - Map springProperties = Mssql.springPropertiesForTest("baseName"); - - assertThat(springProperties) - .containsEntry("spring.datasource.driver-class-name", "org.testcontainers.jdbc.ContainerDatabaseDriver") - .containsEntry( - "spring.datasource.url", - "jdbc:tc:sqlserver:latest://;database=baseName;trustServerCertificate=true?TC_TMPFS=/testtmpfs:rw" - ) - .containsEntry("spring.datasource.username", "SA") - .containsEntry("spring.datasource.password", "yourStrong(!)Password") - .containsEntry("spring.datasource.hikari.maximum-pool-size", 2); - } }