/*
* Copyright (c) 2013 Cosmin Stejerean, Karl Heinz Marbaise, and contributors.
*
* Distributed under the MIT license: http://opensource.org/licenses/MIT
*/
package com.offbytwo.jenkins;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.anyMap;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.apache.http.entity.ContentType;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import com.google.common.base.Optional;
import com.offbytwo.jenkins.client.JenkinsHttpClient;
import com.offbytwo.jenkins.model.FolderJob;
import com.offbytwo.jenkins.model.Job;
import com.offbytwo.jenkins.model.JobWithDetails;
import com.offbytwo.jenkins.model.MainView;
import com.offbytwo.jenkins.model.View;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
public class JenkinsServerTest extends BaseUnitTest {
private JenkinsHttpClient client = mock(JenkinsHttpClient.class);
private JenkinsServer server = new JenkinsServer(client);
private MainView mainView = new MainView(new Job("Hello", "http://localhost/job/Hello/"));
public JenkinsServerTest() throws Exception {
}
@Before
public void setUp() throws Exception {
given(client.get("/", MainView.class)).willReturn(mainView);
}
@Test
public void shouldReturnListOfJobs() throws Exception {
assertTrue(server.getJobs().containsKey("Hello"));
}
@Test
public void testGetJobXml() throws Exception {
// given
String xmlString = "<xml>some xml goes here</xml>";
String jobName = "pr";
given(client.get(anyString())).willReturn(xmlString);
// when
String xmlReturn = server.getJobXml(jobName);
// then
verify(client).get("/job/pr/config.xml");
assertEquals(xmlString, xmlReturn);
}
@Test
public void testFolderGetJobs() throws Exception {
String[] jobNames = { "job-the-first", "Job-The-Next", "Job-the-Next" };
// given
String path = "http://localhost/jobs/someFolder/";
Job someJob = new Job("jobname", path + "jobname");
FolderJob folderJob = new FolderJob("someFolder", path);
List<Job> someJobs = createTestJobs(path, jobNames);
MainView mv = createTestView(someJobs);
given(client.get(eq(path), eq(MainView.class))).willReturn(mv);
// when
Map<String, Job> map = server.getJobs(folderJob);
// then
verify(client).get(path, MainView.class);
for (String name : jobNames)
assertTrue(someJobs.contains(map.get(name)));
assertEquals(jobNames.length, map.size());
}
@Test
public void testFolderGetJob() throws Exception {
// given
String path = "http://localhost/jobs/someFolder/";
JobWithDetails someJob = mock(JobWithDetails.class);
FolderJob folderJob = new FolderJob("someFolder", path);
given(client.get(eq(path + "job/jobname"), eq(JobWithDetails.class))).willReturn(someJob);
// when
Job jobResult = server.getJob(folderJob, "jobname");
// then
verify(client).get(path + "job/jobname", JobWithDetails.class);
assertEquals(someJob, jobResult);
}
@Test
public void testFolderGetView() throws Exception {
// given
String path = "http://localhost/jobs/someFolder/";
FolderJob folderJob = new FolderJob("someFolder", path);
View someView = mock(View.class);
given(client.get(eq(path + "view/viewname/"), eq(View.class))).willReturn(someView);
// when
View viewResult = server.getView(folderJob, "viewname");
// then
verify(client).get(path + "view/viewname/", View.class);
assertEquals(someView, viewResult);
}
@Test
public void testGetFolderJob() throws Exception {
// given
String path = "http://localhost/jobs/someFolder/";
Job someJob = new Job("someFolder", path);
FolderJob folderJob = mock(FolderJob.class);
given(folderJob.isFolder()).willReturn(true);
given(client.get(eq(path), eq(FolderJob.class))).willReturn(folderJob);
// when
Optional<FolderJob> oj = server.getFolderJob(someJob);
// then
verify(client).get(path, FolderJob.class);
assertEquals(folderJob, oj.get());
}
@Test
public void testGetFolderJobInvalidFolder() throws Exception {
// given
String path = "http://localhost/jobs/someFolder/";
Job someJob = new Job("someFolder", path);
FolderJob folderJob = mock(FolderJob.class);
given(folderJob.isFolder()).willReturn(false);
given(client.get(eq(path), eq(FolderJob.class))).willReturn(folderJob);
// when
Optional<FolderJob> oj = server.getFolderJob(someJob);
// then
verify(client).get(path, FolderJob.class);
assertEquals(false, oj.isPresent());
}
@Test
public void testCreateFolderJob() throws Exception {
// when
server.createFolder("someFolder");
// then
verify(client).post_form(eq("/createItem?"), anyMap(), eq(false));
}
@Test
public void testCreateSubFolderJob() throws Exception {
// given
String path = "http://localhost/jobs/someFolder/";
FolderJob folderJob = mock(FolderJob.class);
given(folderJob.getUrl()).willReturn(path);
// when
server.createFolder(folderJob, "someFolder");
// then
verify(client).post_form(eq(path + "createItem?"), anyMap(), eq(false));
}
@Test
public void testUpdateJobXml() throws Exception {
// given
String jobName = "pr";
String xmlString = "<xml>some xml goes here</xml>";
given(client.post_xml(anyString(), eq(xmlString))).willReturn(xmlString);
// when
server.updateJob(jobName, xmlString);
// then
ArgumentCaptor<String> captureString = ArgumentCaptor.forClass(String.class);
verify(client).post_xml(eq("/job/pr/config.xml"), captureString.capture(), eq(true));
assertEquals(xmlString, captureString.getValue());
}
@Test
public void testCreateJob() throws Exception {
// given
String jobName = "test-job-" + UUID.randomUUID().toString();
String xmlString = "<xml>some xml goes here</xml>";
// when
server.createJob(jobName, xmlString);
// then
ArgumentCaptor<String> captureString = ArgumentCaptor.forClass(String.class);
verify(client).post_xml(eq("/createItem?name=" + jobName), captureString.capture(), eq(false));
String xmlReturn = captureString.getValue();
assertEquals(xmlReturn, xmlString);
}
@Test
public void testJenkinsConnectivity() throws IOException {
// given
given(client.get("/")).willReturn("<xml>not a real response</xml>");
// then
assertEquals(server.isRunning(), true);
}
@Test
public void testJenkinsConnectivityBroken() throws IOException {
// given
given(client.get("/")).willThrow(IOException.class);
// then
assertEquals(server.isRunning(), false);
}
@Test
public void testQuietDown() throws IOException {
server.quietDown();
server.cancelQuietDown();
}
@Test
public void testScriptPosts() throws IOException, URISyntaxException {
given(client.post_text("/scriptText", "script=script", ContentType.APPLICATION_FORM_URLENCODED, false))
.willReturn("result");
String result = server.runScript("script");
verify(client).post_text("/scriptText", "script=script", ContentType.APPLICATION_FORM_URLENCODED, false);
assertEquals("result", result);
}
public void testJenkinsPathEncoding() throws IOException {
given(client.get("/job/encoded%2Fproperly%3F/config.xml")).willReturn("<xml>not a real response</xml>");
assertEquals("<xml>not a real response</xml>", server.getJobXml("encoded/properly?"));
}
private MainView createTestView(List<Job> jobs) {
return new MainView(jobs.toArray(new Job[0]));
}
private MainView createTestView(String baseUrl, String... jobNames) {
return createTestView(createTestJobs(baseUrl, jobNames));
}
private List<Job> createTestJobs(String baseUrl, String... jobNames) {
List<Job> jobs = new ArrayList<Job>();
for (String name : jobNames) {
jobs.add(new Job(name, baseUrl + name));
}
return jobs;
}
@Test
public void testReturnSingleJob() throws Exception {
shouldReturnListOfJobs("hello");
}
@Test
public void testReturnListOfJobs() throws Exception {
shouldReturnListOfJobs("hello", "Hello", "HeLLo");
}
@Test
public void testFolderGetSingleJob() throws Exception {
shouldGetFolderJobs("jobname");
}
private void shouldReturnListOfJobs(String... jobNames) throws Exception {
MainView mainView = createTestView("http://localhost/job/", jobNames);
given(client.get("/", MainView.class)).willReturn(mainView);
Map<String, Job> jobs = server.getJobs();
for (String name : jobNames)
assertTrue(jobs.containsKey(name));
assertEquals(jobNames.length, jobs.size());
}
@Test
public void testGetJobXmls() throws Exception {
shouldGetJobXml("pr");
shouldGetJobXml("hello");
shouldGetJobXml("Hello");
shouldGetJobXml("HeLLo");
}
private void shouldGetFolderJobs(String... jobNames) throws IOException {
// given
String path = "http://localhost/jobs/someFolder/";
FolderJob folderJob = new FolderJob("someFolder", path);
List<Job> someJobs = createTestJobs(path, jobNames);
MainView mv = createTestView(someJobs);
given(client.get(eq(path), eq(MainView.class))).willReturn(mv);
// when
Map<String, Job> map = server.getJobs(folderJob);
// then
verify(client).get(path, MainView.class);
for (String name : jobNames)
assertTrue(someJobs.contains(map.get(name)));
assertEquals(jobNames.length, map.size());
}
private void shouldGetJobXml(String jobName) throws Exception {
// given
String xmlString = "<xml>some xml goes here</xml>";
given(client.get(anyString())).willReturn(xmlString);
// when
String xmlReturn = server.getJobXml(jobName);
// then
verify(client).get("/job/" + jobName + "/config.xml");
verify(client).get("/job/" + jobName + "/config.xml");
assertEquals(xmlString, xmlReturn);
}
}