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 e1aa8c4d16)
This commit is contained in:
Ihar Hrachyshka
2026-08-17 21:47:02 -04:00
committed by github-actions[bot]
parent 7c2242edbc
commit bec0b0629c
2 changed files with 205 additions and 1 deletions

View File

@@ -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<DecisionFacts>
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)
})
}

View File

@@ -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",