From f224c6a38ac1e81614fe314a91b37596d9a3ce95 Mon Sep 17 00:00:00 2001 From: Torsten Walter Date: Fri, 1 Dec 2017 12:01:25 +0100 Subject: [PATCH] Allow generation of custom files To generate additional files, `doGenerateProjectStructure` should be overridden but doing so doesn't work as `ProjectGeneratedEvent` is publised as part as the base implementation. See gh-552 --- .../generator/ProjectGenerator.java | 10 +-- .../AbstractProjectGeneratorTests.java | 14 ++++- .../CustomProjectGeneratorTests.java | 63 +++++++++++++++++++ .../test/resources/project/maven/Jenkinsfile | 16 +++++ .../test/resources/templates/Jenkinsfile.tmpl | 16 +++++ 5 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 initializr-generator/src/test/java/io/spring/initializr/generator/CustomProjectGeneratorTests.java create mode 100644 initializr-generator/src/test/resources/project/maven/Jenkinsfile create mode 100644 initializr-generator/src/test/resources/templates/Jenkinsfile.tmpl diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java index 4ddb3553..30c3fb03 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java @@ -186,7 +186,9 @@ public class ProjectGenerator { */ public File generateProjectStructure(ProjectRequest request) { try { - return doGenerateProjectStructure(request); + File rootDir = doGenerateProjectStructure(request); + publishProjectGeneratedEvent(request); + return rootDir; } catch (InitializrException ex) { publishProjectFailedEvent(request, ex); @@ -254,9 +256,7 @@ public class ProjectGenerator { new File(dir, "src/main/resources/templates").mkdirs(); new File(dir, "src/main/resources/static").mkdirs(); } - publishProjectGeneratedEvent(request); return rootDir; - } /** @@ -566,11 +566,11 @@ public class ProjectGenerator { && !request.getJavaVersion().equals("1.7"); } - private static boolean isGradleBuild(ProjectRequest request) { + protected static boolean isGradleBuild(ProjectRequest request) { return "gradle".equals(request.getBuild()); } - private static boolean isMavenBuild(ProjectRequest request) { + protected static boolean isMavenBuild(ProjectRequest request) { return "maven".equals(request.getBuild()); } diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/AbstractProjectGeneratorTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/AbstractProjectGeneratorTests.java index a1b34b51..83a25611 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/AbstractProjectGeneratorTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/AbstractProjectGeneratorTests.java @@ -48,11 +48,19 @@ public abstract class AbstractProjectGeneratorTests { @Rule public final TemporaryFolder folder = new TemporaryFolder(); - protected final ProjectGenerator projectGenerator = new ProjectGenerator(); + protected final ProjectGenerator projectGenerator; - private final ApplicationEventPublisher eventPublisher = mock( + protected final ApplicationEventPublisher eventPublisher = mock( ApplicationEventPublisher.class); + public AbstractProjectGeneratorTests() { + this(new ProjectGenerator()); + } + + public AbstractProjectGeneratorTests(ProjectGenerator projectGenerator) { + this.projectGenerator = projectGenerator; + } + @Before public void setup() throws IOException { Dependency web = Dependency.withId("web"); @@ -104,7 +112,7 @@ public abstract class AbstractProjectGeneratorTests { verify(eventPublisher, times(1)).publishEvent(argThat(new ProjectFailedEventMatcher(request, ex))); } - private static class ProjectGeneratedEventMatcher + protected static class ProjectGeneratedEventMatcher extends ArgumentMatcher { private final ProjectRequest request; diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/CustomProjectGeneratorTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/CustomProjectGeneratorTests.java new file mode 100644 index 00000000..346cc0de --- /dev/null +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/CustomProjectGeneratorTests.java @@ -0,0 +1,63 @@ +package io.spring.initializr.generator; + +import io.spring.initializr.test.generator.ProjectAssert; +import org.junit.Test; +import org.mockito.InOrder; +import org.mockito.Mockito; +import org.springframework.core.io.ClassPathResource; + +import java.io.File; + +import static org.mockito.Matchers.argThat; +import static org.mockito.Mockito.times; + +public class CustomProjectGeneratorTests extends AbstractProjectGeneratorTests { + + public CustomProjectGeneratorTests() { + super(new MyProjectGenerator()); + } + + @Test + public void jenkinsfileMaven() { + ProjectRequest request = createProjectRequest(); + request.setType("maven-project"); + ProjectAssert project = generateProject(request); + project.sourceCodeAssert("Jenkinsfile") + .equalsTo(new ClassPathResource("project/maven/Jenkinsfile")); + } + + @Test + public void jenkinsfileGradle() { + ProjectRequest request = createProjectRequest(); + request.setType("gradle-build"); + ProjectAssert project = generateProject(request); + project.hasNoFile("Jenkinsfile"); + } + + @Test + public void projectGenerationEventAfterGeneratingAllFiles() throws Exception { + ProjectRequest request = createProjectRequest("web"); + generateProject(request); + verifyProjectSuccessfulEventFor(request); + + Runnable jenkinsfileGenerated = ((MyProjectGenerator) projectGenerator).jenkinsfileGenerated; + InOrder inOrder = Mockito.inOrder(eventPublisher, jenkinsfileGenerated); + + inOrder.verify(jenkinsfileGenerated, times(1)).run(); + inOrder.verify(eventPublisher, times(1)).publishEvent(argThat(new ProjectGeneratedEventMatcher(request))); + } + + private static class MyProjectGenerator extends ProjectGenerator { + protected final Runnable jenkinsfileGenerated = Mockito.mock(Runnable.class); + + @Override + protected File doGenerateProjectStructure(ProjectRequest request) { + File dir = super.doGenerateProjectStructure(request); + if (isMavenBuild(request)) { + write(new File(dir, "Jenkinsfile"), "Jenkinsfile.tmpl", resolveModel(request)); + jenkinsfileGenerated.run(); + } + return dir; + } + } +} diff --git a/initializr-generator/src/test/resources/project/maven/Jenkinsfile b/initializr-generator/src/test/resources/project/maven/Jenkinsfile new file mode 100644 index 00000000..847f0154 --- /dev/null +++ b/initializr-generator/src/test/resources/project/maven/Jenkinsfile @@ -0,0 +1,16 @@ +pipeline { + agent any + stages { + stage ('Build') { + steps { + echo "building com.example:demo:0.0.1-SNAPSHOT" + sh 'mvn -Dmaven.test.failure.ignore=true -B clean install' + } + post { + success { + junit 'target/surefire-reports/**/*.xml' + } + } + } + } +} \ No newline at end of file diff --git a/initializr-generator/src/test/resources/templates/Jenkinsfile.tmpl b/initializr-generator/src/test/resources/templates/Jenkinsfile.tmpl new file mode 100644 index 00000000..55c68a19 --- /dev/null +++ b/initializr-generator/src/test/resources/templates/Jenkinsfile.tmpl @@ -0,0 +1,16 @@ +pipeline { + agent any + stages { + stage ('Build') { + steps { + echo "building {{groupId}}:{{artifactId}}:{{version}}" + sh 'mvn -Dmaven.test.failure.ignore=true -B clean install' + } + post { + success { + junit 'target/surefire-reports/**/*.xml' + } + } + } + } +} \ No newline at end of file