返回 DeepSeek-Reasonix
recovery_save_meta_test.go
根目录 / internal / agent / recovery_save_meta_test.go
1 package agent
2
3 import (
4 "path/filepath"
5 "testing"
6
7 "reasonix/internal/provider"
8 "reasonix/internal/store"
9 )
10
11 func TestRecoveryLaneRewriteAdvancesItsOwnLedgerAndDerivedIndexes(t *testing.T) {
12 dir := t.TempDir()
13 originalPath := filepath.Join(dir, "original.jsonl")
14 original := NewSession("sys")
15 original.Add(provider.Message{Role: provider.RoleUser, Content: "disk question"})
16 if err := original.SaveSnapshot(originalPath); err != nil {
17 t.Fatal(err)
18 }
19
20 recovery := NewSession("sys")
21 recovery.Add(provider.Message{Role: provider.RoleUser, Content: "local question"})
22 first, err := recovery.SaveShutdownRecoveryBranch(RecoveryBranchOptions{OriginalPath: originalPath, BaseRevision: 4, DiskRevision: 9})
23 if err != nil {
24 t.Fatal(err)
25 }
26 if err := UpdateBranchMeta(first.Path, false, func(meta *BranchMeta) error {
27 meta.Revision = 7
28 stampSessionListingProjection(meta)
29 return nil
30 }); err != nil {
31 t.Fatal(err)
32 }
33
34 recovery.Add(provider.Message{Role: provider.RoleAssistant, Content: "answer"})
35 recovery.Add(provider.Message{Role: provider.RoleUser, Content: "follow up"})
36 second, err := recovery.SaveShutdownRecoveryBranch(RecoveryBranchOptions{OriginalPath: originalPath})
37 if err != nil {
38 t.Fatal(err)
39 }
40 if second.Path != first.Path {
41 t.Fatalf("recovery lane changed from %q to %q", first.Path, second.Path)
42 }
43 msgs := recovery.Snapshot()
44 digest, err := ContentDigestForMessages(msgs)
45 if err != nil {
46 t.Fatal(err)
47 }
48 meta, ok, err := LoadBranchMeta(second.Path)
49 if err != nil || !ok {
50 t.Fatalf("LoadBranchMeta ok=%v err=%v", ok, err)
51 }
52 if meta.EffectiveVersionKind() != VersionRecovery || meta.EffectiveVersionState() != VersionActive ||
53 meta.BaseRevision != 4 || meta.DiskRevision != 9 ||
54 meta.Revision != 8 || meta.ContentDigest != digest || meta.RecoveryDigest != digest ||
55 meta.ListingRevision != 8 || meta.ListingContentDigest != digest || meta.Turns != 2 {
56 t.Fatalf("rewritten recovery meta = %+v", meta)
57 }
58 display, err := LoadSessionDisplayIndex(store.SessionDisplayIndex(second.Path))
59 if err != nil || display.Revision != 8 || display.ContentDigest != digest || display.AuthoredTurns != 2 {
60 t.Fatalf("display index = %+v err=%v", display, err)
61 }
62 event, err := readSessionEventIndex(second.Path)
63 if err != nil || event == nil || event.Revision != 8 || event.ContentDigest != digest {
64 t.Fatalf("event index = %+v err=%v", event, err)
65 }
66 }
67
67 lines GO