51 lines
1.8 KiB
TypeScript
51 lines
1.8 KiB
TypeScript
import { existsSync, readFileSync } from 'node:fs';
|
|
import { join } from 'node:path';
|
|
|
|
const migrationPath = join(
|
|
process.cwd(),
|
|
'prisma',
|
|
'migrations',
|
|
'20260708000000_v27_enterprise_collab_governance',
|
|
'migration.sql',
|
|
);
|
|
|
|
function readMigrationSql() {
|
|
if (!existsSync(migrationPath)) {
|
|
throw new Error(`Missing V2.7 migration: ${migrationPath}`);
|
|
}
|
|
return readFileSync(migrationPath, 'utf8');
|
|
}
|
|
|
|
describe('V2.7 enterprise collaboration schema migration', () => {
|
|
it('creates notification records for assignment, mention, risk alert, and overdue events', () => {
|
|
const sql = readMigrationSql();
|
|
|
|
expect(sql).toMatch(/CREATE TABLE "notifications"/);
|
|
expect(sql).toMatch(/"type" TEXT NOT NULL/);
|
|
expect(sql).toMatch(/"recipient_id" TEXT NOT NULL/);
|
|
expect(sql).toMatch(/"read_at" TIMESTAMP\(3\)/);
|
|
expect(sql).toMatch(/CREATE INDEX "notifications_recipient_read_created_idx"/);
|
|
});
|
|
|
|
it('creates polymorphic comments with mention metadata', () => {
|
|
const sql = readMigrationSql();
|
|
|
|
expect(sql).toMatch(/CREATE TABLE "comments"/);
|
|
expect(sql).toMatch(/"entity_type" TEXT NOT NULL/);
|
|
expect(sql).toMatch(/"entity_id" TEXT NOT NULL/);
|
|
expect(sql).toMatch(/"mentioned_member_ids" JSONB NOT NULL DEFAULT '\[\]'/);
|
|
expect(sql).toMatch(/CREATE INDEX "comments_entity_created_idx"/);
|
|
});
|
|
|
|
it('adds audit logs and governance dictionaries with soft-delete support', () => {
|
|
const sql = readMigrationSql();
|
|
|
|
expect(sql).toMatch(/CREATE TABLE "audit_logs"/);
|
|
expect(sql).toMatch(/"before" JSONB NOT NULL DEFAULT '\{\}'/);
|
|
expect(sql).toMatch(/"after" JSONB NOT NULL DEFAULT '\{\}'/);
|
|
expect(sql).toMatch(/CREATE TABLE "governance_dictionaries"/);
|
|
expect(sql).toMatch(/"deleted_at" TIMESTAMP\(3\)/);
|
|
expect(sql).toMatch(/CONSTRAINT "governance_dictionaries_scope_kind_name_key" UNIQUE/);
|
|
});
|
|
});
|