Initial BPer implementation

This commit is contained in:
Andrea Lamparelli 2022-12-22 13:14:37 +01:00
parent 05d156a5b0
commit f0d9f789fa
59 changed files with 33618 additions and 1048 deletions

View file

@ -0,0 +1,90 @@
import { Args } from "@bp/service/args/args.types";
import CLIArgsParser from "@bp/service/args/cli/cli-args-parser";
import { addProcessArgs, resetProcessArgs } from "../../../support/utils";
describe("cli args parser", () => {
let parser: CLIArgsParser;
beforeEach(() => {
// create a fresh new instance every time
parser = new CLIArgsParser();
// reset process.env variables
resetProcessArgs();
});
test("valid execution [default, short]", () => {
addProcessArgs([
"-tb",
"target",
"-pr",
"https://localhost/whatever/pulls/1"
]);
const args: Args = parser.parse();
expect(args.dryRun).toEqual(false);
expect(args.auth).toEqual("");
expect(args.author).toEqual(undefined);
expect(args.folder).toEqual(undefined);
expect(args.targetBranch).toEqual("target");
expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
});
test("valid execution [default, long]", () => {
addProcessArgs([
"--target-branch",
"target",
"--pull-request",
"https://localhost/whatever/pulls/1"
]);
const args: Args = parser.parse();
expect(args.dryRun).toEqual(false);
expect(args.auth).toEqual("");
expect(args.author).toEqual(undefined);
expect(args.folder).toEqual(undefined);
expect(args.targetBranch).toEqual("target");
expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
});
test("valid execution [override, short]", () => {
addProcessArgs([
"-d",
"-a",
"bearer-token",
"-tb",
"target",
"-pr",
"https://localhost/whatever/pulls/1"
]);
const args: Args = parser.parse();
expect(args.dryRun).toEqual(true);
expect(args.auth).toEqual("bearer-token");
expect(args.author).toEqual(undefined);
expect(args.folder).toEqual(undefined);
expect(args.targetBranch).toEqual("target");
expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
});
test("valid execution [override, long]", () => {
addProcessArgs([
"--dry-run",
"--auth",
"bearer-token",
"--target-branch",
"target",
"--pull-request",
"https://localhost/whatever/pulls/1"
]);
const args: Args = parser.parse();
expect(args.dryRun).toEqual(true);
expect(args.auth).toEqual("bearer-token");
expect(args.author).toEqual(undefined);
expect(args.folder).toEqual(undefined);
expect(args.targetBranch).toEqual("target");
expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
});
});

View file

@ -0,0 +1,50 @@
import { Args } from "@bp/service/args/args.types";
import GHAArgsParser from "@bp/service/args/gha/gha-args-parser";
import { spyGetInput } from "../../../support/utils";
describe("gha args parser", () => {
let parser: GHAArgsParser;
beforeEach(() => {
// create a fresh new instance every time
parser = new GHAArgsParser();
});
afterEach(() => {
jest.clearAllMocks();
});
test("valid execution [default]", () => {
spyGetInput({
"target-branch": "target",
"pull-request": "https://localhost/whatever/pulls/1"
});
const args: Args = parser.parse();
expect(args.dryRun).toEqual(false);
expect(args.auth).toEqual("");
expect(args.author).toEqual(undefined);
expect(args.folder).toEqual(undefined);
expect(args.targetBranch).toEqual("target");
expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
});
test("valid execution [override]", () => {
spyGetInput({
"dry-run": "true",
"auth": "bearer-token",
"target-branch": "target",
"pull-request": "https://localhost/whatever/pulls/1"
});
const args: Args = parser.parse();
expect(args.dryRun).toEqual(true);
expect(args.auth).toEqual("bearer-token");
expect(args.author).toEqual(undefined);
expect(args.folder).toEqual(undefined);
expect(args.targetBranch).toEqual("target");
expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
});
});

View file

