Files
go-sip/internal/store/execute_deadline_test.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")
}
}