package org.jenkinsci.plugins.github.status; import com.cloudbees.jenkins.GitHubSetCommitStatusBuilder; import com.github.tomakehurst.wiremock.common.Slf4jNotifier; import com.github.tomakehurst.wiremock.junit.WireMockRule; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.BuildListener; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.model.Result; import hudson.plugins.git.Revision; import hudson.plugins.git.util.BuildData; import org.apache.commons.lang3.StringUtils; import org.eclipse.jgit.lib.ObjectId; import org.jenkinsci.plugins.github.config.GitHubPluginConfig; import org.jenkinsci.plugins.github.extension.status.StatusErrorHandler; import org.jenkinsci.plugins.github.status.err.ChangingBuildStatusErrorHandler; import org.jenkinsci.plugins.github.status.sources.AnyDefinedRepositorySource; import org.jenkinsci.plugins.github.status.sources.BuildDataRevisionShaSource; import org.jenkinsci.plugins.github.status.sources.DefaultCommitContextSource; import org.jenkinsci.plugins.github.status.sources.DefaultStatusResultSource; import org.jenkinsci.plugins.github.test.GHMockRule; import org.jenkinsci.plugins.github.test.GHMockRule.FixedGHRepoNameTestContributor; import org.jenkinsci.plugins.github.test.InjectJenkinsMembersRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExternalResource; import org.junit.rules.RuleChain; import org.junit.runner.RunWith; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestBuilder; import org.jvnet.hudson.test.TestExtension; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import javax.inject.Inject; import java.util.Collections; import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor; import static com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; import static org.mockito.Mockito.when; /** * Tests for {@link GitHubSetCommitStatusBuilder}. * * @author Oleg Nenashev <o.v.nenashev@gmail.com> */ @RunWith(MockitoJUnitRunner.class) public class GitHubCommitStatusSetterTest { public static final String SOME_SHA = StringUtils.repeat("f", 40); @Mock public BuildData data; @Mock public Revision rev; @Inject public GitHubPluginConfig config; public JenkinsRule jRule = new JenkinsRule(); @Rule public RuleChain chain = RuleChain.outerRule(jRule).around(new InjectJenkinsMembersRule(jRule, this)); @Rule public GHMockRule github = new GHMockRule( new WireMockRule( wireMockConfig().dynamicPort().notifier(new Slf4jNotifier(true)) )) .stubUser() .stubRepo() .stubStatuses(); @Rule public ExternalResource prep = new ExternalResource() { @Override protected void before() throws Throwable { when(data.getLastBuiltRevision()).thenReturn(rev); data.lastBuild = new hudson.plugins.git.util.Build(rev, rev, 0, Result.SUCCESS); when(rev.getSha1()).thenReturn(ObjectId.fromString(SOME_SHA)); } }; @Test public void shouldSetGHCommitStatus() throws Exception { config.getConfigs().add(github.serverConfig()); FreeStyleProject prj = jRule.createFreeStyleProject(); GitHubCommitStatusSetter statusSetter = new GitHubCommitStatusSetter(); statusSetter.setCommitShaSource(new BuildDataRevisionShaSource()); statusSetter.setContextSource(new DefaultCommitContextSource()); statusSetter.setReposSource(new AnyDefinedRepositorySource()); statusSetter.setStatusResultSource(new DefaultStatusResultSource()); prj.getBuildersList().add(new TestBuilder() { @Override public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) { build.addAction(data); return true; } }); prj.getPublishersList().add(statusSetter); prj.scheduleBuild2(0).get(); github.service().verify(1, postRequestedFor(urlPathMatching(".*/" + SOME_SHA))); } @Test public void shouldHandleError() throws Exception { FreeStyleProject prj = jRule.createFreeStyleProject(); GitHubCommitStatusSetter statusSetter = new GitHubCommitStatusSetter(); statusSetter.setCommitShaSource(new BuildDataRevisionShaSource()); statusSetter.setErrorHandlers(Collections.<StatusErrorHandler>singletonList( new ChangingBuildStatusErrorHandler(Result.UNSTABLE.toString()) )); statusSetter.setReposSource(new AnyDefinedRepositorySource()); statusSetter.setStatusResultSource(new DefaultStatusResultSource()); prj.getPublishersList().add(statusSetter); FreeStyleBuild build = prj.scheduleBuild2(0).get(); jRule.assertBuildStatus(Result.UNSTABLE, build); } @TestExtension public static final FixedGHRepoNameTestContributor CONTRIBUTOR = new FixedGHRepoNameTestContributor(); }