From fe9b99d921bad6dd33ccac9d7f5134c0d7b57f18 Mon Sep 17 00:00:00 2001 From: Colin DAMON Date: Wed, 22 Jun 2022 08:33:22 +0200 Subject: [PATCH] Add JPA reset option for cucumber --- .../domain/CucumberModuleFactory.java | 88 +++++++++++-------- .../primary/CucumberModuleConfiguration.java | 19 +++- .../cucumber/CucumberJpaReset.java.mustache | 24 +++++ src/test/features/cucumber.feature | 1 + .../module/domain/JHipsterModulesFixture.java | 6 ++ .../secondary/JHipsterModulesAssertions.java | 18 ++++ .../domain/CucumberModuleFactoryTest.java | 24 +++-- 7 files changed, 136 insertions(+), 44 deletions(-) create mode 100644 src/main/resources/generator/server/springboot/cucumber/CucumberJpaReset.java.mustache diff --git a/src/main/java/tech/jhipster/lite/generator/server/springboot/cucumber/domain/CucumberModuleFactory.java b/src/main/java/tech/jhipster/lite/generator/server/springboot/cucumber/domain/CucumberModuleFactory.java index 9fa43dd54c5..6cdffdd37b1 100644 --- a/src/main/java/tech/jhipster/lite/generator/server/springboot/cucumber/domain/CucumberModuleFactory.java +++ b/src/main/java/tech/jhipster/lite/generator/server/springboot/cucumber/domain/CucumberModuleFactory.java @@ -3,7 +3,9 @@ import static tech.jhipster.lite.generator.module.domain.JHipsterModule.*; import tech.jhipster.lite.error.domain.Assert; +import tech.jhipster.lite.generator.module.domain.JHipsterDestination; import tech.jhipster.lite.generator.module.domain.JHipsterModule; +import tech.jhipster.lite.generator.module.domain.JHipsterModule.JHipsterModuleBuilder; import tech.jhipster.lite.generator.module.domain.JHipsterSource; import tech.jhipster.lite.generator.module.domain.javadependency.JavaDependency; import tech.jhipster.lite.generator.module.domain.javadependency.JavaDependencyScope; @@ -11,6 +13,7 @@ public class CucumberModuleFactory { + private static final JHipsterSource SOURCE = from("server/springboot/cucumber"); private static final String CUCUMBER_GROUP_ID = "io.cucumber"; private static final String CUCUMBER_VERSION = "cucumber.version"; @@ -19,48 +22,53 @@ public JHipsterModule buildModule(JHipsterModuleProperties properties) { String packagePath = properties.basePackage().path(); String applicationName = properties.projectBaseName().capitalized(); - JHipsterSource source = from("server/springboot/cucumber"); + JHipsterDestination destination = toSrcTestJava().append(packagePath).append("cucumber"); //@formatter:off - return moduleBuilder(properties) - .context() - .packageName(properties.basePackage()) - .put("applicationName", applicationName) + JHipsterModuleBuilder builder = moduleBuilder(properties) + .context() + .packageName(properties.basePackage()) + .put("applicationName", applicationName) + .and() + .documentation(documentationTitle("Cucumber"), SOURCE.template("cucumber.md")) + .files() + .batch(SOURCE, destination) + .add("AsyncElementAsserter.java") + .add("AsyncHeaderAsserter.java") + .add("AsyncResponseAsserter.java") + .add("Awaiter.java") + .add("CucumberAssertions.java") + .add("CucumberConfiguration.java") + .add("CucumberJson.java") + .add("CucumberTest.java") + .add("CucumberTestContext.java") + .add("CucumberTestContextUnitTest.java") + .add("ElementAsserter.java") + .add("ElementAssertions.java") + .add("HeaderAsserter.java") + .add("HeaderAssertions.java") + .add("ResponseAsserter.java") + .add("SyncElementAsserter.java") + .add("SyncHeaderAsserter.java") + .add("SyncResponseAsserter.java") .and() - .documentation(documentationTitle("Cucumber"), source.template("cucumber.md")) - .files() - .batch(source, toSrcTestJava().append(packagePath).append("cucumber")) - .add("AsyncElementAsserter.java") - .add("AsyncHeaderAsserter.java") - .add("AsyncResponseAsserter.java") - .add("Awaiter.java") - .add("CucumberAssertions.java") - .add("CucumberConfiguration.java") - .add("CucumberJson.java") - .add("CucumberTest.java") - .add("CucumberTestContext.java") - .add("CucumberTestContextUnitTest.java") - .add("ElementAsserter.java") - .add("ElementAssertions.java") - .add("HeaderAsserter.java") - .add("HeaderAssertions.java") - .add("ResponseAsserter.java") - .add("SyncElementAsserter.java") - .add("SyncHeaderAsserter.java") - .add("SyncResponseAsserter.java") - .and() - .add(source.file("gitkeep"), to("src/test/features/.gitkeep")) - .and() - .javaDependencies() - .add(cucumberJunitDependency()) - .add(cucumberJavaDependency()) - .add(cucumberSpringDependency()) - .add(junitVintageDependency()) - .add(testNgDependency()) - .add(awaitilityDepencency()) - .and() - .build(); + .add(SOURCE.file("gitkeep"), to("src/test/features/.gitkeep")) + .and() + .javaDependencies() + .add(cucumberJunitDependency()) + .add(cucumberJavaDependency()) + .add(cucumberSpringDependency()) + .add(junitVintageDependency()) + .add(testNgDependency()) + .add(awaitilityDepencency()) + .and(); //@formatter:on + + if (needJpaReset(properties)) { + builder.files().add(SOURCE.template("CucumberJpaReset.java"), destination.append("CucumberJpaReset.java")); + } + + return builder.build(); } private JavaDependency cucumberJunitDependency() { @@ -106,4 +114,8 @@ private JavaDependency testNgDependency() { private JavaDependency awaitilityDepencency() { return javaDependency().groupId("org.awaitility").artifactId("awaitility").scope(JavaDependencyScope.TEST).build(); } + + private boolean needJpaReset(JHipsterModuleProperties properties) { + return properties.getOrDefaultBoolean("jpaReset", false); + } } diff --git a/src/main/java/tech/jhipster/lite/generator/server/springboot/cucumber/infrastructure/primary/CucumberModuleConfiguration.java b/src/main/java/tech/jhipster/lite/generator/server/springboot/cucumber/infrastructure/primary/CucumberModuleConfiguration.java index c261bcf17e1..cb2b58e839d 100644 --- a/src/main/java/tech/jhipster/lite/generator/server/springboot/cucumber/infrastructure/primary/CucumberModuleConfiguration.java +++ b/src/main/java/tech/jhipster/lite/generator/server/springboot/cucumber/infrastructure/primary/CucumberModuleConfiguration.java @@ -3,6 +3,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import tech.jhipster.lite.generator.module.domain.properties.JHipsterModulePropertiesDefinition; +import tech.jhipster.lite.generator.module.domain.properties.JHipsterModulePropertyDefinition; import tech.jhipster.lite.generator.module.infrastructure.primary.JHipsterModuleApiDoc; import tech.jhipster.lite.generator.module.infrastructure.primary.JHipsterModuleResource; import tech.jhipster.lite.generator.server.springboot.cucumber.application.CucumberApplicationService; @@ -16,8 +17,24 @@ JHipsterModuleResource cucumberModule(CucumberApplicationService cucumber) { .builder() .legacyUrl("/api/servers/spring-boot/component-tests/cucumber") .slug("springboot-cucumber") - .propertiesDefinition(JHipsterModulePropertiesDefinition.builder().addBasePackage().addIndentation().addProjectBaseName().build()) + .propertiesDefinition( + JHipsterModulePropertiesDefinition + .builder() + .addBasePackage() + .addIndentation() + .addProjectBaseName() + .add(jpaResetPropertyDefinition()) + .build() + ) .apiDoc(new JHipsterModuleApiDoc("Spring Boot - Component Tests", "Add cucumber integration to project")) .factory(cucumber::build); } + + private JHipsterModulePropertyDefinition jpaResetPropertyDefinition() { + return JHipsterModulePropertyDefinition + .optionalBooleanProperty("jpaReset") + .description("Used to reset data from all JPA repositories") + .order(500) + .build(); + } } diff --git a/src/main/resources/generator/server/springboot/cucumber/CucumberJpaReset.java.mustache b/src/main/resources/generator/server/springboot/cucumber/CucumberJpaReset.java.mustache new file mode 100644 index 00000000000..98a17df7f62 --- /dev/null +++ b/src/main/resources/generator/server/springboot/cucumber/CucumberJpaReset.java.mustache @@ -0,0 +1,24 @@ +package {{packageName}}.cucumber; + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.repository.JpaRepository; + +import io.cucumber.java.After; +import io.cucumber.java.Before; + +public class CucumberJpaReset { + + @Autowired + private Map> repositories; + + @After + @Before + public void wipeData() { + repositories.entrySet() + .stream() + .map(Map.Entry::getValue) + .forEach(JpaRepository::deleteAllInBatch); + } +} diff --git a/src/test/features/cucumber.feature b/src/test/features/cucumber.feature index 42c6803c150..e320b61eb24 100644 --- a/src/test/features/cucumber.feature +++ b/src/test/features/cucumber.feature @@ -11,6 +11,7 @@ Feature: Cucumber module | Key | Type | Mandatory | | packageName | STRING | true | | baseName | STRING | true | + | jpaReset | BOOLEAN | false | | prettierDefaultIndent | INTEGER | false | Scenario: Should add cucumber elements using module url diff --git a/src/test/java/tech/jhipster/lite/generator/module/domain/JHipsterModulesFixture.java b/src/test/java/tech/jhipster/lite/generator/module/domain/JHipsterModulesFixture.java index cd50b277878..2aae83eba25 100644 --- a/src/test/java/tech/jhipster/lite/generator/module/domain/JHipsterModulesFixture.java +++ b/src/test/java/tech/jhipster/lite/generator/module/domain/JHipsterModulesFixture.java @@ -245,6 +245,12 @@ public JHipsterModulePropertiesBuilder projectBaseName(String projectBaseName) { return this; } + public JHipsterModulePropertiesBuilder put(String key, Object value) { + properties.put(key, value); + + return this; + } + public JHipsterModuleProperties build() { return new JHipsterModuleProperties(projectFolder, properties); } diff --git a/src/test/java/tech/jhipster/lite/generator/module/infrastructure/secondary/JHipsterModulesAssertions.java b/src/test/java/tech/jhipster/lite/generator/module/infrastructure/secondary/JHipsterModulesAssertions.java index 33380165edd..b24477491b6 100644 --- a/src/test/java/tech/jhipster/lite/generator/module/infrastructure/secondary/JHipsterModulesAssertions.java +++ b/src/test/java/tech/jhipster/lite/generator/module/infrastructure/secondary/JHipsterModulesAssertions.java @@ -112,6 +112,20 @@ private Consumer assertFileExist(SoftAssertions assertions) { return path -> assertions.assertThat(Files.exists(path)).as(fileNotFoundMessage(path, projectFolder)).isTrue(); } + public ModuleAsserter doNotCreateFiles(String... files) { + assertThat(files).as("Can't check null files as not created for a module").isNotNull(); + + SoftAssertions assertions = new SoftAssertions(); + Stream.of(files).map(file -> projectFolder.filePath(file)).forEach(assertFileNotExist(assertions)); + assertions.assertAll(); + + return this; + } + + private Consumer assertFileNotExist(SoftAssertions assertions) { + return path -> assertions.assertThat(Files.notExists(path)).as(fileFoundMessage(path, projectFolder)).isTrue(); + } + public ModuleFileAsserter createFile(String file) { return new ModuleFileAsserter(this, file); } @@ -173,6 +187,10 @@ private static Supplier fileNotFoundMessage(Path path, JHipsterProjectFo return () -> "Can't find file " + path + " in project folder, found " + projectFiles(projectFolder); } + private static Supplier fileFoundMessage(Path path, JHipsterProjectFolder projectFolder) { + return () -> "Found file " + path + " in project folder, found " + projectFiles(projectFolder); + } + private static String projectFiles(JHipsterProjectFolder projectFolder) { try { return Files diff --git a/src/test/java/tech/jhipster/lite/generator/server/springboot/cucumber/domain/CucumberModuleFactoryTest.java b/src/test/java/tech/jhipster/lite/generator/server/springboot/cucumber/domain/CucumberModuleFactoryTest.java index 2d5d4fa95de..49ec5649d94 100644 --- a/src/test/java/tech/jhipster/lite/generator/server/springboot/cucumber/domain/CucumberModuleFactoryTest.java +++ b/src/test/java/tech/jhipster/lite/generator/server/springboot/cucumber/domain/CucumberModuleFactoryTest.java @@ -46,10 +46,8 @@ void shouldCreateModule() { "SyncHeaderAsserter.java", "SyncResponseAsserter.java" ) - .createFile("documentation/cucumber.md") - .and() - .createFile("src/test/features/.gitkeep") - .and() + .createFiles("documentation/cucumber.md") + .createFiles("src/test/features/.gitkeep") .createFile("pom.xml") .containing("cucumber-junit") .containing("cucumber-java") @@ -57,6 +55,22 @@ void shouldCreateModule() { .containing("junit-vintage-engine") .containing("testng") .containing("awaitility") - .containing("${cucumber.version}"); + .containing("${cucumber.version}") + .and() + .doNotCreateFiles("src/test/java/com/jhipster/test/cucumber/CucumberJpaReset.java"); + } + + @Test + void shouldAddDataResetWithSelectedOption() { + JHipsterModuleProperties properties = JHipsterModulesFixture + .propertiesBuilder(FileUtils.tmpDirForTest()) + .basePackage("com.jhipster.test") + .projectBaseName("myapp") + .put("jpaReset", true) + .build(); + + JHipsterModule module = factory.buildModule(properties); + + assertThatModuleOnProjectWithDefaultPom(module).createFiles("src/test/java/com/jhipster/test/cucumber/CucumberJpaReset.java"); } }