@ -0,0 +1,132 @@
import { Args } from "@bp/service/args/args.types";
import { Configs } from "@bp/service/configs/configs.types";
import PullRequestConfigsParser from "@bp/service/configs/pullrequest/pr-configs-parser";
import GitServiceFactory from "@bp/service/git/git-service-factory";
import { GitServiceType } from "@bp/service/git/git.types";
import { setupMoctokit } from "../../../support/moctokit/moctokit-support";
import { mergedPullRequestFixture, notMergedPullRequestFixture, repo, targetOwner } from "../../../support/moctokit/moctokit-data";
describe("pull request config parser", () => {
const mergedPRUrl = `https://github.com/${targetOwner}/${repo}/pull/${mergedPullRequestFixture.number}`;
const notMergedPRUrl = `https://github.com/${targetOwner}/${repo}/pull/${notMergedPullRequestFixture.number}`;
let parser: PullRequestConfigsParser;
beforeAll(() => {
GitServiceFactory.init(GitServiceType.GITHUB, "whatever");
});
beforeEach(() => {
setupMoctokit();
parser = new PullRequestConfigsParser();
});
afterEach(() => {
jest.clearAllMocks();
});
test("parse configs from pull request [default]", async () => {
const args: Args = {
dryRun: false,
auth: "",
pullRequest: mergedPRUrl,
targetBranch: "prod"
};
const configs: Configs = await parser.parseAndValidate(args);
expect(configs.dryRun).toEqual(false);
expect(configs.author).toEqual("gh-user");
expect(configs.auth).toEqual("");
expect(configs.targetBranch).toEqual("prod");
expect(configs.folder).toEqual(process.cwd() + "/bp");
expect(configs.originalPullRequest).toEqual({
author: "gh-user",
url: "https://api.github.com/repos/owner/reponame/pulls/2368",
htmlUrl: "https://github.com/owner/reponame/pull/2368",
state: "closed",
merged: true,
mergedBy: "that-s-a-user",
title: "PR Title",
body: "Please review and merge",
reviewers: ["requested-gh-user", "gh-user"],
targetRepo: {
owner: "owner",
project: "reponame",
cloneUrl: "https://github.com/owner/reponame.git"
},
sourceRepo: {
owner: "fork",
project: "reponame",
cloneUrl: "https://github.com/fork/reponame.git"
},
commits: ["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"]
});
expect(configs.backportPullRequest).toEqual({
author: "gh-user",
url: undefined,
htmlUrl: undefined,
title: "[prod] PR Title",
body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge\r\n\r\nPowered by [BPer](https://github.com/lampajr/backporting).",
reviewers: ["gh-user", "that-s-a-user"],
targetRepo: {
owner: "owner",
project: "reponame",
cloneUrl: "https://github.com/owner/reponame.git"
},
sourceRepo: {
owner: "owner",
project: "reponame",
cloneUrl: "https://github.com/owner/reponame.git"
},
commits: []
});
});
test("override folder", async () => {
const args: Args = {
dryRun: true,
auth: "whatever",
pullRequest: mergedPRUrl,
targetBranch: "prod",
folder: "/tmp/test"
};
const configs: Configs = await parser.parseAndValidate(args);
expect(configs.dryRun).toEqual(true);
expect(configs.auth).toEqual("whatever");
expect(configs.targetBranch).toEqual("prod");
expect(configs.folder).toEqual("/tmp/test");
});
test("override author", async () => {
const args: Args = {
dryRun: true,
auth: "whatever",
pullRequest: mergedPRUrl,
targetBranch: "prod",
author: "another-user"
};
const configs: Configs = await parser.parseAndValidate(args);
expect(configs.dryRun).toEqual(true);
expect(configs.auth).toEqual("whatever");
expect(configs.targetBranch).toEqual("prod");
expect(configs.author).toEqual("another-user");
});
test("not merged pull request", async () => {
const args: Args = {
dryRun: true,
auth: "whatever",
pullRequest: notMergedPRUrl,
targetBranch: "prod"
};
expect(async () => await parser.parseAndValidate(args)).rejects.toThrow("Provided pull request is not merged!");
});
});

View file

@ -0,0 +1,114 @@
import GitCLIService from "@bp/service/git/git-cli";
import { FileState, GitActionTypes, MockGithub } from "@kie/mock-github";
import { spawnSync } from "child_process";
import { assert } from "console";
import path from "path";
import fs from "fs";
let git: GitCLIService;
let cwd: string;
let currentBranch: string;
let pushedBranches: string[];
let localBranches: string[];
let files: FileState[];
const mockGithub = new MockGithub(
{
repo: {
repoA: {
pushedBranches: ["sbranch", "tbranch"],
localBranches: ["lbranch"],
currentBranch: "main",
history: [
{
action: GitActionTypes.PUSH,
branch: "main",
},
{
action: GitActionTypes.PUSH,
branch: "sbranch",
},
{
action: GitActionTypes.PUSH,
branch: "tbranch",
},
],
},
},
},
path.join(__dirname, "setup-cli")
);
beforeAll(async () => {
//setup
await mockGithub.setup();
cwd = mockGithub.repo.getPath("repoA")!;
currentBranch = mockGithub.repo.getBranchState("repoA")!.currentBranch;
pushedBranches = mockGithub.repo.getBranchState("repoA")!.pushedBranches;
localBranches = mockGithub.repo.getBranchState("repoA")!.localBranches;
files = (await mockGithub.repo.getFileSystemState("repoA"))!;
//make sure the setup is correct to run this test suite
assert(
pushedBranches.length > 1,
"your configuration must have a repository with pushed branches other than main"
);
assert(
localBranches.length > 0,
"your configuration must have a repository with local branches i.e. not pushed branches"
);
assert(
files.length > 0,
"your configuration needs at least 1 file committed to some branch which is not the current branch"
);
});
afterAll(async () => {
await mockGithub.teardown();
});
beforeEach(() => {
// create a fresh instance of git before each test
git = new GitCLIService("", "author");
});
describe("git cli service", () => {
test("version", async () => {
const result = await git.version();
const actualVersion = spawnSync("git", ["version"]).stdout.toString();
const match = actualVersion.match(/(\d+\.\d+(\.\d+)?)/);
if (match) {
expect(result).toEqual(match[1]);
} else {
expect(result).toBe(undefined);
}
});
test("fetch", async () => {
await expect(git.fetch(cwd, currentBranch)).resolves.not.toThrowError();
});
test("local branch", async () => {
await expect(git.createLocalBranch(cwd, "new-local-branch")).resolves.not.toThrowError();
// use rev-parse to double check the current branch is the new one
const output = spawnSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], { cwd }).stdout.toString().trim();
expect(output).toEqual("new-local-branch");
});
test("push local branch", async () => {
const expressionToTest = "GIT_CHERRY_SHOULD_NOT_INCLUDE_THIS_MSG";
// create file to push
fs.writeFileSync(path.join(cwd, "test-push"), "testing git push");
// add and commit the file
spawnSync("git", ["add", "."], { cwd });
spawnSync("git", ["commit", "-m", expressionToTest], { cwd });
await git.push(cwd, currentBranch, "origin", false);
// use git cherry to verify this commit was pushed
const output = spawnSync("git", ["cherry", "-v"], { cwd }).stdout.toString();
expect(output.includes(expressionToTest)).toBe(false);
});
});

View file

