/*
* 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 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.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.springframework.core.io.ClassPathResource;
/**
* Project generator tests for supported build systems.
*
* @author Stephane Nicoll
*/
@RunWith(Parameterized.class)
public class ProjectGeneratorBuildTests extends AbstractProjectGeneratorTests {
@Parameterized.Parameters(name = "{0}")
public static Object[] parameters() {
Object[] maven = new Object[] { "maven", "pom.xml" };
Object[] gradle = new Object[] { "gradle", "build.gradle" };
return new Object[] { maven, gradle };
}
private final String build;
private final String fileName;
private final String assertFileName;
public ProjectGeneratorBuildTests(String build, String fileName) {
this.build = build;
this.fileName = fileName;
this.assertFileName = fileName + ".gen";
}
@Test
public void standardJarJava() {
testStandardJar("java");
}
@Test
public void standardJarGroovy() {
testStandardJar("groovy");
}
@Test
public void standardJarKotlin() {
testStandardJar("kotlin");
}
private void testStandardJar(String language) {
ProjectRequest request = createProjectRequest();
request.setLanguage(language);
ProjectAssert project = generateProject(request);
project.sourceCodeAssert(fileName).equalsTo(new ClassPathResource(
"project/" + language + "/standard/" + assertFileName));
}
@Test
public void standardWarJava() {
testStandardWar("java");
}
@Test
public void standardWarGroovy() {
testStandardWar("java");
}
@Test
public void standardWarKotlin() {
testStandardWar("kotlin");
}
private void testStandardWar(String language) {
ProjectRequest request = createProjectRequest("web");
request.setPackaging("war");
request.setLanguage(language);
ProjectAssert project = generateProject(request);
project.sourceCodeAssert(fileName).equalsTo(new ClassPathResource(
"project/" + language + "/war/" + assertFileName));
}
@Test
public void versionOverride() {
ProjectRequest request = createProjectRequest("web");
request.getBuildProperties().getVersions().put(
new VersionProperty("spring-foo.version"), () -> "0.1.0.RELEASE");
request.getBuildProperties().getVersions().put(
new VersionProperty("spring-bar.version"), () -> "0.2.0.RELEASE");
ProjectAssert project = generateProject(request);
project.sourceCodeAssert(fileName).equalsTo(new ClassPathResource(
"project/" + build + "/version-override-" + assertFileName));
}
@Test
public void bomWithVersionProperty() {
Dependency foo = Dependency.withId("foo", "org.acme", "foo");
foo.setBom("the-bom");
BillOfMaterials bom = BillOfMaterials.create("org.acme", "foo-bom", "1.3.3");
bom.setVersionProperty("foo.version");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("foo", foo).addBom("the-bom", bom).build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("foo");
ProjectAssert project = generateProject(request);
project.sourceCodeAssert(fileName).equalsTo(new ClassPathResource(
"project/" + build + "/bom-property-" + assertFileName));
}
@Test
public void compileOnlyDependency() {
Dependency foo = Dependency.withId("foo", "org.acme", "foo");
foo.setScope(Dependency.SCOPE_COMPILE_ONLY);
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("core", "web", "data-jpa")
.addDependencyGroup("foo", foo)
.build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("foo", "web", "data-jpa");
ProjectAssert project = generateProject(request);
project.sourceCodeAssert(fileName).equalsTo(new ClassPathResource(
"project/" + build + "/compile-only-dependency-" + assertFileName));
}
@Test
public void bomWithOrdering() {
Dependency foo = Dependency.withId("foo", "org.acme", "foo");
foo.setBom("foo-bom");
BillOfMaterials barBom = BillOfMaterials.create("org.acme", "bar-bom",
"1.0");
barBom.setOrder(50);
BillOfMaterials bizBom = BillOfMaterials.create("org.acme", "biz-bom");
bizBom.setOrder(40);
bizBom.getAdditionalBoms().add("bar-bom");
bizBom.getMappings().add(BillOfMaterials.Mapping.create("1.0.0.RELEASE", "1.0"));
BillOfMaterials fooBom = BillOfMaterials.create("org.acme", "foo-bom",
"1.0");
fooBom.setOrder(20);
fooBom.getAdditionalBoms().add("biz-bom");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("foo", foo)
.addBom("foo-bom", fooBom)
.addBom("bar-bom", barBom)
.addBom("biz-bom", bizBom)
.build();
applyMetadata(metadata);
ProjectRequest request = createProjectRequest("foo");
ProjectAssert project = generateProject(request);
project.sourceCodeAssert(fileName).equalsTo(new ClassPathResource(
"project/" + build + "/bom-ordering-" + assertFileName));
}
@Test
public void kotlinJava6() {
ProjectRequest request = createProjectRequest();
request.setLanguage("kotlin");
request.setJavaVersion("1.6");
ProjectAssert project = generateProject(request);
project.sourceCodeAssert(fileName).equalsTo(new ClassPathResource(
"project/" + build + "/kotlin-java6-" + assertFileName));
}
@Test
public void kotlinJava7() {
ProjectRequest request = createProjectRequest();
request.setLanguage("kotlin");
request.setJavaVersion("1.7");
ProjectAssert project = generateProject(request);
project.sourceCodeAssert(fileName).equalsTo(new ClassPathResource(
"project/" + build + "/kotlin-java7-" + assertFileName));
}
@Override
public ProjectRequest createProjectRequest(String... styles) {
ProjectRequest request = super.createProjectRequest(styles);
request.setType(build + "-project");
return request;
}
}