package com.thoughtworks.go.plugin.access.configrepo.contract;
import com.thoughtworks.go.plugin.access.configrepo.ErrorCollection;
import com.thoughtworks.go.plugin.access.configrepo.contract.material.CRDependencyMaterial;
import com.thoughtworks.go.plugin.access.configrepo.contract.material.CRGitMaterial;
import com.thoughtworks.go.plugin.access.configrepo.contract.material.CRMaterial;
import com.thoughtworks.go.plugin.access.configrepo.contract.tasks.CRBuildTask;
import org.junit.Test;
import java.util.Map;
import static com.thoughtworks.go.util.TestUtils.contains;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
public class CRPipelineTest extends CRBaseTest<CRPipeline> {
private final CRPipeline pipe1;
private final CRPipeline customPipeline;
private final CRPipeline invalidNoName;
private final CRPipeline invalidNoMaterial;
private final CRPipeline invalidNoStages;
private final CRPipeline invalidNoNamedMaterials;
private final CRGitMaterial veryCustomGit;
private final CRStage buildStage;
private final CRPipeline invalidNoGroup;
public CRPipelineTest()
{
CRBuildTask rakeTask = CRBuildTask.rake();
CRJob buildRake = new CRJob("build", rakeTask);
veryCustomGit = new CRGitMaterial("gitMaterial1", "dir1", false,true, "gitrepo", "feature12", false, "externals", "tools");
buildStage = new CRStage("build", buildRake);
pipe1 = new CRPipeline("pipe1","group1",veryCustomGit,buildStage);
customPipeline = new CRPipeline("pipe2","group1",veryCustomGit,buildStage);
customPipeline.addMaterial(new CRDependencyMaterial("pipe1","pipe1","build"));
customPipeline.setLabelTemplate("foo-1.0-${COUNT}");
customPipeline.setIsLocked(true);
customPipeline.setMingle( new CRMingle("http://mingle.example.com","my_project"));
customPipeline.setTimer(new CRTimer("0 15 10 * * ? *"));
invalidNoName = new CRPipeline(null,"group1",veryCustomGit,buildStage);
invalidNoMaterial = new CRPipeline();
invalidNoMaterial.setName("pipe4");
invalidNoMaterial.setGroupName("g1");
invalidNoMaterial.addStage(buildStage);
invalidNoGroup = new CRPipeline("name",null,veryCustomGit,buildStage);
invalidNoStages = new CRPipeline();
invalidNoStages.setName("pipe4");
invalidNoStages.setGroupName("g1");
invalidNoStages.addMaterial(veryCustomGit);
invalidNoNamedMaterials = new CRPipeline("pipe2","group1",veryCustomGit,buildStage);
invalidNoNamedMaterials.addMaterial(new CRDependencyMaterial("pipe1","build"));
invalidNoNamedMaterials.setGroupName("g1");
}
@Test
public void shouldAppendPrettyLocationInErrors_WhenPipelineHasExplicitLocationField()
{
CRPipeline p = new CRPipeline();
p.setName("pipe4");
p.addMaterial(veryCustomGit);
// plugin may voluntarily set this
p.setLocation("pipe4.json");
ErrorCollection errors = new ErrorCollection();
p.getErrors(errors,"TEST");
String fullError = errors.getErrorsAsText();
assertThat(fullError,contains("pipe4.json; Pipeline pipe4"));
assertThat(fullError,contains("Missing field 'group'"));
assertThat(fullError,contains("Pipeline has no stages"));
}
@Test
public void shouldCheckErrorsInMaterials()
{
CRPipeline p = new CRPipeline();
p.setName("pipe4");
CRGitMaterial invalidGit = new CRGitMaterial("gitMaterial1", "dir1", false,true, null, "feature12",false, "externals", "tools");
p.addMaterial(invalidGit);
// plugin may voluntarily set this
p.setLocation("pipe4.json");
ErrorCollection errors = new ErrorCollection();
p.getErrors(errors,"TEST");
String fullError = errors.getErrorsAsText();
assertThat(fullError,contains("Pipeline pipe4; Git material"));
assertThat(fullError,contains("Missing field 'url'"));
}
@Test
public void shouldCheckMissingDestinationDirectoryWhenManySCMs()
{
CRPipeline p = new CRPipeline();
p.setName("pipe4");
CRGitMaterial simpleGit1 = new CRGitMaterial();
simpleGit1.setUrl("url1");
CRGitMaterial simpleGit2 = new CRGitMaterial();
simpleGit2.setUrl("url2");
p.addMaterial(simpleGit1);
p.addMaterial(simpleGit2);
ErrorCollection errors = new ErrorCollection();
p.getErrors(errors,"TEST");
String fullError = errors.getErrorsAsText();
assertThat(fullError,contains("Pipeline pipe4; Git material"));
assertThat(fullError,contains("Material must have destination directory when there are many SCM materials"));
}
@Test
public void shouldCheckErrorsInStages()
{
CRPipeline p = new CRPipeline();
p.setName("pipe4");
// plugin may voluntarily set this
p.setLocation("pipe4.json");
CRStage invalidSameEnvironmentVariableTwice = new CRStage("bla");
invalidSameEnvironmentVariableTwice.addEnvironmentVariable("key","value1");
invalidSameEnvironmentVariableTwice.addEnvironmentVariable("key","value2");
p.addStage(invalidSameEnvironmentVariableTwice);
ErrorCollection errors = new ErrorCollection();
p.getErrors(errors,"TEST");
String fullError = errors.getErrorsAsText();
assertThat(fullError,contains("Pipeline pipe4; Stage (bla)"));
assertThat(fullError,contains("Stage has no jobs"));
assertThat(fullError,contains("Environment variable key defined more than once"));
}
@Override
public void addGoodExamples(Map<String, CRPipeline> examples) {
examples.put("pipe1",pipe1);
examples.put("customPipeline",customPipeline);
}
@Override
public void addBadExamples(Map<String, CRPipeline> examples) {
examples.put("invalidNoName",invalidNoName);
examples.put("invalidNoMaterial",invalidNoMaterial);
examples.put("invalidNoStages",invalidNoStages);
examples.put("invalidNoNamedMaterials",invalidNoNamedMaterials);
examples.put("invalidNoGroup",invalidNoGroup);
}
@Test
public void shouldHandlePolymorphismWhenDeserializingJobs()
{
String json = gson.toJson(pipe1);
CRPipeline deserializedValue = gson.fromJson(json,CRPipeline.class);
CRMaterial git = deserializedValue.getMaterialByName("gitMaterial1");
assertThat(git instanceof CRGitMaterial,is(true));
assertThat(((CRGitMaterial)git).getBranch(),is("feature12"));
}
}