Files
pbakaus_impeccable/tests/test-suites.test.mjs
T
Paul BakausandGitHub 6496f49a1e Fix skill workflow regression coverage (#783)
Clarify launcher fallback and completed documentation handoffs; separate bounded protocol checkpoints from opt-in browser-backed completion diagnostics. Correct fixture containment, target syntax, and artifact assertions. AI assistance: Codex, under maintainer direction.
2026-09-08 08:41:54 -07:00

77 lines
2.9 KiB
JavaScript

import { describe, it } from 'node:test';
import assert from 'node:assert/strict';
import {
DEFAULT_SUITES,
OPT_IN_SUITES,
SUITES,
expandSuites,
findTestFiles,
matchesSuiteTriggers,
suiteFiles,
} from '../scripts/test-suites.mjs';
describe('test suite registry', () => {
it('separates protocol checkpoints from opt-in browser-backed completion', () => {
assert.deepEqual(suiteFiles(['skill-behavior']), ['tests/skill-behavior/scenarios.test.mjs']);
assert.ok(OPT_IN_SUITES.includes('skill-workflow'));
assert.equal(SUITES['skill-workflow'].needsPlaywright, true);
assert.ok(suiteFiles(['skill-workflow']).includes('tests/skill-workflow/full-build.test.mjs'));
assert.equal(DEFAULT_SUITES.includes('skill-workflow'), false);
});
it('assigns every test file to a default or opt-in suite', () => {
const allDiscovered = findTestFiles();
const allRegistered = new Set(suiteFiles([...DEFAULT_SUITES, ...OPT_IN_SUITES]));
const missing = allDiscovered.filter((file) => !allRegistered.has(file));
assert.deepEqual(
missing,
[],
'new test files must be added to scripts/test-suites.mjs, either in a default suite or an opt-in suite',
);
});
it('keeps default local suites free of duplicate test files', () => {
const files = suiteFiles(DEFAULT_SUITES);
const duplicates = files.filter((file, index) => files.indexOf(file) !== index);
assert.deepEqual(duplicates, []);
});
it('keeps opt-in suites out of the default alias', () => {
const expanded = expandSuites(['default']);
for (const suite of expanded) {
assert.equal(SUITES[suite].optIn, undefined, `${suite} should not be opt-in`);
}
});
it('selects every suite when one of its own test files changes', () => {
// Change-based CI (ci-test-plan.mjs) picks suites via matchesSuiteTriggers.
// A test file whose edits select no suite, or only a suite that does not
// run it, is a silent CI gap; the generated own-file triggers close it.
for (const [name, suite] of Object.entries(SUITES)) {
for (const file of suiteFiles([name])) {
assert.equal(
matchesSuiteTriggers(name, [file]),
true,
`editing ${file} must select suite "${name}"`,
);
}
}
});
it('never lets a test file trigger only suites that do not run it', () => {
const allSuiteNames = Object.keys(SUITES);
for (const file of findTestFiles()) {
const triggered = allSuiteNames.filter((name) => matchesSuiteTriggers(name, [file]));
const runsIn = allSuiteNames.filter((name) => suiteFiles([name]).includes(file));
const useful = triggered.filter((name) => runsIn.includes(name));
assert.ok(
useful.length > 0,
`${file} triggers [${triggered.join(', ')}] but runs in [${runsIn.join(', ')}]; ` +
'at least one triggered suite must actually run it',
);
}
});
});