返回 DeepSeek-Reasonix
recovery_policy_test.go
根目录 / internal / extension / recovery_policy_test.go
1 package extension
2
3 import "testing"
4
5 func TestDecideResumeIrreversibleNeverClean(t *testing.T) {
6 s := NewReceiptStore()
7 s.Record(EffectReceipt{ID: "p1", Class: Irreversible, Generation: 7, CompensationStatus: "rolled_back"})
8 d := DecideResume(s, 7)
9 if !d.AllowResume {
10 t.Fatal("must allow resume with awareness")
11 }
12 if d.CleanRollback {
13 t.Fatal("irreversible must not claim clean rollback")
14 }
15 if !d.HasIrreversible {
16 t.Fatal("expected irreversible flag")
17 }
18 // Store must not keep a fake rolled_back status.
19 r, ok := s.Get("p1")
20 if !ok || r.CompensationStatus == "rolled_back" {
21 t.Fatalf("receipt = %+v", r)
22 }
23 }
24
25 func TestDecideResumeCleanWhenEmpty(t *testing.T) {
26 s := NewReceiptStore()
27 d := DecideResume(s, 1)
28 if !d.AllowResume || !d.CleanRollback {
29 t.Fatalf("decision = %+v", d)
30 }
31 }
32
33 func TestDecideResumeCompensatableFailed(t *testing.T) {
34 s := NewReceiptStore()
35 s.Record(EffectReceipt{ID: "c1", Class: Compensatable, Generation: 2, CompensationStatus: "failed"})
36 d := DecideResume(s, 2)
37 if d.CleanRollback {
38 t.Fatal("failed compensation must not be clean")
39 }
40 if len(d.Blocking) == 0 {
41 t.Fatal("expected blocking id")
42 }
43 }
44
44 lines GO