/*
* 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 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.scm.SCM;
import com.thoughtworks.go.domain.scm.SCMMother;
import com.thoughtworks.go.plugin.access.scm.SCMMetadataStore;
import com.thoughtworks.go.plugin.access.scm.SCMView;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
import static com.thoughtworks.go.domain.packagerepository.ConfigurationPropertyMother.create;
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 PluggableSCMMaterialConfigTest {
@Before
public void setUp() {
SCMMetadataStore.getInstance().clear();
}
@After
public void tearDown() {
SCMMetadataStore.getInstance().clear();
}
@Test
public void shouldAddErrorIfMaterialDoesNotHaveASCMId() throws Exception {
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig();
pluggableSCMMaterialConfig.validateConcreteMaterial(new ConfigSaveValidationContext(null, null));
assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(1));
assertThat(pluggableSCMMaterialConfig.errors().on(PluggableSCMMaterialConfig.SCM_ID), is("Please select a SCM"));
}
@Test
public void shouldAddErrorIfSCMNameUniquenessValidationFails() throws Exception {
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig("scm-id");
Map<CaseInsensitiveString, AbstractMaterialConfig> nameToMaterialMap = new HashMap<>();
PluggableSCMMaterialConfig existingMaterial = new PluggableSCMMaterialConfig("scm-id");
nameToMaterialMap.put(new CaseInsensitiveString("scm-id"), existingMaterial);
nameToMaterialMap.put(new CaseInsensitiveString("foo"), new GitMaterialConfig("url"));
pluggableSCMMaterialConfig.validateNameUniqueness(nameToMaterialMap);
assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(1));
assertThat(pluggableSCMMaterialConfig.errors().on(PluggableSCMMaterialConfig.SCM_ID), is("Duplicate SCM material detected!"));
assertThat(existingMaterial.errors().getAll().size(), is(1));
assertThat(existingMaterial.errors().on(PluggableSCMMaterialConfig.SCM_ID), is("Duplicate SCM material detected!"));
assertThat(nameToMaterialMap.size(), is(2));
}
@Test
public void shouldPassMaterialUniquenessIfIfNoDuplicateSCMFound() throws Exception {
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig("scm-id");
Map<CaseInsensitiveString, AbstractMaterialConfig> nameToMaterialMap = new HashMap<>();
nameToMaterialMap.put(new CaseInsensitiveString("scm-id-new"), new PluggableSCMMaterialConfig("scm-id-new"));
nameToMaterialMap.put(new CaseInsensitiveString("foo"), new GitMaterialConfig("url"));
pluggableSCMMaterialConfig.validateNameUniqueness(nameToMaterialMap);
assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(0));
assertThat(nameToMaterialMap.size(), is(3));
}
@Test
public void shouldNotAddErrorDuringUniquenessValidationIfSCMNameIsEmpty() throws Exception {
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig("");
Map<CaseInsensitiveString, AbstractMaterialConfig> nameToMaterialMap = new HashMap<>();
pluggableSCMMaterialConfig.validateNameUniqueness(nameToMaterialMap);
assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(0));
assertThat(nameToMaterialMap.size(), is(0));
}
@Test
public void shouldAddErrorIDestinationIsNotValid() throws Exception {
ConfigSaveValidationContext configSaveValidationContext = mock(ConfigSaveValidationContext.class);
SCM scmConfig = mock(SCM.class);
when(configSaveValidationContext.findScmById(anyString())).thenReturn(scmConfig);
when(scmConfig.doesPluginExist()).thenReturn(true);
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(null, scmConfig, "/usr/home", null);
pluggableSCMMaterialConfig.setScmId("scm-id");
pluggableSCMMaterialConfig.validateConcreteMaterial(configSaveValidationContext);
assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(1));
assertThat(pluggableSCMMaterialConfig.errors().on(PluggableSCMMaterialConfig.FOLDER), is("Dest folder '/usr/home' is not valid. It must be a sub-directory of the working folder."));
pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(null, scmConfig, "./../crap", null);
pluggableSCMMaterialConfig.setScmId("scm-id");
pluggableSCMMaterialConfig.validateConcreteMaterial(configSaveValidationContext);
assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(2));
assertThat(pluggableSCMMaterialConfig.errors().on(PluggableSCMMaterialConfig.FOLDER), is("Invalid directory name './../crap'. It should be a valid relative path."));
}
@Test
public void shouldAddErrorWhenMatchingScmConfigDoesNotExist() throws Exception {
PipelineConfigSaveValidationContext validationContext = mock(PipelineConfigSaveValidationContext.class);
when(validationContext.findScmById(anyString())).thenReturn(null);
SCM scmConfig = mock(SCM.class);
when(scmConfig.doesPluginExist()).thenReturn(true);
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(null, scmConfig, "usr/home", null);
pluggableSCMMaterialConfig.setScmId("scm-id");
pluggableSCMMaterialConfig.validateTree(validationContext);
assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(1));
assertThat(pluggableSCMMaterialConfig.errors().on(PluggableSCMMaterialConfig.SCM_ID), is("Could not find SCM for given scm-id: [scm-id]."));
}
@Test
public void shouldAddErrorWhenAssociatedSCMPluginIsMissing() throws Exception {
PipelineConfigSaveValidationContext configSaveValidationContext = mock(PipelineConfigSaveValidationContext.class);
when(configSaveValidationContext.findScmById(anyString())).thenReturn(mock(SCM.class));
SCM scmConfig = mock(SCM.class);
when(scmConfig.doesPluginExist()).thenReturn(false);
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(null, scmConfig, "usr/home", null);
pluggableSCMMaterialConfig.setScmId("scm-id");
pluggableSCMMaterialConfig.validateTree(configSaveValidationContext);
assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(1));
assertThat(pluggableSCMMaterialConfig.errors().on(PluggableSCMMaterialConfig.SCM_ID), is("Could not find plugin for scm-id: [scm-id]."));
}
@Test
public void shouldSetConfigAttributesForSCMMaterial() throws Exception {
Map<String, String> attributes = new HashMap<>();
attributes.put(PluggableSCMMaterialConfig.SCM_ID, "scm-id");
attributes.put(PluggableSCMMaterialConfig.FOLDER, "dest");
attributes.put(PluggableSCMMaterialConfig.FILTER, "/foo/**.*,/another/**.*,bar");
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig();
pluggableSCMMaterialConfig.setConfigAttributes(attributes);
assertThat(pluggableSCMMaterialConfig.getScmId(), is("scm-id"));
assertThat(pluggableSCMMaterialConfig.getFolder(), is("dest"));
assertThat(pluggableSCMMaterialConfig.filter(), is(new Filter(new IgnoredFiles("/foo/**.*"), new IgnoredFiles("/another/**.*"), new IgnoredFiles("bar"))));
}
@Test
public void shouldSetConfigAttributesForSCMMaterialWhenDataIsEmpty() throws Exception {
Map<String, String> attributes = new HashMap<>();
attributes.put(PluggableSCMMaterialConfig.SCM_ID, "scm-id");
attributes.put(PluggableSCMMaterialConfig.FOLDER, "");
attributes.put(PluggableSCMMaterialConfig.FILTER, "");
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig();
pluggableSCMMaterialConfig.setFolder("dest");
pluggableSCMMaterialConfig.setFilter(new Filter(new IgnoredFiles("/foo/**.*")));
pluggableSCMMaterialConfig.setConfigAttributes(attributes);
assertThat(pluggableSCMMaterialConfig.getScmId(), is("scm-id"));
assertThat(pluggableSCMMaterialConfig.getFolder(), is(nullValue()));
assertThat(pluggableSCMMaterialConfig.filter(), is(new Filter()));
}
@Test
public void shouldGetFilterAsString() {
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig();
pluggableSCMMaterialConfig.setFilter(new Filter(new IgnoredFiles("/foo/**.*"), new IgnoredFiles("/another/**.*"), new IgnoredFiles("bar")));
assertThat(pluggableSCMMaterialConfig.getFilterAsString(), is("/foo/**.*,/another/**.*,bar"));
pluggableSCMMaterialConfig.setFilter(new Filter());
assertThat(pluggableSCMMaterialConfig.getFilterAsString(), is(""));
}
@Test
public void shouldSetSCMIdToNullIfConfigAttributesForSCMMaterialDoesNotContainSCMId() throws Exception {
Map<String, String> attributes = new HashMap<>();
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig("scm-id");
pluggableSCMMaterialConfig.setConfigAttributes(attributes);
assertThat(pluggableSCMMaterialConfig.getScmId(), is(nullValue()));
}
@Test
public void shouldSetSCMIdAsNullIfSCMConfigIsNull() {
PluggableSCMMaterialConfig materialConfig = new PluggableSCMMaterialConfig("1");
materialConfig.setSCMConfig(null);
assertThat(materialConfig.getScmId(), is(nullValue()));
assertThat(materialConfig.getSCMConfig(), is(nullValue()));
}
@Test
public void shouldGetNameFromSCMName() {
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig();
SCM scmConfig = SCMMother.create("scm-id", "scm-name", "plugin-id", "1.0", new Configuration(create("k1", false, "v1")));
pluggableSCMMaterialConfig.setSCMConfig(scmConfig);
assertThat(pluggableSCMMaterialConfig.getName().toString(), is("scm-name"));
pluggableSCMMaterialConfig.setSCMConfig(null);
assertThat(pluggableSCMMaterialConfig.getName(), is(nullValue()));
}
@Test
public void shouldCheckEquals() throws Exception {
SCM scmConfig = SCMMother.create("scm-id", "scm-name", "plugin-id", "1.0", new Configuration(create("k1", false, "v1")));
// same fingerprint
PluggableSCMMaterialConfig p1 = new PluggableSCMMaterialConfig();
p1.setSCMConfig(scmConfig);
PluggableSCMMaterialConfig p2 = new PluggableSCMMaterialConfig();
p2.setSCMConfig(scmConfig);
assertThat(p1.equals(p2), is(true));
// folder
p2.setFolder("dest");
assertThat(p1.equals(p2), is(false));
// scmConfig null
p1 = new PluggableSCMMaterialConfig();
p2 = new PluggableSCMMaterialConfig();
assertThat(p1.equals(p2), is(true));
p2.setSCMConfig(scmConfig);
assertThat(p1.equals(p2), is(false));
p1.setSCMConfig(scmConfig);
p2 = new PluggableSCMMaterialConfig();
assertThat(p1.equals(p2), is(false));
p2.setSCMConfig(scmConfig);
assertThat(p1.equals(p2), is(true));
// null comparison
assertThat(p1.equals(null), is(false));
}
@Test
public void shouldDelegateToSCMConfigForAutoUpdate() throws Exception {
SCM scm = mock(SCM.class);
when(scm.isAutoUpdate()).thenReturn(false);
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(new CaseInsensitiveString("scm-name"), scm, null, null);
assertThat(pluggableSCMMaterialConfig.isAutoUpdate(), is(false));
verify(scm).isAutoUpdate();
}
@Test
public void shouldCorrectlyGet_Name_DisplayName_Description_LongDescription_UriForDisplay() {
SCM scmConfig = mock(SCM.class);
when(scmConfig.getName()).thenReturn("scm-name");
when(scmConfig.getConfigForDisplay()).thenReturn("k1:v1");
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(null, scmConfig, null, null);
assertThat(pluggableSCMMaterialConfig.getName(), is(new CaseInsensitiveString("scm-name")));
assertThat(pluggableSCMMaterialConfig.getDisplayName(), is("scm-name"));
assertThat(pluggableSCMMaterialConfig.getLongDescription(), is("k1:v1"));
assertThat(pluggableSCMMaterialConfig.getUriForDisplay(), is("k1:v1"));
when(scmConfig.getName()).thenReturn(null);
pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(null, scmConfig, null, null);
assertThat(pluggableSCMMaterialConfig.getName(), is(nullValue()));
assertThat(pluggableSCMMaterialConfig.getDisplayName(), is("k1:v1"));
}
@Test
public void shouldCorrectlyGetTypeDisplay() {
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig("scm-id");
assertThat(pluggableSCMMaterialConfig.getTypeForDisplay(), is("SCM"));
pluggableSCMMaterialConfig.setSCMConfig(SCMMother.create("scm-id"));
assertThat(pluggableSCMMaterialConfig.getTypeForDisplay(), is("SCM"));
SCMMetadataStore.getInstance().addMetadataFor("plugin", null, null);
assertThat(pluggableSCMMaterialConfig.getTypeForDisplay(), is("SCM"));
SCMView scmView = mock(SCMView.class);
when(scmView.displayValue()).thenReturn("scm-name");
SCMMetadataStore.getInstance().addMetadataFor("plugin", null, scmView);
assertThat(pluggableSCMMaterialConfig.getTypeForDisplay(), is("scm-name"));
}
}