@ -1,7 +1,7 @@
import GitServiceFactory from "@gb/service/git/git-service-factory";
import { GitPullRequest, GitServiceType } from "@gb/service/git/git.types";
import GitHubService from "@gb/service/git/github/github-service";
import { pullRequestNumber, repo, targetOwner } from "../../../support/moctokit/moctokit-data";
import GitServiceFactory from "@bp/service/git/git-service-factory";
import { GitPullRequest, GitServiceType } from "@bp/service/git/git.types";
import GitHubService from "@bp/service/git/github/github-service";
import { mergedPullRequestFixture, repo, targetOwner } from "../../../support/moctokit/moctokit-data";
import { setupMoctokit } from "../../../support/moctokit/moctokit-support";
describe("github service", () => {
@ -21,9 +21,17 @@ describe("github service", () => {
});
test("get pull request: success", async () => {
const res: GitPullRequest = await gitService.getPullRequest(targetOwner, repo, pullRequestNumber);
expect(res.sourceRepo).toBe("fork/reponame");
expect(res.targetRepo).toBe("owner/reponame");
const res: GitPullRequest = await gitService.getPullRequest(targetOwner, repo, mergedPullRequestFixture.number);
expect(res.sourceRepo).toEqual({
owner: "fork",
project: "reponame",
cloneUrl: "https://github.com/fork/reponame.git"
});
expect(res.targetRepo).toEqual({
owner: "owner",
project: "reponame",
cloneUrl: "https://github.com/owner/reponame.git"
});
expect(res.title).toBe("PR Title");
expect(res.commits.length).toBe(1);
expect(res.commits).toEqual(["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"]);

View file

@ -0,0 +1,201 @@
import ArgsParser from "@bp/service/args/args-parser";
import Runner from "@bp/service/runner/runner";
import GitCLIService from "@bp/service/git/git-cli";
import GitHubService from "@bp/service/git/github/github-service";
import CLIArgsParser from "@bp/service/args/cli/cli-args-parser";
import { addProcessArgs, resetProcessArgs } from "../../support/utils";
import { setupMoctokit } from "../../support/moctokit/moctokit-support";
jest.mock("@bp/service/git/git-cli");
jest.spyOn(GitHubService.prototype, "createPullRequest");
let parser: ArgsParser;
let runner: Runner;
beforeEach(() => {
setupMoctokit();
// create CLI arguments parser
parser = new CLIArgsParser();
// create runner
runner = new Runner(parser);
});
afterEach(() => {
jest.clearAllMocks();
// reset process.env variables
resetProcessArgs();
});
describe("pull request runner test", () => {
test("with dry run", async () => {
addProcessArgs([
"-d",
"-tb",
"target",
"-pr",
"https://github.com/owner/reponame/pull/2368"
]);
await runner.execute();
const cwd = process.cwd() + "/bp";
expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitCLIService.prototype.push).toBeCalledTimes(0);
expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(0);
});
test("overriding author", async () => {
addProcessArgs([
"-d",
"-tb",
"target",
"-pr",
"https://github.com/owner/reponame/pull/2368"
]);
await runner.execute();
const cwd = process.cwd() + "/bp";
expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitCLIService.prototype.push).toBeCalledTimes(0);
expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(0);
});
test("with relative folder", async () => {
addProcessArgs([
"-d",
"-tb",
"target",
"-pr",
"https://github.com/owner/reponame/pull/2368",
"-f",
"folder"
]);
await runner.execute();
const cwd = process.cwd() + "/folder";
expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
expect(GitCLIService.prototype.push).toBeCalledTimes(0);
expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(0);
});
test("with absolute folder", async () => {
addProcessArgs([
"-d",
"-tb",
"target",
"-pr",
"https://github.com/owner/reponame/pull/2368",
"-f",
"/tmp/folder"
]);
await runner.execute();
const cwd = "/tmp/folder";
expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitCLIService.prototype.push).toBeCalledTimes(0);
expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(0);
});
test("without dry run", async () => {
addProcessArgs([
"-tb",
"target",
"-pr",
"https://github.com/owner/reponame/pull/2368"
]);
await runner.execute();
const cwd = process.cwd() + "/bp";
expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitCLIService.prototype.push).toBeCalledTimes(1);
expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(1);
expect(GitHubService.prototype.createPullRequest).toBeCalledWith({
owner: "owner",
repo: "reponame",
head: "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc",
base: "target",
title: "[target] PR Title",
body: expect.stringContaining("**Backport:** https://github.com/owner/reponame/pull/2368"),
reviewers: ["gh-user", "that-s-a-user"]
}
);
});
test("not merged pull request", async () => {
addProcessArgs([
"-tb",
"target",
"-pr",
"https://github.com/owner/reponame/pull/4444"
]);
expect(async () => await runner.execute()).rejects.toThrow("Provided pull request is not merged!");
});
});

View file

@ -0,0 +1,101 @@
import ArgsParser from "@bp/service/args/args-parser";
import Runner from "@bp/service/runner/runner";
import GitCLIService from "@bp/service/git/git-cli";
import GitHubService from "@bp/service/git/github/github-service";
import GHAArgsParser from "@bp/service/args/gha/gha-args-parser";
import { spyGetInput } from "../../support/utils";
import { setupMoctokit } from "../../support/moctokit/moctokit-support";
jest.mock("@bp/service/git/git-cli");
jest.spyOn(GitHubService.prototype, "createPullRequest");
let parser: ArgsParser;
let runner: Runner;
beforeEach(() => {
setupMoctokit();
// create GHA arguments parser
parser = new GHAArgsParser();
// create runner
runner = new Runner(parser);
});
afterEach(() => {
jest.clearAllMocks();
});
describe("pull request runner test", () => {
test("with dry run", async () => {
spyGetInput({
"dry-run": "true",
"target-branch": "target",
"pull-request": "https://github.com/owner/reponame/pull/2368"
});
await runner.execute();
const cwd = process.cwd() + "/bp";
expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitCLIService.prototype.push).toBeCalledTimes(0);
expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(0);
});
test("without dry run", async () => {
spyGetInput({
"target-branch": "target",
"pull-request": "https://github.com/owner/reponame/pull/2368"
});
await runner.execute();
const cwd = process.cwd() + "/bp";
expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitCLIService.prototype.push).toBeCalledTimes(1);
expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(1);
expect(GitHubService.prototype.createPullRequest).toBeCalledWith({
owner: "owner",
repo: "reponame",
head: "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc",
base: "target",
title: "[target] PR Title",
body: expect.stringContaining("**Backport:** https://github.com/owner/reponame/pull/2368"),
reviewers: ["gh-user", "that-s-a-user"]
}
);
});
test("not merged pull request", async () => {
spyGetInput({
"target-branch": "target",
"pull-request": "https://github.com/owner/reponame/pull/4444"
});
expect(async () => await runner.execute()).rejects.toThrow("Provided pull request is not merged!");
});
});

