49 lines
1.4 KiB
TypeScript
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);
|
|
}
|
|
});
|
|
});
|