81 lines
2.2 KiB
Go
81 lines
2.2 KiB
Go
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")
|
|
}
|
|
}
|