package hudson.plugins.jira.selector; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.regex.Pattern; import org.junit.Assert; import org.junit.Test; import org.jvnet.hudson.test.Bug; import com.google.common.collect.Sets; import hudson.model.BuildListener; import hudson.model.FreeStyleBuild; import hudson.model.ParameterValue; import hudson.model.ParametersAction; import hudson.model.User; import hudson.plugins.jira.JiraSite; import hudson.plugins.jira.listissuesparameter.JiraIssueParameterValue; import hudson.scm.ChangeLogSet; import hudson.scm.ChangeLogSet.Entry; public class DefaultIssueSelectorTest { private static class MockEntry extends Entry { private final String msg; public MockEntry(String msg) { this.msg = msg; } @Override public Collection<String> getAffectedPaths() { return null; } @Override public User getAuthor() { return null; } @Override public String getMsg() { return this.msg; } } @Test @Bug(4132) public void testProjectNamesAllowed() { FreeStyleBuild build = mock(FreeStyleBuild.class); ChangeLogSet changeLogSet = mock(ChangeLogSet.class); BuildListener listener = mock(BuildListener.class); JiraSite site = mock(JiraSite.class); when(site.getIssuePattern()).thenReturn(JiraSite.DEFAULT_ISSUE_PATTERN); Set<? extends Entry> entries = Sets.newHashSet(new MockEntry("Fixed JI123-4711"), new MockEntry("Fixed foo_bar-4710"), new MockEntry("Fixed FoO_bAr-4711"), new MockEntry("Fixed someting.\nJFoO_bAr_MULTI-4718"), new MockEntry("TR-123: foo"), new MockEntry("[ABC-42] hallo"), new MockEntry("#123: this one must not match"), new MockEntry("ABC-: this one must also not match"), new MockEntry("ABC-: \n\nABC-127:\nthis one should match"), new MockEntry("ABC-: \n\nABC-128:\nthis one should match"), new MockEntry("ABC-: \n\nXYZ-10:\nXYZ-20 this one too"), new MockEntry("Fixed DOT-4."), new MockEntry("Fixed DOT-5. Did it right this time")); when(build.getChangeSet()).thenReturn(changeLogSet); when(changeLogSet.iterator()).thenReturn(entries.iterator()); List<ChangeLogSet<? extends ChangeLogSet.Entry>> changeSets = new ArrayList<ChangeLogSet<? extends Entry>>(); changeSets.add(changeLogSet); when(build.getChangeSets()).thenReturn(changeSets); Set<String> expected = Sets.newHashSet("JI123-4711", "FOO_BAR-4710", "FOO_BAR-4711", "JFOO_BAR_MULTI-4718", "TR-123", "ABC-42", "ABC-127", "ABC-128", "XYZ-10", "XYZ-20", "DOT-4", "DOT-5"); Set<String> result = new DefaultIssueSelector().findIssueIds(build, site, listener); Assert.assertEquals(expected.size(), result.size()); Assert.assertEquals(expected, result); } /** * Tests that the JiraIssueParameters are identified as updateable JIRA * issues. */ @Test @Bug(12312) public void testFindIssuesWithJiraParameters() { FreeStyleBuild build = mock(FreeStyleBuild.class); ChangeLogSet changeLogSet = mock(ChangeLogSet.class); BuildListener listener = mock(BuildListener.class); JiraSite site = mock(JiraSite.class); when(site.getIssuePattern()).thenReturn(JiraSite.DEFAULT_ISSUE_PATTERN); JiraIssueParameterValue parameter = mock(JiraIssueParameterValue.class); JiraIssueParameterValue parameterTwo = mock(JiraIssueParameterValue.class); ParametersAction action = mock(ParametersAction.class); List<ParameterValue> parameters = new ArrayList<ParameterValue>(); when(changeLogSet.iterator()).thenReturn(Collections.EMPTY_LIST.iterator()); when(build.getChangeSet()).thenReturn(changeLogSet); when(build.getAction(ParametersAction.class)).thenReturn(action); when(action.getParameters()).thenReturn(parameters); when(parameter.getValue()).thenReturn("JIRA-123"); when(parameterTwo.getValue()).thenReturn("JIRA-321"); // Initial state contains zero parameters Set<String> ids = new DefaultIssueSelector().findIssueIds(build, site, listener); Assert.assertTrue(ids.isEmpty()); parameters.add(parameter); ids = new DefaultIssueSelector().findIssueIds(build, site, listener); Assert.assertEquals(1, ids.size()); Assert.assertEquals("JIRA-123", ids.iterator().next()); parameters.add(parameterTwo); ids = new DefaultIssueSelector().findIssueIds(build, site, listener); Assert.assertEquals(2, ids.size()); Set<String> expected = Sets.newTreeSet(Sets.newHashSet("JIRA-123", "JIRA-321")); Assert.assertEquals(expected, ids); } @Test @Bug(6043) public void testUserPatternNotMatch() { FreeStyleBuild build = mock(FreeStyleBuild.class); ChangeLogSet changeLogSet = mock(ChangeLogSet.class); when(build.getChangeSet()).thenReturn(changeLogSet); Set<? extends Entry> entries = Sets.newHashSet(new MockEntry("Fixed FOO_BAR-4711")); when(changeLogSet.iterator()).thenReturn(entries.iterator()); Set<String> ids = new LinkedHashSet<String>(); DefaultIssueSelector.findIssues(build, ids, Pattern.compile("[(w)]"), mock(BuildListener.class)); Assert.assertEquals(0, ids.size()); } @Test @Bug(6043) public void testUserPatternMatchTwoIssuesInOneComment() { FreeStyleBuild build = mock(FreeStyleBuild.class); ChangeLogSet changeLogSet = mock(ChangeLogSet.class); when(build.getChangeSet()).thenReturn(changeLogSet); Set<? extends Entry> entries = Sets.newHashSet(new MockEntry("Fixed toto [FOOBAR-4711] [FOOBAR-21] "), new MockEntry("[TEST-9] with [dede]"), new MockEntry("toto [maven-release-plugin] prepare release foo-2.2.3")); when(changeLogSet.iterator()).thenReturn(entries.iterator()); List<ChangeLogSet<? extends ChangeLogSet.Entry>> changeSets = new ArrayList<ChangeLogSet<? extends Entry>>(); changeSets.add(changeLogSet); when(build.getChangeSets()).thenReturn(changeSets); Set<String> ids = new LinkedHashSet<String>(); Pattern pat = Pattern.compile("\\[(\\w+-\\d+)\\]"); DefaultIssueSelector.findIssues(build, ids, pat, mock(BuildListener.class)); Assert.assertEquals(3, ids.size()); Assert.assertTrue(ids.contains("TEST-9")); Assert.assertTrue(ids.contains("FOOBAR-4711")); Assert.assertTrue(ids.contains("FOOBAR-21")); } @Test @Bug(6043) public void testUserPatternMatch() { FreeStyleBuild build = mock(FreeStyleBuild.class); ChangeLogSet changeLogSet = mock(ChangeLogSet.class); when(build.getChangeSet()).thenReturn(changeLogSet); Set<? extends Entry> entries = Sets.newHashSet(new MockEntry("Fixed toto [FOOBAR-4711]"), new MockEntry("[TEST-9] with [dede]"), new MockEntry("toto [maven-release-plugin] prepare release foo-2.2.3")); when(changeLogSet.iterator()).thenReturn(entries.iterator()); List<ChangeLogSet<? extends ChangeLogSet.Entry>> changeSets = new ArrayList<ChangeLogSet<? extends Entry>>(); changeSets.add(changeLogSet); when(build.getChangeSets()).thenReturn(changeSets); Set<String> ids = new LinkedHashSet<String>(); Pattern pat = Pattern.compile("\\[(\\w+-\\d+)\\]"); DefaultIssueSelector.findIssues(build, ids, pat, mock(BuildListener.class)); Assert.assertEquals(2, ids.size()); Assert.assertTrue(ids.contains("TEST-9")); Assert.assertTrue(ids.contains("FOOBAR-4711")); } /** * Tests that the default pattern doesn't match strings like 'project-1.1'. * These patterns are used e.g. by the maven release plugin. */ @Test public void testDefaultPattertNotToMatchMavenRelease() { FreeStyleBuild build = mock(FreeStyleBuild.class); ChangeLogSet changeLogSet = mock(ChangeLogSet.class); when(build.getChangeSet()).thenReturn(changeLogSet); // commit messages like the one from the Maven release plugin must not // match Set<? extends Entry> entries = Sets.newHashSet(new MockEntry("prepare release project-4.7.1")); when(changeLogSet.iterator()).thenReturn(entries.iterator()); Set<String> ids = new LinkedHashSet<String>(); DefaultIssueSelector.findIssues(build, ids, JiraSite.DEFAULT_ISSUE_PATTERN, null); Assert.assertEquals(0, ids.size()); } }