/*
* Copyright 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.spring.initializr.generator;
import java.util.Collections;
import io.spring.initializr.metadata.BillOfMaterials;
import io.spring.initializr.metadata.Dependency;
import io.spring.initializr.metadata.InitializrMetadata;
import io.spring.initializr.test.generator.ProjectAssert;
import io.spring.initializr.test.metadata.InitializrMetadataTestBuilder;
import io.spring.initializr.util.VersionProperty;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
/**
* Tests for {@link ProjectGenerator}
*
* @author Stephane Nicoll
* @author Andy Wilkinson
*/
public class ProjectGeneratorTests extends AbstractProjectGeneratorTests {
@Rule
public final ExpectedException thrown = ExpectedException.none();
@Test
public void defaultMavenPom() {
ProjectRequest request = createProjectRequest("web");
generateMavenPom(request).hasNoRepository().hasSpringBootStarterDependency("web");
verifyProjectSuccessfulEventFor(request);
}
@Test
public void defaultGradleBuild() {
ProjectRequest request = createProjectRequest("web");
generateGradleBuild(request).doesNotContain("import");
verifyProjectSuccessfulEventFor(request);
}
@Test
public void defaultProject() {
ProjectRequest request = createProjectRequest("web");
generateProject(request).isJavaProject().isMavenProject().pomAssert()
.hasNoRepository().hasSpringBootStarterDependency("web");
verifyProjectSuccessfulEventFor(request);
}
@Test
public void noDependencyAddsRootStarter() {
ProjectRequest request = createProjectRequest();
generateProject(request).isJavaProject().isMavenProject().pomAssert()
.hasSpringBootStarterRootDependency();
}
@Test
public void mavenPomWithBootSnapshot() {
ProjectRequest request = createProjectRequest("web");
request.setBootVersion("1.0.1.BUILD-SNAPSHOT");
generateMavenPom(request).hasSnapshotRepository()
.hasSpringBootParent("1.0.1.BUILD-SNAPSHOT")
.hasSpringBootStarterDependency("web");
}
@Test
public void mavenPomWithTarDependency() {
Dependency dependency = Dependency.withId("custom-artifact", "org.foo",
"custom-artifact");
dependency.setType("tar.gz");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("test", dependency).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("custom-artifact");
generateMavenPom(request).hasDependency(dependency).hasDependenciesCount(2);
}
@Test
public void gradleBuildWithTarDependency() {
Dependency dependency = Dependency.withId("custom-artifact", "org.foo",
"custom-artifact");
dependency.setType("tar.gz");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("test", dependency).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("custom-artifact");
generateGradleBuild(request)
.contains("compile('org.foo:custom-artifact@tar.gz')");
}
@Test
public void mavenPomWithWebFacet() {
Dependency dependency = Dependency.withId("thymeleaf", "org.foo", "thymeleaf");
dependency.getFacets().add("web");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("core", "web", "security", "data-jpa")
.addDependencyGroup("test", dependency).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("thymeleaf");
generateMavenPom(request).hasDependency("org.foo", "thymeleaf")
.hasDependenciesCount(2);
}
@Test
public void mavenWarWithWebFacet() {
Dependency dependency = Dependency.withId("thymeleaf", "org.foo", "thymeleaf");
dependency.getFacets().add("web");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("core", "web", "security", "data-jpa")
.addDependencyGroup("test", dependency).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("thymeleaf");
request.setPackaging("war");
generateProject(request).isJavaWarProject().isMavenProject().pomAssert()
.hasSpringBootStarterTomcat()
// This is tagged as web facet so it brings the web one
.hasDependency("org.foo", "thymeleaf").hasSpringBootStarterTest()
.hasDependenciesCount(3);
}
@Test
public void mavenWarPomWithoutWebFacet() {
ProjectRequest request = createProjectRequest("data-jpa");
request.setPackaging("war");
generateMavenPom(request).hasSpringBootStarterTomcat()
.hasSpringBootStarterDependency("data-jpa")
.hasSpringBootStarterDependency("web") // Added by war packaging
.hasSpringBootStarterTest().hasDependenciesCount(4);
}
@Test
public void gradleWarWithWebFacet() {
Dependency dependency = Dependency.withId("thymeleaf", "org.foo", "thymeleaf");
dependency.getFacets().add("web");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("core", "web", "security", "data-jpa")
.addDependencyGroup("test", dependency).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("thymeleaf");
request.setPackaging("war");
request.setType("gradle-project");
generateProject(request).isJavaWarProject().isGradleProject().gradleBuildAssert()
// This is tagged as web facet so it brings the web one
.contains("apply plugin: 'war'")
.contains("compile('org.foo:thymeleaf')")
.doesNotContain(
"compile('org.springframework.boot:spring-boot-starter-web')")
.contains(
"testCompile('org.springframework.boot:spring-boot-starter-test')")
.contains("configurations {") // declare providedRuntime config
.contains("providedRuntime").contains(
"providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')");
}
@Test
public void gradleWarPomWithoutWebFacet() {
ProjectRequest request = createProjectRequest("data-jpa");
request.setPackaging("war");
generateGradleBuild(request)
.contains(
"compile('org.springframework.boot:spring-boot-starter-data-jpa')")
// Added by warpackaging
.contains("compile('org.springframework.boot:spring-boot-starter-web')")
.contains(
"testCompile('org.springframework.boot:spring-boot-starter-test')")
.contains("configurations {") // declare providedRuntime config
.contains("providedRuntime").contains(
"providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')");
}
@Test
public void groupIdAndArtifactIdInferPackageName() {
ProjectRequest request = createProjectRequest("web");
request.setGroupId("org.acme");
request.setArtifactId("42foo");
generateProject(request)
.isJavaProject("org/acme/foo", "DemoApplication");
}
@Test
public void springBoot11UseEnableAutoConfigurationJava() {
ProjectRequest request = createProjectRequest("web");
request.setBootVersion("1.1.9.RELEASE");
request.setName("MyDemo");
request.setPackageName("foo");
generateProject(request)
.sourceCodeAssert("src/main/java/foo/MyDemoApplication.java")
.hasImports(EnableAutoConfiguration.class.getName(),
ComponentScan.class.getName(), Configuration.class.getName())
.doesNotHaveImports(SpringBootApplication.class.getName())
.contains("@EnableAutoConfiguration", "@Configuration", "@ComponentScan")
.doesNotContain("@SpringBootApplication");
}
@Test
public void springBootUseSpringBootApplicationJava() {
ProjectRequest request = createProjectRequest("web");
request.setBootVersion("1.2.0.RC1");
request.setName("MyDemo");
request.setPackageName("foo");
generateProject(request)
.sourceCodeAssert("src/main/java/foo/MyDemoApplication.java")
.hasImports(SpringBootApplication.class.getName())
.doesNotHaveImports(EnableAutoConfiguration.class.getName(),
ComponentScan.class.getName(), Configuration.class.getName())
.contains("@SpringBootApplication").doesNotContain(
"@EnableAutoConfiguration", "@Configuration", "@ComponentScan");
}
@Test
public void springBoot11UseEnableAutoConfigurationGroovy() {
ProjectRequest request = createProjectRequest("web");
request.setLanguage("groovy");
request.setBootVersion("1.1.9.RELEASE");
request.setName("MyDemo");
request.setPackageName("foo");
generateProject(request)
.sourceCodeAssert("src/main/groovy/foo/MyDemoApplication.groovy")
.hasImports(EnableAutoConfiguration.class.getName(),
ComponentScan.class.getName(), Configuration.class.getName())
.doesNotHaveImports(SpringBootApplication.class.getName())
.contains("@EnableAutoConfiguration", "@Configuration", "@ComponentScan")
.doesNotContain("@SpringBootApplication");
}
@Test
public void springBootUseSpringBootApplicationGroovy() {
ProjectRequest request = createProjectRequest("web");
request.setLanguage("groovy");
request.setBootVersion("1.2.0.RC1");
request.setName("MyDemo");
request.setPackageName("foo");
generateProject(request)
.sourceCodeAssert("src/main/groovy/foo/MyDemoApplication.groovy")
.hasImports(SpringBootApplication.class.getName())
.doesNotHaveImports(EnableAutoConfiguration.class.getName(),
ComponentScan.class.getName(), Configuration.class.getName())
.contains("@SpringBootApplication").doesNotContain(
"@EnableAutoConfiguration", "@Configuration", "@ComponentScan");
}
@Test
public void springBoot11UseEnableAutoConfigurationKotlin() {
ProjectRequest request = createProjectRequest("web");
request.setLanguage("kotlin");
request.setBootVersion("1.1.9.RELEASE");
request.setName("MyDemo");
request.setPackageName("foo");
generateProject(request)
.sourceCodeAssert("src/main/kotlin/foo/MyDemoApplication.kt")
.hasImports(EnableAutoConfiguration.class.getName(),
ComponentScan.class.getName(), Configuration.class.getName())
.doesNotHaveImports(SpringBootApplication.class.getName())
.contains("@EnableAutoConfiguration", "@Configuration", "@ComponentScan")
.doesNotContain("@SpringBootApplication");
}
@Test
public void springBootUseSpringBootApplicationKotlin() {
ProjectRequest request = createProjectRequest("web");
request.setLanguage("kotlin");
request.setBootVersion("1.2.0.RC1");
request.setName("MyDemo");
request.setPackageName("foo");
generateProject(request)
.sourceCodeAssert("src/main/kotlin/foo/MyDemoApplication.kt")
.hasImports(SpringBootApplication.class.getName())
.doesNotHaveImports(EnableAutoConfiguration.class.getName(),
ComponentScan.class.getName(), Configuration.class.getName())
.contains("@SpringBootApplication").doesNotContain(
"@EnableAutoConfiguration", "@Configuration", "@ComponentScan");
}
@Test
public void springBootUseGradle2() {
ProjectRequest request = createProjectRequest("web");
request.setType("gradle-project");
generateProject(request).isGradleProject("2.13");
}
@Test
public void springBoot15UseGradle3() {
ProjectRequest request = createProjectRequest("web");
request.setType("gradle-project");
request.setBootVersion("1.5.0.RELEASE");
generateProject(request).isGradleProject("3.4.1");
}
@Test
public void customBaseDirectory() {
ProjectRequest request = createProjectRequest();
request.setBaseDir("my-project");
generateProject(request).hasBaseDir("my-project").isJavaProject()
.isMavenProject();
}
@Test
public void customBaseDirectoryNested() {
ProjectRequest request = createProjectRequest();
request.setBaseDir("foo-bar/my-project");
generateProject(request).hasBaseDir("foo-bar/my-project").isJavaProject()
.isMavenProject();
}
@Test
public void groovyWithMavenUsesGroovyDir() {
ProjectRequest request = createProjectRequest("web");
request.setType("maven-project");
request.setLanguage("groovy");
generateProject(request).isMavenProject().isGroovyProject();
}
@Test
public void groovyWithGradleUsesGroovyDir() {
ProjectRequest request = createProjectRequest("web");
request.setType("gradle-project");
request.setLanguage("groovy");
generateProject(request).isGradleProject().isGroovyProject();
}
@Test
public void mavenPomWithCustomVersion() {
Dependency whatever = Dependency.withId("whatever", "org.acme", "whatever",
"1.2.3");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("core", "web", "security", "data-jpa")
.addDependencyGroup("foo", whatever).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("whatever", "data-jpa", "web");
generateMavenPom(request).hasDependency(whatever)
.hasSpringBootStarterDependency("data-jpa")
.hasSpringBootStarterDependency("web");
}
@Test
public void defaultMavenPomHasSpringBootParent() {
ProjectRequest request = createProjectRequest("web");
generateMavenPom(request).hasSpringBootParent(request.getBootVersion());
}
@Test
public void mavenPomWithCustomParentPom() {
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("core", "web", "security", "data-jpa")
.setMavenParent("com.foo", "foo-parent", "1.0.0-SNAPSHOT", false).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("web");
generateMavenPom(request).hasParent("com.foo", "foo-parent", "1.0.0-SNAPSHOT")
.hasBomsCount(0);
}
@Test
public void mavenPomWithCustomParentPomAndSpringBootBom() {
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("core", "web", "security", "data-jpa")
.setMavenParent("com.foo", "foo-parent", "1.0.0-SNAPSHOT", true).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("web");
request.setBootVersion("1.0.2.RELEASE");
generateMavenPom(request).hasParent("com.foo", "foo-parent", "1.0.0-SNAPSHOT")
.hasProperty("spring-boot.version", "1.0.2.RELEASE")
.hasBom("org.springframework.boot", "spring-boot-dependencies",
"${spring-boot.version}")
.hasBomsCount(1);
}
@Test
public void gradleBuildWithCustomParentPomAndSpringBootBom() {
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("core", "web", "security", "data-jpa")
.setMavenParent("com.foo", "foo-parent", "1.0.0-SNAPSHOT", true).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("web");
request.setBootVersion("1.0.2.RELEASE");
generateGradleBuild(request)
.doesNotContain("ext['spring-boot.version'] = '1.0.2.RELEASE'")
.doesNotContain(
"mavenBom \"org.springframework.boot:spring-boot-dependencies:1.0.2.RELEASE\"");
}
@Test
public void gradleBuildWithBootSnapshot() {
ProjectRequest request = createProjectRequest("web");
request.setBootVersion("1.0.1.BUILD-SNAPSHOT");
generateGradleBuild(request).hasSnapshotRepository();
}
@Test
public void gradleBuildWithCustomVersion() {
Dependency whatever = Dependency.withId("whatever", "org.acme", "whatever",
"1.2.3");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("core", "web", "security", "data-jpa")
.addDependencyGroup("foo", whatever).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("whatever", "data-jpa", "web");
generateGradleBuild(request)
.contains("compile('org.springframework.boot:spring-boot-starter-web')")
.contains(
"compile('org.springframework.boot:spring-boot-starter-data-jpa')")
.contains("compile('org.acme:whatever:1.2.3')");
}
@Test
public void mavenPomWithCustomScope() {
Dependency h2 = Dependency.withId("h2", "org.h2", "h2");
h2.setScope("runtime");
Dependency hamcrest = Dependency.withId("hamcrest", "org.hamcrest", "hamcrest");
hamcrest.setScope("test");
Dependency servlet = Dependency.withId("servlet-api", "javax.servlet",
"servlet-api");
servlet.setScope("provided");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("core", "web", "security", "data-jpa")
.addDependencyGroup("database", h2)
.addDependencyGroup("container", servlet)
.addDependencyGroup("test", hamcrest).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("hamcrest", "h2", "servlet-api",
"data-jpa", "web");
generateMavenPom(request).hasDependency(h2).hasDependency(hamcrest)
.hasDependency(servlet).hasSpringBootStarterDependency("data-jpa")
.hasSpringBootStarterDependency("web");
}
@Test
public void gradleBuildWithCustomScope() {
Dependency h2 = Dependency.withId("h2", "org.h2", "h2");
h2.setScope("runtime");
Dependency hamcrest = Dependency.withId("hamcrest", "org.hamcrest", "hamcrest");
hamcrest.setScope("test");
Dependency servlet = Dependency.withId("servlet-api", "javax.servlet",
"servlet-api");
servlet.setScope("provided");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("core", "web", "security", "data-jpa")
.addDependencyGroup("database", h2)
.addDependencyGroup("container", servlet)
.addDependencyGroup("test", hamcrest).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("hamcrest", "h2", "servlet-api",
"data-jpa", "web");
generateGradleBuild(request)
.contains("compile('org.springframework.boot:spring-boot-starter-web')")
.contains(
"compile('org.springframework.boot:spring-boot-starter-data-jpa')")
// declare providedRuntime config
.contains("runtime('org.h2:h2')").contains("configurations {")
.contains("providedRuntime")
.contains("providedRuntime('javax.servlet:servlet-api')")
.contains("testCompile('org.hamcrest:hamcrest')");
}
@Test
public void gradleBuildBeforeWithSpringBoot13() {
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("core", "web", "jpa").setGradleEnv("0.5.9.RELEASE")
.build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("web");
request.setBootVersion("1.2.3.RELEASE");
generateGradleBuild(request).contains("springBootVersion = '1.2.3.RELEASE'")
.contains(
"classpath('io.spring.gradle:dependency-management-plugin:0.5.9.RELEASE')")
.contains("apply plugin: 'spring-boot'")
.contains("apply plugin: 'io.spring.dependency-management'");
}
@Test
public void gradleBuildAsFromSpringBoot13() {
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("core", "web", "jpa").setGradleEnv("0.5.9.RELEASE")
.build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("web");
request.setBootVersion("1.3.0.BUILD-SNAPSHOT");
generateGradleBuild(request)
.contains("springBootVersion = '1.3.0.BUILD-SNAPSHOT'")
.contains("apply plugin: 'spring-boot'")
.doesNotContain(
"classpath('io.spring.gradle:dependency-management-plugin:0.5.9.RELEASE')")
.doesNotContain("apply plugin: 'io.spring.dependency-management'");
}
@Test
public void gradleBuildAsFromSpringBoot142() {
ProjectRequest request = createProjectRequest("web");
request.setBootVersion("1.4.2.BUILD-SNAPSHOT");
generateGradleBuild(request)
.contains("springBootVersion = '1.4.2.BUILD-SNAPSHOT'")
.contains("apply plugin: 'org.springframework.boot'")
.doesNotContain("apply plugin: 'spring-boot'");
}
@Test
public void gradleBuildAsFromSpringBoot20() {
ProjectRequest request = createProjectRequest("web");
request.setBootVersion("2.0.0.BUILD-SNAPSHOT");
generateGradleBuild(request)
.contains("springBootVersion = '2.0.0.BUILD-SNAPSHOT'")
.contains("apply plugin: 'org.springframework.boot'")
.doesNotContain("apply plugin: 'spring-boot'")
.contains("apply plugin: 'io.spring.dependency-management'");
}
@Test
public void mavenBom() {
Dependency foo = Dependency.withId("foo", "org.acme", "foo");
foo.setBom("foo-bom");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("foo", foo)
.addBom("foo-bom", "org.acme", "foo-bom", "1.2.3").build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("foo");
generateMavenPom(request).hasDependency(foo).hasBom("org.acme", "foo-bom",
"1.2.3");
}
@Test
public void mavenBomWithSeveralDependenciesOnSameBom() {
Dependency foo = Dependency.withId("foo", "org.acme", "foo");
foo.setBom("the-bom");
Dependency bar = Dependency.withId("bar", "org.acme", "bar");
bar.setBom("the-bom");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("group", foo, bar)
.addBom("the-bom", "org.acme", "the-bom", "1.2.3").build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("foo", "bar");
generateMavenPom(request).hasDependency(foo)
.hasBom("org.acme", "the-bom", "1.2.3").hasBomsCount(1);
}
@Test
public void mavenBomWithVersionMapping() {
Dependency foo = Dependency.withId("foo", "org.acme", "foo");
foo.setBom("the-bom");
BillOfMaterials bom = BillOfMaterials.create("org.acme", "foo-bom");
bom.getMappings()
.add(BillOfMaterials.Mapping.create("[1.2.0.RELEASE,1.3.0.M1)", "1.0.0"));
bom.getMappings().add(BillOfMaterials.Mapping.create("1.3.0.M1", "1.2.0"));
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("foo", foo).addBom("the-bom", bom).build();
applyMetadata(metadata);
// First version
ProjectRequest request = createProjectRequest("foo");
request.setBootVersion("1.2.5.RELEASE");
generateMavenPom(request).hasDependency(foo).hasSpringBootParent("1.2.5.RELEASE")
.hasBom("org.acme", "foo-bom", "1.0.0");
// Second version
ProjectRequest request2 = createProjectRequest("foo");
request2.setBootVersion("1.3.0.M1");
generateMavenPom(request2).hasDependency(foo).hasSpringBootParent("1.3.0.M1")
.hasBom("org.acme", "foo-bom", "1.2.0");
}
@Test
public void mavenBomWithVersionMappingAndExtraRepositories() {
Dependency foo = Dependency.withId("foo", "org.acme", "foo");
foo.setBom("the-bom");
BillOfMaterials bom = BillOfMaterials.create("org.acme", "foo-bom");
bom.getRepositories().add("foo-repo");
bom.getMappings()
.add(BillOfMaterials.Mapping.create("[1.2.0.RELEASE,1.3.0.M1)", "1.0.0"));
bom.getMappings().add(BillOfMaterials.Mapping.create("1.3.0.M1", "1.2.0",
"foo-repo", "bar-repo"));
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("foo", foo).addBom("the-bom", bom)
.addRepository("foo-repo", "repo", "http://example.com/foo", true)
.addRepository("bar-repo", "repo", "http://example.com/bar", false)
.build();
applyMetadata(metadata);
// Second version
ProjectRequest request = createProjectRequest("foo");
request.setBootVersion("1.3.0.RELEASE");
generateMavenPom(request).hasDependency(foo).hasSpringBootParent("1.3.0.RELEASE")
.hasBom("org.acme", "foo-bom", "1.2.0")
.hasRepository("foo-repo", "repo", "http://example.com/foo", true)
.hasRepository("bar-repo", "repo", "http://example.com/bar", false)
.hasRepositoriesCount(2);
}
@Test
public void gradleBom() {
Dependency foo = Dependency.withId("foo", "org.acme", "foo");
foo.setBom("foo-bom");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("foo", foo)
.addBom("foo-bom", "org.acme", "foo-bom", "1.2.3").build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("foo");
generateGradleBuild(request).contains("dependencyManagement {")
.contains("imports {").contains("mavenBom \"org.acme:foo-bom:1.2.3\"");
}
@Test
public void mavenRepository() {
Dependency foo = Dependency.withId("foo", "org.acme", "foo");
foo.setRepository("foo-repo");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("foo", foo)
.addRepository("foo-repo", "foo", "http://example.com/repo", false)
.build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("foo");
generateMavenPom(request).hasDependency(foo).hasRepository("foo-repo", "foo",
"http://example.com/repo", false);
}
@Test
public void mavenRepositoryWithSeveralDependenciesOnSameRepository() {
Dependency foo = Dependency.withId("foo", "org.acme", "foo");
foo.setRepository("the-repo");
Dependency bar = Dependency.withId("bar", "org.acme", "bar");
foo.setRepository("the-repo");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("group", foo, bar)
.addRepository("the-repo", "repo", "http://example.com/repo", true)
.build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("foo", "bar");
generateMavenPom(request).hasDependency(foo)
.hasRepository("the-repo", "repo", "http://example.com/repo", true)
.hasRepositoriesCount(1);
}
@Test
public void gradleRepository() {
Dependency foo = Dependency.withId("foo", "org.acme", "foo");
foo.setRepository("foo-repo");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("foo", foo)
.addRepository("foo-repo", "foo", "http://example.com/repo", false)
.build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("foo");
generateGradleBuild(request).hasRepository("http://example.com/repo");
}
@Test
public void projectWithOnlyStarterDependency() {
Dependency foo = Dependency.withId("foo", "org.foo", "custom-my-starter");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("foo", foo).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("foo");
generateMavenPom(request).hasDependency("org.foo", "custom-my-starter")
.hasSpringBootStarterTest().hasDependenciesCount(2);
}
@Test
public void projectWithOnlyNonStarterDependency() {
Dependency foo = Dependency.withId("foo", "org.foo", "foo");
foo.setStarter(false);
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("foo", foo).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("foo");
generateMavenPom(request).hasDependency("org.foo", "foo")
.hasSpringBootStarterRootDependency().hasSpringBootStarterTest()
.hasDependenciesCount(3);
}
@Test
public void buildPropertiesMaven() {
ProjectRequest request = createProjectRequest("web");
request.getBuildProperties().getMaven().put("name", () -> "test");
request.getBuildProperties().getVersions().put(
new VersionProperty("foo.version"), () -> "1.2.3");
request.getBuildProperties().getGradle().put("ignore.property", () -> "yes");
generateMavenPom(request).hasProperty("name", "test")
.hasProperty("foo.version", "1.2.3").hasNoProperty("ignore.property");
}
@Test
public void buildPropertiesGradle() {
ProjectRequest request = createProjectRequest("web");
request.getBuildProperties().getGradle().put("name", () -> "test");
request.getBuildProperties().getVersions().put(
new VersionProperty("foo.version"), () -> "1.2.3");
request.getBuildProperties().getMaven().put("ignore.property", () -> "yes");
generateGradleBuild(request).contains("name = 'test'")
.contains("ext {")
.contains("fooVersion = '1.2.3'")
.doesNotContain("ignore.property");
}
@Test
public void versionRangeWithPostProcessor() {
Dependency foo = Dependency.withId("foo", "org.acme", "foo");
foo.getMappings().add(Dependency.Mapping.create("[1.2.0.RELEASE,1.3.0.M1)", null,
null, "1.0.0"));
foo.getMappings().add(Dependency.Mapping.create("1.3.0.M1", null, null, "1.2.0"));
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("foo", foo).build();
applyMetadata(metadata);
// First without processor, get the correct version
ProjectRequest request = createProjectRequest("foo");
request.setBootVersion("1.2.5.RELEASE");
generateMavenPom(request)
.hasDependency(Dependency.withId("foo", "org.acme", "foo", "1.0.0"));
// First after processor that flips Spring Boot version
projectGenerator.setRequestResolver(new ProjectRequestResolver(
Collections.singletonList(new ProjectRequestPostProcessorAdapter() {
@Override
public void postProcessBeforeResolution(ProjectRequest r,
InitializrMetadata m) {
r.setBootVersion("1.3.0.M2");
}
})));
generateMavenPom(request)
.hasDependency(Dependency.withId("foo", "org.acme", "foo", "1.2.0"));
}
@Test
public void gitIgnoreMaven() {
ProjectRequest request = createProjectRequest();
request.setType("maven-project");
ProjectAssert project = generateProject(request);
project.sourceCodeAssert(".gitignore")
.equalsTo(new ClassPathResource("project/maven/gitignore.gen"));
}
@Test
public void gitIgnoreGradle() {
ProjectRequest request = createProjectRequest();
request.setType("gradle-project");
ProjectAssert project = generateProject(request);
project.sourceCodeAssert(".gitignore")
.equalsTo(new ClassPathResource("project/gradle/gitignore.gen"));
}
@Test
public void invalidProjectTypeMavenPom() {
ProjectRequest request = createProjectRequest("web");
request.setType("gradle-build");
this.thrown.expect(InvalidProjectRequestException.class);
this.thrown.expectMessage("gradle-build");
projectGenerator.generateMavenPom(request);
}
@Test
public void invalidProjectTypeGradleBuild() {
ProjectRequest request = createProjectRequest("web");
request.setType("maven-build");
this.thrown.expect(InvalidProjectRequestException.class);
this.thrown.expectMessage("maven-build");
projectGenerator.generateGradleBuild(request);
}
@Test
public void invalidDependency() {
ProjectRequest request = createProjectRequest("foo-bar");
try {
generateMavenPom(request);
fail("Should have failed to generate project");
}
catch (InvalidProjectRequestException ex) {
assertThat(ex.getMessage(), containsString("foo-bar"));
verifyProjectFailedEventFor(request, ex);
}
}
@Test
public void invalidType() {
ProjectRequest request = createProjectRequest("web");
request.setType("foo-bar");
try {
generateProject(request);
fail("Should have failed to generate project");
}
catch (InvalidProjectRequestException ex) {
assertThat(ex.getMessage(), containsString("foo-bar"));
verifyProjectFailedEventFor(request, ex);
}
}
@Test
public void invalidPackaging() {
ProjectRequest request = createProjectRequest("web");
request.setPackaging("foo-bar");
try {
generateGradleBuild(request);
fail("Should have failed to generate project");
}
catch (InvalidProjectRequestException ex) {
assertThat(ex.getMessage(), containsString("foo-bar"));
verifyProjectFailedEventFor(request, ex);
}
}
@Test
public void invalidLanguage() {
ProjectRequest request = createProjectRequest("web");
request.setLanguage("foo-bar");
try {
generateProject(request);
fail("Should have failed to generate project");
}
catch (InvalidProjectRequestException ex) {
assertThat(ex.getMessage(), containsString("foo-bar"));
verifyProjectFailedEventFor(request, ex);
}
}
}