/*
* 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.*;
import com.thoughtworks.go.config.materials.dependency.DependencyMaterialConfig;
import com.thoughtworks.go.config.materials.mercurial.HgMaterialConfig;
import com.thoughtworks.go.domain.BaseCollection;
import com.thoughtworks.go.domain.materials.MaterialConfig;
import org.hamcrest.Matchers;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.sameInstance;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNull.nullValue;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.*;
public class AbstractMaterialConfigTest {
@Test
public void shouldRecomputePipelineUniqueFingerprint_whenAttributesChanged() {
TestMaterialConfig testMaterialConfig = new TestMaterialConfig("foo");
String pipelineUniqueFingerprint = testMaterialConfig.getPipelineUniqueFingerprint();
testMaterialConfig.setConfigAttributes(m("bar", "baz"));
assertThat(testMaterialConfig.getPipelineUniqueFingerprint(), not(pipelineUniqueFingerprint));
}
@Test
public void shouldNotSetMaterialNameIfItIsSetToEmptyAsItsAnOptionalField() {
AbstractMaterialConfig materialConfig = new TestMaterialConfig("");
Map<String, String> map = new HashMap<>();
map.put(AbstractMaterialConfig.MATERIAL_NAME, "");
materialConfig.setConfigAttributes(map);
assertThat(materialConfig.getName(), is(nullValue()));
}
@Test
public void shouldRecomputeSqlCriteriaAndXmlAttributeMap_whenAttributesChanged() {
AbstractMaterialConfig testMaterialConfig = new TestMaterialConfig("foo");
Map<String, Object> sqlCriteria = testMaterialConfig.getSqlCriteria();
testMaterialConfig.setConfigAttributes(m("bar", "baz"));
assertThat(testMaterialConfig.getSqlCriteria(), not(sameInstance(sqlCriteria)));
assertThat(testMaterialConfig.getSqlCriteria().get("foo"), is("baz"));
}
@Test
public void shouldReturnTrueIfMaterialNameIsUsedInPipelineTemplate() {
AbstractMaterialConfig material = new TestMaterialConfig("");
material.setName(new CaseInsensitiveString("funky_name"));
PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("blah"), "${COUNT}-${funky_name}", "", false, null, new BaseCollection<>());
assertThat(material.isUsedInLabelTemplate(pipelineConfig), is(true));
}
@Test
public void shouldReturnTrueIfMaterialNameIsUsedInPipelineTemplate_caseInsensitive() {
AbstractMaterialConfig material = new TestMaterialConfig("");
material.setName(new CaseInsensitiveString("funky_name"));
PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("blah"), "${COUNT}-${funky_Name}", "", false, null, new BaseCollection<>());
assertThat(material.isUsedInLabelTemplate(pipelineConfig), is(true));
}
@Test
public void shouldReturnFalseIfMaterialNameIsNotUsedInPipelineTemplate() {
AbstractMaterialConfig material = new TestMaterialConfig("");
material.setName(new CaseInsensitiveString("funky_name"));
assertThat(material.isUsedInLabelTemplate(new PipelineConfig(new CaseInsensitiveString("blah"), "${COUNT}-${test1}-test", "", false, null, new BaseCollection<>())), is(false));
}
@Test
public void shouldReturnFalseIfMaterialNameIsNotDefined() {
AbstractMaterialConfig material = new TestMaterialConfig("test");
PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("blah"), "${COUNT}-${test}-test", "", false, null, new BaseCollection<>());
assertThat(material.isUsedInLabelTemplate(pipelineConfig), is(false));
}
@Test
public void shouldNotUseNameFieldButInsteadUseTheNameMethodToCheckIfTheMaterialNameIsUsedInThePipelineLabel() throws Exception {
PipelineConfig pipelineConfig = mock(PipelineConfig.class);
when(pipelineConfig.getLabelTemplate()).thenReturn("${COUNT}-${hg}-${dep}-${pkg}-${scm}");
MaterialConfig hg = mock(HgMaterialConfig.class);
when(hg.getName()).thenReturn(new CaseInsensitiveString("hg"));
when(hg.isUsedInLabelTemplate(pipelineConfig)).thenCallRealMethod();
MaterialConfig dependency = mock(DependencyMaterialConfig.class);
when(dependency.getName()).thenReturn(new CaseInsensitiveString("dep"));
when(dependency.isUsedInLabelTemplate(pipelineConfig)).thenCallRealMethod();
MaterialConfig aPackage = mock(PackageMaterialConfig.class);
when(aPackage.getName()).thenReturn(new CaseInsensitiveString("pkg"));
when(aPackage.isUsedInLabelTemplate(pipelineConfig)).thenCallRealMethod();
MaterialConfig aPluggableSCM = mock(PluggableSCMMaterialConfig.class);
when(aPluggableSCM.getName()).thenReturn(new CaseInsensitiveString("scm"));
when(aPluggableSCM.isUsedInLabelTemplate(pipelineConfig)).thenCallRealMethod();
assertThat(hg.isUsedInLabelTemplate(pipelineConfig), is(true));
assertThat(dependency.isUsedInLabelTemplate(pipelineConfig), is(true));
assertThat(aPackage.isUsedInLabelTemplate(pipelineConfig), is(true));
assertThat(aPluggableSCM.isUsedInLabelTemplate(pipelineConfig), is(true));
verify(hg).getName();
verify(dependency).getName();
verify(aPackage).getName();
verify(aPluggableSCM).getName();
}
@Test
public void shouldHandleBlankMaterialName(){
TestMaterialConfig materialConfig = new TestMaterialConfig("");
materialConfig.setName(null);
materialConfig.validate(PipelineConfigSaveValidationContext.forChain(true, "group", new PipelineConfig()));
assertThat(materialConfig.errors().getAllOn(AbstractMaterialConfig.MATERIAL_NAME), is(Matchers.nullValue()));
materialConfig.setName(new CaseInsensitiveString(null));
materialConfig.validate(PipelineConfigSaveValidationContext.forChain(true, "group", new PipelineConfig()));
assertThat(materialConfig.errors().getAllOn(AbstractMaterialConfig.MATERIAL_NAME), is(Matchers.nullValue()));
materialConfig.setName(new CaseInsensitiveString(""));
materialConfig.validate(PipelineConfigSaveValidationContext.forChain(true, "group", new PipelineConfig()));
assertThat(materialConfig.errors().getAllOn(AbstractMaterialConfig.MATERIAL_NAME), is(Matchers.nullValue()));
}
private Map<String, String> m(String key, String value) {
HashMap<String, String> map = new HashMap<>();
map.put(key, value);
return map;
}
public static class TestMaterialConfig extends AbstractMaterialConfig {
private final String displayName;
private String bar = "bar";
private String quux = "quux";
public static int PIPELINE_UNIQUE_ATTRIBUTE_ADDED = 0;
public TestMaterialConfig(String displayName) {
super(displayName);
this.displayName = displayName;
}
protected void appendPipelineUniqueCriteria(Map<String, Object> basicCriteria) {
basicCriteria.put("pipeline-unique", "unique-" + PIPELINE_UNIQUE_ATTRIBUTE_ADDED++);
}
@Override
protected void validateConcreteMaterial(ValidationContext validationContext) {
}
protected void appendCriteria(Map<String, Object> parameters) {
parameters.put("foo", bar);
}
protected void appendAttributes(Map<String, Object> parameters) {
parameters.put("baz", quux);
}
public String getFolder() {
throw new UnsupportedOperationException();
}
@Override
public Filter filter() {
return null;
}
@Override
public boolean isInvertFilter() {
return false;
}
@Override
public void setConfigAttributes(Object attributes) {
super.setConfigAttributes(attributes);
Map map = (Map) attributes;
if (map.containsKey("bar")) {
bar = (String) map.get("bar");
}
if (map.containsKey("quux")) {
quux = (String) map.get("quux");
}
}
public boolean matches(String name, String regex) {
throw new UnsupportedOperationException();
}
public String getDescription() {
throw new UnsupportedOperationException();
}
public String getTypeForDisplay() {
throw new UnsupportedOperationException();
}
public String getDisplayName() {
return displayName;
}
public boolean isAutoUpdate() {
throw new UnsupportedOperationException();
}
@Override
public void setAutoUpdate(boolean autoUpdate) {
throw new UnsupportedOperationException();
}
public String getUriForDisplay() {
throw new UnsupportedOperationException();
}
public Boolean isUsedInFetchArtifact(PipelineConfig pipelineConfig) {
return false;
}
public Class getInstanceType() {
throw new UnsupportedOperationException("instance not available for test material");
}
@Override
public String getLongDescription() {
throw new UnsupportedOperationException();
}
}
}