/*
* Copyright 2015 ThoughtWorks, Inc.
*
* 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 com.thoughtworks.go.domain.packagerepository;
import com.thoughtworks.go.config.materials.AbstractMaterialConfig;
import com.thoughtworks.go.domain.config.Configuration;
import com.thoughtworks.go.domain.config.ConfigurationKey;
import com.thoughtworks.go.domain.config.ConfigurationProperty;
import com.thoughtworks.go.domain.config.ConfigurationValue;
import com.thoughtworks.go.domain.config.RepositoryMetadataStoreHelper;
import com.thoughtworks.go.plugin.access.packagematerial.PackageConfigurations;
import com.thoughtworks.go.plugin.access.packagematerial.PackageMetadataStore;
import com.thoughtworks.go.plugin.api.material.packagerepository.PackageMaterialProperty;
import org.hamcrest.Matchers;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static com.thoughtworks.go.plugin.api.config.Property.PART_OF_IDENTITY;
import static java.util.Arrays.asList;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNull.nullValue;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
public class PackageRepositoriesTest {
@Test
public void shouldCheckEqualityOfPackageRepositories() {
PackageRepository packageRepository = new PackageRepository();
PackageRepositories packageRepositories = new PackageRepositories(packageRepository);
assertThat(packageRepositories, is(new PackageRepositories(packageRepository)));
}
@Test
public void shouldFindRepositoryGivenTheRepoId() throws Exception {
PackageRepository packageRepository1 = PackageRepositoryMother.create("repo-id1", "repo1", "plugin-id", "1.0", null);
PackageRepository packageRepository2 = PackageRepositoryMother.create("repo-id2", "repo2", "plugin-id", "1.0", null);
PackageRepositories packageRepositories = new PackageRepositories(packageRepository1, packageRepository2);
assertThat(packageRepositories.find("repo-id2"), is(packageRepository2));
}
@Test
public void shouldReturnNullIfNoMatchingRepoFound() throws Exception {
PackageRepositories packageRepositories = new PackageRepositories();
assertThat(packageRepositories.find("not-found"), is(nullValue()));
}
@Test
public void shouldGetPackageRepositoryForGivenPackageId() throws Exception {
PackageRepository repo1 = PackageRepositoryMother.create("repo-id1", "repo1", "plugin-id", "1.0", null);
PackageDefinition packageDefinitionOne = PackageDefinitionMother.create("pid1", repo1);
PackageDefinition packageDefinitionTwo = PackageDefinitionMother.create("pid2", repo1);
repo1.getPackages().addAll(asList(packageDefinitionOne, packageDefinitionTwo));
PackageRepository repo2 = PackageRepositoryMother.create("repo-id2", "repo2", "plugin-id", "1.0", null);
PackageDefinition packageDefinitionThree = PackageDefinitionMother.create("pid3", repo2);
PackageDefinition packageDefinitionFour = PackageDefinitionMother.create("pid4", repo2);
repo2.getPackages().addAll(asList(packageDefinitionThree, packageDefinitionFour));
PackageRepositories packageRepositories = new PackageRepositories(repo1, repo2);
assertThat(packageRepositories.findPackageRepositoryHaving("pid3"), is(repo2));
assertThat(packageRepositories.findPackageRepositoryWithPackageIdOrBomb("pid3"), is(repo2));
}
@Test
public void shouldReturnNullWhenRepositoryForGivenPackageNotFound() throws Exception {
PackageRepositories packageRepositories = new PackageRepositories();
assertThat(packageRepositories.findPackageRepositoryHaving("invalid"), is(nullValue()));
}
@Test
public void shouldThrowExceptionWhenRepositoryForGivenPackageNotFound() throws Exception {
PackageRepositories packageRepositories = new PackageRepositories();
try {
packageRepositories.findPackageRepositoryWithPackageIdOrBomb("invalid");
fail("should have thrown exception for not finding package repository");
} catch (RuntimeException e) {
assertThat(e.getMessage(), is("Could not find repository for given package id:[invalid]"));
}
}
@Test
public void shouldFindPackageRepositoryById() throws Exception {
PackageRepositories packageRepositories = new PackageRepositories();
packageRepositories.add(PackageRepositoryMother.create("repo1"));
PackageRepository repo2 = PackageRepositoryMother.create("repo2");
packageRepositories.add(repo2);
packageRepositories.removePackageRepository("repo1");
assertThat(packageRepositories, Matchers.contains(repo2));
}
@Test
public void shouldReturnNullExceptionWhenRepoIdIsNotFound() throws Exception {
PackageRepositories packageRepositories = new PackageRepositories();
try {
packageRepositories.removePackageRepository("repo1");
fail();
} catch (Exception e) {
assertThat(e.getMessage(), is(String.format("Could not find repository with id '%s'", "repo1")));
}
}
@Test
public void shouldValidateForCaseInsensitiveNameAndIdUniqueness() {
PackageRepository repo1 = PackageRepositoryMother.create("repo1");
PackageRepository duplicate = PackageRepositoryMother.create("REPO1");
PackageRepository unique = PackageRepositoryMother.create("unique");
PackageRepositories packageRepositories = new PackageRepositories();
packageRepositories.add(repo1);
packageRepositories.add(duplicate);
packageRepositories.add(unique);
packageRepositories.validate(null);
assertThat(repo1.errors().isEmpty(), is(false));
String nameError = String.format("You have defined multiple repositories called '%s'. Repository names are case-insensitive and must be unique.", duplicate.getName());
assertThat(repo1.errors().getAllOn(PackageRepository.NAME).contains(nameError), is(true));
assertThat(duplicate.errors().isEmpty(), is(false));
assertThat(duplicate.errors().getAllOn(PackageRepository.NAME).contains(nameError), is(true));
assertThat(unique.errors().isEmpty(), is(true));
}
@Test
public void shouldFailValidationIfMaterialWithDuplicateFingerprintIsFound() {
com.thoughtworks.go.plugin.api.material.packagerepository.PackageConfiguration packageConfiguration = new com.thoughtworks.go.plugin.api.material.packagerepository.PackageConfiguration();
packageConfiguration.add(new PackageMaterialProperty("k1"));
packageConfiguration.add(new PackageMaterialProperty("k2").with(PART_OF_IDENTITY, false));
PackageMetadataStore.getInstance().addMetadataFor("plugin", new PackageConfigurations(packageConfiguration));
String expectedErrorMessage = "Cannot save package or repo, found duplicate packages. [Repo Name: 'repo-repo1', Package Name: 'pkg1'], [Repo Name: 'repo-repo1', Package Name: 'pkg3'], [Repo Name: 'repo-repo1', Package Name: 'pkg5']";
PackageRepository repository = PackageRepositoryMother.create("repo1");
PackageDefinition definition1 = PackageDefinitionMother.create("1", "pkg1", new Configuration(new ConfigurationProperty(new ConfigurationKey("k1"), new ConfigurationValue("v1"))), repository);
PackageDefinition definition2 = PackageDefinitionMother.create("2", "pkg2", new Configuration(new ConfigurationProperty(new ConfigurationKey("k1"), new ConfigurationValue("v2"))), repository);
PackageDefinition definition3 = PackageDefinitionMother.create("3", "pkg3", new Configuration(new ConfigurationProperty(new ConfigurationKey("k1"), new ConfigurationValue("v1"))), repository);
PackageDefinition definition4 = PackageDefinitionMother.create("4", "pkg4", new Configuration(new ConfigurationProperty(new ConfigurationKey("k1"), new ConfigurationValue("V1"))), repository);
PackageDefinition definition5 = PackageDefinitionMother.create("5", "pkg5", new Configuration(new ConfigurationProperty(new ConfigurationKey("k1"), new ConfigurationValue("v1")), new ConfigurationProperty(new ConfigurationKey("k2"), new ConfigurationValue("v2"))), repository);
repository.setPackages(new Packages(definition1, definition2, definition3, definition4, definition5));
PackageRepositories packageRepositories = new PackageRepositories(repository);
packageRepositories.validate(null);
assertThat(definition1.errors().getAllOn(PackageDefinition.ID), is(asList(expectedErrorMessage)));
assertThat(definition3.errors().getAllOn(PackageDefinition.ID), is(asList(expectedErrorMessage)));
assertThat(definition3.getFingerprint(AbstractMaterialConfig.FINGERPRINT_DELIMITER).equals(definition1.getFingerprint(AbstractMaterialConfig.FINGERPRINT_DELIMITER)), is(true));
assertThat(definition5.errors().getAllOn(PackageDefinition.ID), is(asList(expectedErrorMessage)));
assertThat(definition5.getFingerprint(AbstractMaterialConfig.FINGERPRINT_DELIMITER).equals(definition1.getFingerprint(AbstractMaterialConfig.FINGERPRINT_DELIMITER)), is(true));
assertThat(definition2.errors().getAllOn(PackageDefinition.ID), is(nullValue()));
assertThat(definition2.getFingerprint(AbstractMaterialConfig.FINGERPRINT_DELIMITER).equals(definition1.getFingerprint(AbstractMaterialConfig.FINGERPRINT_DELIMITER)), is(false));
assertThat(definition4.errors().getAllOn(PackageDefinition.ID), is(nullValue()));
assertThat(definition4.getFingerprint(AbstractMaterialConfig.FINGERPRINT_DELIMITER).equals(definition1.getFingerprint(AbstractMaterialConfig.FINGERPRINT_DELIMITER)), is(false));
}
@Test
public void shouldGetPackageDefinitionForGivenPackageId() throws Exception {
PackageRepository repo1 = PackageRepositoryMother.create("repo-id1", "repo1", "plugin-id", "1.0", null);
PackageDefinition packageDefinitionOne = PackageDefinitionMother.create("pid1", repo1);
PackageDefinition packageDefinitionTwo = PackageDefinitionMother.create("pid2", repo1);
repo1.getPackages().addAll(asList(packageDefinitionOne, packageDefinitionTwo));
PackageRepository repo2 = PackageRepositoryMother.create("repo-id2", "repo2", "plugin-id", "1.0", null);
PackageDefinition packageDefinitionThree = PackageDefinitionMother.create("pid3", repo2);
PackageDefinition packageDefinitionFour = PackageDefinitionMother.create("pid4", repo2);
repo2.getPackages().addAll(asList(packageDefinitionThree, packageDefinitionFour));
PackageRepositories packageRepositories = new PackageRepositories(repo1, repo2);
assertThat(packageRepositories.findPackageDefinitionWith("pid3"), is(packageDefinitionThree));
assertThat(packageRepositories.findPackageDefinitionWith("pid5"), is(nullValue()));
}
@Before
public void setup() throws Exception {
RepositoryMetadataStoreHelper.clear();
}
@After
public void tearDown() throws Exception {
RepositoryMetadataStoreHelper.clear();
}
}