package com.cloudbees.jenkins; import com.google.inject.Inject; import hudson.model.Item; import hudson.model.Job; import org.jenkinsci.plugins.github.extension.GHEventsSubscriber; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; import org.kohsuke.github.GHEvent; import java.util.Set; import static com.google.common.collect.Sets.immutableEnumSet; import static java.util.Arrays.asList; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.everyItem; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; /** * @author lanwen (Merkushev Kirill) */ public class GitHubWebHookTest { public static final String PAYLOAD = "{}"; @Rule public JenkinsRule jenkins = new JenkinsRule(); @Inject private IssueSubscriber subscriber; @Inject private PullRequestSubscriber pullRequestSubscriber; @Inject private ThrowablePullRequestSubscriber throwablePullRequestSubscriber; @Before public void setUp() throws Exception { jenkins.getInstance().getInjector().injectMembers(this); } @Test public void shouldCallExtensionInterestedInIssues() throws Exception { new GitHubWebHook().doIndex(GHEvent.ISSUES, PAYLOAD); assertThat("should get interested event", subscriber.lastEvent(), equalTo(GHEvent.ISSUES)); } @Test public void shouldNotCallAnyExtensionsWithPublicEventIfNotRegistered() throws Exception { new GitHubWebHook().doIndex(GHEvent.PUBLIC, PAYLOAD); assertThat("should not get not interested event", subscriber.lastEvent(), nullValue()); } @Test public void shouldCatchThrowableOnFailedSubscriber() throws Exception { new GitHubWebHook().doIndex(GHEvent.PULL_REQUEST, PAYLOAD); assertThat("each extension should get event", asList( pullRequestSubscriber.lastEvent(), throwablePullRequestSubscriber.lastEvent() ), everyItem(equalTo(GHEvent.PULL_REQUEST))); } @TestExtension @SuppressWarnings("unused") public static class IssueSubscriber extends TestSubscriber { public IssueSubscriber() { super(GHEvent.ISSUES); } } @TestExtension @SuppressWarnings("unused") public static class PullRequestSubscriber extends TestSubscriber { public PullRequestSubscriber() { super(GHEvent.PULL_REQUEST); } } @TestExtension @SuppressWarnings("unused") public static class ThrowablePullRequestSubscriber extends TestSubscriber { public ThrowablePullRequestSubscriber() { super(GHEvent.PULL_REQUEST); } @Override protected void onEvent(GHEvent event, String payload) { super.onEvent(event, payload); throw new GotEventException("Something went wrong!"); } } public static class TestSubscriber extends GHEventsSubscriber { private GHEvent interested; private GHEvent event; public TestSubscriber(GHEvent interested) { this.interested = interested; } @Override protected boolean isApplicable(Item project) { return true; } @Override protected Set<GHEvent> events() { return immutableEnumSet(interested); } @Override protected void onEvent(GHEvent event, String payload) { this.event = event; } public GHEvent lastEvent() { return event; } } public static class GotEventException extends RuntimeException { public GotEventException(String message) { super(message); } } }