From 2621fe1e2573a9b09acd9117eee238774311e377 Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 2 Jul 2026 20:46:59 -0700 Subject: [PATCH 1/2] Add tests for verifyPeerReview CLI skeleton (test.yml) Adds a trimmed tests/verifyPeerReviewCli.test.ts that exercises CLI argument parsing against the current no-op skeleton, plus the test npm script and CI workflow to run it. GitHubUtils stubbing will be reintroduced in Phase 3 once the real logic lands. Co-authored-by: Cursor --- .github/workflows/test.yml | 39 +++++++++++++++++++++++++++++ package.json | 3 ++- tests/verifyPeerReviewCli.test.ts | 41 +++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/test.yml create mode 100644 tests/verifyPeerReviewCli.test.ts diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..33833f0 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,39 @@ +name: Test + +on: + pull_request: + types: [opened, synchronize] + paths: + - "**/*.[tj]s" + - "**/*.?[tj]s" + - "tsconfig.json" + - "package.json" + - "package-lock.json" + - ".nvmrc" + - ".github/workflows/test.yml" + +jobs: + test: + runs-on: blacksmith-2vcpu-ubuntu-2404 + steps: + - name: Checkout + # 6.0.3 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 + + # v6.1.0 + - name: Setup Node + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f + with: + node-version-file: .nvmrc + cache: npm + cache-dependency-path: package-lock.json + + - name: Install npm packages + run: npm ci + + - name: Run unit tests + run: npm test + + - name: Tell people how to run the failing check + if: failure() + run: echo "::error::The test check failed! To run it locally, run \`npm ci && npm test\` from the GitHub-Actions repo root." diff --git a/package.json b/package.json index 395e804..942beb9 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,8 @@ "private": true, "type": "module", "scripts": { - "verify-peer-review": "tsx scripts/verifyPeerReview.ts" + "verify-peer-review": "tsx scripts/verifyPeerReview.ts", + "test": "tsx --test tests/*.test.ts" }, "dependencies": { "expensify-common": "2.0.189" diff --git a/tests/verifyPeerReviewCli.test.ts b/tests/verifyPeerReviewCli.test.ts new file mode 100644 index 0000000..68497c6 --- /dev/null +++ b/tests/verifyPeerReviewCli.test.ts @@ -0,0 +1,41 @@ +import assert from "node:assert/strict"; +import { afterEach, beforeEach, describe, it } from "node:test"; +import VerifyPeerReview from "../scripts/verifyPeerReview"; + +const ORIGINAL_ARGV = process.argv; + +describe("main CLI parsing", () => { + let originalExit: typeof process.exit; + + beforeEach(() => { + process.argv = ["tsx", "scripts/verifyPeerReview.ts"]; + originalExit = process.exit.bind(process); + process.exit = (code?: string | number | null) => { + throw new Error(`exit ${code ?? 0}`); + }; + }); + + afterEach(() => { + process.argv = ORIGINAL_ARGV; + process.exit = originalExit; + }); + + it("parses required pull request CLI arguments", async () => { + process.argv.push( + "--owner", + "Expensify", + "--repo", + "Auth", + "--pull-request-number", + "21136", + "--base-ref", + "main", + ); + + await assert.doesNotReject(() => VerifyPeerReview.main()); + }); + + it("fails when required arguments are missing", async () => { + await assert.rejects(() => VerifyPeerReview.main(), /exit 1/); + }); +}); From 12f258295cd750b1d85b68133766171c5d6ae81a Mon Sep 17 00:00:00 2001 From: rory Date: Thu, 2 Jul 2026 22:06:19 -0700 Subject: [PATCH 2/2] Run oxfmt --- .github/workflows/test.yml | 14 +++---- tests/verifyPeerReviewCli.test.ts | 66 ++++++++++++++----------------- 2 files changed, 36 insertions(+), 44 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 33833f0..fb9cdeb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,13 +4,13 @@ on: pull_request: types: [opened, synchronize] paths: - - "**/*.[tj]s" - - "**/*.?[tj]s" - - "tsconfig.json" - - "package.json" - - "package-lock.json" - - ".nvmrc" - - ".github/workflows/test.yml" + - '**/*.[tj]s' + - '**/*.?[tj]s' + - 'tsconfig.json' + - 'package.json' + - 'package-lock.json' + - '.nvmrc' + - '.github/workflows/test.yml' jobs: test: diff --git a/tests/verifyPeerReviewCli.test.ts b/tests/verifyPeerReviewCli.test.ts index 68497c6..b906c13 100644 --- a/tests/verifyPeerReviewCli.test.ts +++ b/tests/verifyPeerReviewCli.test.ts @@ -1,41 +1,33 @@ -import assert from "node:assert/strict"; -import { afterEach, beforeEach, describe, it } from "node:test"; -import VerifyPeerReview from "../scripts/verifyPeerReview"; +import assert from 'node:assert/strict'; +import {afterEach, beforeEach, describe, it} from 'node:test'; + +import VerifyPeerReview from '../scripts/verifyPeerReview'; const ORIGINAL_ARGV = process.argv; -describe("main CLI parsing", () => { - let originalExit: typeof process.exit; - - beforeEach(() => { - process.argv = ["tsx", "scripts/verifyPeerReview.ts"]; - originalExit = process.exit.bind(process); - process.exit = (code?: string | number | null) => { - throw new Error(`exit ${code ?? 0}`); - }; - }); - - afterEach(() => { - process.argv = ORIGINAL_ARGV; - process.exit = originalExit; - }); - - it("parses required pull request CLI arguments", async () => { - process.argv.push( - "--owner", - "Expensify", - "--repo", - "Auth", - "--pull-request-number", - "21136", - "--base-ref", - "main", - ); - - await assert.doesNotReject(() => VerifyPeerReview.main()); - }); - - it("fails when required arguments are missing", async () => { - await assert.rejects(() => VerifyPeerReview.main(), /exit 1/); - }); +describe('main CLI parsing', () => { + let originalExit: typeof process.exit; + + beforeEach(() => { + process.argv = ['tsx', 'scripts/verifyPeerReview.ts']; + originalExit = process.exit.bind(process); + process.exit = (code?: string | number | null) => { + throw new Error(`exit ${code ?? 0}`); + }; + }); + + afterEach(() => { + process.argv = ORIGINAL_ARGV; + process.exit = originalExit; + }); + + it('parses required pull request CLI arguments', async () => { + process.argv.push('--owner', 'Expensify', '--repo', 'Auth', '--pull-request-number', '21136', '--base-ref', 'main'); + + await assert.doesNotReject(() => VerifyPeerReview.main()); + }); + + it('fails when required arguments are missing', async () => { + await assert.rejects(() => VerifyPeerReview.main(), /exit 1/); + }); });