45 lines
2.7 KiB
JavaScript
45 lines
2.7 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import test from 'node:test'
|
|
import {desktopNativeEvidence} from './fixtures/desktop-native-migration-evidence.mjs'
|
|
const {assertDesktopCreationEvidence}=await import(process.env.SAFE_MIGRATION_MODULE_URL || './safe-production-migrate.mjs')
|
|
|
|
test('native desktop migration validates task leases and both tombstone columns',()=>{
|
|
assert.doesNotThrow(()=>assertDesktopCreationEvidence(desktopNativeEvidence()))
|
|
})
|
|
test('native desktop migration rejects absent or nonnullable tombstones',()=>{
|
|
for(const table of ['desktop_workspace_projects','detail_generator_projects']) {
|
|
const missing=desktopNativeEvidence();missing.columns=missing.columns.filter(row=>row.table_name!==table)
|
|
assert.throws(()=>assertDesktopCreationEvidence(missing),/column mismatch/)
|
|
const wrong=desktopNativeEvidence();wrong.columns.find(row=>row.table_name===table).is_nullable='NO'
|
|
assert.throws(()=>assertDesktopCreationEvidence(wrong),/column mismatch/)
|
|
}
|
|
})
|
|
test('native desktop migration requires exact task foreign keys and delete actions',()=>{
|
|
for(const index of [0,1,2])for(const mutation of [row=>row.referenced_table='other',row=>row.delete_action='a',row=>row.convalidated=false]) {
|
|
const evidence=desktopNativeEvidence();mutation(evidence.constraints[index])
|
|
assert.throws(()=>assertDesktopCreationEvidence(evidence),/foreign key/)
|
|
}
|
|
})
|
|
test('native desktop migration rejects weakened status or recovery-mode checks',()=>{
|
|
for(const column of ['status','lease_mode']) {
|
|
const evidence=desktopNativeEvidence();evidence.constraints.find(row=>row.constraint_name.endsWith(column+'_check')).expression=`${column} IS NOT NULL`
|
|
assert.throws(()=>assertDesktopCreationEvidence(evidence),/constraint expression/)
|
|
}
|
|
})
|
|
test('native desktop migration requires validated primary key and exact query indexes',()=>{
|
|
const badPk=desktopNativeEvidence();badPk.constraints.find(row=>row.contype==='p').columns=['owner_id']
|
|
assert.throws(()=>assertDesktopCreationEvidence(badPk),/primary key/)
|
|
for(let i=0;i<3;i++) {
|
|
const badIndex=desktopNativeEvidence();badIndex.indexes[i].indisvalid=false
|
|
assert.throws(()=>assertDesktopCreationEvidence(badIndex),/index/)
|
|
const reversed=desktopNativeEvidence();reversed.indexes[i].indexdef=reversed.indexes[i].indexdef.replace('USING btree','USING hash')
|
|
assert.throws(()=>assertDesktopCreationEvidence(reversed),/index/)
|
|
}
|
|
})
|
|
test('native desktop migration rejects changed durable task defaults',()=>{
|
|
for(const column of ['dispatched','revision','created_at','updated_at']) {
|
|
const evidence=desktopNativeEvidence();evidence.columns.find(row=>row.column_name===column).column_default='unexpected'
|
|
assert.throws(()=>assertDesktopCreationEvidence(evidence),/default mismatch/)
|
|
}
|
|
})
|