返回 DeepSeek-Reasonix
recovery_test.go
根目录 / internal / sessioninbox / recovery_test.go
1 package sessioninbox
2
3 import (
4 "path/filepath"
5 "testing"
6 )
7
8 func TestRecoverOrphanedInFlightPreservesOwnedAndPendingItems(t *testing.T) {
9 s, err := Open(filepath.Join(t.TempDir(), "s.jsonl"), Limits{})
10 if err != nil {
11 t.Fatal(err)
12 }
13 defer s.Close()
14
15 enqueue := func(text string) string {
16 rec, enqueueErr := s.Enqueue(EnqueueRequest{Envelope: PromptEnvelope{SubmitText: text}})
17 if enqueueErr != nil {
18 t.Fatal(enqueueErr)
19 }
20 return rec.ItemID
21 }
22 queued := enqueue("queued")
23 owned := enqueue("owned accepted")
24 orphanedAccepted := enqueue("orphaned accepted")
25 orphanedRunning := enqueue("orphaned running")
26 if err := s.SetState(owned, StateSteerAccepted, ""); err != nil {
27 t.Fatal(err)
28 }
29 if err := s.SetState(orphanedAccepted, StateSteerConsumed, ""); err != nil {
30 t.Fatal(err)
31 }
32 if err := s.ClaimItem(orphanedRunning); err != nil {
33 t.Fatal(err)
34 }
35
36 recovered, err := s.RecoverOrphanedInFlight([]string{owned})
37 if err != nil {
38 t.Fatal(err)
39 }
40 if recovered != 2 {
41 t.Fatalf("recovered = %d, want 2", recovered)
42 }
43 snap := s.Snapshot()
44 if !snap.Paused || !snap.Recovered || snap.RecoveredN != 2 {
45 t.Fatalf("recovery metadata = %+v", snap)
46 }
47 states := make(map[string]InboxState, len(snap.Items))
48 for _, item := range snap.Items {
49 states[item.ID] = item.State
50 }
51 if states[queued] != StateQueued || states[owned] != StateSteerAccepted ||
52 states[orphanedAccepted] != StateUncertain || states[orphanedRunning] != StateUncertain {
53 t.Fatalf("recovered states = %+v", states)
54 }
55
56 if again, err := s.RecoverOrphanedInFlight([]string{owned}); err != nil || again != 0 {
57 t.Fatalf("idempotent recovery = %d, err=%v", again, err)
58 }
59 }
60
60 lines GO