From ae7731cc72aa9b1f0da815a07b794be765082080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Mino?= Date: Wed, 18 Sep 2024 08:48:31 +0200 Subject: [PATCH 1/3] test: added nested classes for maven and gradle in FrontendJavaBuildToolModuleFactoryTest --- ...rontendJavaBuildToolModuleFactoryTest.java | 485 +++++++++--------- 1 file changed, 246 insertions(+), 239 deletions(-) diff --git a/src/test/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/domain/FrontendJavaBuildToolModuleFactoryTest.java b/src/test/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/domain/FrontendJavaBuildToolModuleFactoryTest.java index a7d5593ca26..3dc0eda89bf 100644 --- a/src/test/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/domain/FrontendJavaBuildToolModuleFactoryTest.java +++ b/src/test/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/domain/FrontendJavaBuildToolModuleFactoryTest.java @@ -1,9 +1,10 @@ package tech.jhipster.lite.generator.server.javatool.frontendmaven.domain; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.when; import static tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.*; import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -13,9 +14,7 @@ import tech.jhipster.lite.UnitTest; import tech.jhipster.lite.module.domain.JHipsterModule; import tech.jhipster.lite.module.domain.JHipsterModulesFixture; -import tech.jhipster.lite.module.domain.npm.NpmPackageVersion; -import tech.jhipster.lite.module.domain.npm.NpmVersionSource; -import tech.jhipster.lite.module.domain.npm.NpmVersions; +import tech.jhipster.lite.module.domain.npm.*; import tech.jhipster.lite.module.domain.properties.JHipsterModuleProperties; @UnitTest @@ -28,250 +27,258 @@ class FrontendJavaBuildToolModuleFactoryTest { @InjectMocks private FrontendJavaBuildToolModuleFactory factory; - @Test - void shouldBuildFrontendMavenModule() { - mockNpmVersion(); + @Nested + class Maven { - JHipsterModule module = factory.buildFrontendMavenModule(getProperties()); + @Test + void shouldBuildFrontendMavenModule() { + mockNpmVersion(); - assertThatModuleWithFiles(module, pomFile()) - .hasFile("pom.xml") - .containing(" v16.0.0") - .containing(" 4.0.0") - .containing( - """ - - net.nicoulaj.maven.plugins - checksum-maven-plugin - ${checksum-maven-plugin.version} - - - create-pre-compiled-webapp-checksum - generate-resources - - files - - - - create-compiled-webapp-checksum - compile - - files - - - checksums.csv.old - - - - - - - ${project.basedir} - - src/main/webapp/**/*.* - target/classes/static/**/*.* - package-lock.json - package.json - tsconfig.json - - - - false - false - false - - SHA-1 - - true - true - - - """ - ) - .containing( - """ - - maven-antrun-plugin - ${maven-antrun-plugin.version} - - - eval-frontend-checksum - generate-resources - - run - - - - - - - - - - - - true - - - - - """ - ) - .containing( - """ - - com.github.eirslett - frontend-maven-plugin - ${frontend-maven-plugin.version} - - - install-node-and-npm - - install-node-and-npm - - - ${node.version} - ${npm.version} - - - - npm install - - npm - - - - build front - generate-resources - - npm - - - run build - - ${project.version} - - false - - - - front test - test - - npm - - - run test:coverage - false - - - - - ${project.build.directory} - - - """ - ) - .and() - .hasPrefixedFiles( - "src/main/java/tech/jhipster/jhlitest/wire/frontend", - "infrastructure/primary/RedirectionResource.java", - "package-info.java" - ); + JHipsterModule module = factory.buildFrontendMavenModule(getProperties()); + + assertThatModuleWithFiles(module, pomFile()) + .hasFile("pom.xml") + .containing(" v16.0.0") + .containing(" 4.0.0") + .containing( + """ + + net.nicoulaj.maven.plugins + checksum-maven-plugin + ${checksum-maven-plugin.version} + + + create-pre-compiled-webapp-checksum + generate-resources + + files + + + + create-compiled-webapp-checksum + compile + + files + + + checksums.csv.old + + + + + + + ${project.basedir} + + src/main/webapp/**/*.* + target/classes/static/**/*.* + package-lock.json + package.json + tsconfig.json + + + + false + false + false + + SHA-1 + + true + true + + + """ + ) + .containing( + """ + + maven-antrun-plugin + ${maven-antrun-plugin.version} + + + eval-frontend-checksum + generate-resources + + run + + + + + + + + + + + + true + + + + + """ + ) + .containing( + """ + + com.github.eirslett + frontend-maven-plugin + ${frontend-maven-plugin.version} + + + install-node-and-npm + + install-node-and-npm + + + ${node.version} + ${npm.version} + + + + npm install + + npm + + + + build front + generate-resources + + npm + + + run build + + ${project.version} + + false + + + + front test + test + + npm + + + run test:coverage + false + + + + + ${project.build.directory} + + + """ + ) + .and() + .hasPrefixedFiles( + "src/main/java/tech/jhipster/jhlitest/wire/frontend", + "infrastructure/primary/RedirectionResource.java", + "package-info.java" + ); + } } - @Test - void shouldBuildFrontendGradleModule() { - mockNpmVersion(); + @Nested + class Gradle { + + @Test + void shouldBuildFrontendGradleModule() { + mockNpmVersion(); - JHipsterModule module = factory.buildFrontendGradleModule(getProperties()); + JHipsterModule module = factory.buildFrontendGradleModule(getProperties()); - assertThatModuleWithFiles(module, gradleBuildFile(), gradleLibsVersionFile()) - .hasFile("gradle/libs.versions.toml") - .containing("node-gradle = \"") - .containing( - """ - \t[plugins.node-gradle] - \t\tid = "com.github.node-gradle.node" + assertThatModuleWithFiles(module, gradleBuildFile(), gradleLibsVersionFile()) + .hasFile("gradle/libs.versions.toml") + .containing("node-gradle = \"") + .containing( + """ + \t[plugins.node-gradle] + \t\tid = "com.github.node-gradle.node" - \t\t[plugins.node-gradle.version] - \t\t\tref = "node-gradle" - """ - ) - .and() - .hasFile("build.gradle.kts") - .containing( - """ - import com.github.gradle.node.npm.task.NpmTask - // jhipster-needle-gradle-imports - """ - ) - .containing( - """ - alias(libs.plugins.node.gradle) - // jhipster-needle-gradle-plugins - """ - ) - .containing( - """ - val nodeVersionValue by extra("16.0.0") - val npmVersionValue by extra("4.0.0") - // jhipster-needle-gradle-properties - """ - ) - .containing( - """ - node { - download.set(true) - version.set(nodeVersionValue) - npmVersion.set(npmVersionValue) - workDir.set(file(layout.buildDirectory)) - npmWorkDir.set(file(layout.buildDirectory)) - } - """ - ) - .containing( - """ - val buildTaskUsingNpm = tasks.register("buildNpm") { - description = "Build the frontend project using NPM" - group = "Build" - dependsOn("npmInstall") - npmCommand.set(listOf("run", "build")) - environment.set(mapOf("APP_VERSION" to project.version.toString())) - } - """ - ) - .containing( - """ - val testTaskUsingNpm = tasks.register("testNpm") { - description = "Test the frontend project using NPM" - group = "verification" - dependsOn("npmInstall", "buildNpm") - npmCommand.set(listOf("run", "test:coverage")) - ignoreExitValue.set(false) - workingDir.set(projectDir) - execOverrides { - standardOutput = System.out + \t\t[plugins.node-gradle.version] + \t\t\tref = "node-gradle" + """ + ) + .and() + .hasFile("build.gradle.kts") + .containing( + """ + import com.github.gradle.node.npm.task.NpmTask + // jhipster-needle-gradle-imports + """ + ) + .containing( + """ + alias(libs.plugins.node.gradle) + // jhipster-needle-gradle-plugins + """ + ) + .containing( + """ + val nodeVersionValue by extra("16.0.0") + val npmVersionValue by extra("4.0.0") + // jhipster-needle-gradle-properties + """ + ) + .containing( + """ + node { + download.set(true) + version.set(nodeVersionValue) + npmVersion.set(npmVersionValue) + workDir.set(file(layout.buildDirectory)) + npmWorkDir.set(file(layout.buildDirectory)) + } + """ + ) + .containing( + """ + val buildTaskUsingNpm = tasks.register("buildNpm") { + description = "Build the frontend project using NPM" + group = "Build" + dependsOn("npmInstall") + npmCommand.set(listOf("run", "build")) + environment.set(mapOf("APP_VERSION" to project.version.toString())) + } + """ + ) + .containing( + """ + val testTaskUsingNpm = tasks.register("testNpm") { + description = "Test the frontend project using NPM" + group = "verification" + dependsOn("npmInstall", "buildNpm") + npmCommand.set(listOf("run", "test:coverage")) + ignoreExitValue.set(false) + workingDir.set(projectDir) + execOverrides { + standardOutput = System.out + } } - } - """ - ) - .containing( - """ - tasks.bootJar { - dependsOn("buildNpm") - from("build/classes/static") { - into("BOOT-INF/classes/static") + """ + ) + .containing( + """ + tasks.bootJar { + dependsOn("buildNpm") + from("build/classes/static") { + into("BOOT-INF/classes/static") + } } - } - """ - ) - .containing( - """ - dependsOn("testNpm") - // jhipster-needle-gradle-tasks-test - """ - ); + """ + ) + .containing( + """ + dependsOn("testNpm") + // jhipster-needle-gradle-tasks-test + """ + ); + } } private void mockNpmVersion() { From da521b38cdd6a85fd65d24c261073743c910a6f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Mino?= Date: Wed, 18 Sep 2024 09:09:26 +0200 Subject: [PATCH 2/3] feat(frontend-maven-plugin): extract cache logic (checksum computation of resources) into a dedicated module See #10612 --- ...ontendJavaBuildToolApplicationService.java | 4 + .../FrontendJavaBuildToolModuleFactory.java | 15 +- ...ntendJavaBuildToolModuleConfiguration.java | 26 +++- .../slug/domain/JHLiteModuleSlug.java | 1 + .../javatool/frontend-java-build-tool.feature | 5 + ...rontendJavaBuildToolModuleFactoryTest.java | 131 ++++++++++-------- 6 files changed, 113 insertions(+), 69 deletions(-) diff --git a/src/main/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/application/FrontendJavaBuildToolApplicationService.java b/src/main/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/application/FrontendJavaBuildToolApplicationService.java index 2a9dcf9a23c..ee3c5263327 100644 --- a/src/main/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/application/FrontendJavaBuildToolApplicationService.java +++ b/src/main/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/application/FrontendJavaBuildToolApplicationService.java @@ -22,4 +22,8 @@ public JHipsterModule buildFrontendMavenModule(JHipsterModuleProperties properti public JHipsterModule buildFrontendGradleModule(JHipsterModuleProperties properties) { return factory.buildFrontendGradleModule(properties); } + + public JHipsterModule buildFrontendMavenCacheModule(JHipsterModuleProperties properties) { + return factory.buildFrontendMavenCacheModule(properties); + } } diff --git a/src/main/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/domain/FrontendJavaBuildToolModuleFactory.java b/src/main/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/domain/FrontendJavaBuildToolModuleFactory.java index 0ff1c99aee1..ddefa9539b2 100644 --- a/src/main/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/domain/FrontendJavaBuildToolModuleFactory.java +++ b/src/main/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/domain/FrontendJavaBuildToolModuleFactory.java @@ -29,16 +29,29 @@ public FrontendJavaBuildToolModuleFactory(NpmVersions npmVersions) { } public JHipsterModule buildFrontendMavenModule(JHipsterModuleProperties properties) { + Assert.notNull("properties", properties); + //@formatter:off return commonModuleFiles(properties) .javaBuildProperties() .set(buildPropertyKey("node.version"), buildPropertyValue("v" + npmVersions.nodeVersion().get())) .set(buildPropertyKey("npm.version"), buildPropertyValue(npmVersions.get("npm", NpmVersionSource.COMMON).get())) .and() + .mavenPlugins() + .plugin(frontendMavenPlugin()) + .and() + .build(); + //@formatter:on + } + + public JHipsterModule buildFrontendMavenCacheModule(JHipsterModuleProperties properties) { + Assert.notNull("properties", properties); + + //@formatter:off + return moduleBuilder(properties) .mavenPlugins() .plugin(checksumPlugin()) .plugin(antrunPlugin()) - .plugin(frontendMavenPlugin()) .and() .build(); //@formatter:on diff --git a/src/main/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/infrastructure/primary/FrontendJavaBuildToolModuleConfiguration.java b/src/main/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/infrastructure/primary/FrontendJavaBuildToolModuleConfiguration.java index 3a87a2f72cb..6d3af7badaf 100644 --- a/src/main/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/infrastructure/primary/FrontendJavaBuildToolModuleConfiguration.java +++ b/src/main/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/infrastructure/primary/FrontendJavaBuildToolModuleConfiguration.java @@ -6,19 +6,20 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import tech.jhipster.lite.generator.server.javatool.frontendmaven.application.FrontendJavaBuildToolApplicationService; -import tech.jhipster.lite.module.domain.resource.JHipsterModuleOrganization; -import tech.jhipster.lite.module.domain.resource.JHipsterModulePropertiesDefinition; -import tech.jhipster.lite.module.domain.resource.JHipsterModuleResource; +import tech.jhipster.lite.module.domain.resource.*; @Configuration class FrontendJavaBuildToolModuleConfiguration { + private static final String[] TAGS = { "server", "tools" }; + private static final String FRONTEND_JAVA_PLUGIN = "Frontend Java Plugin"; + @Bean JHipsterModuleResource frontendMavenModule(FrontendJavaBuildToolApplicationService frontendJavaBuildTool) { return JHipsterModuleResource.builder() .slug(FRONTEND_MAVEN_PLUGIN) .propertiesDefinition(JHipsterModulePropertiesDefinition.builder().addBasePackage().addProjectBaseName().addIndentation().build()) - .apiDoc("Frontend Java Plugin", "Add Frontend Maven Plugin") + .apiDoc(FRONTEND_JAVA_PLUGIN, "Add Frontend Maven Plugin") .organization( JHipsterModuleOrganization.builder() .feature(FRONTEND_JAVA_BUILD_TOOL_PLUGIN) @@ -27,16 +28,27 @@ JHipsterModuleResource frontendMavenModule(FrontendJavaBuildToolApplicationServi .addDependency(MAVEN_JAVA) .build() ) - .tags("server", "tools") + .tags(TAGS) .factory(frontendJavaBuildTool::buildFrontendMavenModule); } + @Bean + JHipsterModuleResource frontendMavenCacheModule(FrontendJavaBuildToolApplicationService frontendJavaBuildTool) { + return JHipsterModuleResource.builder() + .slug(FRONTEND_MAVEN_PLUGIN_CACHE) + .propertiesDefinition(JHipsterModulePropertiesDefinition.EMPTY) + .apiDoc(FRONTEND_JAVA_PLUGIN, "Add cache - by computing resources checksum - to avoid rebuilding frontend on successive maven builds") + .organization(JHipsterModuleOrganization.builder().addDependency(FRONTEND_MAVEN_PLUGIN).build()) + .tags(TAGS) + .factory(frontendJavaBuildTool::buildFrontendMavenCacheModule); + } + @Bean JHipsterModuleResource frontendGradleModule(FrontendJavaBuildToolApplicationService frontendJavaBuildTool) { return JHipsterModuleResource.builder() .slug(NODE_GRADLE_PLUGIN) .propertiesDefinition(JHipsterModulePropertiesDefinition.builder().addBasePackage().addProjectBaseName().addIndentation().build()) - .apiDoc("Frontend Java Plugin", "Add node-gradle plugin for building frontend with Gradle") + .apiDoc(FRONTEND_JAVA_PLUGIN, "Add node-gradle plugin for building frontend with Gradle") .organization( JHipsterModuleOrganization.builder() .feature(FRONTEND_JAVA_BUILD_TOOL_PLUGIN) @@ -45,7 +57,7 @@ JHipsterModuleResource frontendGradleModule(FrontendJavaBuildToolApplicationServ .addDependency(GRADLE_JAVA) .build() ) - .tags("server", "tools") + .tags(TAGS) .factory(frontendJavaBuildTool::buildFrontendGradleModule); } } diff --git a/src/main/java/tech/jhipster/lite/generator/slug/domain/JHLiteModuleSlug.java b/src/main/java/tech/jhipster/lite/generator/slug/domain/JHLiteModuleSlug.java index 18ffdffc0c8..61bc37c4962 100644 --- a/src/main/java/tech/jhipster/lite/generator/slug/domain/JHLiteModuleSlug.java +++ b/src/main/java/tech/jhipster/lite/generator/slug/domain/JHLiteModuleSlug.java @@ -33,6 +33,7 @@ public enum JHLiteModuleSlug implements JHipsterModuleSlugFactory { FLYWAY_MYSQL("flyway-mysql"), FLYWAY_POSTGRESQL("flyway-postgresql"), FRONTEND_MAVEN_PLUGIN("frontend-maven-plugin"), + FRONTEND_MAVEN_PLUGIN_CACHE("frontend-maven-plugin-cache"), FRONT_HEXAGONAL_ARCHITECTURE("front-hexagonal-architecture"), NODE_GRADLE_PLUGIN("node-gradle-plugin"), GATEWAY("gateway"), diff --git a/src/test/features/server/javatool/frontend-java-build-tool.feature b/src/test/features/server/javatool/frontend-java-build-tool.feature index cf8c90d5623..9254435d0da 100644 --- a/src/test/features/server/javatool/frontend-java-build-tool.feature +++ b/src/test/features/server/javatool/frontend-java-build-tool.feature @@ -7,6 +7,11 @@ Feature: Frontend server module Then I should have files in "src/main/java/tech/jhipster/chips/wire/frontend/infrastructure/primary" | RedirectionResource.java | + Scenario: Should apply frontend-maven-plugin-cache module + When I apply "frontend-maven-plugin-cache" module to default project with maven file + | packageName | tech.jhipster.chips | + Then I should have "checksum-maven-plugin" in "pom.xml" + Scenario: Should apply frontend server gradle module When I apply "node-gradle-plugin" module to default project with gradle build | packageName | tech.jhipster.chips | diff --git a/src/test/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/domain/FrontendJavaBuildToolModuleFactoryTest.java b/src/test/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/domain/FrontendJavaBuildToolModuleFactoryTest.java index 3dc0eda89bf..e80ac63a01d 100644 --- a/src/test/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/domain/FrontendJavaBuildToolModuleFactoryTest.java +++ b/src/test/java/tech/jhipster/lite/generator/server/javatool/frontendmaven/domain/FrontendJavaBuildToolModuleFactoryTest.java @@ -40,6 +40,76 @@ void shouldBuildFrontendMavenModule() { .hasFile("pom.xml") .containing(" v16.0.0") .containing(" 4.0.0") + .notContaining("checksum-maven-plugin") + .containing( + """ + + com.github.eirslett + frontend-maven-plugin + ${frontend-maven-plugin.version} + + + install-node-and-npm + + install-node-and-npm + + + ${node.version} + ${npm.version} + + + + npm install + + npm + + + + build front + generate-resources + + npm + + + run build + + ${project.version} + + false + + + + front test + test + + npm + + + run test:coverage + false + + + + + ${project.build.directory} + + + """ + ) + .and() + .hasPrefixedFiles( + "src/main/java/tech/jhipster/jhlitest/wire/frontend", + "infrastructure/primary/RedirectionResource.java", + "package-info.java" + ); + } + + @Test + void shouldBuildFrontendMavenCacheModule() { + JHipsterModule module = factory.buildFrontendMavenCacheModule(getProperties()); + + assertThatModuleWithFiles(module, pomFile()) + .hasFile("pom.xml") .containing( """ @@ -118,67 +188,6 @@ void shouldBuildFrontendMavenModule() { """ - ) - .containing( - """ - - com.github.eirslett - frontend-maven-plugin - ${frontend-maven-plugin.version} - - - install-node-and-npm - - install-node-and-npm - - - ${node.version} - ${npm.version} - - - - npm install - - npm - - - - build front - generate-resources - - npm - - - run build - - ${project.version} - - false - - - - front test - test - - npm - - - run test:coverage - false - - - - - ${project.build.directory} - - - """ - ) - .and() - .hasPrefixedFiles( - "src/main/java/tech/jhipster/jhlitest/wire/frontend", - "infrastructure/primary/RedirectionResource.java", - "package-info.java" ); } } From 4ccfa973d1c8831a4f411edea28496f1161dbacd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Mino?= Date: Wed, 18 Sep 2024 15:59:03 +0200 Subject: [PATCH 3/3] test: apply frontend-maven-plugin-cache when applying frontend-maven-plugin --- tests-ci/generate.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests-ci/generate.sh b/tests-ci/generate.sh index b117c0b4e3a..b35c790026c 100755 --- a/tests-ci/generate.sh +++ b/tests-ci/generate.sh @@ -95,7 +95,7 @@ sonar_back_front() { frontend_server_plugin() { if [[ $java_build_tool == 'maven' ]]; then - applyModules "frontend-maven-plugin" + applyModules "frontend-maven-plugin" "frontend-maven-plugin-cache" else applyModules "node-gradle-plugin" fi