From bec0b0629c343fb2f880f0b201ed024cd85d4f09 Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Mon, 17 Aug 2026 21:47:02 -0400 Subject: [PATCH] ci/github-script/check-target-branch: add policy tests Tests reflect status quo. They establish baseline for later policy changes. Some test cases are obvious bugs (e.g. mass rebuild checks are skipped on staging-nixos), others may also be questionable. Assisted-by: Codex gpt-5.6-sol medium (cherry picked from commit e1aa8c4d16e92029f39c3f92998f49cdf7be95cc) --- .../check-target-branch-policy.test.ts | 203 ++++++++++++++++++ ci/github-script/package.json | 3 +- 2 files changed, 205 insertions(+), 1 deletion(-) create mode 100644 ci/github-script/check-target-branch-policy.test.ts diff --git a/ci/github-script/check-target-branch-policy.test.ts b/ci/github-script/check-target-branch-policy.test.ts new file mode 100644 index 000000000000..7329fc3f6d3a --- /dev/null +++ b/ci/github-script/check-target-branch-policy.test.ts @@ -0,0 +1,203 @@ +const assert = require('node:assert/strict') +const test = require('node:test') +const { decideTargetBranchReview } = require('./check-target-branch-policy.ts') + +type DecisionFacts = { + base: string + head: string + maxRebuildCount: number + rebuildsAllTests: boolean + isExemptKernelUpdate: boolean + isExemptHomeAssistantUpdate: boolean +} + +type Decision = + | 'mass-rebuild' + | 'nixos-rebuild' + | 'possible-mass-rebuild' + | 'skip-development-merge' + | 'dismiss' + +const defaults: DecisionFacts = { + base: 'master', + head: 'topic-branch', + maxRebuildCount: 0, + rebuildsAllTests: false, + isExemptKernelUpdate: false, + isExemptHomeAssistantUpdate: false, +} + +const cases: Array<{ + name: string + facts: Partial + expected: Decision +}> = [ + { + name: 'allows fewer than 500 rebuilds on master', + facts: { maxRebuildCount: 499 }, + expected: 'dismiss', + }, + { + name: 'flags 500 rebuilds on master as a possible mass rebuild', + facts: { maxRebuildCount: 500 }, + expected: 'possible-mass-rebuild', + }, + { + name: 'flags 999 rebuilds on master as a possible mass rebuild', + facts: { maxRebuildCount: 999 }, + expected: 'possible-mass-rebuild', + }, + { + name: 'flags 1000 rebuilds on master as a mass rebuild', + facts: { maxRebuildCount: 1000 }, + expected: 'mass-rebuild', + }, + { + name: 'does not check mass rebuilds on staging-nixos', + facts: { base: 'staging-nixos', maxRebuildCount: 24_000 }, + expected: 'dismiss', + }, + { + name: 'does not check mass rebuilds on a release staging-nixos branch', + facts: { base: 'staging-nixos-26.05', maxRebuildCount: 1000 }, + expected: 'dismiss', + }, + { + name: 'allows mass rebuilds on staging', + facts: { base: 'staging', maxRebuildCount: 1000 }, + expected: 'dismiss', + }, + { + name: 'flags a mass rebuild on a release branch', + facts: { base: 'release-26.05', maxRebuildCount: 1000 }, + expected: 'mass-rebuild', + }, + { + name: 'flags NixOS test rebuilds on master', + facts: { rebuildsAllTests: true }, + expected: 'nixos-rebuild', + }, + { + name: 'flags NixOS test rebuilds on a release branch', + facts: { base: 'release-26.05', rebuildsAllTests: true }, + expected: 'nixos-rebuild', + }, + { + name: 'allows NixOS test rebuilds on staging-nixos', + facts: { base: 'staging-nixos', rebuildsAllTests: true }, + expected: 'dismiss', + }, + { + name: 'does not flag a possible mass rebuild when staging-nixos rebuilds all NixOS tests', + facts: { + base: 'staging-nixos', + maxRebuildCount: 500, + rebuildsAllTests: true, + }, + expected: 'dismiss', + }, + { + name: 'does not check possible mass rebuilds on staging-nixos', + facts: { base: 'staging-nixos', maxRebuildCount: 500 }, + expected: 'dismiss', + }, + { + name: 'skips staging into master', + facts: { + head: 'staging', + maxRebuildCount: 24_000, + }, + expected: 'skip-development-merge', + }, + { + name: 'skips staging-nixos into master', + facts: { + head: 'staging-nixos', + maxRebuildCount: 24_000, + }, + expected: 'skip-development-merge', + }, + { + name: 'skips master into staging-nixos', + facts: { + base: 'staging-nixos', + head: 'master', + maxRebuildCount: 24_000, + }, + expected: 'skip-development-merge', + }, + { + name: 'skips staging into staging-nixos', + facts: { + base: 'staging-nixos', + head: 'staging', + maxRebuildCount: 24_000, + }, + expected: 'skip-development-merge', + }, + { + name: 'skips release staging-nixos into its release branch', + facts: { + base: 'release-26.05', + head: 'staging-nixos-26.05', + maxRebuildCount: 24_000, + }, + expected: 'skip-development-merge', + }, + { + name: 'skips a release branch into its staging-nixos branch', + facts: { + base: 'staging-nixos-26.05', + head: 'release-26.05', + maxRebuildCount: 24_000, + }, + expected: 'skip-development-merge', + }, + { + name: 'skips release staging into its staging-nixos branch', + facts: { + base: 'staging-nixos-26.05', + head: 'staging-26.05', + maxRebuildCount: 24_000, + }, + expected: 'skip-development-merge', + }, + { + name: 'kernel exemption suppresses a possible mass rebuild', + facts: { maxRebuildCount: 999, isExemptKernelUpdate: true }, + expected: 'dismiss', + }, + { + name: 'kernel exemption suppresses a definite mass rebuild', + facts: { maxRebuildCount: 1000, isExemptKernelUpdate: true }, + expected: 'dismiss', + }, + { + name: 'kernel exemption suppresses a NixOS test rebuild', + facts: { rebuildsAllTests: true, isExemptKernelUpdate: true }, + expected: 'dismiss', + }, + { + name: 'Home Assistant exemption suppresses a mass rebuild', + facts: { + maxRebuildCount: 1500, + isExemptHomeAssistantUpdate: true, + }, + expected: 'dismiss', + }, + { + name: 'Home Assistant exemption does not suppress a NixOS test rebuild', + facts: { + maxRebuildCount: 1500, + rebuildsAllTests: true, + isExemptHomeAssistantUpdate: true, + }, + expected: 'nixos-rebuild', + }, +] + +for (const { name, facts, expected } of cases) { + test(name, () => { + assert.equal(decideTargetBranchReview({ ...defaults, ...facts }), expected) + }) +} diff --git a/ci/github-script/package.json b/ci/github-script/package.json index e495941ca4cc..84555f8dc372 100644 --- a/ci/github-script/package.json +++ b/ci/github-script/package.json @@ -2,7 +2,8 @@ "private": true, "scripts": { "typecheck": "tsc --build", - "test": "npm run typecheck" + "testsuite": "node --test", + "test": "npm run typecheck && npm run testsuite" }, "//": [ "Keep `@actions/core` and `@actions/github` in sync with",