From a29890345af880263c6bc60992642dd819ee21bb Mon Sep 17 00:00:00 2001 From: Derek Cormier Date: Wed, 8 Jan 2025 17:34:47 -0800 Subject: [PATCH] test: add coverage for auto merge feature --- e2e/e2e.spec.ts | 28 ++++++++++++++++++++++------ e2e/stubs/fake-github.ts | 29 ++++++++++++++++++++++++----- 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/e2e/e2e.spec.ts b/e2e/e2e.spec.ts index fdf0964..f15bf41 100644 --- a/e2e/e2e.spec.ts +++ b/e2e/e2e.spec.ts @@ -468,8 +468,8 @@ describe("e2e tests", () => { ); // Pull request was created with the corrects params - expect(fakeGitHub.pullRequestHandler).toHaveBeenCalledTimes(1); - const request = fakeGitHub.pullRequestHandler.mock + expect(fakeGitHub.createPullRequestHandler).toHaveBeenCalledTimes(1); + const request = fakeGitHub.createPullRequestHandler.mock .calls[0][0] as CompletedRequest; expect(request.path).toEqual( expect.stringMatching(/bazelbuild\/bazel-central-registry/) @@ -491,6 +491,22 @@ describe("e2e tests", () => { `https://github.com/${testOrg}/${repo}/releases/tag/${tag}` ) ); + + // Pull request was updated to enable auto merge + expect(fakeGitHub.updatePullRequestHandler).toHaveBeenCalledTimes(1); + const updateRequest = fakeGitHub.updatePullRequestHandler.mock + .calls[0][0] as CompletedRequest; + expect(updateRequest.path).toEqual( + expect.stringMatching( + /repos\/bazelbuild\/bazel-central-registry\/pulls\/\d+/ + ) + ); + const updateBody = (await updateRequest.body.getJson()) as any; + expect(updateBody).toEqual( + expect.objectContaining({ + allow_auto_merge: true, + }) + ); }); test("happy path with multiple modules", async () => { @@ -536,8 +552,8 @@ describe("e2e tests", () => { expect(messages.length).toEqual(0); // One pull requests was created with the corrects params - expect(fakeGitHub.pullRequestHandler).toHaveBeenCalledTimes(1); - let request = fakeGitHub.pullRequestHandler.mock + expect(fakeGitHub.createPullRequestHandler).toHaveBeenCalledTimes(1); + let request = fakeGitHub.createPullRequestHandler.mock .calls[0][0] as CompletedRequest; expect(request.path).toEqual( expect.stringMatching(/bazelbuild\/bazel-central-registry/) @@ -644,8 +660,8 @@ describe("e2e tests", () => { expect(response.status).toEqual(200); // Pull request points to releaser's BCR fork - expect(fakeGitHub.pullRequestHandler).toHaveBeenCalled(); - const request = fakeGitHub.pullRequestHandler.mock + expect(fakeGitHub.createPullRequestHandler).toHaveBeenCalled(); + const request = fakeGitHub.createPullRequestHandler.mock .calls[0][0] as CompletedRequest; const body = (await request.body.getJson()) as any; expect(body).toEqual( diff --git a/e2e/stubs/fake-github.ts b/e2e/stubs/fake-github.ts index 140ebe3..2928eb1 100644 --- a/e2e/stubs/fake-github.ts +++ b/e2e/stubs/fake-github.ts @@ -1,6 +1,7 @@ import { User } from "@octokit/webhooks-types"; import { randomUUID } from "crypto"; import * as mockttp from "mockttp"; +import { randomInt } from "node:crypto"; import url from "node:url"; import { StubbedServer } from "./stubbed-server"; @@ -18,7 +19,8 @@ export class FakeGitHub implements StubbedServer { { owner: string; repo: string; sourceOwner?: string; sourceRepo?: string } >(); - public readonly pullRequestHandler = jest.fn(); + public readonly createPullRequestHandler = jest.fn(); + public readonly updatePullRequestHandler = jest.fn(); public readonly installationTokenHandler = jest.fn(); public constructor() { @@ -38,6 +40,7 @@ export class FakeGitHub implements StubbedServer { this.setupGetOwnedReposHandler(), this.setupGetRepoHandler(), this.setupCreatePullHandler(), + this.setupUpdatePullHandler(), this.setupAppHandler(), ]); } @@ -45,7 +48,8 @@ export class FakeGitHub implements StubbedServer { public async reset(): Promise { this.server.reset(); this.clearMockedData(); - this.pullRequestHandler.mockReset(); + this.createPullRequestHandler.mockReset(); + this.updatePullRequestHandler.mockReset(); this.installationTokenHandler.mockReset(); await this.setupHandlers(); } @@ -262,16 +266,31 @@ export class FakeGitHub implements StubbedServer { } private async setupCreatePullHandler(): Promise { - this.pullRequestHandler.mockImplementation((request) => { + this.createPullRequestHandler.mockImplementation((request) => { return { statusCode: 201, - body: "{}", + json: { + number: randomInt(100), + }, }; }); await this.server .forPost("/repos/bazelbuild/bazel-central-registry/pulls") - .thenCallback((request) => this.pullRequestHandler(request)); + .thenCallback((request) => this.createPullRequestHandler(request)); + } + + private async setupUpdatePullHandler(): Promise { + this.updatePullRequestHandler.mockImplementation((request) => { + return { + statusCode: 200, + json: {}, + }; + }); + + await this.server + .forPatch(/\/repos\/bazelbuild\/bazel-central-registry\/pulls\/\d+$/) + .thenCallback((request) => this.updatePullRequestHandler(request)); } private async setupAppHandler(): Promise {