Files
go-sip/internal/store/rejected_data_failure_test.go
T

61 lines
2.3 KiB
Go

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)
}
}