package hudson.plugins.jira; import hudson.AbortException; import hudson.EnvVars; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.Action; import hudson.model.BuildListener; import hudson.model.Node; import hudson.plugins.jira.selector.AbstractIssueSelector; import hudson.plugins.jira.selector.DefaultIssueSelector; import java.io.IOException; import java.io.PrintStream; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; import static org.hamcrest.Matchers.instanceOf; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; import org.mockito.ArgumentCaptor; import static org.hamcrest.Matchers.anyOf; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; public class JiraEnvironmentVariableBuilderTest { private static final String JIRA_URL = "http://example.com"; private static final String JIRA_URL_PROPERTY_NAME = "JIRA_URL"; private static final String ISSUES_PROPERTY_NAME = "JIRA_ISSUES"; private static final String ISSUE_ID_1 = "ISS-1"; private static final String ISSUE_ID_2 = "ISS-2"; // Ordering of set created from collection intializer seems to depend on which JDK is used // but isn't important for this purpose private static final String EXPECTED_JIRA_ISSUES_1 = ISSUE_ID_1+","+ISSUE_ID_2; private static final String EXPECTED_JIRA_ISSUES_2 = ISSUE_ID_2+","+ISSUE_ID_1; AbstractBuild build; Launcher launcher; BuildListener listener; EnvVars env; AbstractProject project; JiraSite site; AbstractIssueSelector issueSelector; PrintStream logger; Node node; @Before public void createMocks() throws IOException, InterruptedException { build = mock(AbstractBuild.class); launcher = mock(Launcher.class); listener = mock(BuildListener.class); env = mock(EnvVars.class); project = mock(AbstractProject.class); site = mock(JiraSite.class); issueSelector = mock(AbstractIssueSelector.class); logger = mock(PrintStream.class); when(site.getName()).thenReturn(JIRA_URL); when(listener.getLogger()).thenReturn(logger); when(issueSelector.findIssueIds(build, site, listener)) .thenReturn(new LinkedHashSet<>(Arrays.asList(ISSUE_ID_1, ISSUE_ID_2))); when(build.getProject()).thenReturn(project); when(build.getEnvironment(listener)).thenReturn(env); } @Test public void testIssueSelectorDefaultsToDefault() { final JiraEnvironmentVariableBuilder builder = new JiraEnvironmentVariableBuilder(null); assertThat(builder.getIssueSelector(), instanceOf(DefaultIssueSelector.class)); } @Test public void testSetIssueSelectorPersists() { final JiraEnvironmentVariableBuilder builder = new JiraEnvironmentVariableBuilder(issueSelector); assertThat(builder.getIssueSelector(), is(issueSelector)); } @Test(expected = AbortException.class) public void testPerformWithNoSiteFailsBuild() throws InterruptedException, IOException { JiraEnvironmentVariableBuilder builder = spy(new JiraEnvironmentVariableBuilder(issueSelector)); doReturn(null).when(builder).getSiteForProject((AbstractProject<?, ?>) Mockito.any()); builder.perform(build, launcher, listener); } @Test public void testPerformAddsAction() throws InterruptedException, IOException { JiraEnvironmentVariableBuilder builder = spy(new JiraEnvironmentVariableBuilder(issueSelector)); doReturn(site).when(builder).getSiteForProject((AbstractProject<?, ?>) Mockito.any()); boolean result = builder.perform(build, launcher, listener); assertThat(result, is(true)); ArgumentCaptor<Action> captor = ArgumentCaptor.forClass(Action.class); verify(build).addAction(captor.capture()); assertThat(captor.getValue(),instanceOf(JiraEnvironmentContributingAction.class)); JiraEnvironmentContributingAction action = (JiraEnvironmentContributingAction)(captor.getValue()); assertThat(action.getJiraUrl(), is(JIRA_URL)); assertThat(action.getIssuesList(), anyOf(is(EXPECTED_JIRA_ISSUES_1), is(EXPECTED_JIRA_ISSUES_2))); } }