返回 DeepSeek-Reasonix
session_history_native_search_dag_test.go
根目录 / desktop / session_history_native_search_dag_test.go
1 package main
2
3 import (
4 "encoding/json"
5 "os"
6 "path/filepath"
7 "testing"
8
9 "reasonix/internal/provider"
10 "reasonix/internal/store"
11 )
12
13 func TestNativeHistorySearchDAGUsesSelectedBranchAndPatches(t *testing.T) {
14 a := historySliceTestApp(t)
15 t.Cleanup(a.closeHistoryReaders)
16 tab := newColdHistoryTab(t, a)
17 dir := tabSessionDir(tab)
18 if err := os.MkdirAll(dir, 0700); err != nil {
19 t.Fatal(err)
20 }
21 tab.SessionPath = filepath.Join(dir, "dag-search.jsonl")
22 if err := os.WriteFile(tab.SessionPath, nil, 0600); err != nil {
23 t.Fatal(err)
24 }
25 message := func(id, head, parent, text string) map[string]any {
26 return map[string]any{"type": "message", "id": id, "head": head, "parent": parent, "msgs": []provider.Message{{ID: id, Role: provider.RoleUser, Content: text}}}
27 }
28 entries := []map[string]any{
29 {"type": "log", "generation": 1},
30 message("root", "main", "", "shared original"),
31 message("main-only", "main", "root", "main needle"),
32 {"type": "fork", "head": "main", "new_head": "fork", "from": "root"},
33 message("fork-only", "fork", "root", "fork needle"),
34 {"type": "patch", "target": "root", "msgs": []provider.Message{{ID: "root", Role: provider.RoleUser, Content: "patched needle"}}},
35 {"type": "select", "head": "fork"},
36 }
37 var data []byte
38 for _, entry := range entries {
39 entry["schema_version"], entry["at"] = 2, "2026-01-08T10:00:00Z"
40 body, _ := json.Marshal(entry)
41 data = append(data, append(body, '\n')...)
42 }
43 if err := os.WriteFile(store.SessionEventLog(tab.SessionPath), data, 0600); err != nil {
44 t.Fatal(err)
45 }
46 var previousCursor string
47 for _, head := range []string{"fork", "main"} {
48 tab.SessionHeadID = head
49 handle, err := a.BeginSessionHistoryReadForTab(tab.ID)
50 if err != nil {
51 t.Fatal(err)
52 }
53 first := awaitNativeSearch(t, a, handle.ID, "needle", "", 1)
54 if len(first.Hits) != 1 || first.Hits[0].Preview != head+" needle" || !first.HasMore {
55 t.Fatalf("wrong branch: %+v", first)
56 }
57 last := awaitNativeSearch(t, a, handle.ID, "needle", first.NextCursor, 1)
58 if len(last.Hits) != 1 || last.Hits[0].Preview != "patched needle" || last.HasMore {
59 t.Fatalf("patch not reflected: %+v", last)
60 }
61 if got := awaitNativeSearch(t, a, handle.ID, "original", "", 10); len(got.Hits) != 0 {
62 t.Fatal("superseded text remained searchable")
63 }
64 if previousCursor != "" {
65 page, err := a.SearchSessionHistoryRead(handle.ID, "needle", previousCursor, 1)
66 if err != nil || page.Status != "stale_cursor" || len(page.Hits) != 0 {
67 t.Fatalf("cross-branch cursor accepted: %+v %v", page, err)
68 }
69 }
70 previousCursor = first.NextCursor
71 a.ReleaseSessionHistoryRead(handle.ID)
72 }
73 after, _ := os.ReadFile(store.SessionEventLog(tab.SessionPath))
74 if string(after) != string(data) {
75 t.Fatal("search modified selected head or authoritative DAG")
76 }
77 }
78
78 lines GO