package com.cloudbees.jenkins;
import com.github.tomakehurst.wiremock.common.Slf4jNotifier;
import com.github.tomakehurst.wiremock.junit.WireMockRule;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.Build;
import hudson.model.BuildListener;
import hudson.model.FreeStyleProject;
import hudson.model.Result;
import hudson.plugins.git.Revision;
import hudson.plugins.git.util.BuildData;
import hudson.tasks.Builder;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jgit.lib.ObjectId;
import org.jenkinsci.plugins.github.config.GitHubPluginConfig;
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.Issue;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.TestBuilder;
import org.jvnet.hudson.test.TestExtension;
import org.jvnet.hudson.test.recipes.LocalData;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import javax.inject.Inject;
import java.util.List;
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 com.google.common.collect.Lists.newArrayList;
import static org.mockito.Mockito.when;
/**
* Tests for {@link GitHubSetCommitStatusBuilder}.
*
* @author Oleg Nenashev <o.v.nenashev@gmail.com>
*/
@RunWith(MockitoJUnitRunner.class)
public class GitHubSetCommitStatusBuilderTest {
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
@Issue("JENKINS-23641")
public void shouldIgnoreIfNoBuildData() throws Exception {
FreeStyleProject prj = jRule.createFreeStyleProject("23641_noBuildData");
prj.getBuildersList().add(new GitHubSetCommitStatusBuilder());
Build b = prj.scheduleBuild2(0).get();
jRule.assertBuildStatus(Result.SUCCESS, b);
}
@Test
@LocalData
@Issue("JENKINS-32132")
public void shouldLoadNullStatusMessage() throws Exception {
config.getConfigs().add(github.serverConfig());
FreeStyleProject prj = jRule.getInstance().getItemByFullName("step", FreeStyleProject.class);
List<Builder> builders = newArrayList(prj.getBuildersList().toList());
builders.add(0, new TestBuilder() {
@Override
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) {
build.addAction(data);
return true;
}
});
prj.getBuildersList().replaceBy(builders);
prj.scheduleBuild2(0).get();
github.service().verify(1, postRequestedFor(urlPathMatching(".*/" + SOME_SHA)));
}
@TestExtension
public static final FixedGHRepoNameTestContributor CONTRIBUTOR = new FixedGHRepoNameTestContributor();
}