Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package io.jenkins.plugins.checks.github;

import hudson.model.*;
import hudson.model.Item;
import hudson.model.Job;
import hudson.model.ParametersAction;
import hudson.model.Run;
import hudson.model.StringParameterValue;
import io.jenkins.plugins.util.JenkinsFacade;
import org.apache.commons.io.FileUtils;
import org.jenkinsci.plugins.github.extension.GHSubscriberEvent;
import org.jenkinsci.plugins.github_branch_source.GitHubSCMSource;
import org.junit.Rule;
import org.junit.jupiter.api.Test;
import org.jvnet.hudson.test.LoggerRule;
import org.jvnet.hudson.test.LogRecorder;
import org.kohsuke.github.GHEvent;

import java.io.File;
Expand All @@ -16,20 +19,17 @@
import java.util.Optional;
import java.util.logging.Level;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

class CheckRunGHEventSubscriberTest {
static final String RERUN_REQUEST_JSON_FOR_PR = "check-run-event-with-rerun-action-for-pr.json";
static final String RERUN_REQUEST_JSON_FOR_MASTER = "check-run-event-with-rerun-action-for-master.json";
static final String RERUN_REQUEST_JSON_FOR_PR_MISSING_CHECKSUITE = "check-run-event-with-rerun-action-for-pr-missing-check-suite.json";
static final String RERUN_REQUEST_JSON_FOR_PR_MISSING_CHECKSUITE_HEAD_BRANCH = "check-run-event-with-rerun-action-for-pr-missing-check-suite-head-branch.json";

/**
* Rule for the log system.
*/
@Rule
public LoggerRule loggerRule = new LoggerRule();
private static final String RERUN_REQUEST_JSON_FOR_PR = "check-run-event-with-rerun-action-for-pr.json";
private static final String RERUN_REQUEST_JSON_FOR_MASTER = "check-run-event-with-rerun-action-for-master.json";
private static final String RERUN_REQUEST_JSON_FOR_PR_MISSING_CHECKSUITE = "check-run-event-with-rerun-action-for-pr-missing-check-suite.json";
private static final String RERUN_REQUEST_JSON_FOR_PR_MISSING_CHECKSUITE_HEAD_BRANCH = "check-run-event-with-rerun-action-for-pr-missing-check-suite-head-branch.json";

@Test
void shouldBeApplicableForJobWithGitHubSCMSource() {
Expand Down Expand Up @@ -65,35 +65,38 @@ void shouldSubscribeToCheckRunEvent() {

@Test
void shouldProcessCheckRunEventWithRerequestedAction() throws IOException {
loggerRule.record(CheckRunGHEventSubscriber.class.getName(), Level.INFO).capture(1);
new CheckRunGHEventSubscriber(mock(JenkinsFacade.class), mock(SCMFacade.class))
.onEvent(createEventWithRerunRequest(RERUN_REQUEST_JSON_FOR_PR));
assertThat(loggerRule.getMessages().get(0)).contains("Received rerun request through GitHub checks API.");
try (LogRecorder logRecorder = new LogRecorder().record(CheckRunGHEventSubscriber.class.getName(), Level.INFO).capture(1)) {
new CheckRunGHEventSubscriber(mock(JenkinsFacade.class), mock(SCMFacade.class))
.onEvent(createEventWithRerunRequest(RERUN_REQUEST_JSON_FOR_PR));
assertThat(logRecorder.getMessages().get(0)).contains("Received rerun request through GitHub checks API.");
}
}

@Test
void shouldThrowExceptionWhenCheckSuitesMissingFromPayload() throws IOException {
void shouldThrowExceptionWhenCheckSuitesMissingFromPayload() {
assertThatThrownBy(
() -> new CheckRunGHEventSubscriber(mock(JenkinsFacade.class), mock(SCMFacade.class))
.onEvent(createEventWithRerunRequest(RERUN_REQUEST_JSON_FOR_PR_MISSING_CHECKSUITE)))
() -> new CheckRunGHEventSubscriber(mock(JenkinsFacade.class), mock(SCMFacade.class))
.onEvent(createEventWithRerunRequest(RERUN_REQUEST_JSON_FOR_PR_MISSING_CHECKSUITE)))
.isInstanceOf(IllegalStateException.class)
.hasMessageContaining("Could not parse check run event:");
}

@Test
void shouldIgnoreHeadBranchMissingFromPayload() throws IOException {
loggerRule.record(CheckRunGHEventSubscriber.class.getName(), Level.INFO).capture(1);
new CheckRunGHEventSubscriber(mock(JenkinsFacade.class), mock(SCMFacade.class))
.onEvent(createEventWithRerunRequest(RERUN_REQUEST_JSON_FOR_PR_MISSING_CHECKSUITE_HEAD_BRANCH));
assertThat(loggerRule.getMessages().get(0)).contains("Received rerun request through GitHub checks API.");
try (LogRecorder logRecorder = new LogRecorder().record(CheckRunGHEventSubscriber.class.getName(), Level.INFO).capture(1)) {
new CheckRunGHEventSubscriber(mock(JenkinsFacade.class), mock(SCMFacade.class))
.onEvent(createEventWithRerunRequest(RERUN_REQUEST_JSON_FOR_PR_MISSING_CHECKSUITE_HEAD_BRANCH));
assertThat(logRecorder.getMessages().get(0)).contains("Received rerun request through GitHub checks API.");
}
}

@Test
void shouldIgnoreCheckRunEventWithoutRerequestedAction() throws IOException {
loggerRule.record(CheckRunGHEventSubscriber.class.getName(), Level.FINE).capture(1);
new CheckRunGHEventSubscriber(mock(JenkinsFacade.class), mock(SCMFacade.class))
.onEvent(createEventWithRerunRequest("check-run-event-with-created-action.json"));
assertThat(loggerRule.getMessages()).contains("Unsupported check run action: created");
try (LogRecorder logRecorder = new LogRecorder().record(CheckRunGHEventSubscriber.class.getName(), Level.FINE).capture(1)) {
new CheckRunGHEventSubscriber(mock(JenkinsFacade.class), mock(SCMFacade.class))
.onEvent(createEventWithRerunRequest("check-run-event-with-created-action.json"));
assertThat(logRecorder.getMessages()).contains("Unsupported check run action: created");
}
}

@Test
Expand All @@ -107,16 +110,17 @@ void shouldScheduleRerunForPR() throws IOException {
when(jenkinsFacade.getFullNameOf(job)).thenReturn("codingstyle/PR-1");
when(run.getParent()).thenReturn(job);
when(run.getAction(ParametersAction.class)).thenReturn(
new ParametersAction(new StringParameterValue("test_key", "test_value"))
new ParametersAction(new StringParameterValue("test_key", "test_value"))
);
when(job.getNextBuildNumber()).thenReturn(1);
when(job.getName()).thenReturn("PR-1");

loggerRule.record(CheckRunGHEventSubscriber.class.getName(), Level.INFO).capture(1);
new CheckRunGHEventSubscriber(jenkinsFacade, scmFacade)
.onEvent(createEventWithRerunRequest(RERUN_REQUEST_JSON_FOR_PR));
assertThat(loggerRule.getMessages())
.contains("Scheduled rerun (build #1) for job codingstyle/PR-1, requested by XiongKezhi");
try (LogRecorder logRecorder = new LogRecorder().record(CheckRunGHEventSubscriber.class.getName(), Level.INFO).capture(1)) {
new CheckRunGHEventSubscriber(jenkinsFacade, scmFacade)
.onEvent(createEventWithRerunRequest(RERUN_REQUEST_JSON_FOR_PR));
assertThat(logRecorder.getMessages())
.contains("Scheduled rerun (build #1) for job codingstyle/PR-1, requested by XiongKezhi");
}
}

@Test
Expand All @@ -133,11 +137,12 @@ void shouldScheduleRerunForMaster() throws IOException {
when(job.getNextBuildNumber()).thenReturn(1);
when(job.getName()).thenReturn("master");

loggerRule.record(CheckRunGHEventSubscriber.class.getName(), Level.INFO).capture(1);
new CheckRunGHEventSubscriber(jenkinsFacade, scmFacade)
.onEvent(createEventWithRerunRequest(RERUN_REQUEST_JSON_FOR_MASTER));
assertThat(loggerRule.getMessages())
.contains("Scheduled rerun (build #1) for job codingstyle/master, requested by XiongKezhi");
try (LogRecorder logRecorder = new LogRecorder().record(CheckRunGHEventSubscriber.class.getName(), Level.INFO).capture(1)) {
new CheckRunGHEventSubscriber(jenkinsFacade, scmFacade)
.onEvent(createEventWithRerunRequest(RERUN_REQUEST_JSON_FOR_MASTER));
assertThat(logRecorder.getMessages())
.contains("Scheduled rerun (build #1) for job codingstyle/master, requested by XiongKezhi");
}
}

@Test
Expand All @@ -158,24 +163,25 @@ void shouldContainsUserAndBranchInShortDescriptionOfGitHubChecksRerunActionCause
}

@Test
void shouldHaveAccessableBranchNameInGitHubChecksRerunActionCause() {
void shouldHaveAccessibleBranchNameInGitHubChecksRerunActionCause() {
CheckRunGHEventSubscriber.GitHubChecksRerunActionCause cause =
new CheckRunGHEventSubscriber.GitHubChecksRerunActionCause("jenkins", "some_branch");

assertThat(cause.getBranchName()).isEqualTo("some_branch");
}

private void assertNoBuildIsScheduled(final JenkinsFacade jenkinsFacade, final SCMFacade scmFacade,
final GHSubscriberEvent event) {
loggerRule.record(CheckRunGHEventSubscriber.class.getName(), Level.WARNING).capture(1);
new CheckRunGHEventSubscriber(jenkinsFacade, scmFacade).onEvent(event);
assertThat(loggerRule.getMessages())
.contains("No build found for rerun request from repository: XiongKezhi/codingstyle and id: codingstyle/PR-1#2");
private static void assertNoBuildIsScheduled(final JenkinsFacade jenkinsFacade, final SCMFacade scmFacade,
final GHSubscriberEvent event) {
try (LogRecorder logRecorder = new LogRecorder().record(CheckRunGHEventSubscriber.class.getName(), Level.WARNING).capture(1)) {
new CheckRunGHEventSubscriber(jenkinsFacade, scmFacade).onEvent(event);
assertThat(logRecorder.getMessages())
.contains("No build found for rerun request from repository: XiongKezhi/codingstyle and id: codingstyle/PR-1#2");
}
}

private GHSubscriberEvent createEventWithRerunRequest(final String jsonFile) throws IOException {
private static GHSubscriberEvent createEventWithRerunRequest(final String jsonFile) throws IOException {
return new GHSubscriberEvent("CheckRunGHEventSubscriberTest", GHEvent.CHECK_RUN,
FileUtils.readFileToString(new File(getClass().getResource(getClass().getSimpleName() + "/"
+ jsonFile).getFile()), StandardCharsets.UTF_8));
FileUtils.readFileToString(new File(CheckRunGHEventSubscriberTest.class.getResource(
CheckRunGHEventSubscriberTest.class.getSimpleName() + "/" + jsonFile).getFile()), StandardCharsets.UTF_8));
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
package io.jenkins.plugins.checks.github;

import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.Test;

import org.kohsuke.github.GHCheckRun.Conclusion;
import org.kohsuke.github.GHCheckRun.Status;

import io.jenkins.plugins.checks.api.ChecksConclusion;
import io.jenkins.plugins.checks.api.ChecksDetails;
import io.jenkins.plugins.checks.api.ChecksDetails.ChecksDetailsBuilder;
import io.jenkins.plugins.checks.api.ChecksStatus;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.Test;
import org.kohsuke.github.GHCheckRun.Conclusion;
import org.kohsuke.github.GHCheckRun.Status;

import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

class GitHubChecksDetailsTest {

@Test
void shouldReturnAllGitHubObjectsCorrectly() {
ChecksDetails details = new ChecksDetailsBuilder()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package io.jenkins.plugins.checks.github;

import java.io.IOException;
import java.util.Optional;

import hudson.EnvVars;
import hudson.model.Job;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.plugins.git.GitSCM;
import hudson.plugins.git.UserRemoteConfig;
import jenkins.scm.api.SCMHead;
Expand All @@ -13,14 +13,15 @@
import org.jenkinsci.plugins.github_branch_source.PullRequestSCMRevision;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import java.io.IOException;
import java.util.Optional;

import hudson.model.Job;
import hudson.model.Run;
import hudson.model.TaskListener;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

class GitHubChecksPublisherFactoryTest {

@Test
void shouldCreateGitHubChecksPublisherFromRunForProjectWithValidGitHubSCMSource() {
Run run = mock(Run.class);
Expand Down Expand Up @@ -113,7 +114,7 @@ void shouldCreateNullPublisherFromJobForInvalidProject() {
.isNotPresent();
}

private DisplayURLProvider createDisplayURLProvider(final Run<?, ?> run, final Job<?, ?> job) {
private static DisplayURLProvider createDisplayURLProvider(final Run<?, ?> run, final Job<?, ?> job) {
DisplayURLProvider urlProvider = mock(DisplayURLProvider.class);

when(urlProvider.getRunURL(run)).thenReturn(null);
Expand Down
Loading