Phase 1 of golden-install-parity redesign (epic #2264). Consolidates buildParityManifest + exclusion constants into tests/helpers/install-shared.cjs (fixes realRoot divergence), adds anti-divergence guard, corrects 12 stale golden fixtures to portable values. Closes #2266.
98 lines
4.4 KiB
JavaScript
98 lines
4.4 KiB
JavaScript
'use strict';
|
|
|
|
/**
|
|
* golden-parity-single-source.test.cjs — anti-divergence guard (#2266).
|
|
*
|
|
* tests/golden-install-parity.test.cjs and scripts/gen-golden-install-parity-zcode.cjs
|
|
* used to each carry their OWN inline copy of buildParityManifest plus its 4
|
|
* exclusion constants (VOLATILE_FILES, HOOK_CONFIG_FILES,
|
|
* HOOK_CONFIG_RELATIVE_PATHS, EXCLUDED_PREFIXES). The two copies drifted —
|
|
* the generator's copy was missing the realpath/`<HOME>` normalization the
|
|
* test harness's copy had — and shipped broken fixtures three times (#2086,
|
|
* #2095, #2100). Phase 1 of the golden-install-parity redesign (#2266)
|
|
* consolidated both call sites onto a single canonical implementation in
|
|
* tests/helpers/install-shared.cjs.
|
|
*
|
|
* This guard (mirrors the ADR-2121 anti-divergence pattern) enforces that
|
|
* consolidation stays consolidated:
|
|
* 1. install-shared.cjs actually exports a working buildParityManifest +
|
|
* the 4 exclusion constants with the expected shapes.
|
|
* 2. Neither downstream consumer re-declares its own inline copy of the
|
|
* builder function or the exclusion constants.
|
|
*/
|
|
|
|
const { test } = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
const fs = require('node:fs');
|
|
const path = require('node:path');
|
|
|
|
const ROOT = path.join(__dirname, '..');
|
|
|
|
test('install-shared.cjs exports the canonical buildParityManifest + exclusion constants (#2266)', () => {
|
|
const installShared = require('./helpers/install-shared.cjs');
|
|
|
|
assert.equal(
|
|
typeof installShared.buildParityManifest,
|
|
'function',
|
|
'install-shared.cjs must export buildParityManifest as the single source of truth'
|
|
);
|
|
|
|
assert.ok(
|
|
installShared.VOLATILE_FILES instanceof Set,
|
|
'VOLATILE_FILES must be a Set'
|
|
);
|
|
assert.ok(
|
|
installShared.HOOK_CONFIG_FILES instanceof Set,
|
|
'HOOK_CONFIG_FILES must be a Set'
|
|
);
|
|
assert.ok(
|
|
installShared.HOOK_CONFIG_RELATIVE_PATHS instanceof Set,
|
|
'HOOK_CONFIG_RELATIVE_PATHS must be a Set'
|
|
);
|
|
assert.ok(
|
|
Array.isArray(installShared.EXCLUDED_PREFIXES),
|
|
'EXCLUDED_PREFIXES must be an array'
|
|
);
|
|
assert.ok(
|
|
installShared.EXCLUDED_PREFIXES.includes('gsd-core/bin/lib/'),
|
|
"EXCLUDED_PREFIXES must include 'gsd-core/bin/lib/' (compiled runtime artifacts, build-environment-dependent)"
|
|
);
|
|
});
|
|
|
|
// The anti-divergence check below reads the two downstream .cjs source files
|
|
// as plain text to prove they no longer re-declare the builder/constants
|
|
// inline — the runtime-contract-under-test IS the source text (whether a
|
|
// second inline copy exists), not behavior a require() could exercise.
|
|
//
|
|
// ALL FIVE identifiers are guarded, not just buildParityManifest + VOLATILE_FILES:
|
|
// the drift that shipped broken fixtures was a MISSING exclusion-constant entry
|
|
// (#2100 = generator's HOOK_CONFIG_FILES copy lacked settings.local.json; #2095 =
|
|
// kimi's HOOK_CONFIG_RELATIVE_PATHS entry), so a re-declared HOOK_CONFIG_FILES /
|
|
// HOOK_CONFIG_RELATIVE_PATHS / EXCLUDED_PREFIXES is exactly the failure class this
|
|
// guard exists to prevent — checking only two of four would leave that gap open.
|
|
const FORBIDDEN_INLINE = [
|
|
{ label: 'buildParityManifest', re: /function\s+buildParityManifest/ },
|
|
{ label: 'VOLATILE_FILES', re: /const\s+VOLATILE_FILES\s*=\s*new\s+Set/ },
|
|
{ label: 'HOOK_CONFIG_FILES', re: /const\s+HOOK_CONFIG_FILES\s*=\s*new\s+Set/ },
|
|
{ label: 'HOOK_CONFIG_RELATIVE_PATHS', re: /const\s+HOOK_CONFIG_RELATIVE_PATHS\s*=\s*new\s+Set/ },
|
|
{ label: 'EXCLUDED_PREFIXES', re: /const\s+EXCLUDED_PREFIXES\s*=\s*\[/ },
|
|
];
|
|
|
|
const CONSUMERS = [
|
|
{ name: 'tests/golden-install-parity.test.cjs', rel: ['tests', 'golden-install-parity.test.cjs'], from: './helpers/install-shared.cjs' },
|
|
{ name: 'scripts/gen-golden-install-parity-zcode.cjs', rel: ['scripts', 'gen-golden-install-parity-zcode.cjs'], from: 'tests/helpers/install-shared.cjs' },
|
|
];
|
|
|
|
for (const consumer of CONSUMERS) {
|
|
test(`${consumer.name} does not re-declare an inline buildParityManifest or any exclusion constant (#2266)`, () => {
|
|
// allow-test-rule: source text is the product for this anti-divergence check, see #2266
|
|
const content = fs.readFileSync(path.join(ROOT, ...consumer.rel), 'utf8');
|
|
for (const { label, re } of FORBIDDEN_INLINE) {
|
|
assert.ok(
|
|
!re.test(content),
|
|
`${consumer.name} must import ${label} from ${consumer.from}, not re-declare it inline`
|
|
);
|
|
}
|
|
});
|
|
}
|