20 lines
1.4 KiB
JavaScript
20 lines
1.4 KiB
JavaScript
import test from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
import { assertDetailGeneratorEvidence } from './safe-production-migrate.mjs'
|
|
|
|
test('release refuses a missing generator schema instead of enabling a broken feature', () => {
|
|
assert.throws(() => assertDetailGeneratorEvidence({ columns: [] }), /detail_generator_projects.id/)
|
|
})
|
|
test('release refuses incorrectly typed private state/lease fields', () => {
|
|
const columns = []
|
|
for (const [table, names] of Object.entries({
|
|
detail_generator_projects: ['id', 'owner_id', 'document', 'revision'],
|
|
detail_generator_assets: ['id', 'project_id', 'owner_id', 'storage_key', 'byte_size', 'mime_type'],
|
|
detail_generator_jobs: ['id', 'project_id', 'owner_id', 'status', 'idempotency_key', 'checkpoint', 'project_revision', 'lease_token', 'lease_expires_at'],
|
|
detail_generator_brand_profiles: ['id', 'name', 'profile', 'revision'],
|
|
})) for (const name of names) columns.push({ table_name: table, column_name: name, data_type: ['document','checkpoint','profile'].includes(name) ? 'jsonb' : ['revision','project_revision','byte_size'].includes(name) ? 'integer' : name === 'lease_expires_at' ? 'timestamp with time zone' : 'text' })
|
|
assert.doesNotThrow(() => assertDetailGeneratorEvidence({ columns }))
|
|
columns.find(row => row.column_name === 'lease_expires_at').data_type = 'text'
|
|
assert.throws(() => assertDetailGeneratorEvidence({ columns }), /lease_expires_at/)
|
|
})
|