返回 DeepSeek-Reasonix
session_display_read_model_freshness_test.go
根目录 / internal / agent / session_display_read_model_freshness_test.go
1 package agent
2
3 import (
4 "os"
5 "path/filepath"
6 "testing"
7 "time"
8
9 "reasonix/internal/provider"
10 "reasonix/internal/store"
11 )
12
13 func TestAppendSessionDisplayReadModelRejectsEqualMTime(t *testing.T) {
14 useSchemaOneLog(t)
15 path := filepath.Join(t.TempDir(), "equal-mtime.jsonl")
16 base := []provider.Message{
17 {Role: provider.RoleUser, Content: "question"},
18 {Role: provider.RoleAssistant, Content: "answer"},
19 }
20 session := NewSession("sys")
21 for _, message := range base {
22 session.Add(message)
23 }
24 if err := session.Save(path); err != nil {
25 t.Fatal(err)
26 }
27 meta, ok, err := LoadBranchMeta(path)
28 if err != nil || !ok {
29 t.Fatalf("LoadBranchMeta ok=%v err=%v", ok, err)
30 }
31 full := append(append([]provider.Message(nil), base...), provider.Message{Role: provider.RoleUser, Content: "new turn"})
32 digest, err := digestSessionMessages(full)
33 if err != nil {
34 t.Fatal(err)
35 }
36 if err := appendSessionReplaceEvent(path, full, digest, meta.Revision, "equal-mtime-test"); err != nil {
37 t.Fatal(err)
38 }
39 before, err := os.ReadFile(path)
40 if err != nil {
41 t.Fatal(err)
42 }
43 equalTime := time.Now().Add(-time.Second)
44 for _, artifact := range []string{path, store.SessionDisplayIndex(path)} {
45 if err := os.Chtimes(artifact, equalTime, equalTime); err != nil {
46 t.Fatal(err)
47 }
48 }
49
50 appended, err := appendSessionDisplayReadModel(path, full, len(base), meta.Revision)
51 if err != nil || appended {
52 t.Fatalf("equal-mtime append = %v, err=%v; want stale fallback", appended, err)
53 }
54 after, err := os.ReadFile(path)
55 if err != nil {
56 t.Fatal(err)
57 }
58 if string(after) != string(before) {
59 t.Fatal("stale incremental path changed the compatibility transcript")
60 }
61 if err := RepairSessionDisplayReadModel(path); err != nil {
62 t.Fatal(err)
63 }
64 idx, err := LoadSessionDisplayIndex(store.SessionDisplayIndex(path))
65 if err != nil || idx.MessageCount != len(full) {
66 t.Fatalf("replayed display index = %+v err=%v", idx, err)
67 }
68 }
69
69 lines GO