mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-11 21:57:14 +03:00
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.
77 lines
2.9 KiB
JavaScript
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',
|
|
);
|
|
}
|
|
});
|
|
});
|