/* * 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.metadata; import java.util.Arrays; import io.spring.initializr.util.Version; import io.spring.initializr.util.VersionParser; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; /** * Tests for {@link Dependency}. * * @author Stephane Nicoll */ public class DependencyTests { @Rule public final ExpectedException thrown = ExpectedException.none(); @Test public void createRootSpringBootStarter() { Dependency d = new Dependency(); d.asSpringBootStarter(""); assertEquals("org.springframework.boot", d.getGroupId()); assertEquals("spring-boot-starter", d.getArtifactId()); } @Test public void setCoordinatesFromId() { Dependency dependency = Dependency.withId("org.foo:bar:1.2.3"); dependency.resolve(); assertEquals("org.foo", dependency.getGroupId()); assertEquals("bar", dependency.getArtifactId()); assertEquals("1.2.3", dependency.getVersion()); assertEquals("org.foo:bar:1.2.3", dependency.getId()); } @Test public void setCoordinatesFromIdNoVersion() { Dependency dependency = Dependency.withId("org.foo:bar"); dependency.resolve(); assertEquals("org.foo", dependency.getGroupId()); assertEquals("bar", dependency.getArtifactId()); assertNull(dependency.getVersion()); assertEquals("org.foo:bar", dependency.getId()); } @Test public void setIdFromCoordinates() { Dependency dependency = new Dependency(); dependency.setGroupId("org.foo"); dependency.setArtifactId("bar"); dependency.setVersion("1.0"); dependency.resolve(); assertEquals("org.foo:bar", dependency.getId()); } @Test public void setIdFromCoordinatesNoVersion() { Dependency dependency = new Dependency(); dependency.setGroupId("org.foo"); dependency.setArtifactId("bar"); dependency.resolve(); assertEquals("org.foo:bar", dependency.getId()); } @Test public void setIdFromSimpleName() { Dependency dependency = Dependency.withId("web"); dependency.resolve(); assertEquals("org.springframework.boot", dependency.getGroupId()); assertEquals("spring-boot-starter-web", dependency.getArtifactId()); assertNull(dependency.getVersion()); assertEquals("web", dependency.getId()); } @Test public void invalidDependency() { thrown.expect(InvalidInitializrMetadataException.class); new Dependency().resolve(); } @Test public void invalidDependencyScope() { Dependency dependency = Dependency.withId("web"); thrown.expect(InvalidInitializrMetadataException.class); dependency.setScope("whatever"); } @Test public void invalidSpringBootRange() { Dependency dependency = Dependency.withId("web"); dependency.setVersionRange("A.B.C"); thrown.expect(InvalidInitializrMetadataException.class); thrown.expectMessage("A.B.C"); dependency.resolve(); } @Test public void invalidIdFormatTooManyColons() { Dependency dependency = Dependency.withId("org.foo:bar:1.0:test:external"); thrown.expect(InvalidInitializrMetadataException.class); dependency.resolve(); } @Test public void invalidLink() { Dependency dependency = Dependency.withId("foo"); dependency.getLinks().add(Link.create(null, "https://example.com")); thrown.expect(InvalidInitializrMetadataException.class); dependency.resolve(); } @Test public void generateIdWithNoGroupId() { Dependency dependency = new Dependency(); dependency.setArtifactId("bar"); thrown.expect(IllegalArgumentException.class); dependency.generateId(); } @Test public void generateIdWithNoArtifactId() { Dependency dependency = new Dependency(); dependency.setGroupId("foo"); thrown.expect(IllegalArgumentException.class); dependency.generateId(); } @Test public void resolveNoMapping() { Dependency dependency = Dependency.withId("web"); dependency.resolve(); assertSame(dependency, dependency.resolve(Version.parse("1.2.0.RELEASE"))); } @Test public void resolveInvalidMapping() { Dependency dependency = Dependency.withId("web"); dependency.getMappings() .add(Dependency.Mapping.create("foo-bar", null, null, "0.1.0.RELEASE")); thrown.expect(InvalidInitializrMetadataException.class); thrown.expectMessage("foo-bar"); dependency.resolve(); } @Test public void resolveVersionRequirement() { Dependency dependency = Dependency.withId("web"); dependency.getMappings().add(Dependency.Mapping .create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "0.1.0.RELEASE")); dependency.resolve(); Dependency resolved = dependency.resolve(Version.parse("1.1.5.RELEASE")); assertEquals(">=1.1.0.RELEASE and <1.2.0.RELEASE", resolved.getVersionRequirement()); } @Test public void resolveMatchingVersionMapping() { Dependency dependency = Dependency.withId("web", null, null, "0.3.0.RELEASE"); dependency.setDescription("A web dependency"); dependency.getKeywords().addAll(Arrays.asList("foo", "bar")); dependency.getAliases().add("the-web"); dependency.getFacets().add("web"); dependency.getMappings().add(Dependency.Mapping .create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "0.1.0.RELEASE")); dependency.getMappings().add(Dependency.Mapping .create("[1.2.0.RELEASE, 1.3.0.RELEASE)", null, null, "0.2.0.RELEASE")); dependency.resolve(); validateResolvedWebDependency(dependency.resolve(Version.parse("1.1.5.RELEASE")), "org.springframework.boot", "spring-boot-starter-web", "0.1.0.RELEASE"); validateResolvedWebDependency(dependency.resolve(Version.parse("1.2.0.RELEASE")), "org.springframework.boot", "spring-boot-starter-web", "0.2.0.RELEASE"); validateResolvedWebDependency(dependency.resolve(Version.parse("2.1.3.M1")), "org.springframework.boot", "spring-boot-starter-web", "0.3.0.RELEASE"); // default } @Test public void resolveMatchArtifactMapping() { Dependency dependency = Dependency.withId("web", null, null, "0.3.0.RELEASE"); dependency.setDescription("A web dependency"); dependency.getKeywords().addAll(Arrays.asList("foo", "bar")); dependency.getAliases().add("the-web"); dependency.getFacets().add("web"); dependency.getMappings().add(Dependency.Mapping .create("[1.1.0.RELEASE, 1.2.0.RELEASE)", "org.spring.boot", null, null)); dependency.getMappings().add(Dependency.Mapping .create("[1.2.0.RELEASE, 1.3.0.RELEASE)", null, "starter-web", null)); dependency.resolve(); validateResolvedWebDependency(dependency.resolve(Version.parse("1.1.5.RELEASE")), "org.spring.boot", "spring-boot-starter-web", "0.3.0.RELEASE"); validateResolvedWebDependency(dependency.resolve(Version.parse("1.2.0.RELEASE")), "org.springframework.boot", "starter-web", "0.3.0.RELEASE"); validateResolvedWebDependency(dependency.resolve(Version.parse("2.1.3.M1")), "org.springframework.boot", "spring-boot-starter-web", "0.3.0.RELEASE"); // default } @Test public void resolveMatchingVersionWithVariablePatch() { Dependency dependency = Dependency.withId("web", null, null, "0.3.0.RELEASE"); dependency.setDescription("A web dependency"); dependency.getKeywords().addAll(Arrays.asList("foo", "bar")); dependency.getAliases().add("the-web"); dependency.getFacets().add("web"); dependency.getMappings().add(Dependency.Mapping .create("[1.1.0.RELEASE, 1.1.x.RELEASE]", null, null, "0.1.0.RELEASE")); dependency.getMappings().add(Dependency.Mapping .create("[1.1.x.BUILD-SNAPSHOT, 1.2.0.RELEASE)", null, null, "0.2.0.RELEASE")); dependency.resolve(); dependency.updateVersionRanges(new VersionParser(Arrays.asList( Version.parse("1.1.5.RELEASE"), Version.parse("1.1.6.BUILD-SNAPSHOT")))); validateResolvedWebDependency(dependency.resolve(Version.parse("1.1.5.RELEASE")), "org.springframework.boot", "spring-boot-starter-web", "0.1.0.RELEASE"); validateResolvedWebDependency(dependency.resolve(Version.parse("1.1.6.BUILD-SNAPSHOT")), "org.springframework.boot", "spring-boot-starter-web", "0.2.0.RELEASE"); validateResolvedWebDependency(dependency.resolve(Version.parse("2.1.3.M1")), "org.springframework.boot", "spring-boot-starter-web", "0.3.0.RELEASE"); // default dependency.updateVersionRanges(new VersionParser(Arrays.asList( Version.parse("1.1.6.RELEASE"), Version.parse("1.1.7.BUILD-SNAPSHOT")))); validateResolvedWebDependency(dependency.resolve(Version.parse("1.1.5.RELEASE")), "org.springframework.boot", "spring-boot-starter-web", "0.1.0.RELEASE"); validateResolvedWebDependency(dependency.resolve(Version.parse("1.1.6.RELEASE")), "org.springframework.boot", "spring-boot-starter-web", "0.1.0.RELEASE"); validateResolvedWebDependency(dependency.resolve(Version.parse("1.1.7.BUILD-SNAPSHOT")), "org.springframework.boot", "spring-boot-starter-web", "0.2.0.RELEASE"); validateResolvedWebDependency(dependency.resolve(Version.parse("2.1.3.M1")), "org.springframework.boot", "spring-boot-starter-web", "0.3.0.RELEASE"); // default } @Test public void resolveMatchingWithCustomGroupId() { Dependency dependency = Dependency.withId("foo", "com.acme", "foo", "0.3.0.RELEASE"); dependency.getMappings().add(Dependency.Mapping .create("[1.1.0.RELEASE, 1.2.0.RELEASE)", null, null, "1.0.0.RELEASE")); dependency.getMappings().add(Dependency.Mapping .create("[1.2.0.RELEASE, 1.3.0.RELEASE)", null, "bar", null)); dependency.resolve(); validateResolvedDependency(dependency.resolve(Version.parse("1.1.5.RELEASE")), "foo", "com.acme", "foo", "1.0.0.RELEASE"); validateResolvedDependency(dependency.resolve(Version.parse("1.2.5.RELEASE")), "foo", "com.acme", "bar", "0.3.0.RELEASE"); } private static void validateResolvedWebDependency(Dependency dependency, String expectedGroupId, String expectedArtifactId, String expectedVersion) { validateResolvedDependency(dependency, "web", expectedGroupId, expectedArtifactId, expectedVersion); assertEquals(2, dependency.getKeywords().size()); assertEquals(1, dependency.getAliases().size()); assertEquals(1, dependency.getFacets().size()); } private static void validateResolvedDependency(Dependency dependency, String id, String expectedGroupId, String expectedArtifactId, String expectedVersion) { assertEquals(id, dependency.getId()); assertEquals(expectedGroupId, dependency.getGroupId()); assertEquals(expectedArtifactId, dependency.getArtifactId()); assertEquals(expectedVersion, dependency.getVersion()); } }