package org.jenkinsci.plugins.ghprb; import static org.fest.assertions.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.*; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.regex.Pattern; import org.jenkinsci.plugins.ghprb.extensions.GhprbExtension; import org.jenkinsci.plugins.ghprb.extensions.GhprbGlobalDefault; import org.jenkinsci.plugins.ghprb.extensions.build.GhprbCancelBuildsOnUpdate; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.jvnet.hudson.test.JenkinsRule; import org.kohsuke.github.GHPullRequest; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; /** * Unit test for {@link org.jenkinsci.plugins.ghprb.GhprbTriggerTest}. */ @RunWith(MockitoJUnitRunner.class) public class GhprbTriggerTest { @Rule public JenkinsRule jenkinsRule = new JenkinsRule(); @Mock private GhprbPullRequest pr; @Mock private Ghprb helper; @Test public void testGlobalExtensions() throws Exception { GhprbTrigger.getDscp().getExtensions().add(new GhprbCancelBuildsOnUpdate(false)); GhprbTrigger trigger = GhprbTestUtil.getTrigger(); for (GhprbExtension ext : trigger.getDescriptor().getExtensions()) { if (ext instanceof GhprbGlobalDefault) { assertThat(trigger.getExtensions().contains(ext)); } } } @Test public void testCheckSkipBuild() throws Exception { GHPullRequest issue = mock(GHPullRequest.class); boolean skipBuild = false; boolean build = true; String nonMatch = "Some dumb comment\r\nThat shouldn't match"; String multiLine = "This is a multiline skip\r\n[skip ci]"; String justSkipCi = "skip ci"; String fullSkipCi = "[skip ci]"; Map<String, Map<String, Boolean>> stringsToTest = new HashMap<String, Map<String, Boolean>>(10); Map<String, Boolean> comment = new HashMap<String, Boolean>(5); comment.put(nonMatch, build); comment.put(multiLine, skipBuild); comment.put(justSkipCi, build); comment.put(fullSkipCi, skipBuild); stringsToTest.put(".*\\[skip\\W+ci\\].*", comment); comment = new HashMap<String, Boolean>(5); comment.put(nonMatch, build); comment.put(multiLine, build); comment.put(justSkipCi, build); comment.put(fullSkipCi, skipBuild); stringsToTest.put("\\[skip ci\\]", comment); comment = new HashMap<String, Boolean>(5); comment.put(nonMatch, build); comment.put(multiLine, skipBuild); comment.put(justSkipCi, skipBuild); comment.put(fullSkipCi, skipBuild); stringsToTest.put("\\[skip ci\\]\n.*\\[skip\\W+ci\\].*\nskip ci", comment); Method checkSkip = GhprbPullRequest.class.getDeclaredMethod("checkSkipBuild"); checkSkip.setAccessible(true); Field prField = GhprbPullRequest.class.getDeclaredField("pr"); prField.setAccessible(true); prField.set(pr, issue); Field shouldRun = GhprbPullRequest.class.getDeclaredField("shouldRun"); shouldRun.setAccessible(true); Field prHelper = GhprbPullRequest.class.getDeclaredField("helper"); prHelper.setAccessible(true); prHelper.set(pr, helper); for (Entry<String, Map<String, Boolean>> skipMap : stringsToTest.entrySet()) { String skipPhrases = skipMap.getKey(); Set<String> phrases = new HashSet<String>(Arrays.asList(skipPhrases.split("[\\r\\n]+"))); given(helper.getSkipBuildPhrases()).willReturn(phrases); for (Entry<String, Boolean> skipResults : skipMap.getValue().entrySet()) { String nextComment = skipResults.getKey(); Boolean shouldBuild = skipResults.getValue(); given(issue.getBody()).willReturn(nextComment); String skipPhrase = ""; for (String skipBuildPhrase : phrases) { skipBuildPhrase = skipBuildPhrase.trim(); Pattern skipBuildPhrasePattern = Ghprb.compilePattern(skipBuildPhrase); if (skipBuildPhrasePattern.matcher(nextComment).matches()) { skipPhrase = skipBuildPhrase; break; } } given(helper.checkSkipBuild(issue)).willReturn(skipPhrase); shouldRun.set(pr, true); checkSkip.invoke(pr); String errorMessage = String.format("Comment does %scontain skip phrase \n(\n%s\n)\n[\n%s\n]", shouldBuild ? "not ": "", nextComment, skipPhrases); if (shouldBuild) { assertThat(skipPhrase).overridingErrorMessage(errorMessage).isEmpty(); } else { assertThat(skipPhrase).overridingErrorMessage(errorMessage).isNotEmpty(); } assertThat(shouldRun.get(pr)).overridingErrorMessage(errorMessage).isEqualTo(shouldBuild); } } } }