package hudson.plugins.jira;
import hudson.EnvVars;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.BuildListener;
import hudson.model.Result;
import hudson.tasks.BuildWrapper;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import com.atlassian.jira.rest.client.api.domain.Issue;
import com.atlassian.jira.rest.client.api.domain.IssueType;
import com.atlassian.jira.rest.client.api.domain.Status;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.junit.Assert.assertEquals;
@RunWith(MockitoJUnitRunner.class)
public class JiraCreateReleaseNotesTest {
private static final String JIRA_RELEASE = Long.toString(System.currentTimeMillis());
private static final String JIRA_PRJ = "TEST_PRJ";
private static final String JIRA_RELEASE_PARAM = "${JIRA_RELEASE}";
private static final String JIRA_PRJ_PARAM = "${JIRA_PRJ}";
private static final String JIRA_VARIABLE = "ReleaseNotes";
private static final String JIRA_OTHER_FILTER = "status in (Resolved, Done, Closed)";
@Mock
AbstractBuild build;
@Mock
Launcher launcher;
@Mock
BuildListener buildListener;
@Mock
EnvVars env;
@Mock
AbstractProject project;
@Mock
JiraSite site;
@Mock
private PrintWriter printWriter;
@Before
public void createCommonMocks() throws IOException, InterruptedException {
when(build.getProject()).thenReturn(project);
when(build.getEnvironment(buildListener)).thenReturn(env);
when(buildListener.fatalError(Mockito.anyString(), Mockito.anyVararg())).thenReturn(printWriter);
when(build.getResult()).thenCallRealMethod();
when(env.expand(Mockito.anyString())).thenAnswer(new Answer<String>() {
@Override
public String answer(InvocationOnMock invocationOnMock) throws Throwable {
Object[] args = invocationOnMock.getArguments();
String expanded = (String) args[0];
if (expanded.equals(JIRA_PRJ_PARAM))
return JIRA_PRJ;
else if (expanded.equals(JIRA_RELEASE_PARAM))
return JIRA_RELEASE;
else
return expanded;
}
});
}
@Test
public void testDefaults(){
JiraCreateReleaseNotes jcrn = new JiraCreateReleaseNotes(JIRA_PRJ,JIRA_RELEASE,"");
assertEquals(JiraCreateReleaseNotes.DEFAULT_ENVVAR_NAME, jcrn.getJiraEnvironmentVariable());
assertEquals(JiraCreateReleaseNotes.DEFAULT_FILTER, jcrn.getJiraFilter());
}
@Test
public void jiraApiCallDefaultFilter() throws InterruptedException, IOException {
JiraCreateReleaseNotes jcrn = spy(new JiraCreateReleaseNotes(JIRA_PRJ,JIRA_RELEASE,JIRA_VARIABLE));
doReturn(site).when(jcrn).getSiteForProject((AbstractProject<?, ?>) Mockito.any());
jcrn.setUp(build, launcher, buildListener);
verify(site).getReleaseNotesForFixVersion(JIRA_PRJ, JIRA_RELEASE, JiraCreateReleaseNotes.DEFAULT_FILTER);
}
@Test
public void jiraApiCallOtherFilter() throws InterruptedException, IOException {
JiraCreateReleaseNotes jcrn = spy(new JiraCreateReleaseNotes(JIRA_PRJ,JIRA_RELEASE,JIRA_VARIABLE, JIRA_OTHER_FILTER));
doReturn(site).when(jcrn).getSiteForProject((AbstractProject<?, ?>) Mockito.any());
BuildListenerResultMethodMock finishedListener = new BuildListenerResultMethodMock();
Mockito.doAnswer(finishedListener).when(buildListener).finished(Mockito.<Result>anyObject());
jcrn.setUp(build, launcher, buildListener);
verify(site).getReleaseNotesForFixVersion(JIRA_PRJ, JIRA_RELEASE, JIRA_OTHER_FILTER);
//assert that build not fail
assertThat(finishedListener.getResult(), Matchers.nullValue());
}
@Test
public void failBuildOnErrorEmptyProjectKey() throws InterruptedException, IOException {
JiraCreateReleaseNotes jcrn = spy(new JiraCreateReleaseNotes("",JIRA_RELEASE,JIRA_VARIABLE, JIRA_OTHER_FILTER));
doReturn(site).when(jcrn).getSiteForProject((AbstractProject<?, ?>) Mockito.any());
BuildListenerResultMethodMock finishedListener = new BuildListenerResultMethodMock();
Mockito.doAnswer(finishedListener).when(buildListener).finished(Mockito.<Result>anyObject());
jcrn.setUp(build, launcher, buildListener);
assertThat(finishedListener.getResult(), Matchers.equalTo(Result.FAILURE));
}
@Test
public void failBuildOnErrorEmptyRelease() throws InterruptedException, IOException {
JiraCreateReleaseNotes jcrn = spy(new JiraCreateReleaseNotes(JIRA_PRJ,"",JIRA_VARIABLE, JIRA_OTHER_FILTER));
doReturn(site).when(jcrn).getSiteForProject((AbstractProject<?, ?>) Mockito.any());
BuildListenerResultMethodMock finishedListener = new BuildListenerResultMethodMock();
Mockito.doAnswer(finishedListener).when(buildListener).finished(Mockito.<Result>anyObject());
jcrn.setUp(build, launcher, buildListener);
assertThat(finishedListener.getResult(), Matchers.equalTo(Result.FAILURE));
}
@Test
public void releaseNotesContent() throws InterruptedException, IOException {
JiraCreateReleaseNotes jcrn = spy(new JiraCreateReleaseNotes(JIRA_PRJ,JIRA_RELEASE,JIRA_VARIABLE));
doReturn(site).when(jcrn).getSiteForProject((AbstractProject<?, ?>) Mockito.any());
when(site.getReleaseNotesForFixVersion(JIRA_PRJ, JIRA_RELEASE, JiraCreateReleaseNotes.DEFAULT_FILTER)).thenCallRealMethod();
JiraSession session = Mockito.mock(JiraSession.class);
doReturn(session).when(site).getSession();
Issue issue1 = Mockito.mock(Issue.class);
IssueType issueType1 = Mockito.mock(IssueType.class);
Status issueStatus = Mockito.mock(Status.class);
when(issue1.getIssueType()).thenReturn(issueType1);
when(issue1.getStatus()).thenReturn(issueStatus);
when(issueType1.getName()).thenReturn("Bug");
Issue issue2 = Mockito.mock(Issue.class);
IssueType issueType2 = Mockito.mock(IssueType.class);
when(issue2.getIssueType()).thenReturn(issueType2);
when(issue2.getStatus()).thenReturn(issueStatus);
when(issueType2.getName()).thenReturn("Feature");
when(session.getIssuesWithFixVersion(JIRA_PRJ, JIRA_RELEASE, JiraCreateReleaseNotes.DEFAULT_FILTER)).
thenReturn(Arrays.asList(issue1, issue2));
BuildWrapper.Environment environment = jcrn.setUp(build, launcher, buildListener);
Map<String, String> envVars = new HashMap<String, String>();
environment.buildEnvVars(envVars);
String releaseNotes = envVars.get(jcrn.getJiraEnvironmentVariable());
assertNotNull(releaseNotes);
assertThat(releaseNotes, Matchers.containsString(issueType1.getName()));
assertThat(releaseNotes, Matchers.containsString(issueType2.getName()));
assertThat(releaseNotes, Matchers.not(Matchers.containsString("UNKNOWN")));
}
}