View file

@ -1,11 +1,9 @@
export const targetOwner = "owner";
export const sourceOwner = "fork";
export const repo = "reponame";
export const pullRequestNumber = 2368;
export const invalidPullRequestNumber = 1;
export const commitRef = "91748965051fae1330ad58d15cf694e103267c87";
export const notFoundPullRequestNumber = 1;
export const validPR = {
export const mergedPullRequestFixture = {
"url": "https://api.github.com/repos/owner/reponame/pulls/2368",
"id": 1137188271,
"node_id": "PR_kwDOABTq6s5DyB2v",
@ -18,22 +16,22 @@ export const validPR = {
"locked": false,
"title": "PR Title",
"user": {
"login": "kie-ci",
"login": "gh-user",
"id": 11995863,
"node_id": "MDQ6VXNlcjExOTk1ODYz",
"avatar_url": "https://avatars.githubusercontent.com/u/11995863?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/kie-ci",
"html_url": "https://github.com/kie-ci",
"followers_url": "https://api.github.com/users/kie-ci/followers",
"following_url": "https://api.github.com/users/kie-ci/following{/other_user}",
"gists_url": "https://api.github.com/users/kie-ci/gists{/gist_id}",
"starred_url": "https://api.github.com/users/kie-ci/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/kie-ci/subscriptions",
"organizations_url": "https://api.github.com/users/kie-ci/orgs",
"repos_url": "https://api.github.com/users/kie-ci/repos",
"events_url": "https://api.github.com/users/kie-ci/events{/privacy}",
"received_events_url": "https://api.github.com/users/kie-ci/received_events",
"url": "https://api.github.com/users/gh-user",
"html_url": "https://github.com/gh-user",
"followers_url": "https://api.github.com/users/gh-user/followers",
"following_url": "https://api.github.com/users/gh-user/following{/other_user}",
"gists_url": "https://api.github.com/users/gh-user/gists{/gist_id}",
"starred_url": "https://api.github.com/users/gh-user/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/gh-user/subscriptions",
"organizations_url": "https://api.github.com/users/gh-user/orgs",
"repos_url": "https://api.github.com/users/gh-user/repos",
"events_url": "https://api.github.com/users/gh-user/events{/privacy}",
"received_events_url": "https://api.github.com/users/gh-user/received_events",
"type": "User",
"site_admin": false
},
@ -49,22 +47,42 @@ export const validPR = {
],
"requested_reviewers": [
{
"login": "ghuser",
"login": "requested-gh-user",
"id": 1422582,
"node_id": "MDQ6VXNlcjE0MjI1ODI=",
"avatar_url": "https://avatars.githubusercontent.com/u/1422582?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/ghuser",
"html_url": "https://github.com/ghuser",
"followers_url": "https://api.github.com/users/ghuser/followers",
"following_url": "https://api.github.com/users/ghuser/following{/other_user}",
"gists_url": "https://api.github.com/users/ghuser/gists{/gist_id}",
"starred_url": "https://api.github.com/users/ghuser/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/ghuser/subscriptions",
"organizations_url": "https://api.github.com/users/ghuser/orgs",
"repos_url": "https://api.github.com/users/ghuser/repos",
"events_url": "https://api.github.com/users/ghuser/events{/privacy}",
"received_events_url": "https://api.github.com/users/ghuser/received_events",
"url": "https://api.github.com/users/requested-gh-user",
"html_url": "https://github.com/requested-gh-user",
"followers_url": "https://api.github.com/users/requested-gh-user/followers",
"following_url": "https://api.github.com/users/requested-gh-user/following{/other_user}",
"gists_url": "https://api.github.com/users/requested-gh-user/gists{/gist_id}",
"starred_url": "https://api.github.com/users/requested-gh-user/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/requested-gh-user/subscriptions",
"organizations_url": "https://api.github.com/users/requested-gh-user/orgs",
"repos_url": "https://api.github.com/users/requested-gh-user/repos",
"events_url": "https://api.github.com/users/requested-gh-user/events{/privacy}",
"received_events_url": "https://api.github.com/users/requested-gh-user/received_events",
"type": "User",
"site_admin": false
},
{
"login": "gh-user",
"id": 1422582,
"node_id": "MDQ6VXNlcjE0MjI1ODI=",
"avatar_url": "https://avatars.githubusercontent.com/u/1422582?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/gh-user",
"html_url": "https://github.com/gh-user",
"followers_url": "https://api.github.com/users/gh-user/followers",
"following_url": "https://api.github.com/users/gh-user/following{/other_user}",
"gists_url": "https://api.github.com/users/gh-user/gists{/gist_id}",
"starred_url": "https://api.github.com/users/gh-user/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/gh-user/subscriptions",
"organizations_url": "https://api.github.com/users/gh-user/orgs",
"repos_url": "https://api.github.com/users/gh-user/repos",
"events_url": "https://api.github.com/users/gh-user/events{/privacy}",
"received_events_url": "https://api.github.com/users/gh-user/received_events",
"type": "User",
"site_admin": false
}
@ -109,7 +127,7 @@ export const validPR = {
"repo": {
"id": 1370858,
"node_id": "MDEwOlJlcG9zaXRvcnkxMzcwODU4",
"name": "optaplanner",
"name": "reponame",
"full_name": "fork/reponame",
"private": false,
"owner": {
@ -179,7 +197,7 @@ export const validPR = {
"ssh_url": "git@github.com:fork/reponame.git",
"clone_url": "https://github.com/fork/reponame.git",
"svn_url": "https://github.com/fork/reponame",
"homepage": "https://www.optaplanner.org",
"homepage": "https://www.reponame.org",
"size": 238339,
"stargazers_count": 2811,
"watchers_count": 2811,
@ -261,7 +279,7 @@ export const validPR = {
"repo": {
"id": 1370858,
"node_id": "MDEwOlJlcG9zaXRvcnkxMzcwODU4",
"name": "optaplanner",
"name": "reponame",
"full_name": "owner/reponame",
"private": false,
"owner": {
@ -331,7 +349,7 @@ export const validPR = {
"ssh_url": "git@github.com:owner/reponame.git",
"clone_url": "https://github.com/owner/reponame.git",
"svn_url": "https://github.com/owner/reponame",
"homepage": "https://www.optaplanner.org",
"homepage": "https://www.reponame.org",
"size": 238339,
"stargazers_count": 2811,
"watchers_count": 2811,
@ -420,22 +438,465 @@ export const validPR = {
"rebaseable": null,
"mergeable_state": "unknown",
"merged_by": {
"login": "radtriste",
"login": "that-s-a-user",
"id": 17157711,
"node_id": "MDQ6VXNlcjE3MTU3NzEx",
"avatar_url": "https://avatars.githubusercontent.com/u/17157711?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/radtriste",
"html_url": "https://github.com/radtriste",
"followers_url": "https://api.github.com/users/radtriste/followers",
"following_url": "https://api.github.com/users/radtriste/following{/other_user}",
"gists_url": "https://api.github.com/users/radtriste/gists{/gist_id}",
"starred_url": "https://api.github.com/users/radtriste/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/radtriste/subscriptions",
"organizations_url": "https://api.github.com/users/radtriste/orgs",
"repos_url": "https://api.github.com/users/radtriste/repos",
"events_url": "https://api.github.com/users/radtriste/events{/privacy}",
"received_events_url": "https://api.github.com/users/radtriste/received_events",
"url": "https://api.github.com/users/that-s-a-user",
"html_url": "https://github.com/that-s-a-user",
"followers_url": "https://api.github.com/users/that-s-a-user/followers",
"following_url": "https://api.github.com/users/that-s-a-user/following{/other_user}",
"gists_url": "https://api.github.com/users/that-s-a-user/gists{/gist_id}",
"starred_url": "https://api.github.com/users/that-s-a-user/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/that-s-a-user/subscriptions",
"organizations_url": "https://api.github.com/users/that-s-a-user/orgs",
"repos_url": "https://api.github.com/users/that-s-a-user/repos",
"events_url": "https://api.github.com/users/that-s-a-user/events{/privacy}",
"received_events_url": "https://api.github.com/users/that-s-a-user/received_events",
"type": "User",
"site_admin": false
},
"comments": 0,
"review_comments": 0,
"maintainer_can_modify": false,
"commits": 2,
"additions": 2,
"deletions": 2,
"changed_files": 2
};
export const notMergedPullRequestFixture = {
"url": "https://api.github.com/repos/owner/reponame/pulls/4444",
"id": 1137188271,
"node_id": "PR_kwDOABTq6s5DyB2v",
"html_url": "https://github.com/owner/reponame/pull/4444",
"diff_url": "https://github.com/owner/reponame/pull/4444.diff",
"patch_url": "https://github.com/owner/reponame/pull/4444.patch",
"issue_url": "https://api.github.com/repos/owner/reponame/issues/4444",
"number": 4444,
"state": "closed",
"locked": false,
"title": "PR Title",
"user": {
"login": "gh-user",
"id": 11995863,
"node_id": "MDQ6VXNlcjExOTk1ODYz",
"avatar_url": "https://avatars.githubusercontent.com/u/11995863?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/gh-user",
"html_url": "https://github.com/gh-user",
"followers_url": "https://api.github.com/users/gh-user/followers",
"following_url": "https://api.github.com/users/gh-user/following{/other_user}",
"gists_url": "https://api.github.com/users/gh-user/gists{/gist_id}",
"starred_url": "https://api.github.com/users/gh-user/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/gh-user/subscriptions",
"organizations_url": "https://api.github.com/users/gh-user/orgs",
"repos_url": "https://api.github.com/users/gh-user/repos",
"events_url": "https://api.github.com/users/gh-user/events{/privacy}",
"received_events_url": "https://api.github.com/users/gh-user/received_events",
"type": "User",
"site_admin": false
},
"body": "Please review and merge",
"created_at": "2022-11-28T08:43:09Z",
"updated_at": "2022-11-28T10:11:53Z",
"closed_at": "2022-11-28T10:11:52Z",
"merged_at": "2022-11-28T10:11:52Z",
"merge_commit_sha": "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc",
"assignee": null,
"assignees": [
],
"requested_reviewers": [
{
"login": "gh-user",
"id": 1422582,
"node_id": "MDQ6VXNlcjE0MjI1ODI=",
"avatar_url": "https://avatars.githubusercontent.com/u/1422582?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/gh-user",
"html_url": "https://github.com/gh-user",
"followers_url": "https://api.github.com/users/gh-user/followers",
"following_url": "https://api.github.com/users/gh-user/following{/other_user}",
"gists_url": "https://api.github.com/users/gh-user/gists{/gist_id}",
"starred_url": "https://api.github.com/users/gh-user/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/gh-user/subscriptions",
"organizations_url": "https://api.github.com/users/gh-user/orgs",
"repos_url": "https://api.github.com/users/gh-user/repos",
"events_url": "https://api.github.com/users/gh-user/events{/privacy}",
"received_events_url": "https://api.github.com/users/gh-user/received_events",
"type": "User",
"site_admin": false
}
],
"requested_teams": [
],
"labels": [
],
"milestone": null,
"draft": false,
"commits_url": "https://api.github.com/repos/owner/reponame/pulls/4444/commits",
"review_comments_url": "https://api.github.com/repos/owner/reponame/pulls/4444/comments",
"review_comment_url": "https://api.github.com/repos/owner/reponame/pulls/comments{/number}",
"comments_url": "https://api.github.com/repos/owner/reponame/issues/4444/comments",
"statuses_url": "https://api.github.com/repos/owner/reponame/statuses/91748965051fae1330ad58d15cf694e103267c87",
"head": {
"label": "kiegroup:bump-8.31.x-drools-8.31.0.Final",
"ref": "bump-8.31.x-drools-8.31.0.Final",
"sha": "91748965051fae1330ad58d15cf694e103267c87",
"user": {
"login": "kiegroup",
"id": 517980,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
"avatar_url": "https://avatars.githubusercontent.com/u/517980?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/kiegroup",
"html_url": "https://github.com/kiegroup",
"followers_url": "https://api.github.com/users/kiegroup/followers",
"following_url": "https://api.github.com/users/kiegroup/following{/other_user}",
"gists_url": "https://api.github.com/users/kiegroup/gists{/gist_id}",
"starred_url": "https://api.github.com/users/kiegroup/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/kiegroup/subscriptions",
"organizations_url": "https://api.github.com/users/kiegroup/orgs",
"repos_url": "https://api.github.com/users/kiegroup/repos",
"events_url": "https://api.github.com/users/kiegroup/events{/privacy}",
"received_events_url": "https://api.github.com/users/kiegroup/received_events",
"type": "Organization",
"site_admin": false
},
"repo": {
"id": 1370858,
"node_id": "MDEwOlJlcG9zaXRvcnkxMzcwODU4",
"name": "reponame",
"full_name": "fork/reponame",
"private": false,
"owner": {
"login": "kiegroup",
"id": 517980,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
"avatar_url": "https://avatars.githubusercontent.com/u/517980?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/kiegroup",
"html_url": "https://github.com/kiegroup",
"followers_url": "https://api.github.com/users/kiegroup/followers",
"following_url": "https://api.github.com/users/kiegroup/following{/other_user}",
"gists_url": "https://api.github.com/users/kiegroup/gists{/gist_id}",
"starred_url": "https://api.github.com/users/kiegroup/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/kiegroup/subscriptions",
"organizations_url": "https://api.github.com/users/kiegroup/orgs",
"repos_url": "https://api.github.com/users/kiegroup/repos",
"events_url": "https://api.github.com/users/kiegroup/events{/privacy}",
"received_events_url": "https://api.github.com/users/kiegroup/received_events",
"type": "Organization",
"site_admin": false
},
"html_url": "https://github.com/fork/reponame",
"description": "AI constraint solver in Java to optimize the vehicle routing problem, employee rostering, task assignment, maintenance scheduling, conference scheduling and other planning problems.",
"fork": false,
"url": "https://api.github.com/repos/fork/reponame",
"forks_url": "https://api.github.com/repos/fork/reponame/forks",
"keys_url": "https://api.github.com/repos/fork/reponame/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/fork/reponame/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/fork/reponame/teams",
"hooks_url": "https://api.github.com/repos/fork/reponame/hooks",
"issue_events_url": "https://api.github.com/repos/fork/reponame/issues/events{/number}",
"events_url": "https://api.github.com/repos/fork/reponame/events",
"assignees_url": "https://api.github.com/repos/fork/reponame/assignees{/user}",
"branches_url": "https://api.github.com/repos/fork/reponame/branches{/branch}",
"tags_url": "https://api.github.com/repos/fork/reponame/tags",
"blobs_url": "https://api.github.com/repos/fork/reponame/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/fork/reponame/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/fork/reponame/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/fork/reponame/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/fork/reponame/statuses/{sha}",
"languages_url": "https://api.github.com/repos/fork/reponame/languages",
"stargazers_url": "https://api.github.com/repos/fork/reponame/stargazers",
"contributors_url": "https://api.github.com/repos/fork/reponame/contributors",
"subscribers_url": "https://api.github.com/repos/fork/reponame/subscribers",
"subscription_url": "https://api.github.com/repos/fork/reponame/subscription",
"commits_url": "https://api.github.com/repos/fork/reponame/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/fork/reponame/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/fork/reponame/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/fork/reponame/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/fork/reponame/contents/{+path}",
"compare_url": "https://api.github.com/repos/fork/reponame/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/fork/reponame/merges",
"archive_url": "https://api.github.com/repos/fork/reponame/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/fork/reponame/downloads",
"issues_url": "https://api.github.com/repos/fork/reponame/issues{/number}",
"pulls_url": "https://api.github.com/repos/fork/reponame/pulls{/number}",
"milestones_url": "https://api.github.com/repos/fork/reponame/milestones{/number}",
"notifications_url": "https://api.github.com/repos/fork/reponame/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/fork/reponame/labels{/name}",
"releases_url": "https://api.github.com/repos/fork/reponame/releases{/id}",
"deployments_url": "https://api.github.com/repos/fork/reponame/deployments",
"created_at": "2011-02-15T19:38:23Z",
"updated_at": "2022-11-28T05:01:47Z",
"pushed_at": "2022-11-28T10:50:51Z",
"git_url": "git://github.com/fork/reponame.git",
"ssh_url": "git@github.com:fork/reponame.git",
"clone_url": "https://github.com/fork/reponame.git",
"svn_url": "https://github.com/fork/reponame",
"homepage": "https://www.reponame.org",
"size": 238339,
"stargazers_count": 2811,
"watchers_count": 2811,
"language": "Java",
"has_issues": false,
"has_projects": false,
"has_downloads": true,
"has_wiki": false,
"has_pages": false,
"has_discussions": false,
"forks_count": 878,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 30,
"license": {
"key": "apache-2.0",
"name": "Apache License 2.0",
"spdx_id": "Apache-2.0",
"url": "https://api.github.com/licenses/apache-2.0",
"node_id": "MDc6TGljZW5zZTI="
},
"allow_forking": true,
"is_template": false,
"web_commit_signoff_required": false,
"topics": [
"artificial-intelligence",
"branch-and-bound",
"constraint-programming",
"constraint-satisfaction-problem",
"constraint-solver",
"constraints",
"employee-rostering",
"java",
"local-search",
"mathematical-optimization",
"metaheuristics",
"optimization",
"rostering",
"scheduling",
"simulated-annealing",
"solver",
"tabu-search",
"traveling-salesman",
"traveling-salesman-problem",
"vehicle-routing-problem"
],
"visibility": "public",
"forks": 878,
"open_issues": 30,
"watchers": 2811,
"default_branch": "main"
}
},
"base": {
"label": "kiegroup:8.31.x",
"ref": "8.31.x",
"sha": "8cfc286765cb01c84a1d62c65519fa8032bfecbd",
"user": {
"login": "kiegroup",
"id": 517980,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
"avatar_url": "https://avatars.githubusercontent.com/u/517980?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/kiegroup",
"html_url": "https://github.com/kiegroup",
"followers_url": "https://api.github.com/users/kiegroup/followers",
"following_url": "https://api.github.com/users/kiegroup/following{/other_user}",
"gists_url": "https://api.github.com/users/kiegroup/gists{/gist_id}",
"starred_url": "https://api.github.com/users/kiegroup/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/kiegroup/subscriptions",
"organizations_url": "https://api.github.com/users/kiegroup/orgs",
"repos_url": "https://api.github.com/users/kiegroup/repos",
"events_url": "https://api.github.com/users/kiegroup/events{/privacy}",
"received_events_url": "https://api.github.com/users/kiegroup/received_events",
"type": "Organization",
"site_admin": false
},
"repo": {
"id": 1370858,
"node_id": "MDEwOlJlcG9zaXRvcnkxMzcwODU4",
"name": "reponame",
"full_name": "owner/reponame",
"private": false,
"owner": {
"login": "kiegroup",
"id": 517980,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
"avatar_url": "https://avatars.githubusercontent.com/u/517980?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/kiegroup",
"html_url": "https://github.com/kiegroup",
"followers_url": "https://api.github.com/users/kiegroup/followers",
"following_url": "https://api.github.com/users/kiegroup/following{/other_user}",
"gists_url": "https://api.github.com/users/kiegroup/gists{/gist_id}",
"starred_url": "https://api.github.com/users/kiegroup/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/kiegroup/subscriptions",
"organizations_url": "https://api.github.com/users/kiegroup/orgs",
"repos_url": "https://api.github.com/users/kiegroup/repos",
"events_url": "https://api.github.com/users/kiegroup/events{/privacy}",
"received_events_url": "https://api.github.com/users/kiegroup/received_events",
"type": "Organization",
"site_admin": false
},
"html_url": "https://github.com/owner/reponame",
"description": "AI constraint solver in Java to optimize the vehicle routing problem, employee rostering, task assignment, maintenance scheduling, conference scheduling and other planning problems.",
"fork": false,
"url": "https://api.github.com/repos/owner/reponame",
"forks_url": "https://api.github.com/repos/owner/reponame/forks",
"keys_url": "https://api.github.com/repos/owner/reponame/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/owner/reponame/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/owner/reponame/teams",
"hooks_url": "https://api.github.com/repos/owner/reponame/hooks",
"issue_events_url": "https://api.github.com/repos/owner/reponame/issues/events{/number}",
"events_url": "https://api.github.com/repos/owner/reponame/events",
"assignees_url": "https://api.github.com/repos/owner/reponame/assignees{/user}",
"branches_url": "https://api.github.com/repos/owner/reponame/branches{/branch}",
"tags_url": "https://api.github.com/repos/owner/reponame/tags",
"blobs_url": "https://api.github.com/repos/owner/reponame/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/owner/reponame/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/owner/reponame/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/owner/reponame/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/owner/reponame/statuses/{sha}",
"languages_url": "https://api.github.com/repos/owner/reponame/languages",
"stargazers_url": "https://api.github.com/repos/owner/reponame/stargazers",
"contributors_url": "https://api.github.com/repos/owner/reponame/contributors",
"subscribers_url": "https://api.github.com/repos/owner/reponame/subscribers",
"subscription_url": "https://api.github.com/repos/owner/reponame/subscription",
"commits_url": "https://api.github.com/repos/owner/reponame/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/owner/reponame/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/owner/reponame/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/owner/reponame/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/owner/reponame/contents/{+path}",
"compare_url": "https://api.github.com/repos/owner/reponame/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/owner/reponame/merges",
"archive_url": "https://api.github.com/repos/owner/reponame/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/owner/reponame/downloads",
"issues_url": "https://api.github.com/repos/owner/reponame/issues{/number}",
"pulls_url": "https://api.github.com/repos/owner/reponame/pulls{/number}",
"milestones_url": "https://api.github.com/repos/owner/reponame/milestones{/number}",
"notifications_url": "https://api.github.com/repos/owner/reponame/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/owner/reponame/labels{/name}",
"releases_url": "https://api.github.com/repos/owner/reponame/releases{/id}",
"deployments_url": "https://api.github.com/repos/owner/reponame/deployments",
"created_at": "2011-02-15T19:38:23Z",
"updated_at": "2022-11-28T05:01:47Z",
"pushed_at": "2022-11-28T10:50:51Z",
"git_url": "git://github.com/owner/reponame.git",
"ssh_url": "git@github.com:owner/reponame.git",
"clone_url": "https://github.com/owner/reponame.git",
"svn_url": "https://github.com/owner/reponame",
"homepage": "https://www.reponame.org",
"size": 238339,
"stargazers_count": 2811,
"watchers_count": 2811,
"language": "Java",
"has_issues": false,
"has_projects": false,
"has_downloads": true,
"has_wiki": false,
"has_pages": false,
"has_discussions": false,
"forks_count": 878,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 30,
"license": {
"key": "apache-2.0",
"name": "Apache License 2.0",
"spdx_id": "Apache-2.0",
"url": "https://api.github.com/licenses/apache-2.0",
"node_id": "MDc6TGljZW5zZTI="
},
"allow_forking": true,
"is_template": false,
"web_commit_signoff_required": false,
"topics": [
"artificial-intelligence",
"branch-and-bound",
"constraint-programming",
"constraint-satisfaction-problem",
"constraint-solver",
"constraints",
"employee-rostering",
"java",
"local-search",
"mathematical-optimization",
"metaheuristics",
"optimization",
"rostering",
"scheduling",
"simulated-annealing",
"solver",
"tabu-search",
"traveling-salesman",
"traveling-salesman-problem",
"vehicle-routing-problem"
],
"visibility": "public",
"forks": 878,
"open_issues": 30,
"watchers": 2811,
"default_branch": "main"
}
},
"_links": {
"self": {
"href": "https://api.github.com/repos/owner/reponame/pulls/4444"
},
"html": {
"href": "https://github.com/owner/reponame/pull/4444"
},
"issue": {
"href": "https://api.github.com/repos/owner/reponame/issues/4444"
},
"comments": {
"href": "https://api.github.com/repos/owner/reponame/issues/4444/comments"
},
"review_comments": {
"href": "https://api.github.com/repos/owner/reponame/pulls/4444/comments"
},
"review_comment": {
"href": "https://api.github.com/repos/owner/reponame/pulls/comments{/number}"
},
"commits": {
"href": "https://api.github.com/repos/owner/reponame/pulls/4444/commits"
},
"statuses": {
"href": "https://api.github.com/repos/owner/reponame/statuses/91748965051fae1330ad58d15cf694e103267c87"
}
},
"author_association": "CONTRIBUTOR",
"auto_merge": null,
"active_lock_reason": null,
"merged": null,
"mergeable": null,
"rebaseable": null,
"mergeable_state": "unknown",
"merged_by": {
"login": "that-s-a-user",
"id": 17157711,
"node_id": "MDQ6VXNlcjE3MTU3NzEx",
"avatar_url": "https://avatars.githubusercontent.com/u/17157711?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/that-s-a-user",
"html_url": "https://github.com/that-s-a-user",
"followers_url": "https://api.github.com/users/that-s-a-user/followers",
"following_url": "https://api.github.com/users/that-s-a-user/following{/other_user}",
"gists_url": "https://api.github.com/users/that-s-a-user/gists{/gist_id}",
"starred_url": "https://api.github.com/users/that-s-a-user/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/that-s-a-user/subscriptions",
"organizations_url": "https://api.github.com/users/that-s-a-user/orgs",
"repos_url": "https://api.github.com/users/that-s-a-user/repos",
"events_url": "https://api.github.com/users/that-s-a-user/events{/privacy}",
"received_events_url": "https://api.github.com/users/that-s-a-user/received_events",
"type": "User",
"site_admin": false
},

View file

@ -1,11 +1,11 @@
import LoggerServiceFactory from "@gb/service/logger/logger-service-factory";
import LoggerServiceFactory from "@bp/service/logger/logger-service-factory";
import { Moctokit } from "@kie/mock-github";
import { targetOwner, repo, pullRequestNumber, validPR, invalidPullRequestNumber } from "./moctokit-data";
import { targetOwner, repo, mergedPullRequestFixture, notMergedPullRequestFixture, notFoundPullRequestNumber } from "./moctokit-data";
const logger = LoggerServiceFactory.getLogger();
export const setupMoctokit = (): Moctokit => {
logger.debug("Setting up moctokit..");
logger.debug("Setting up moctokit.");
const mock = new Moctokit();
@ -16,18 +16,36 @@ export const setupMoctokit = (): Moctokit => {
.get({
owner: targetOwner,
repo: repo,
pull_number: pullRequestNumber
pull_number: mergedPullRequestFixture.number
})
.reply({
status: 200,
data: validPR
data: mergedPullRequestFixture
});
mock.rest.pulls
.get({
owner: targetOwner,
repo: repo,
pull_number: notMergedPullRequestFixture.number
})
.reply({
status: 200,
data: notMergedPullRequestFixture
});
mock.rest.pulls
.create()
.reply({
status: 201,
data: validPR
data: mergedPullRequestFixture
});
mock.rest.pulls
.requestReviewers()
.reply({
status: 201,
data: mergedPullRequestFixture
});
@ -36,7 +54,7 @@ export const setupMoctokit = (): Moctokit => {
.get({
owner: targetOwner,
repo: repo,
pull_number: invalidPullRequestNumber
pull_number: notFoundPullRequestNumber
})
.reply({
status: 404,

17
test/support/utils.ts Normal file
View file

@ -0,0 +1,17 @@
import * as core from "@actions/core";
export const addProcessArgs = (args: string[]) => {
process.argv = [...process.argv, ...args];
};
export const resetProcessArgs = () => {
process.argv = ["node", "backporting"];
};
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const spyGetInput = (obj: any) => {
const mock = jest.spyOn(core, "getInput");
mock.mockImplementation((name: string) : string => {
return obj[name];
});
};