31 lines
1.5 KiB
TypeScript
31 lines
1.5 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import { readFile } from 'node:fs/promises';
|
|
import { resolve } from 'node:path';
|
|
import test from 'node:test';
|
|
|
|
async function source(relativePath: string): Promise<string> {
|
|
return readFile(resolve(process.cwd(), 'src', relativePath), 'utf8');
|
|
}
|
|
|
|
test('D5.2 versions every catalog item and keeps versions append-only', async () => {
|
|
const migration = await source(
|
|
'database/migrations/1787335200000-phase-d5-2-finding-catalog-administration.ts',
|
|
);
|
|
assert.match(migration, /CREATE TABLE finding_catalog_item_versions/);
|
|
assert.match(migration, /UNIQUE \(item_id, revision\)/);
|
|
assert.match(migration, /jsonb_typeof\(snapshot\) = 'object'/);
|
|
assert.match(migration, /INSERT INTO finding_catalog_item_versions/);
|
|
assert.match(migration, /FROM finding_catalog_items item/);
|
|
assert.match(migration, /GRANT SELECT, INSERT ON TABLE finding_catalog_item_versions/);
|
|
assert.match(migration, /REVOKE UPDATE, DELETE ON TABLE finding_catalog_item_versions/);
|
|
});
|
|
|
|
test('D5.2 catalog administration captures audit and immutable revisions', async () => {
|
|
const service = await source('inspection-findings/finding-catalog.service.ts');
|
|
assert.match(service, /item\.revision \+= 1/);
|
|
assert.match(service, /captureVersion\(manager, created, principal\)/);
|
|
assert.match(service, /captureVersion\(manager, updated, principal\)/);
|
|
assert.match(service, /FINDING_CATEGORY_CREATED/);
|
|
assert.match(service, /FINDING_CATALOG_ITEM_UPDATED/);
|
|
});
|