1package agent
2
3import (
4 "context"
5 "path/filepath"
6 "testing"
7
8 "github.com/bnema/zut/packages/core"
9 "github.com/bnema/zut/packages/provider"
10)
11
12func TestOpenOrCreateSessionStateFreshness(t *testing.T) {
13 for _, name := range []string{"new", "no-session", "new-explicit", "existing-explicit", "continue-existing", "resume-id", "continue-missing"} {
14 t.Run(name, func(t *testing.T) {
15 home, cwd := t.TempDir(), t.TempDir()
16 t.Setenv("ZUT_HOME", home)
17 args := Args{CWD: cwd}
18 resolved := Resolved{CWD: cwd, Provider: "test-provider", Model: "test-model"}
19 wantFresh := true
20 switch name {
21 case "no-session":
22 args.NoSess = true
23 case "new-explicit":
24 args.Session = filepath.Join(home, "explicit.jsonl")
25 case "existing-explicit", "continue-existing", "resume-id":
26 old, err := core.NewSession(home, cwd, resolved.Provider, resolved.Model, "test")
27 if err != nil {
28 t.Fatal(err)
29 }
30 if name != "existing-explicit" {
31 if err := old.AppendMessage(provider.Message{Role: provider.RoleUser, Content: []provider.Content{provider.TextBlock{Text: "saved prompt"}}}); err != nil {
32 t.Fatal(err)
33 }
34 }
35 path, id := old.Path, old.ID
36 if name == "existing-explicit" {
37 // Keep the empty session open so its valid header remains;
38 // restoration is not inferred from message count.
39 t.Cleanup(func() { _ = old.Close() })
40 args.Session = path
41 } else {
42 if err := old.Close(); err != nil {
43 t.Fatal(err)
44 }
45 if name == "continue-existing" {
46 args.Continue = true
47 } else {
48 args.Resume, args.ResumeSessionID = true, id
49 }
50 }
51 wantFresh = false
52 case "continue-missing":
53 args.Continue = true
54 }
55 ag := core.NewAgent(nil, resolved.Model, "system", core.Registry{})
56 sess, fresh, err := openOrCreateSessionState(context.Background(), args, resolved, ag, "test")
57 if err != nil {
58 t.Fatal(err)
59 }
60 if sess != nil {
61 defer sess.Close()
62 }
63 if fresh != wantFresh {
64 t.Fatalf("fresh=%v, want %v", fresh, wantFresh)
65 }
66 if args.NoSess && sess != nil {
67 t.Fatal("session created with persistence disabled")
68 }
69 })
70 }
71}