返回 DeepSeek-Reasonix
session_clear_test.go
根目录 / internal / control / session_clear_test.go
1 package control
2
3 import (
4 "os"
5 "path/filepath"
6 "runtime"
7 "strings"
8 "testing"
9 "time"
10
11 "reasonix/internal/agent"
12 "reasonix/internal/event"
13 "reasonix/internal/provider"
14 )
15
16 func TestSubmitClearDiscardsCurrentContextWithoutSavingTranscript(t *testing.T) {
17 dir := t.TempDir()
18 sess := agent.NewSession("sys")
19 sess.Add(provider.Message{Role: provider.RoleUser, Content: "old context"})
20 exec := agent.New(nil, nil, sess, agent.Options{}, event.Discard)
21 path := filepath.Join(dir, "session.jsonl")
22 clearResult := make(chan string, 1)
23 sink := event.FuncSink(func(e event.Event) {
24 if e.Kind != event.Notice || (e.Text != "context cleared" && !strings.HasPrefix(e.Text, "clear context failed: ")) {
25 return
26 }
27 select {
28 case clearResult <- e.Text:
29 default:
30 }
31 })
32 c := newOwnedTestController(t, Options{Executor: exec, SystemPrompt: "sys", SessionDir: dir, SessionPath: path, Label: "test", Sink: sink})
33 if err := c.Snapshot(); err != nil {
34 t.Fatal(err)
35 }
36 ckpt := ckptDir(path)
37 if err := os.MkdirAll(ckpt, 0o755); err != nil {
38 t.Fatal(err)
39 }
40 if err := os.WriteFile(filepath.Join(ckpt, "turn-0.json"), []byte("{}"), 0o644); err != nil {
41 t.Fatal(err)
42 }
43
44 c.submit("/clear", "", "")
45 select {
46 case result := <-clearResult:
47 if result != "context cleared" {
48 t.Fatal(result)
49 }
50 case <-time.After(30 * time.Second):
51 stack := make([]byte, 2<<20)
52 n := runtime.Stack(stack, true)
53 t.Fatalf("/clear did not finish\n%s", stack[:n])
54 }
55 if c.SessionPath() == path {
56 t.Fatal("/clear did not rotate to a fresh session path")
57 }
58 for _, p := range []string{path, agent.BranchMetaPath(path), ckpt} {
59 if _, err := os.Stat(p); !os.IsNotExist(err) {
60 t.Fatalf("discarded artifact %s still exists or stat failed with %v", p, err)
61 }
62 }
63 if _, err := os.Stat(c.SessionPath()); !os.IsNotExist(err) {
64 t.Fatalf("fresh empty session should not be saved yet; stat err=%v", err)
65 }
66 current := exec.Session().Snapshot()
67 if len(current) != 1 || current[0].Role != provider.RoleSystem || current[0].Content != "sys" {
68 t.Fatalf("cleared context = %+v, want only system prompt", current)
69 }
70 }
71
71 lines GO