test(carriers): pin scanner edge cases and share one registry run

This commit is contained in:
montjeffrey
2026-10-08 15:46:49 +00:00
parent 4d8e3cfac0
commit 3c8042fb33
+45 -18
View File
@@ -13,6 +13,17 @@ function validator() {
return require(SCRIPT_PATH);
}
let realRun = null;
function realRegistryRun() {
if (!realRun) {
const result = childProcess.spawnSync(process.execPath, [SCRIPT_PATH, '--json'], {
cwd: REPO_ROOT, encoding: 'utf8', timeout: 120_000,
});
realRun = { status: result.status, stderr: result.stderr, receipt: JSON.parse(result.stdout) };
}
return realRun;
}
function plantSkillScript(root, source) {
write(root, 'skills/ecc-guide/scripts/tool.js', source);
}
@@ -21,17 +32,6 @@ function specifiersOf(failures) {
return failures.map(failure => failure.specifier);
}
test('the real registry closes: every planned script resolves inside its carrier', () => {
const result = validator().validate();
assert.equal(result.status, 'success');
assert.deepEqual(result.failures, []);
assert.equal(result.layouts.length, 5);
assert.deepEqual(result.profiles, ['lean@1', 'full@1']);
assert.ok(result.scriptCount > 0, 'expected planned JavaScript files to inspect');
assert.ok(result.resolvedCount > 0, 'expected at least one resolved relative specifier');
assert.ok(result.plannedFileCount > result.scriptCount);
});
test('a planted require that leaves the carrier tree fails with its specifier', () => withFixture(root => {
const escape = '../../../../../scripts/lib/context-profile-support';
plantSkillScript(root, `'use strict';\n\nconst support = require('${escape}');\n\nmodule.exports = { support };\n`);
@@ -69,20 +69,47 @@ test('a require shape quoted inside a string literal is not a dependency', () =>
}));
test('--json emits a machine-readable receipt and exits zero on a clean registry', () => {
const result = childProcess.spawnSync(process.execPath, [SCRIPT_PATH, '--json'], {
cwd: REPO_ROOT, encoding: 'utf8', timeout: 120_000,
});
assert.equal(result.status, 0, result.stderr);
const receipt = JSON.parse(result.stdout);
assert.equal(receipt.status, 'success');
const { status, stderr, receipt } = realRegistryRun();
assert.equal(status, 0, stderr);
assert.equal(receipt.schemaVersion, 'ecc.carrier-closure.v1');
assert.equal(receipt.projectionCount, receipt.layouts.length * receipt.profiles.length);
assert.deepEqual(receipt.failures, []);
assert.ok(Array.isArray(receipt.warnings));
assert.ok(Number.isInteger(receipt.scriptCount));
assert.equal(receipt.loadSmoke, 'deferred');
});
test('the real registry closes: every planned script resolves inside its carrier', () => {
const { receipt } = realRegistryRun();
assert.equal(receipt.status, 'success');
assert.deepEqual(receipt.failures, []);
assert.equal(receipt.layouts.length, 5);
assert.deepEqual(receipt.profiles, ['lean@1', 'full@1']);
assert.ok(receipt.scriptCount > 0, 'expected planned JavaScript files to inspect');
assert.ok(receipt.resolvedCount > 0, 'expected at least one resolved relative specifier');
assert.ok(receipt.plannedFileCount > receipt.scriptCount);
});
const SCANNER_CASES = [
['division before a require', "const r = a / b; require('./after-division');", ['./after-division']],
['regex holding a quote', "const re = /it's/; require('./after-regex');", ['./after-regex']],
['regex holding a slash in a class', "const re = /[/]/g; require('./after-class');", ['./after-class']],
['regex after return', "function f() { return /x/.test(y); } require('./after-return');", ['./after-return']],
['division after a closing paren', "const v = (a) / 2 / 3; require('./after-paren');", ['./after-paren']],
['object braces inside an interpolation', "const s = `a ${ {k: 1}.k } b`; require('./after-template');", ['./after-template']],
['require text inside a template', "const s = `require('./fake')`;", []],
['require inside an interpolation', "const s = `${require('./in-interpolation')}`;", ['./in-interpolation']],
['block comment', "/* require('./commented') */ require('./real');", ['./real']],
['multi-line import', "import {\n a,\n b\n} from\n './multi';", ['./multi']],
['re-export', 'export * from "./reexport.js";', ['./reexport.js']],
['path.join from __dirname', "require(path.join(__dirname, '..', 'lib', 'x.js'));", ['./../lib/x.js']],
];
for (const [label, source, expected] of SCANNER_CASES) {
test(`scanner: ${label}`, () => {
assert.deepEqual(validator().extractReferences(source).specifiers.sort(), [...expected].sort());
});
}
test('unknown flags are rejected', () => {
const result = childProcess.spawnSync(process.execPath, [SCRIPT_PATH, '--write'], {
cwd: REPO_ROOT, encoding: 'utf8', timeout: 120_000,