diff --git a/src/main/java/org/jenkinsci/plugins/ghprb/Ghprb.java b/src/main/java/org/jenkinsci/plugins/ghprb/Ghprb.java index def9cfecd..b2df71ef1 100644 --- a/src/main/java/org/jenkinsci/plugins/ghprb/Ghprb.java +++ b/src/main/java/org/jenkinsci/plugins/ghprb/Ghprb.java @@ -57,6 +57,8 @@ * @author janinko */ public class Ghprb { + private static final String DEPENDABOT_USERNAME = "dependabot[bot]"; + private static final Logger LOGGER = Logger.getLogger(Ghprb.class.getName()); static final Pattern GITHUB_USER_REPO_PATTERN = Pattern.compile("^(http[s]?://[^/]*)/([^/]*/[^/]*).*"); @@ -267,9 +269,12 @@ public boolean ifOnlyTriggerPhrase() { } public boolean isWhitelisted(GHUser user) { + String username = user.getLogin().toLowerCase(); + return trigger.getPermitAll() - || whitelisted().contains(user.getLogin().toLowerCase()) - || admins().contains(user.getLogin().toLowerCase()) + || isDependabotUser(user) + || whitelisted().contains(username) + || admins().contains(username) || isInWhitelistedOrganisation(user); } @@ -279,6 +284,10 @@ public boolean isAdmin(GHUser user) { && isInWhitelistedOrganisation(user)); } + public boolean isDependabotUser(GHUser user) { + return user != null && user.getLogin().equals(DEPENDABOT_USERNAME); + } + public boolean isBotUser(GHUser user) { return user != null && user.getLogin().equals(getGitHub().getBotUserLogin()); } @@ -326,6 +335,10 @@ public List getExcludedRegionPatterns() { return patterns; } + public boolean getReportSuccessIfNotRegion() { + return trigger.getReportSuccessIfNotRegion(); + } + public static String replaceMacros(Run build, TaskListener listener, String inputString) { String returnString = inputString; if (build != null && inputString != null) { diff --git a/src/main/java/org/jenkinsci/plugins/ghprb/GhprbBuilds.java b/src/main/java/org/jenkinsci/plugins/ghprb/GhprbBuilds.java index ef12d3519..d090dc3e0 100644 --- a/src/main/java/org/jenkinsci/plugins/ghprb/GhprbBuilds.java +++ b/src/main/java/org/jenkinsci/plugins/ghprb/GhprbBuilds.java @@ -11,7 +11,7 @@ import org.apache.commons.lang.StringUtils; import org.jenkinsci.plugins.ghprb.extensions.GhprbBuildStep; import org.jenkinsci.plugins.ghprb.extensions.GhprbCommentAppender; -import org.jenkinsci.plugins.ghprb.extensions.GhprbCommitStatus; +import org.jenkinsci.plugins.ghprb.extensions.status.GhprbSimpleStatus; import org.jenkinsci.plugins.ghprb.extensions.GhprbCommitStatusException; import org.jenkinsci.plugins.ghprb.extensions.GhprbExtension; import org.kohsuke.github.GHCommitState; @@ -76,10 +76,10 @@ public void build(GhprbPullRequest pr, GHUser triggerSender, String commentBody) repo.getName(), trigger.getGitHubApiAuth().getCredentialsId()); - for (GhprbExtension ext : Ghprb.getJobExtensions(trigger, GhprbCommitStatus.class)) { - if (ext instanceof GhprbCommitStatus) { + for (GhprbExtension ext : Ghprb.getJobExtensions(trigger, GhprbSimpleStatus.class)) { + if (ext instanceof GhprbSimpleStatus) { try { - ((GhprbCommitStatus) ext).onBuildTriggered( + ((GhprbSimpleStatus) ext).onBuildTriggered( trigger.getActualProject(), pr.getHead(), pr.isMergeable(), @@ -138,10 +138,10 @@ public void onStarted(Run build, TaskListener listener) { e.printStackTrace(logger); } - for (GhprbExtension ext : Ghprb.getJobExtensions(trigger, GhprbCommitStatus.class)) { - if (ext instanceof GhprbCommitStatus) { + for (GhprbExtension ext : Ghprb.getJobExtensions(trigger, GhprbSimpleStatus.class)) { + if (ext instanceof GhprbSimpleStatus) { try { - ((GhprbCommitStatus) ext).onBuildStart(build, listener, repo.getGitHubRepo()); + ((GhprbSimpleStatus) ext).onBuildStart(build, listener, repo.getGitHubRepo()); } catch (GhprbCommitStatusException e) { repo.commentOnFailure(build, listener, e); } @@ -199,10 +199,10 @@ public void onCompleted(Run build, TaskListener listener) { } } - for (GhprbExtension ext : Ghprb.getJobExtensions(trigger, GhprbCommitStatus.class)) { - if (ext instanceof GhprbCommitStatus) { + for (GhprbExtension ext : Ghprb.getJobExtensions(trigger, GhprbSimpleStatus.class)) { + if (ext instanceof GhprbSimpleStatus) { try { - ((GhprbCommitStatus) ext).onBuildComplete(build, listener, repo.getGitHubRepo()); + ((GhprbSimpleStatus) ext).onBuildComplete(build, listener, repo.getGitHubRepo()); } catch (GhprbCommitStatusException e) { repo.commentOnFailure(build, listener, e); } @@ -260,10 +260,10 @@ public void onEnvironmentSetup(@SuppressWarnings("rawtypes") Run build, Launcher LOGGER.log(Level.FINE, "Job: " + build.getFullDisplayName() + " Attempting to send GitHub commit status"); - for (GhprbExtension ext : Ghprb.getJobExtensions(trigger, GhprbCommitStatus.class)) { - if (ext instanceof GhprbCommitStatus) { + for (GhprbExtension ext : Ghprb.getJobExtensions(trigger, GhprbSimpleStatus.class)) { + if (ext instanceof GhprbSimpleStatus) { try { - ((GhprbCommitStatus) ext).onEnvironmentSetup(build, listener, repo.getGitHubRepo()); + ((GhprbSimpleStatus) ext).onEnvironmentSetup(build, listener, repo.getGitHubRepo()); } catch (GhprbCommitStatusException e) { repo.commentOnFailure(build, listener, e); } diff --git a/src/main/java/org/jenkinsci/plugins/ghprb/GhprbPullRequest.java b/src/main/java/org/jenkinsci/plugins/ghprb/GhprbPullRequest.java index a21c64d74..b9a73d239 100644 --- a/src/main/java/org/jenkinsci/plugins/ghprb/GhprbPullRequest.java +++ b/src/main/java/org/jenkinsci/plugins/ghprb/GhprbPullRequest.java @@ -1,15 +1,21 @@ package org.jenkinsci.plugins.ghprb; import com.google.common.base.Joiner; +import hudson.model.Job; import hudson.model.Run; import org.apache.commons.lang.StringUtils; +import org.jenkinsci.plugins.ghprb.extensions.status.GhprbSimpleStatus; +import org.jenkinsci.plugins.ghprb.extensions.GhprbCommitStatusException; +import org.jenkinsci.plugins.ghprb.extensions.GhprbExtension; import org.kohsuke.github.GHCommitPointer; +import org.kohsuke.github.GHCommitState; import org.kohsuke.github.GHIssue; import org.kohsuke.github.GHIssueComment; import org.kohsuke.github.GHLabel; import org.kohsuke.github.GHPullRequest; import org.kohsuke.github.GHPullRequestCommitDetail; import org.kohsuke.github.GHPullRequestFileDetail; +import org.kohsuke.github.GHRepository; import org.kohsuke.github.GHUser; import org.kohsuke.github.GitUser; @@ -334,11 +340,12 @@ private void updatePR(GHPullRequest ghpr, GHIssueComment comment, boolean isWebh Date updatedDate = comment != null ? comment.getUpdatedAt() : ghpr.getUpdatedAt(); // Don't log unless it was actually updated if (updated == null || updated.compareTo(updatedDate) < 0) { - String user = comment != null ? comment.getUser().getName() : ghpr.getUser().getName(); + GHUser user = comment != null ? comment.getUser() : ghpr.getUser(); + String name = StringUtils.defaultIfBlank(user.getName(), user.getLogin()); LOGGER.log( Level.INFO, "Pull request #{0} was updated/initialized on {1} at {2} by {3} ({4})", - new Object[] {this.id, this.repo.getName(), updatedDate, user, + new Object[] {this.id, this.repo.getName(), updatedDate, name, comment != null ? "comment" : "PR update"} ); } @@ -511,7 +518,7 @@ boolean containsWatchedPaths(GHPullRequest pr) { } } - private void tryBuild() { + void tryBuild() { synchronized (this) { if (helper.isProjectDisabled()) { LOGGER.log(Level.FINEST, "Project is disabled, not trying to build"); @@ -530,7 +537,7 @@ private void tryBuild() { } if (shouldRun && !containsWatchedPaths(pr)) { - LOGGER.log(Level.FINEST, "Pull request contains no watched paths, skipping the build"); + skipBuildForWatchedPaths(); shouldRun = false; } @@ -690,6 +697,31 @@ public boolean checkMergeable() { return mergeable; } + void skipBuildForWatchedPaths() { + if (helper.getReportSuccessIfNotRegion()) { + LOGGER.log(Level.FINEST, "Pull request contains no watched paths, skipping the build and reporting success."); + createCommitStatus(GHCommitState.SUCCESS, "Skipped, no pertinent files changed."); + } else { + LOGGER.log(Level.FINEST, + "Pull request contains no watched paths, skipping the build"); + } + } + + public void createCommitStatus(GHCommitState state, String message) { + GHRepository ghRepository = repo.getGitHubRepo(); + GhprbTrigger trigger = helper.getTrigger(); + Job actualProject = trigger.getActualProject(); + for (GhprbExtension ext : Ghprb.getJobExtensions(trigger, GhprbSimpleStatus.class)) { + if (ext instanceof GhprbSimpleStatus) { + try { + ((GhprbSimpleStatus) ext).createCommitStatus(actualProject, id, head, state, ghRepository, message); + } catch (GhprbCommitStatusException e) { + repo.commentOnFailure(null, null, e); + } + } + } + } + @Override public boolean equals(Object obj) { if (!(obj instanceof GhprbPullRequest)) { diff --git a/src/main/java/org/jenkinsci/plugins/ghprb/GhprbTrigger.java b/src/main/java/org/jenkinsci/plugins/ghprb/GhprbTrigger.java index 5ba3e756f..0e6f44806 100644 --- a/src/main/java/org/jenkinsci/plugins/ghprb/GhprbTrigger.java +++ b/src/main/java/org/jenkinsci/plugins/ghprb/GhprbTrigger.java @@ -28,7 +28,6 @@ import net.sf.json.JSONObject; import org.apache.commons.lang.StringUtils; import org.jenkinsci.plugins.ghprb.extensions.GhprbBuildStep; -import org.jenkinsci.plugins.ghprb.extensions.GhprbCommitStatus; import org.jenkinsci.plugins.ghprb.extensions.GhprbExtension; import org.jenkinsci.plugins.ghprb.extensions.GhprbExtensionDescriptor; import org.jenkinsci.plugins.ghprb.extensions.GhprbGlobalDefault; @@ -135,6 +134,8 @@ public class GhprbTrigger extends GhprbTriggerBackwardsCompatible { private String excludedRegions; + private Boolean reportSuccessIfNotRegion; + private transient Ghprb helper; @@ -161,7 +162,7 @@ private void setExtensions(List extensions) { // Filter out items that we only want one of, like the status updater. this.extensions = Ghprb.onlyOneEntry(rawList, - GhprbCommitStatus.class + GhprbSimpleStatus.class ); // Make sure we have at least one of the types we need one of. @@ -198,7 +199,8 @@ public GhprbTrigger(String adminlist, String whiteListLabels, List extensions, String includedRegions, - String excludedRegions + String excludedRegions, + Boolean reportSuccessIfNotRegion ) throws ANTLRException { super(cron); this.adminlist = adminlist; @@ -222,6 +224,7 @@ public GhprbTrigger(String adminlist, this.whiteListLabels = whiteListLabels; this.includedRegions = includedRegions; this.excludedRegions = excludedRegions; + this.reportSuccessIfNotRegion = reportSuccessIfNotRegion; setExtensions(extensions); configVersion = LATEST_VERSION; } @@ -661,6 +664,13 @@ public String getExcludedRegions() { return excludedRegions; } + public Boolean getReportSuccessIfNotRegion() { + if (reportSuccessIfNotRegion == null) { + return false; + } + return reportSuccessIfNotRegion; + } + @Override public DescriptorImpl getDescriptor() { return DESCRIPTOR; @@ -920,8 +930,7 @@ public boolean configure(StaplerRequest req, JSONObject formData) throws FormExc try { extensions.rebuildHetero(req, formData, getGlobalExtensionDescriptors(), "extensions"); - // Now make sure we have at least one of the types we need one of. - Ghprb.addIfMissing(this.extensions, new GhprbSimpleStatus(), GhprbCommitStatus.class); + Ghprb.addIfMissing(this.extensions, new GhprbSimpleStatus(), GhprbSimpleStatus.class); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/org/jenkinsci/plugins/ghprb/extensions/GhprbCommitStatus.java b/src/main/java/org/jenkinsci/plugins/ghprb/extensions/GhprbCommitStatus.java deleted file mode 100644 index 7d2798a81..000000000 --- a/src/main/java/org/jenkinsci/plugins/ghprb/extensions/GhprbCommitStatus.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.jenkinsci.plugins.ghprb.extensions; - -import hudson.model.Job; -import hudson.model.Run; -import hudson.model.TaskListener; -import org.kohsuke.github.GHRepository; - -public interface GhprbCommitStatus { - void onEnvironmentSetup(Run build, TaskListener listener, GHRepository repo) throws GhprbCommitStatusException; - - void onBuildTriggered(Job project, String commitSha, boolean isMergeable, int prId, GHRepository ghRepository) - throws GhprbCommitStatusException; - - void onBuildStart(Run build, TaskListener listener, GHRepository repo) throws GhprbCommitStatusException; - - void onBuildComplete(Run build, TaskListener listener, GHRepository repo) throws GhprbCommitStatusException; -} diff --git a/src/main/java/org/jenkinsci/plugins/ghprb/extensions/status/GhprbNoCommitStatus.java b/src/main/java/org/jenkinsci/plugins/ghprb/extensions/status/GhprbNoCommitStatus.java deleted file mode 100644 index 4d4ffd5af..000000000 --- a/src/main/java/org/jenkinsci/plugins/ghprb/extensions/status/GhprbNoCommitStatus.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.jenkinsci.plugins.ghprb.extensions.status; - -import hudson.Extension; -import hudson.model.Job; -import hudson.model.Run; -import hudson.model.TaskListener; -import org.jenkinsci.plugins.ghprb.extensions.GhprbCommitStatus; -import org.jenkinsci.plugins.ghprb.extensions.GhprbCommitStatusException; -import org.jenkinsci.plugins.ghprb.extensions.GhprbExtension; -import org.jenkinsci.plugins.ghprb.extensions.GhprbExtensionDescriptor; -import org.jenkinsci.plugins.ghprb.extensions.GhprbProjectExtension; -import org.kohsuke.github.GHRepository; -import org.kohsuke.stapler.DataBoundConstructor; - -public class GhprbNoCommitStatus extends GhprbExtension implements GhprbCommitStatus, GhprbProjectExtension { - @Extension - public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); - - @DataBoundConstructor - public GhprbNoCommitStatus() { - - } - - public void onBuildStart(Run build, TaskListener listener, GHRepository repo) throws GhprbCommitStatusException { - - } - - public void onBuildComplete(Run build, TaskListener listener, GHRepository repo) throws GhprbCommitStatusException { - - } - - public void onEnvironmentSetup(Run build, TaskListener listener, GHRepository repo) throws GhprbCommitStatusException { - - } - - public void onBuildTriggered( - Job project, - String commitSha, - boolean isMergeable, - int prId, - GHRepository ghRepository - ) throws GhprbCommitStatusException { - - } - - @Override - public DescriptorImpl getDescriptor() { - return DESCRIPTOR; - } - - public static final class DescriptorImpl extends GhprbExtensionDescriptor implements GhprbProjectExtension { - - @Override - public String getDisplayName() { - return "Do not update commit status"; - } - - } - - -} diff --git a/src/main/java/org/jenkinsci/plugins/ghprb/extensions/status/GhprbSimpleStatus.java b/src/main/java/org/jenkinsci/plugins/ghprb/extensions/status/GhprbSimpleStatus.java index 7d86d2075..afee63162 100644 --- a/src/main/java/org/jenkinsci/plugins/ghprb/extensions/status/GhprbSimpleStatus.java +++ b/src/main/java/org/jenkinsci/plugins/ghprb/extensions/status/GhprbSimpleStatus.java @@ -11,7 +11,6 @@ import org.jenkinsci.plugins.ghprb.Ghprb; import org.jenkinsci.plugins.ghprb.GhprbCause; import org.jenkinsci.plugins.ghprb.GhprbTrigger; -import org.jenkinsci.plugins.ghprb.extensions.GhprbCommitStatus; import org.jenkinsci.plugins.ghprb.extensions.GhprbCommitStatusException; import org.jenkinsci.plugins.ghprb.extensions.GhprbExtension; import org.jenkinsci.plugins.ghprb.extensions.GhprbExtensionDescriptor; @@ -32,7 +31,7 @@ import java.util.Map; public class GhprbSimpleStatus extends GhprbExtension implements - GhprbCommitStatus, GhprbGlobalExtension, GhprbProjectExtension, GhprbGlobalDefault { + GhprbGlobalExtension, GhprbProjectExtension, GhprbGlobalDefault { @Extension public static final DescriptorImpl /*GhprbSimpleStatusDescriptor*/ DESCRIPTOR = new DescriptorImpl(); @@ -108,7 +107,6 @@ public boolean addIfMissing() { return true; } - @Override public void onBuildTriggered(Job project, String commitSha, boolean isMergeable, @@ -123,14 +121,6 @@ public void onBuildTriggered(Job project, return; } - String statusUrl = getDescriptor().getStatusUrlDefault(this); - if (commitStatusContext == "") { - commitStatusContext = getDescriptor().getCommitStatusContextDefault(this); - } - - String context = Util.fixEmpty(commitStatusContext); - context = Ghprb.replaceMacros(project, context); - if (!StringUtils.isEmpty(triggeredStatus)) { sb.append(Ghprb.replaceMacros(project, triggeredStatus)); } else { @@ -142,20 +132,10 @@ public void onBuildTriggered(Job project, } } - String url = Ghprb.replaceMacros(project, statusUrl); - if (StringUtils.equals(statusUrl, "--none--")) { - url = ""; - } - String message = sb.toString(); - try { - ghRepository.createCommitStatus(commitSha, state, url, message, context); - } catch (IOException e) { - throw new GhprbCommitStatusException(e, state, message, prId); - } + createCommitStatus(project, prId, commitSha, state, ghRepository, message); } - @Override public void onEnvironmentSetup(Run build, TaskListener listener, GHRepository repo) throws GhprbCommitStatusException { @@ -163,7 +143,6 @@ public void onEnvironmentSetup(Run build, // soon and will respect's the user's settings for startedStatus. } - @Override public void onBuildStart(Run build, TaskListener listener, GHRepository repo) throws GhprbCommitStatusException { @@ -286,6 +265,33 @@ private void createCommitStatus(Run build, } } + public void createCommitStatus(Job project, + int prId, + String commitSha, + GHCommitState state, + GHRepository ghRepository, + String message) throws GhprbCommitStatusException { + String statusUrl = getDescriptor().getStatusUrlDefault(this); + if (commitStatusContext == "") { + commitStatusContext = getDescriptor().getCommitStatusContextDefault(this); + } + + String context = Util.fixEmpty(commitStatusContext); + context = Ghprb.replaceMacros(project, context); + + String url = Ghprb.replaceMacros(project, statusUrl); + // "--none--" means the user does not want a message, "Jenkins" is the default when we don't have a URL. + if (StringUtils.equals(statusUrl, "--none--") || StringUtils.equals(statusUrl, "Jenkins")) { + url = ""; + } + + try { + ghRepository.createCommitStatus(commitSha, state, url, message, context); + } catch (IOException e) { + throw new GhprbCommitStatusException(e, state, message, prId); + } + } + @Override public DescriptorImpl /*GhprbSimpleStatusDescriptor*/ getDescriptor() { return DESCRIPTOR; diff --git a/src/main/java/org/jenkinsci/plugins/ghprb/jobdsl/GhprbContextExtensionPoint.java b/src/main/java/org/jenkinsci/plugins/ghprb/jobdsl/GhprbContextExtensionPoint.java index 06275f15f..485512c22 100644 --- a/src/main/java/org/jenkinsci/plugins/ghprb/jobdsl/GhprbContextExtensionPoint.java +++ b/src/main/java/org/jenkinsci/plugins/ghprb/jobdsl/GhprbContextExtensionPoint.java @@ -45,7 +45,8 @@ public Object githubPullRequest(Runnable closure) throws ANTLRException { Joiner.on("\n").join(context.whiteListLabels), context.extensionContext.getExtensions(), context.includedRegions, - context.excludedRegions + context.excludedRegions, + context.reportSuccessIfNotRegion ); } diff --git a/src/main/java/org/jenkinsci/plugins/ghprb/jobdsl/GhprbTriggerContext.java b/src/main/java/org/jenkinsci/plugins/ghprb/jobdsl/GhprbTriggerContext.java index 795a08253..edea9e8ec 100644 --- a/src/main/java/org/jenkinsci/plugins/ghprb/jobdsl/GhprbTriggerContext.java +++ b/src/main/java/org/jenkinsci/plugins/ghprb/jobdsl/GhprbTriggerContext.java @@ -48,6 +48,8 @@ class GhprbTriggerContext implements Context { String excludedRegions; + boolean reportSuccessIfNotRegion; + GhprbExtensionContext extensionContext = new GhprbExtensionContext(); /** diff --git a/src/main/resources/org/jenkinsci/plugins/ghprb/GhprbTrigger/config.groovy b/src/main/resources/org/jenkinsci/plugins/ghprb/GhprbTrigger/config.groovy index 6f1c0b16e..1bc544976 100644 --- a/src/main/resources/org/jenkinsci/plugins/ghprb/GhprbTrigger/config.groovy +++ b/src/main/resources/org/jenkinsci/plugins/ghprb/GhprbTrigger/config.groovy @@ -88,6 +88,10 @@ f.advanced() { f.entry(field: "excludedRegions", title: _("Excluded regions")) { f.textarea() } + f.entry(field: "reportSuccessIfNotRegion", + title: _("Report success if build is not triggered due to include/exclude region")) { + f.checkbox() + } } f.advanced(title: _("Trigger Setup")) { f.entry(title: _("Trigger Setup")) { diff --git a/src/main/resources/org/jenkinsci/plugins/ghprb/GhprbTrigger/help-reportSuccessIfNotRegion.html b/src/main/resources/org/jenkinsci/plugins/ghprb/GhprbTrigger/help-reportSuccessIfNotRegion.html new file mode 100644 index 000000000..f2ac11b1f --- /dev/null +++ b/src/main/resources/org/jenkinsci/plugins/ghprb/GhprbTrigger/help-reportSuccessIfNotRegion.html @@ -0,0 +1,4 @@ +
+ When checked, if this build is not triggered due to include/exclude regions, + it will send a successful build notification back to the GitHub PR. +
diff --git a/src/test/java/org/jenkinsci/plugins/ghprb/GhprbPullRequestTest.java b/src/test/java/org/jenkinsci/plugins/ghprb/GhprbPullRequestTest.java index c22217430..a39a277ec 100644 --- a/src/test/java/org/jenkinsci/plugins/ghprb/GhprbPullRequestTest.java +++ b/src/test/java/org/jenkinsci/plugins/ghprb/GhprbPullRequestTest.java @@ -4,6 +4,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.kohsuke.github.GHCommitPointer; +import org.kohsuke.github.GHCommitState; import org.kohsuke.github.GHIssueComment; import org.kohsuke.github.GHPullRequest; import org.kohsuke.github.GHPullRequestFileDetail; @@ -28,13 +29,15 @@ import static org.fest.assertions.Assertions.assertThat; import static org.mockito.BDDMockito.given; +import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; +import static org.mockito.Matchers.isA; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -346,6 +349,68 @@ public void testContainsWatchedPathIncludeFileExtensionExcludeFolder() { assertThat(ghprbPullRequest.containsWatchedPaths(pr)).isEqualTo(false); } + @Test + public void testSkipBuildForWatchedPathsNotCalledWhenIncluded() { + // GIVEN + GhprbPullRequest ghprbPullRequest = spy(new GhprbPullRequest(pr, helper, repo)); + + // WHEN + ghprbPullRequest.tryBuild(); + + // THEN + verify(ghprbPullRequest, never()).skipBuildForWatchedPaths(); + } + + @Test + public void testSkipBuildForWatchedPathsCalledWhenExcluded() { + // GIVEN + GhprbPullRequest ghprbPullRequest = spy(new GhprbPullRequest(pr, helper, repo)); + // Mockito throws exception if getExcludedRegionPatterns is not stubbed. + given(helper.getExcludedRegionPatterns()).willReturn(Collections.singletonList(Pattern.compile(""))); + given(ghprbPullRequest.containsWatchedPaths(pr)).willReturn(false); + + // WHEN + ghprbPullRequest.tryBuild(); + + // THEN + verify(ghprbPullRequest).skipBuildForWatchedPaths(); + } + + @Test + public void testSuccessPostedWhenBuildSkippedForNoWatchedPaths() { + // GIVEN + GhprbPullRequest ghprbPullRequest = spy(new GhprbPullRequest(pr, helper, repo)); + // Mockito throws exception if getExcludedRegionPatterns is not stubbed. + given(helper.getExcludedRegionPatterns()).willReturn(Collections.singletonList(Pattern.compile(""))); + given(helper.getReportSuccessIfNotRegion()).willReturn(true); + doNothing().when(ghprbPullRequest).createCommitStatus(isA(GHCommitState.class), isA(String.class)); + given(ghprbPullRequest.containsWatchedPaths(pr)).willReturn(false); + + // WHEN + ghprbPullRequest.tryBuild(); + + // THEN + verify(ghprbPullRequest).skipBuildForWatchedPaths(); + verify(ghprbPullRequest).createCommitStatus(any(GHCommitState.class), anyString()); + } + + @Test + public void testNothingPostedWhenBuildSkippedForNoWatchedPaths() { + // GIVEN + GhprbPullRequest ghprbPullRequest = spy(new GhprbPullRequest(pr, helper, repo)); + // Mockito throws exception if getExcludedRegionPatterns is not stubbed. + given(helper.getExcludedRegionPatterns()).willReturn(Collections.singletonList(Pattern.compile(""))); + given(helper.getReportSuccessIfNotRegion()).willReturn(false); + given(ghprbPullRequest.containsWatchedPaths(pr)).willReturn(false); + + // WHEN + ghprbPullRequest.tryBuild(); + + // THEN + verify(ghprbPullRequest).skipBuildForWatchedPaths(); + verify(ghprbPullRequest, never()).createCommitStatus(any(GHCommitState.class), anyString()); + } + @Test public void shouldNotAddDuplicateRequestForTestingComment() throws Exception { PowerMockito.mockStatic(GhprbPullRequest.class); diff --git a/src/test/java/org/jenkinsci/plugins/ghprb/GhprbRepositoryTest.java b/src/test/java/org/jenkinsci/plugins/ghprb/GhprbRepositoryTest.java index 32653c7c3..2b63abfa8 100644 --- a/src/test/java/org/jenkinsci/plugins/ghprb/GhprbRepositoryTest.java +++ b/src/test/java/org/jenkinsci/plugins/ghprb/GhprbRepositoryTest.java @@ -239,6 +239,7 @@ public void testCheckMethodWithOnlyExistingPRs() throws Exception { verifyNoMoreInteractions(gt); verify(ghUser, times(1)).getName(); + verify(ghUser, times(1)).getLogin(); verifyNoMoreInteractions(ghUser); verifyZeroInteractions(ghUser); } @@ -599,7 +600,7 @@ public void testCheckMethodWhenPrWasUpdatedWithNonKeyPhrase() throws Exception { verifyNoMoreInteractions(helper); verify(ghUser, times(1)).getEmail(); // Call to Github API - verify(ghUser, times(2)).getLogin(); + verify(ghUser, times(4)).getLogin(); verify(ghUser, times(3)).getName(); verifyNoMoreInteractions(ghUser); } @@ -701,7 +702,7 @@ public void testCheckMethodWhenPrWasUpdatedWithRetestPhrase() throws Exception { verifyNoMoreInteractions(helper); verify(ghUser, times(1)).getEmail(); // Call to Github API - verify(ghUser, times(2)).getLogin(); + verify(ghUser, times(3)).getLogin(); verify(ghUser, times(2)).getName(); verifyNoMoreInteractions(ghUser); diff --git a/src/test/java/org/jenkinsci/plugins/ghprb/extensions/status/GhprbSimpleStatusTest.java b/src/test/java/org/jenkinsci/plugins/ghprb/extensions/status/GhprbSimpleStatusTest.java index fc0eef854..22b941309 100644 --- a/src/test/java/org/jenkinsci/plugins/ghprb/extensions/status/GhprbSimpleStatusTest.java +++ b/src/test/java/org/jenkinsci/plugins/ghprb/extensions/status/GhprbSimpleStatusTest.java @@ -42,6 +42,18 @@ public void setUp() throws Exception { trigger = GhprbTestUtil.getTrigger(null); } + @Test + public void testCreateCommitStatus() throws Exception { + given(ghprbPullRequest.getHead()).willReturn("sha"); + + GhprbSimpleStatus status = spy(new GhprbSimpleStatus("default")); + status.createCommitStatus(trigger.getActualProject(), 1, "sha", GHCommitState.SUCCESS, ghRepository, "msg"); + + verify(ghRepository).createCommitStatus(eq("sha"), eq(GHCommitState.SUCCESS), eq(""), eq("msg"), eq("default")); + verifyNoMoreInteractions(ghRepository); + verifyNoMoreInteractions(ghprbPullRequest); + } + @Test public void testMergedMessage() throws Exception { String mergedMessage = "Build triggered for merge commit.";