← back to Filemaker Mcp

scripts/test-dup-ledger.mjs

38 lines

// Idempotency-ledger proof for the duplicate-master prevention (DTD verdict C, 2026-08-12).
// Exercises the ACTUAL committed ledger functions against Postgres — NO FileMaker writes —
// to prove: a re-run inside FM's index-lag window reuses the recorded record instead of
// minting a twin, a concurrent second creator is blocked, and a failed create is retryable.
//   node scripts/test-dup-ledger.mjs
import { readFileSync } from 'node:fs';
import { fileURLToPath } from 'node:url'; import { dirname, join } from 'node:path';
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
for (const l of readFileSync(join(ROOT, '.env'), 'utf8').split('\n')) { const m=l.match(/^([A-Z0-9_]+)=(.*)$/); if(m&&!process.env[m[1]])process.env[m[1]]=m[2].replace(/^['"]|['"]$/g,''); }
import { execFileSync } from 'node:child_process';
const PSQL = process.env.PSQL_BIN || '/opt/homebrew/opt/postgresql@14/bin/psql';
const { _internals } = await import('../lib/wallpaper.js');
const { ledgerInit, ledgerLookup, ledgerClaim, ledgerRecord, ledgerRelease } = _internals;
const K='ZZTESTPREVENT001', K2='ZZTESTPREVENT002';
let pass=0, fail=0; const ok=(c,m)=>{ if(c){pass++;console.log('  ✓',m);} else {fail++;console.log('  ✗ FAIL',m);} };
const clean=()=>{ try{ execFileSync(PSQL,['dw_unified','-tAc',`DELETE FROM wallpaper_master_ledger WHERE norm_key IN ('${K}','${K2}')`]); }catch{} };
ledgerInit(); clean();
console.log('[1] fresh key: nothing recorded');
ok(ledgerLookup(K)==='', 'ledgerLookup empty before any create');
console.log('[2] first creator wins the claim, a concurrent 2nd is blocked (no twin)');
ok(ledgerClaim(K,'ZZ','TESTPREVENT001')===true, 'first ledgerClaim wins');
ok(ledgerClaim(K,'ZZ','TESTPREVENT001')===false, 'immediate 2nd ledgerClaim BLOCKED (fresh, not stale) -> no duplicate create');
ok(ledgerLookup(K)==='', 'lookup still empty (create not finished -> no id yet)');
console.log('[3] create finished: record id -> a re-run REUSES it instead of minting a twin');
ledgerRecord(K,'999999','TESTMFR','TESTVID');
ok(ledgerLookup(K)==='999999', 'ledgerLookup returns recorded fm_record_id (re-run skips create)');
ok(ledgerClaim(K,'ZZ','TESTPREVENT001')===false, 'claim still blocked after record (recorded key is not reclaimable)');
console.log('[4] failed create is retryable: release the un-recorded claim');
ok(ledgerClaim(K2,'ZZ','TESTPREVENT002')===true, 'claim K2');
ledgerRelease(K2);
ok(ledgerLookup(K2)==='', 'K2 released');
ok(ledgerClaim(K2,'ZZ','TESTPREVENT002')===true, 'K2 reclaimable after release (failed create can retry)');
ledgerRelease(K);
ok(ledgerLookup(K)==='999999', 'ledgerRelease is a NO-OP on a recorded key (never drops a real master)');
clean();
console.log(`\n=== ${fail? 'FAIL':'ALL PASS'} (${pass} passed, ${fail} failed) ===`);
process.exit(fail?1:0);