fix(reference): verify station coverage and rollback inputs

This commit is contained in:
jb
2026-09-19 09:53:46 -04:00
parent 24660edb09
commit 7601365621
5 changed files with 69 additions and 8 deletions
+19
View File
@@ -321,6 +321,25 @@ describe('fixture reference compiler', () => {
} finally { await rm(root, { recursive: true, force: true }); }
});
test('rejects incomplete PREVIOUS count metadata before rollback', async () => {
const { root, sources } = await fixtureDirectory();
const directory = join(root, 'reference');
try {
const first = await new ReferenceCompiler({ directory, profile: 'fixture', sources: fixtureSources(sources) }).compile();
expect(first.status).toBe('success');
if (first.status !== 'success') throw new Error('initial fixture build did not publish');
await writeFile(join(sources, 'reference-data.json'), `${await readFile(join(sources, 'reference-data.json'), 'utf8')}\n`);
const second = await new ReferenceCompiler({ directory, profile: 'fixture', sources: fixtureSources(sources) }).compile();
expect(second.status).toBe('success');
const manifest = await readReferenceManifest(directory);
if (!manifest.previous) throw new Error('fixture build did not retain PREVIOUS');
const malformed = { ...manifest, previous: { ...manifest.previous, counts: Object.fromEntries(Object.entries(manifest.previous.counts).filter(([key]) => key !== 'stations')) } };
await writeFile(join(directory, 'manifest.json'), `${JSON.stringify(malformed)}\n`);
await expect(new ReferenceCompiler({ directory, profile: 'fixture', sources: fixtureSources(sources) }).rollback()).rejects.toThrow(/missing count metadata/);
expect((await readReferenceManifest(directory)).active?.version).toBe(manifest.active?.version);
} finally { await rm(root, { recursive: true, force: true }); }
});
test('recovers a validated orphan database after manifest publication crash', async () => {
const { root, sources } = await fixtureDirectory();
const directory = join(root, 'reference');