manicanldes-backend/test/migration-history.spec.ts

49 lines
1.4 KiB
TypeScript

import {
mkdtempSync,
mkdirSync,
writeFileSync,
unlinkSync,
rmdirSync,
} from 'node:fs';
import { join, resolve } from 'node:path';
import { createHash } from 'node:crypto';
import { execFileSync } from 'node:child_process';
describe('migration history protection', () => {
it('detects edits to a recorded migration', () => {
mkdirSync('.tmp', { recursive: true });
const root = mkdtempSync(resolve('.tmp/migration-policy-'));
const name = '20260909000000_example';
const directory = join(root, 'prisma', 'migrations', name);
mkdirSync(directory, { recursive: true });
const file = join(directory, 'migration.sql');
const manifest = join(root, 'prisma', 'migration-checksums.json');
const sql = 'SELECT 1;\n';
writeFileSync(file, sql);
writeFileSync(
manifest,
JSON.stringify({
[name]: createHash('sha256').update(sql).digest('hex'),
}),
);
const run = () =>
execFileSync(
process.execPath,
['scripts/check-migrations.mjs', '--root=' + root],
{ stdio: 'pipe' },
);
try {
expect(run().toString()).toContain('Verified 1');
writeFileSync(file, 'SELECT 2;\n');
expect(run).toThrow();
} finally {
unlinkSync(file);
unlinkSync(manifest);
rmdirSync(directory);
rmdirSync(join(root, 'prisma', 'migrations'));
rmdirSync(join(root, 'prisma'));
rmdirSync(root);
}
});
});