package org.jenkinsci.tools.configcloner.handler;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.not;
import static org.jenkinsci.tools.configcloner.handler.Helper.stdoutContains;
import static org.jenkinsci.tools.configcloner.handler.Helper.succeeded;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import hudson.model.TopLevelItem;
import hudson.model.FreeStyleProject;
import java.io.IOException;
import org.jenkinsci.tools.configcloner.CommandInvoker;
import org.jenkinsci.tools.configcloner.CommandResponse.Accumulator;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;
public class CloneJobIntegrationTest {
@Rule public JenkinsRule j = new JenkinsRule();
private CommandInvoker command;
@Before
public void setUp() throws IOException {
command = new CommandInvoker("job").url(j.getURL());
}
@Test
public void createACopyOfJob() {
createFreeStyle("sourceJob", "Job Description");
assertThat(command.invoke("job/sourceJob/", "job/destJob1/", "job/destJob2/"), succeeded());
assertHasDescription("destJob1", "Job Description");
assertHasDescription("destJob2", "Job Description");
}
@Test
public void createACopyOfJobFromView() {
createFreeStyle("sourceJob", "Job Description");
assertThat(command.invoke("view/AView/job/sourceJob/", "job/destJob/"), succeeded());
assertHasDescription("destJob", "Job Description");
}
@Test
public void createACopyOfJobOverwritingDestination() throws IOException {
createFreeStyle("sourceJob", "Job Description");
j.createFreeStyleProject("destJob").setDescription("Description to be overwriten");
assertThat(command.opts("--force").invoke("job/sourceJob/", "job/destJob/"), succeeded());
assertHasDescription("destJob", "Job Description");
}
@Test
public void abortCloningSinceTheDestinationAlreadyExists() {
createFreeStyle("sourceJob", "Job Description");
createFreeStyle("destJob", "Description not to be overwriten");
assertThat(command.invoke("job/sourceJob/", "job/destJob/"), not(succeeded()));
assertHasDescription("destJob", "Description not to be overwriten");
}
@Test
public void abortCloningIfSourceDoesNotExist() {
createFreeStyle("destJob", "Description not to be overwriten");
assertThat(command.invoke("job/sourceJob/", "job/destJob/"), not(succeeded()));
assertHasDescription("destJob", "Description not to be overwriten");
}
@Test
public void performTransformation() {
createFreeStyle("sourceJob", "Job Description");
String[] opts = new String[] {
"-e", "s/Job\\sDescription/asdfghjkl/",
"-e", "s/asdf.hjkl/Project Description/"
};
assertThat(command.opts(opts).invoke("job/sourceJob/", "job/destJob/"), succeeded());
assertHasDescription("destJob", "Project Description");
}
@Test
public void cloneDryRun() {
createFreeStyle("sourceJob", "Job Description");
Accumulator result = command
.opts("--dry-run", "-e", "s/Description/DSCR/")
.invoke("job/sourceJob", "job/destJob")
;
assertThat(result, succeeded());
assertThat(result, stdoutContains("- <description>Job Description</description>"));
assertThat(result, stdoutContains("+ <description>Job DSCR</description>"));
assertNull("Destination should not be created", j.jenkins.getItem("DstJob"));
}
@Test
public void overwriteDryRun() {
createFreeStyle("sourceJob", "Job Description");
createFreeStyle("destJob", "Dest Job Description");
assertThat(command.opts("-n").invoke("job/sourceJob", "job/destJob"), succeeded());
assertHasDescription("destJob", "Dest Job Description");
}
@Test
public void failEvenIfLastTrasferSucceeds() {
createFreeStyle("sourceJob", "Job Description");
createFreeStyle("existingJob", "");
assertThat(command.invoke("job/sourceJob", "job/existingJob", "job/destJob"), not(succeeded()));
assertHasDescription("destJob", "Job Description");
}
@Test
public void useLongAndShortOptionAtTheSameTime() {
createFreeStyle("sourceJob", "ORIGINAL Description");
final Accumulator rsp = command.opts(
"-e", "s/ORIGINAL/MODIFIED/", "--expression", "s/MODIFIED/FINAL/"
).invoke("job/sourceJob", "job/destJob");
assertThat(rsp, succeeded());
assertHasDescription("destJob", "FINAL Description");
}
private FreeStyleProject createFreeStyle(String name, String description) {
try {
FreeStyleProject job = j.createFreeStyleProject(name);
job.setDescription(description);
return job;
} catch (IOException ex) {
throw new AssertionError(ex);
}
}
private <T extends TopLevelItem> T getProject(String name, Class<T> type) {
return j.jenkins.getItem(name, j.jenkins, type);
}
private void assertHasDescription(String name, String description) {
FreeStyleProject dstJob = getProject(name, FreeStyleProject.class);
assertEquals(name, dstJob.getName());
assertEquals(description, dstJob.getDescription());
}
}