package postgres import ( "context" "knowledge-governance/internal/governance" "testing" "time" ) func TestContractDispatchAttachFailureLeavesNoQueueOrBusinessJob(t *testing.T) { store, pool := newIdentityStore(t) ctx := context.Background() now := time.Now().UTC() if _, err := pool.Exec(ctx, `CREATE FUNCTION fail_dispatch_attach() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN IF NEW.queue_job_id <> '' THEN RAISE EXCEPTION 'injected attach failure'; END IF; RETURN NEW; END $$; CREATE TRIGGER fail_attach BEFORE UPDATE ON library_jobs FOR EACH ROW EXECUTE FUNCTION fail_dispatch_attach()`); err != nil { t.Fatal(err) } job := governance.LibraryJob{ID: "atomic-dispatch", Scope: "internal", Kind: governance.LibraryJobSync, RequestDigest: "request", IdempotencyKey: "intent-atomic", TargetSnapshotID: "snapshot"} if _, _, err := store.CreateLibraryDispatch(ctx, job, governance.SyncStages(), false, now); err == nil { t.Fatal("injected attach did not fail") } var business, queue int if err := pool.QueryRow(ctx, `SELECT (SELECT count(*) FROM library_jobs),(SELECT count(*) FROM jobs)`).Scan(&business, &queue); err != nil { t.Fatal(err) } if business != 0 || queue != 0 { t.Fatalf("partial dispatch escaped transaction: business=%d queue=%d", business, queue) } if _, err := pool.Exec(ctx, `DROP TRIGGER fail_attach ON library_jobs`); err != nil { t.Fatal(err) } first, reused, err := store.CreateLibraryDispatch(ctx, job, governance.SyncStages(), false, now) if err != nil || reused || first.QueueJobID == "" { t.Fatalf("dispatch after failure: %+v %v %v", first, reused, err) } replay, reused, err := store.CreateLibraryDispatch(ctx, job, governance.SyncStages(), false, now) if err != nil || !reused || replay.QueueJobID != first.QueueJobID { t.Fatalf("dispatch replay: %+v %v %v", replay, reused, err) } }