package store import ( "errors" "git.ipao.vip/rogee/go-sip/internal/configread" "os" "path/filepath" "testing" ) func TestRejectionEvidenceFailureCreatesNoFeedback(t *testing.T) { path := filepath.Join(t.TempDir(), "state.db") s, err := Open(path) if err != nil { t.Fatal(err) } defer s.Close() if err := s.SaveSnapshot(currentStoreSnapshot(t)); err != nil { t.Fatal(err) } if err := s.ApplyDiscoverySnapshot(currentDispatcherID, []configread.DiscoveredTask{{TaskID: "task-asr", TenantID: 1001, TaskRevision: 1, Status: "running"}}); err != nil { t.Fatal(err) } if err := os.Mkdir(filepath.Join(filepath.Dir(path), "rejected-data"), 0755); err != nil { t.Fatal(err) } raw := []byte(`{"event_id":"failed-original","event_type":"task.control","dispatcher_id":"` + currentDispatcherID + `","tenant_id":1001,"payload":{"task_id":"task-asr","action":"resume"}}`) if err := s.RejectData(currentDispatcherID, raw, errors.New("issued_at required")); err == nil { t.Fatal("evidence failure swallowed") } events, err := s.ListPendingOutbox(currentDispatcherID) if err != nil || len(events) != 0 { t.Fatalf("feedback committed without original evidence: %v %v", events, err) } } func TestRejectionOutboxFailurePreservesOriginalWithoutFalseFeedback(t *testing.T) { path := filepath.Join(t.TempDir(), "state.db") s, err := Open(path) if err != nil { t.Fatal(err) } defer s.Close() if err := s.SaveSnapshot(currentStoreSnapshot(t)); err != nil { t.Fatal(err) } if err := s.ApplyDiscoverySnapshot(currentDispatcherID, []configread.DiscoveredTask{{TaskID: "task-asr", TenantID: 1001, TaskRevision: 1, Status: "running"}}); err != nil { t.Fatal(err) } if _, err := s.db.Exec(`CREATE TRIGGER reject_outbox_write BEFORE INSERT ON dispatcher_outbox BEGIN SELECT RAISE(FAIL,'injected outbox failure'); END`); err != nil { t.Fatal(err) } raw := []byte(`{"event_id":"failed-original","event_type":"task.control","dispatcher_id":"` + currentDispatcherID + `","tenant_id":1001,"payload":{"task_id":"task-asr","action":"resume"}}`) if err := s.RejectData(currentDispatcherID, raw, errors.New("issued_at required")); err == nil { t.Fatal("outbox failure swallowed") } files, err := filepath.Glob(filepath.Join(filepath.Dir(path), "rejected-data", "*.json")) if err != nil || len(files) != 1 { t.Fatalf("original lost on outbox failure: %v %v", files, err) } }