返回 DeepSeek-Reasonix
store_cancel_test.go
根目录 / internal / sessioninbox / store_cancel_test.go
1 package sessioninbox
2
3 import (
4 "errors"
5 "os"
6 "path/filepath"
7 "testing"
8 )
9
10 func TestDiscardPendingItemsOwnedResultReturnsOnlyWithdrawnIDs(t *testing.T) {
11 dir := t.TempDir()
12 session := filepath.Join(dir, "s.jsonl")
13 _ = os.WriteFile(session, []byte("{}\n"), 0o644)
14 s, err := Open(session, Limits{})
15 if err != nil {
16 t.Fatal(err)
17 }
18 defer s.Close()
19 queued, _ := s.Enqueue(EnqueueRequest{Envelope: PromptEnvelope{SubmitText: "queued"}, Source: "desktop"})
20 accepted, _ := s.Enqueue(EnqueueRequest{Envelope: PromptEnvelope{SubmitText: "accepted"}, Source: "desktop"})
21 consumed, _ := s.Enqueue(EnqueueRequest{Envelope: PromptEnvelope{SubmitText: "consumed"}, Source: "desktop"})
22 foreign, _ := s.Enqueue(EnqueueRequest{Envelope: PromptEnvelope{SubmitText: "foreign"}, Source: "bot"})
23 if err := s.SetState(accepted.ItemID, StateSteerAccepted, ""); err != nil {
24 t.Fatal(err)
25 }
26 if err := s.SetState(consumed.ItemID, StateSteerConsumed, ""); err != nil {
27 t.Fatal(err)
28 }
29
30 discarded, err := s.DiscardPendingItemsOwnedResult(
31 []string{queued.ItemID, accepted.ItemID, consumed.ItemID, foreign.ItemID, "missing"},
32 "desktop",
33 )
34 if err != nil {
35 t.Fatal(err)
36 }
37 if len(discarded) != 2 || discarded[0] != queued.ItemID || discarded[1] != accepted.ItemID {
38 t.Fatalf("discarded ids = %v", discarded)
39 }
40 items := s.Snapshot().Items
41 if len(items) != 2 || items[0].ID != consumed.ItemID || items[1].ID != foreign.ItemID {
42 t.Fatalf("remaining items = %+v", items)
43 }
44 }
45
46 func TestMarkSteerConsumedCompareAndTransition(t *testing.T) {
47 dir := t.TempDir()
48 session := filepath.Join(dir, "s.jsonl")
49 _ = os.WriteFile(session, []byte("{}\n"), 0o644)
50 s, err := Open(session, Limits{})
51 if err != nil {
52 t.Fatal(err)
53 }
54 defer s.Close()
55 rec, _ := s.Enqueue(EnqueueRequest{Envelope: PromptEnvelope{SubmitText: "steer"}})
56 if err := s.MarkSteerConsumed(rec.ItemID); !errors.Is(err, ErrInvalidState) {
57 t.Fatalf("queued transition error = %v, want ErrInvalidState", err)
58 }
59 if err := s.SetState(rec.ItemID, StateSteerAccepted, ""); err != nil {
60 t.Fatal(err)
61 }
62 if err := s.MarkSteerConsumed(rec.ItemID); err != nil {
63 t.Fatal(err)
64 }
65 if err := s.MarkSteerConsumed(rec.ItemID); err != nil {
66 t.Fatalf("idempotent transition failed: %v", err)
67 }
68 if got := s.Snapshot().Items[0].State; got != StateSteerConsumed {
69 t.Fatalf("state = %q, want %q", got, StateSteerConsumed)
70 }
71 }
72
73 func TestDeletePendingOrAcceptedItemLinearizesWithSteerConsumption(t *testing.T) {
74 newAccepted := func(t *testing.T) (*Store, string) {
75 t.Helper()
76 s, err := Open(filepath.Join(t.TempDir(), "s.jsonl"), Limits{})
77 if err != nil {
78 t.Fatal(err)
79 }
80 rec, err := s.Enqueue(EnqueueRequest{Envelope: PromptEnvelope{SubmitText: "steer"}})
81 if err != nil {
82 s.Close()
83 t.Fatal(err)
84 }
85 if err := s.SetState(rec.ItemID, StateSteerAccepted, ""); err != nil {
86 s.Close()
87 t.Fatal(err)
88 }
89 return s, rec.ItemID
90 }
91
92 t.Run("delete wins", func(t *testing.T) {
93 s, id := newAccepted(t)
94 defer s.Close()
95 if err := s.DeletePendingOrAcceptedItem(id); err != nil {
96 t.Fatal(err)
97 }
98 if err := s.MarkSteerConsumed(id); !errors.Is(err, ErrNotFound) {
99 t.Fatalf("consume after delete = %v, want ErrNotFound", err)
100 }
101 })
102
103 t.Run("consume wins", func(t *testing.T) {
104 s, id := newAccepted(t)
105 defer s.Close()
106 if err := s.MarkSteerConsumed(id); err != nil {
107 t.Fatal(err)
108 }
109 if err := s.DeletePendingOrAcceptedItem(id); !errors.Is(err, ErrInvalidState) {
110 t.Fatalf("delete after consume = %v, want ErrInvalidState", err)
111 }
112 meta, _, err := s.ReadItem(id)
113 if err != nil {
114 t.Fatal(err)
115 }
116 if meta.State != StateSteerConsumed {
117 t.Fatalf("state = %q, want %q", meta.State, StateSteerConsumed)
118 }
119 })
120 }
121
121 lines GO