package store import ( "encoding/json" "testing" "time" "git.ipao.vip/rogee/go-sip/internal/testfixture" ) func TestExecutionDuplicateAfterDeadlineRestoresOriginalReceipt(t *testing.T) { s := testStore(t) raw, err := testfixture.Execute() if err != nil { t.Fatal(err) } key := testfixture.InboundKey("tenant-demo-key") first, err := s.IngestCommand(raw, key) if err != nil { t.Fatal(err) } records, err := s.ClaimOutbox(1) if err != nil || len(records) != 1 { t.Fatalf("receipt: %v", err) } if err := s.MarkOutboxPublished(records[0].ID); err != nil { t.Fatal(err) } s.now = func() time.Time { return time.Date(2100, 1, 1, 0, 0, 0, 0, time.UTC) } again, err := s.IngestCommand(raw, key) if err != nil || !again.Duplicate || again.ExecutionID != first.ExecutionID { t.Fatalf("late duplicate: %+v %v", again, err) } records, err = s.ClaimOutbox(1) if err != nil || len(records) != 1 || records[0].EventID != first.CommandID+"-result" { t.Fatal("late duplicate lost original response") } var count int if err := s.DB().QueryRow(`SELECT COUNT(*) FROM tasks`).Scan(&count); err != nil { t.Fatal(err) } if count != 1 { t.Fatal("late duplicate created another task") } } func TestNewExpiredExecutionIsPermanentRejection(t *testing.T) { s := testStore(t) s.now = func() time.Time { return time.Date(2100, 1, 1, 0, 0, 0, 0, time.UTC) } raw, err := testfixture.Execute() if err != nil { t.Fatal(err) } if _, err := s.IngestCommand(raw, testfixture.InboundKey("tenant-demo-key")); err != nil { t.Fatalf("expiry must persist a rejection instead of being requeued: %v", err) } var body []byte if err := s.DB().QueryRow(`SELECT body FROM outbox`).Scan(&body); err != nil { t.Fatal(err) } var event struct { Payload struct { Status string `json:"status"` Reason string `json:"reason_code"` } `json:"payload"` } if err := json.Unmarshal(body, &event); err != nil { t.Fatal(err) } if event.Payload.Status != "rejected" || event.Payload.Reason != "expired" { t.Fatal("expired execution lacks durable rejection") } var count int if err := s.DB().QueryRow(`SELECT COUNT(*) FROM tasks`).Scan(&count); err != nil { t.Fatal(err) } if count != 0 { t.Fatal("expired command admitted") } }