返回 DeepSeek-Reasonix
session_migration_stream_test.go
根目录 / internal / agent / session_migration_stream_test.go
1 package agent
2
3 import (
4 "encoding/json"
5 "errors"
6 "os"
7 "path/filepath"
8 "testing"
9
10 "reasonix/internal/provider"
11 "reasonix/internal/store"
12 )
13
14 func TestStreamSessionMessagesForMigrationAppliesReplaceWithoutRetainingPrefix(t *testing.T) {
15 path := filepath.Join(t.TempDir(), "legacy.jsonl")
16 records := []sessionEventRecord{
17 {SchemaVersion: 1, Type: sessionEventTypeReplace, Messages: []provider.Message{{Role: provider.RoleSystem, Content: "system"}, {Role: provider.RoleUser, Content: "old"}}},
18 {SchemaVersion: 1, Type: sessionEventTypeAppend, MessageIndex: 2, Messages: []provider.Message{{Role: provider.RoleAssistant, Content: "obsolete"}}},
19 {SchemaVersion: 1, Type: sessionEventTypeReplace, Messages: []provider.Message{{Role: provider.RoleUser, Content: "final"}}},
20 {SchemaVersion: 1, Type: sessionEventTypeAppend, MessageIndex: 1, Messages: []provider.Message{{Role: provider.RoleAssistant, Content: "answer"}}},
21 }
22 file, err := os.Create(store.SessionEventLog(path))
23 if err != nil {
24 t.Fatal(err)
25 }
26 encoder := json.NewEncoder(file)
27 for _, record := range records {
28 if err := encoder.Encode(record); err != nil {
29 t.Fatal(err)
30 }
31 }
32 if err := file.Close(); err != nil {
33 t.Fatal(err)
34 }
35 var messages []provider.Message
36 resets := 0
37 result, err := StreamSessionMessagesForMigration(t.Context(), path, "", func() error {
38 resets++
39 messages = nil
40 return nil
41 }, func(message provider.Message) error {
42 messages = append(messages, message)
43 return nil
44 })
45 if err != nil {
46 t.Fatal(err)
47 }
48 if !result.FromEvents || result.Messages != 2 || resets != 3 {
49 t.Fatalf("result=%+v resets=%d", result, resets)
50 }
51 if len(messages) != 2 || messages[0].Content != "final" || messages[1].Content != "answer" || messages[0].ID == "" || messages[1].ID == "" {
52 t.Fatalf("messages = %#v", messages)
53 }
54 }
55
56 func TestStreamSessionMessagesForMigrationRejectsBrokenAppendChain(t *testing.T) {
57 path := filepath.Join(t.TempDir(), "legacy.jsonl")
58 record := sessionEventRecord{SchemaVersion: 1, Type: sessionEventTypeAppend, MessageIndex: 7, Messages: []provider.Message{{Role: provider.RoleUser, Content: "lost"}}}
59 data, _ := json.Marshal(record)
60 if err := os.WriteFile(store.SessionEventLog(path), append(data, '\n'), 0o600); err != nil {
61 t.Fatal(err)
62 }
63 _, err := StreamSessionMessagesForMigration(t.Context(), path, "", func() error { return nil }, func(provider.Message) error { return nil })
64 if !errors.Is(err, ErrSessionHistoryDamaged) {
65 t.Fatalf("error = %v", err)
66 }
67 }
68
68 lines GO