/*
* 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.Arrays;
import io.spring.initializr.metadata.BillOfMaterials;
import io.spring.initializr.metadata.Dependency;
import io.spring.initializr.metadata.Dependency.Mapping;
import io.spring.initializr.metadata.InitializrMetadata;
import io.spring.initializr.metadata.InitializrMetadataBuilder;
import io.spring.initializr.test.metadata.InitializrMetadataTestBuilder;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
/**
* @author Stephane Nicoll
*/
public class ProjectRequestTests {
@Rule
public final ExpectedException thrown = ExpectedException.none();
private InitializrMetadata metadata = InitializrMetadataTestBuilder
.withDefaults().build();
@Test
public void initializeGroupIdAndArtifactId() {
metadata = InitializrMetadataBuilder.create().build();
metadata.getGroupId().setContent("org.acme");
metadata.getArtifactId().setContent("my-project");
ProjectRequest request = initProjectRequest();
assertEquals("org.acme", request.getGroupId());
assertEquals("my-project", request.getArtifactId());
}
@Test
public void initializeSetsMetadataDefaults() {
ProjectRequest request = initProjectRequest();
assertEquals(metadata.getName().getContent(), request.getName());
assertEquals(metadata.getTypes().getDefault().getId(), request.getType());
assertEquals(metadata.getDescription().getContent(), request.getDescription());
assertEquals(metadata.getGroupId().getContent(), request.getGroupId());
assertEquals(metadata.getArtifactId().getContent(), request.getArtifactId());
assertEquals(metadata.getVersion().getContent(), request.getVersion());
assertEquals(metadata.getBootVersions().getDefault().getId(),
request.getBootVersion());
assertEquals(metadata.getPackagings().getDefault().getId(),
request.getPackaging());
}
@Test
public void resolve() {
metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("code", "web", "security", "spring-data").build();
ProjectRequest request = initProjectRequest();
request.setType("maven-project");
request.getStyle().addAll(Arrays.asList("web", "spring-data"));
request.resolve(metadata);
assertEquals("Build type not detected", "maven", request.getBuild());
assertBootStarter(request.getResolvedDependencies().get(0), "web");
assertBootStarter(request.getResolvedDependencies().get(1), "spring-data");
}
@Test
public void resolveWithDependencies() {
metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("code", "web", "security", "spring-data").build();
ProjectRequest request = initProjectRequest();
request.setType("maven-project");
request.getDependencies().addAll(Arrays.asList("web", "spring-data"));
request.resolve(metadata);
assertEquals("Build type not detected", "maven", request.getBuild());
assertBootStarter(request.getResolvedDependencies().get(0), "web");
assertBootStarter(request.getResolvedDependencies().get(1), "spring-data");
}
@Test
public void resolveFullMetadata() {
metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("code", createDependency("org.foo", "acme", "1.2.0"))
.build();
ProjectRequest request = initProjectRequest();
request.getStyle().add("org.foo:acme");
request.resolve(metadata);
assertDependency(request.getResolvedDependencies().get(0), "org.foo", "acme",
"1.2.0");
}
@Test
public void resolveUnknownSimpleId() {
metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("code", "org.foo:bar").build();
ProjectRequest request = initProjectRequest();
request.getStyle().addAll(Arrays.asList("org.foo:bar", "foo-bar"));
thrown.expect(InvalidProjectRequestException.class);
thrown.expectMessage("foo-bar");
request.resolve(metadata);
assertEquals(1, request.getResolvedDependencies().size());
}
@Test
public void resolveUnknownDependency() {
metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("code", "org.foo:bar").build();
ProjectRequest request = initProjectRequest();
request.getStyle().add("org.foo:acme"); // does not exist
thrown.expect(InvalidProjectRequestException.class);
thrown.expectMessage("org.foo:acme");
request.resolve(metadata);
assertEquals(1, request.getResolvedDependencies().size());
}
@Test
public void resolveDependencyInRange() {
Dependency dependency = createDependency("org.foo", "bar", "1.2.0.RELEASE");
dependency.setVersionRange("[1.0.1.RELEASE, 1.2.0.RELEASE)");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("code", dependency).build();
ProjectRequest request = initProjectRequest();
request.getStyle().add("org.foo:bar");
request.setBootVersion("1.1.2.RELEASE");
request.resolve(metadata);
}
@Test
public void resolveDependencyNotInRange() {
Dependency dependency = createDependency("org.foo", "bar", "1.2.0.RELEASE");
dependency.setVersionRange("[1.0.1.RELEASE, 1.2.0.RELEASE)");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("code", dependency).build();
ProjectRequest request = initProjectRequest();
request.getStyle().add("org.foo:bar");
request.setBootVersion("0.9.9.RELEASE");
thrown.expect(InvalidProjectRequestException.class);
thrown.expectMessage("org.foo:bar");
thrown.expectMessage("0.9.9.RELEASE");
request.resolve(metadata);
}
@Test
public void resolveDependencyVersion() {
Dependency dependency = createDependency("org.foo", "bar", "1.2.0.RELEASE");
dependency.getMappings().add(Mapping.create(
"[1.0.0.RELEASE, 1.1.0.RELEASE)", null, null, "0.1.0.RELEASE"));
dependency.getMappings().add(Mapping.create(
"1.1.0.RELEASE", null, null, "0.2.0.RELEASE"));
metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("code", dependency).build();
ProjectRequest request = initProjectRequest();
request.setBootVersion("1.0.5.RELEASE");
request.getStyle().add("org.foo:bar");
request.resolve(metadata);
assertDependency(request.getResolvedDependencies().get(0), "org.foo", "bar",
"0.1.0.RELEASE");
ProjectRequest anotherRequest = new ProjectRequest();
anotherRequest.setBootVersion("1.1.0.RELEASE");
anotherRequest.getStyle().add("org.foo:bar");
anotherRequest.resolve(metadata);
assertDependency(anotherRequest.getResolvedDependencies().get(0), "org.foo",
"bar", "0.2.0.RELEASE");
}
@Test
public void resolveBuild() {
ProjectRequest request = initProjectRequest();
request.setType("gradle-project");
request.resolve(metadata);
assertEquals("gradle", request.getBuild());
}
@Test
public void resolveBuildNoTag() {
metadata = InitializrMetadataTestBuilder.withDefaults()
.addType("foo", false, "/foo.zip", null, null).build();
ProjectRequest request = initProjectRequest();
request.setType("foo");
request.resolve(metadata);
assertNull(request.getBuild());
}
@Test
public void resolveUnknownType() {
ProjectRequest request = initProjectRequest();
request.setType("foo-project");
thrown.expect(InvalidProjectRequestException.class);
thrown.expectMessage("foo-project");
request.resolve(metadata);
}
@Test
public void resolveApplicationNameWithNoName() {
ProjectRequest request = initProjectRequest();
request.setName(null);
request.resolve(metadata);
assertEquals(metadata.getConfiguration().getEnv().getFallbackApplicationName(),
request.getApplicationName());
}
@Test
public void resolveApplicationName() {
ProjectRequest request = initProjectRequest();
request.setName("Foo2");
request.resolve(metadata);
assertEquals("Foo2Application", request.getApplicationName());
}
@Test
public void resolveApplicationNameWithApplicationNameSet() {
ProjectRequest request = initProjectRequest();
request.setName("Foo2");
request.setApplicationName("MyApplicationName");
request.resolve(metadata);
assertEquals("MyApplicationName", request.getApplicationName());
}
@Test
public void packageNameInferredByGroupIdAndArtifactId() {
ProjectRequest request = initProjectRequest();
request.setGroupId("org.acme");
request.setArtifactId("foo");
request.resolve(metadata);
assertThat(request.getPackageName()).isEqualTo("org.acme.foo");
}
@Test
public void packageNameInferredByGroupIdAndCompositeArtifactId() {
ProjectRequest request = initProjectRequest();
request.setGroupId("org.acme");
request.setArtifactId("foo-bar");
request.resolve(metadata);
assertThat(request.getPackageName()).isEqualTo("org.acme.foobar");
}
@Test
public void packageNameUseFallbackIfGroupIdNotSet() {
ProjectRequest request = initProjectRequest();
request.setGroupId(null);
request.setArtifactId("foo");
request.resolve(metadata);
assertThat(request.getPackageName()).isEqualTo("com.example.demo");
}
@Test
public void packageNameUseFallbackIfArtifactIdNotSet() {
ProjectRequest request = initProjectRequest();
request.setGroupId("org.acme");
request.setArtifactId(null);
request.resolve(metadata);
assertThat(request.getPackageName()).isEqualTo("com.example.demo");
}
@Test
public void cleanPackageNameLeadingNumbers() {
ProjectRequest request = new ProjectRequest();
request.setPackageName("org.foo.42bar");
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.build();
request.resolve(metadata);
assertThat(request.getPackageName()).isEqualTo("org.foo.bar");
}
@Test
public void cleanPackageNameWithNoName() {
ProjectRequest request = initProjectRequest();
request.resolve(metadata);
assertEquals(metadata.getPackageName().getContent(), request.getPackageName());
}
@Test
public void cleanPackageName() {
ProjectRequest request = initProjectRequest();
request.setPackageName("com:foo bar");
request.resolve(metadata);
assertEquals("com.foo.bar", request.getPackageName());
}
@Test
public void resolveAdditionalBoms() {
Dependency dependency = Dependency.withId("foo");
dependency.setBom("foo-bom");
BillOfMaterials bom = BillOfMaterials.create("com.example", "foo-bom", "1.0.0");
bom.getAdditionalBoms().add("bar-bom");
BillOfMaterials additionalBom = BillOfMaterials.create("com.example", "bar-bom",
"1.1.0");
metadata = InitializrMetadataTestBuilder.withDefaults()
.addBom("foo-bom", bom).addBom("bar-bom", additionalBom)
.addDependencyGroup("test", dependency).build();
ProjectRequest request = initProjectRequest();
request.getStyle().add("foo");
request.resolve(metadata);
assertEquals(1, (request.getResolvedDependencies().size()));
assertEquals(2, request.getBoms().size());
assertEquals(bom, request.getBoms().get("foo-bom"));
assertEquals(additionalBom, request.getBoms().get("bar-bom"));
}
@Test
public void resolveAdditionalBomsDuplicates() {
Dependency dependency = Dependency.withId("foo");
dependency.setBom("foo-bom");
Dependency anotherDependency = Dependency.withId("bar");
anotherDependency.setBom("bar-bom");
BillOfMaterials bom = BillOfMaterials.create("com.example", "foo-bom", "1.0.0");
bom.getAdditionalBoms().add("bar-bom");
BillOfMaterials additionalBom = BillOfMaterials.create("com.example", "bar-bom",
"1.1.0");
metadata = InitializrMetadataTestBuilder.withDefaults()
.addBom("foo-bom", bom).addBom("bar-bom", additionalBom)
.addDependencyGroup("test", dependency, anotherDependency).build();
ProjectRequest request = initProjectRequest();
request.getStyle().addAll(Arrays.asList("foo", "bar"));
request.resolve(metadata);
assertEquals(2, request.getResolvedDependencies().size());
assertEquals(2, request.getBoms().size());
assertEquals(bom, request.getBoms().get("foo-bom"));
assertEquals(additionalBom, request.getBoms().get("bar-bom"));
}
@Test
public void resolveAdditionalRepositories() {
Dependency dependency = Dependency.withId("foo");
dependency.setBom("foo-bom");
dependency.setRepository("foo-repo");
BillOfMaterials bom = BillOfMaterials.create("com.example", "foo-bom", "1.0.0");
bom.getRepositories().add("bar-repo");
metadata = InitializrMetadataTestBuilder.withDefaults()
.addBom("foo-bom", bom)
.addRepository("foo-repo", "foo-repo", "http://example.com/foo", false)
.addRepository("bar-repo", "bar-repo", "http://example.com/bar", false)
.addDependencyGroup("test", dependency).build();
ProjectRequest request = initProjectRequest();
request.getStyle().add("foo");
request.resolve(metadata);
assertEquals(1, request.getResolvedDependencies().size());
assertEquals(1, request.getBoms().size());
assertEquals(2, request.getRepositories().size());
assertEquals(
metadata.getConfiguration().getEnv().getRepositories().get("foo-repo"),
request.getRepositories().get("foo-repo"));
assertEquals(
metadata.getConfiguration().getEnv().getRepositories().get("bar-repo"),
request.getRepositories().get("bar-repo"));
}
@Test
public void resolveAdditionalRepositoriesDuplicates() {
Dependency dependency = Dependency.withId("foo");
dependency.setBom("foo-bom");
dependency.setRepository("foo-repo");
BillOfMaterials bom = BillOfMaterials.create("com.example", "foo-bom", "1.0.0");
bom.getRepositories().add("bar-repo");
Dependency anotherDependency = Dependency.withId("bar");
anotherDependency.setRepository("bar-repo");
metadata = InitializrMetadataTestBuilder.withDefaults()
.addBom("foo-bom", bom)
.addRepository("foo-repo", "foo-repo", "http://example.com/foo", false)
.addRepository("bar-repo", "bar-repo", "http://example.com/bar", false)
.addDependencyGroup("test", dependency, anotherDependency).build();
ProjectRequest request = initProjectRequest();
request.getStyle().addAll(Arrays.asList("foo", "bar"));
request.resolve(metadata);
assertEquals(2, request.getResolvedDependencies().size());
assertEquals(1, request.getBoms().size());
assertEquals(2, request.getRepositories().size());
assertEquals(
metadata.getConfiguration().getEnv().getRepositories().get("foo-repo"),
request.getRepositories().get("foo-repo"));
assertEquals(
metadata.getConfiguration().getEnv().getRepositories().get("bar-repo"),
request.getRepositories().get("bar-repo"));
}
private ProjectRequest initProjectRequest() {
ProjectRequest request = new ProjectRequest();
request.initialize(this.metadata);
return request;
}
private static void assertBootStarter(Dependency actual, String name) {
Dependency expected = new Dependency();
expected.asSpringBootStarter(name);
assertDependency(actual, expected.getGroupId(), expected.getArtifactId(),
expected.getVersion());
assertEquals(name, actual.getId());
}
private static Dependency createDependency(String groupId, String artifactId,
String version) {
return Dependency.create(groupId, artifactId, version, Dependency.SCOPE_COMPILE);
}
private static void assertDependency(Dependency actual, String groupId,
String artifactId, String version) {
assertEquals(groupId, actual.getGroupId());
assertEquals(artifactId, actual.getArtifactId());
assertEquals(version, actual.getVersion());
}
}