39 lines
1.6 KiB
TypeScript
39 lines
1.6 KiB
TypeScript
import { readFile } from 'node:fs/promises';
|
|
import { resolve } from 'node:path';
|
|
import { describe, expect, it } from 'vitest';
|
|
import { databaseMigrations } from '../../server/postgres/migration-catalog';
|
|
|
|
const migrationPath = resolve(
|
|
import.meta.dirname,
|
|
'..',
|
|
'..',
|
|
'server',
|
|
'postgres',
|
|
'migrations',
|
|
'007_unified_result_read_model.sql'
|
|
);
|
|
|
|
describe('PostgreSQL unified-result read-model migration', () => {
|
|
it('adds independent outcome and technical execution dimensions', async () => {
|
|
const sql = await readFile(migrationPath, 'utf8');
|
|
expect(databaseMigrations.find(migration => migration.version === '007')).toMatchObject({
|
|
version: '007',
|
|
name: 'unified-result-read-model'
|
|
});
|
|
expect(sql).toContain('ADD COLUMN outcome_normalized text');
|
|
expect(sql).toContain('ADD COLUMN technical_execution_state text');
|
|
expect(sql).toContain('assessor_occurrences_outcome_check');
|
|
expect(sql).toContain('assessor_occurrences_execution_state_check');
|
|
expect(sql).not.toMatch(/DROP\s+(TABLE|COLUMN)/i);
|
|
});
|
|
|
|
it('persists namespaced, profile-versioned multi-category assignments', async () => {
|
|
const sql = await readFile(migrationPath, 'utf8');
|
|
expect(sql).toContain('CREATE TABLE assessor_result_categories');
|
|
expect(sql).toContain('CREATE TABLE assessor_finding_occurrence_categories');
|
|
expect(sql).toContain('PRIMARY KEY (namespace, category_code, source_profile_id, source_profile_version)');
|
|
expect(sql).toContain('FOREIGN KEY (namespace, category_code, source_profile_id, source_profile_version)');
|
|
expect(sql).toContain('assessor_occurrence_categories_filter_idx');
|
|
});
|
|
});
|