/* * Copyright 2017 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.config.materials; import java.util.HashMap; import java.util.Map; import com.thoughtworks.go.config.CaseInsensitiveString; import com.thoughtworks.go.config.ConfigSaveValidationContext; import com.thoughtworks.go.config.PipelineConfigSaveValidationContext; import com.thoughtworks.go.config.materials.git.GitMaterialConfig; import com.thoughtworks.go.domain.config.Configuration; import com.thoughtworks.go.domain.packagerepository.ConfigurationPropertyMother; import com.thoughtworks.go.domain.packagerepository.PackageDefinition; import com.thoughtworks.go.domain.packagerepository.PackageDefinitionMother; import com.thoughtworks.go.domain.packagerepository.PackageRepository; import com.thoughtworks.go.domain.packagerepository.PackageRepositoryMother; import org.junit.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.nullValue; import static org.mockito.Mockito.*; public class PackageMaterialConfigTest { @Test public void shouldAddErrorIfMaterialDoesNotHaveAPackageId() throws Exception { PackageMaterialConfig packageMaterialConfig = new PackageMaterialConfig(); packageMaterialConfig.validateConcreteMaterial(new ConfigSaveValidationContext(null, null)); assertThat(packageMaterialConfig.errors().getAll().size(), is(1)); assertThat(packageMaterialConfig.errors().on(PackageMaterialConfig.PACKAGE_ID), is("Please select a repository and package")); } @Test public void shouldAddErrorIfPackageDoesNotExistsForGivenPackageId() throws Exception { PipelineConfigSaveValidationContext configSaveValidationContext = mock(PipelineConfigSaveValidationContext.class); when(configSaveValidationContext.findPackageById(anyString())).thenReturn(mock(PackageRepository.class)); PackageRepository packageRepository = mock(PackageRepository.class); when(packageRepository.doesPluginExist()).thenReturn(true); PackageMaterialConfig packageMaterialConfig = new PackageMaterialConfig(new CaseInsensitiveString("package-name"), "package-id", PackageDefinitionMother.create("package-id")); packageMaterialConfig.getPackageDefinition().setRepository(packageRepository); packageMaterialConfig.validateTree(configSaveValidationContext); assertThat(packageMaterialConfig.errors().getAll().size(), is(1)); assertThat(packageMaterialConfig.errors().on(PackageMaterialConfig.PACKAGE_ID), is("Could not find plugin for given package id:[package-id].")); } @Test public void shouldAddErrorIfPackagePluginDoesNotExistsForGivenPackageId() throws Exception { PipelineConfigSaveValidationContext configSaveValidationContext = mock(PipelineConfigSaveValidationContext.class); when(configSaveValidationContext.findPackageById(anyString())).thenReturn(mock(PackageRepository.class)); PackageRepository packageRepository = mock(PackageRepository.class); when(packageRepository.doesPluginExist()).thenReturn(false); PackageMaterialConfig packageMaterialConfig = new PackageMaterialConfig(new CaseInsensitiveString("package-name"), "package-id", PackageDefinitionMother.create("package-id")); packageMaterialConfig.getPackageDefinition().setRepository(packageRepository); packageMaterialConfig.validateTree(configSaveValidationContext); assertThat(packageMaterialConfig.errors().getAll().size(), is(1)); assertThat(packageMaterialConfig.errors().on(PackageMaterialConfig.PACKAGE_ID), is("Could not find plugin for given package id:[package-id].")); } @Test public void shouldAddErrorIfMaterialNameUniquenessValidationFails() throws Exception { PackageMaterialConfig packageMaterialConfig = new PackageMaterialConfig("package-id"); Map<CaseInsensitiveString, AbstractMaterialConfig> nameToMaterialMap = new HashMap<>(); PackageMaterialConfig existingMaterial = new PackageMaterialConfig("package-id"); nameToMaterialMap.put(new CaseInsensitiveString("package-id"), existingMaterial); nameToMaterialMap.put(new CaseInsensitiveString("foo"), new GitMaterialConfig("url")); packageMaterialConfig.validateNameUniqueness(nameToMaterialMap); assertThat(packageMaterialConfig.errors().getAll().size(), is(1)); assertThat(packageMaterialConfig.errors().on(PackageMaterialConfig.PACKAGE_ID), is("Duplicate package material detected!")); assertThat(existingMaterial.errors().getAll().size(), is(1)); assertThat(existingMaterial.errors().on(PackageMaterialConfig.PACKAGE_ID), is("Duplicate package material detected!")); assertThat(nameToMaterialMap.size(), is(2)); } @Test public void shouldPassMaterialUniquenessIfIfNoDuplicateMaterialFound() throws Exception { PackageMaterialConfig packageMaterialConfig = new PackageMaterialConfig("package-id"); Map<CaseInsensitiveString, AbstractMaterialConfig> nameToMaterialMap = new HashMap<>(); nameToMaterialMap.put(new CaseInsensitiveString("repo-name:pkg-name"), new PackageMaterialConfig("package-id-new")); nameToMaterialMap.put(new CaseInsensitiveString("foo"), new GitMaterialConfig("url")); packageMaterialConfig.validateNameUniqueness(nameToMaterialMap); assertThat(packageMaterialConfig.errors().getAll().size(), is(0)); assertThat(nameToMaterialMap.size(), is(3)); } @Test public void shouldNotAddErrorDuringUniquenessValidationIfMaterialNameIsEmpty() throws Exception { PackageMaterialConfig packageMaterialConfig = new PackageMaterialConfig(""); Map<CaseInsensitiveString, AbstractMaterialConfig> nameToMaterialMap = new HashMap<>(); packageMaterialConfig.validateNameUniqueness(nameToMaterialMap); assertThat(packageMaterialConfig.errors().getAll().size(), is(0)); assertThat(nameToMaterialMap.size(), is(0)); } @Test public void shouldSetConfigAttributesForThePackageMaterial() throws Exception { Map<String, String> attributes = new HashMap<>(); attributes.put(PackageMaterialConfig.PACKAGE_ID, "packageId"); PackageMaterialConfig packageMaterialConfig = new PackageMaterialConfig(); packageMaterialConfig.setConfigAttributes(attributes); assertThat(packageMaterialConfig.getPackageId(), is("packageId")); } @Test public void shouldSetPackageIdToNullIfConfigAttributesForThePackageMaterialDoesNotContainPackageId() throws Exception { Map<String, String> attributes = new HashMap<>(); PackageMaterialConfig packageMaterialConfig = new PackageMaterialConfig("id"); packageMaterialConfig.setConfigAttributes(attributes); assertThat(packageMaterialConfig.getPackageId(), is(nullValue())); } @Test public void shouldSetPackageIdAsNullIfPackageDefinitionIsNull(){ PackageMaterialConfig materialConfig = new PackageMaterialConfig("1"); materialConfig.setPackageDefinition(null); assertThat(materialConfig.getPackageId(), is(nullValue())); assertThat(materialConfig.getPackageDefinition(), is(nullValue())); } @Test public void shouldGetNameFromRepoNameAndPackageName() { PackageMaterialConfig materialConfig = new PackageMaterialConfig(); PackageRepository repository = PackageRepositoryMother.create("repo-id", "repo-name", "pluginid", "version", new Configuration(ConfigurationPropertyMother.create("k1", false, "v1"))); materialConfig.setPackageDefinition(PackageDefinitionMother.create("p-id", "package-name", new Configuration(ConfigurationPropertyMother.create("k2", false, "v2")), repository)); assertThat(materialConfig.getName().toString(), is("repo-name:package-name")); materialConfig.setPackageDefinition(null); assertThat(materialConfig.getName(), is(nullValue())); } @Test public void shouldCheckEquals() throws Exception { PackageRepository repository = PackageRepositoryMother.create("repo-id", "repo-name", "pluginid", "version", new Configuration(ConfigurationPropertyMother.create("k1", false, "v1"))); PackageDefinition packageDefinition = PackageDefinitionMother.create("p-id", "package-name", new Configuration(ConfigurationPropertyMother.create("k2", false, "v2")), repository); PackageMaterialConfig p1 = new PackageMaterialConfig(); p1.setPackageDefinition(packageDefinition); PackageMaterialConfig p2 = new PackageMaterialConfig(); p2.setPackageDefinition(packageDefinition); assertThat(p1.equals(p2), is(true)); p1 = new PackageMaterialConfig(); p2 = new PackageMaterialConfig(); assertThat(p1.equals(p2), is(true)); p2.setPackageDefinition(packageDefinition); assertThat(p1.equals(p2), is(false)); p1.setPackageDefinition(packageDefinition); p2 = new PackageMaterialConfig(); assertThat(p1.equals(p2), is(false)); assertThat(p1.equals(null), is(false)); } @Test public void shouldDelegateToPackageDefinitionForAutoUpdate() throws Exception { PackageDefinition packageDefinition = mock(PackageDefinition.class); when(packageDefinition.isAutoUpdate()).thenReturn(false); PackageMaterialConfig materialConfig = new PackageMaterialConfig(new CaseInsensitiveString("name"), "package-id", packageDefinition); assertThat(materialConfig.isAutoUpdate(), is(false)); verify(packageDefinition).isAutoUpdate(); } }