package hudson.plugins.jira;
import com.atlassian.jira.rest.client.api.domain.Component;
import com.atlassian.jira.rest.client.api.domain.Issue;
import com.atlassian.jira.rest.client.api.domain.Status;
import hudson.EnvVars;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.BuildListener;
import hudson.model.FreeStyleBuild;
import hudson.model.Result;
import hudson.model.TaskListener;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.mockito.Mockito;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class JiraCreateIssueNotifierTest {
private static final String JIRA_PROJECT = "PROJECT";
private static final String COMPONENT = "some, componentA";
private static final String ASSIGNEE = "user.name";
private static final String DESCRIPTION = "Some description";
List<Component> jiraComponents = new ArrayList<Component>();
Launcher launcher = mock(Launcher.class);
BuildListener buildListener = mock(BuildListener.class);
PrintStream logger = mock(PrintStream.class);
JiraSite site = mock(JiraSite.class);
JiraSession session = mock(JiraSession.class);
EnvVars env;
AbstractProject project = mock(AbstractProject.class);
AbstractBuild previousBuild = mock(FreeStyleBuild.class);
AbstractBuild currentBuild = mock(FreeStyleBuild.class);
File temporaryDirectory;
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Before
public void createCommonMocks() throws IOException, InterruptedException {
env = new EnvVars();
env.put("BUILD_NUMBER", "10");
env.put("BUILD_URL", "/some/url/to/job");
env.put("JOB_NAME", "Some job");
jiraComponents.add(new Component(null, null, "componentA", null, null));
when(site.getSession()).thenReturn(session);
doReturn(env).when(currentBuild).getEnvironment((TaskListener) Mockito.any());
temporaryDirectory = temporaryFolder.newFolder();
when(project.getBuildDir()).thenReturn(temporaryDirectory);
when(currentBuild.getProject()).thenReturn(project);
when(currentBuild.getEnvironment(buildListener)).thenReturn(env);
when(currentBuild.getPreviousBuild()).thenReturn(previousBuild);
when(buildListener.getLogger()).thenReturn(logger);
when(session.getComponents(Mockito.anyString())).thenReturn(jiraComponents);
}
@Test
public void testPerformSuccessFailure() throws Exception {
when(previousBuild.getResult()).thenReturn(Result.SUCCESS);
when(currentBuild.getResult()).thenReturn(Result.FAILURE);
JiraCreateIssueNotifier notifier = spy(new JiraCreateIssueNotifier(JIRA_PROJECT, "", "", ""));
doReturn(site).when(notifier).getSiteForProject((AbstractProject) Mockito.any());
Issue issue = mock(Issue.class);
when(session.createIssue(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyList(), Mockito.anyString(),
Mockito.anyLong(), Mockito.anyLong())).thenReturn(issue);
assertTrue(notifier.perform(currentBuild, launcher, buildListener));
}
@Test
public void testPerformFailureFailure() throws Exception {
JiraCreateIssueNotifier notifier = spy(new JiraCreateIssueNotifier(JIRA_PROJECT, DESCRIPTION, ASSIGNEE, COMPONENT));
doReturn(site).when(notifier).getSiteForProject((AbstractProject) Mockito.any());
Issue issue = mock(Issue.class);
Status status = new Status(null, null, "1","Open",null);
when(session.createIssue(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyList(), Mockito.anyString(),
Mockito.anyLong(), Mockito.anyLong())).thenReturn(issue);
when(session.getIssueByKey(Mockito.anyString())).thenReturn(issue);
when(issue.getStatus()).thenReturn(status);
assertEquals(0, temporaryDirectory.list().length);
when(previousBuild.getResult()).thenReturn(Result.SUCCESS);
when(currentBuild.getResult()).thenReturn(Result.FAILURE);
assertTrue(notifier.perform(currentBuild, launcher, buildListener));
assertEquals(1, temporaryDirectory.list().length);
when(previousBuild.getResult()).thenReturn(Result.FAILURE);
when(currentBuild.getResult()).thenReturn(Result.FAILURE);
assertTrue(notifier.perform(currentBuild, launcher, buildListener));
assertEquals(1, temporaryDirectory.list().length);
when(issue.getStatus()).thenReturn(new Status(null, null, "6", JiraCreateIssueNotifier.finishedStatuses.Closed.toString(), null));
assertTrue(notifier.perform(currentBuild, launcher, buildListener));
assertEquals(1, temporaryDirectory.list().length);
}
@Test
public void testPerformFailureSuccessIssueOpen() throws Exception {
Long typeId = 1L;
Long priorityId = 0L;
Integer actionIdOnSuccess = 5;
JiraCreateIssueNotifier notifier = spy(new JiraCreateIssueNotifier(JIRA_PROJECT, "", "", "", typeId, priorityId, actionIdOnSuccess));
assertEquals(typeId, notifier.getTypeId());
assertEquals(priorityId, notifier.getPriorityId());
assertEquals(actionIdOnSuccess, notifier.getActionIdOnSuccess());
doReturn(site).when(notifier).getSiteForProject((AbstractProject) Mockito.any());
Issue issue = mock(Issue.class);
Status status = new Status(null, null, "1", "Open", null);
when(session.createIssue(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyList(), Mockito.anyString(),
Mockito.eq(typeId), Mockito.isNull(Long.class))).thenReturn(issue);
when(issue.getStatus()).thenReturn(status);
when(session.getIssueByKey(Mockito.anyString())).thenReturn(issue);
assertEquals(0, temporaryDirectory.list().length);
when(previousBuild.getResult()).thenReturn(Result.SUCCESS);
when(currentBuild.getResult()).thenReturn(Result.FAILURE);
assertTrue(notifier.perform(currentBuild, launcher, buildListener));
assertEquals(1, temporaryDirectory.list().length);
when(previousBuild.getResult()).thenReturn(Result.FAILURE);
when(currentBuild.getResult()).thenReturn(Result.SUCCESS);
assertTrue(notifier.perform(currentBuild, launcher, buildListener));
verify(session).progressWorkflowAction("null", actionIdOnSuccess);
assertEquals(1, temporaryDirectory.list().length);
}
@Test
public void testPerformFailureSuccessIssueClosedWithComponents() throws Exception {
JiraCreateIssueNotifier notifier = spy(new JiraCreateIssueNotifier(JIRA_PROJECT, "", "", ""));
doReturn(site).when(notifier).getSiteForProject((AbstractProject) Mockito.any());
Issue issue = mock(Issue.class);
Status status = new Status(null, null, JiraCreateIssueNotifier.finishedStatuses.Closed.toString() , null, null);
when(session.createIssue(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyList(), Mockito.anyString(),
Mockito.anyLong(), Mockito.anyLong())).thenReturn(issue);
when(issue.getStatus()).thenReturn(status);
when(session.getIssueByKey(Mockito.anyString())).thenReturn(issue);
assertEquals(0, temporaryDirectory.list().length);
when(previousBuild.getResult()).thenReturn(Result.SUCCESS);
when(currentBuild.getResult()).thenReturn(Result.FAILURE);
assertTrue(notifier.perform(currentBuild, launcher, buildListener));
assertEquals(1, temporaryDirectory.list().length);
when(previousBuild.getResult()).thenReturn(Result.FAILURE);
when(currentBuild.getResult()).thenReturn(Result.SUCCESS);
assertTrue(notifier.perform(currentBuild, launcher, buildListener));
// file should be deleted
assertEquals(0, temporaryDirectory.list().length);
}
}