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/) } })