1package core
2
3import (
4 "testing"
5 "time"
6
7 "github.com/bnema/zut/packages/provider"
8)
9
10func TestSessionPersistsAndReplaysToolTiming(t *testing.T) {
11 session, err := NewSession(t.TempDir(), "/workspace", "provider", "model", "test")
12 if err != nil {
13 t.Fatal(err)
14 }
15 started := time.Date(2026, 8, 8, 12, 0, 0, 0, time.FixedZone("UTC-4", -4*60*60))
16 timing := &provider.ToolTiming{
17 StartedAt: started,
18 CompletedAt: started.Add(250 * time.Millisecond),
19 Duration: 250 * time.Millisecond,
20 }
21 if err := session.AppendMessage(provider.Message{
22 Role: provider.RoleAssistant,
23 Content: []provider.Content{provider.ToolCallBlock{ID: "call-1", Name: "echo"}},
24 }); err != nil {
25 t.Fatal(err)
26 }
27 if err := session.AppendMessage(provider.Message{
28 Role: provider.RoleTool,
29 Content: []provider.Content{provider.ToolResultBlock{
30 CallID: "call-1",
31 Content: []provider.Content{provider.TextBlock{Text: "ok"}},
32 Timing: timing,
33 }},
34 }); err != nil {
35 t.Fatal(err)
36 }
37 path := session.Path
38 if err := session.Close(); err != nil {
39 t.Fatal(err)
40 }
41
42 snapshot, err := ReadSessionSnapshot(path)
43 if err != nil {
44 t.Fatal(err)
45 }
46 result, ok := snapshot.Messages[1].Content[0].(provider.ToolResultBlock)
47 if !ok {
48 t.Fatalf("replayed content = %T, want ToolResultBlock", snapshot.Messages[1].Content[0])
49 }
50 if result.Timing == nil {
51 t.Fatal("replayed tool result lost timing")
52 }
53 if !result.Timing.StartedAt.Equal(timing.StartedAt) || !result.Timing.CompletedAt.Equal(timing.CompletedAt) || result.Timing.Duration != timing.Duration {
54 t.Fatalf("replayed timing = %#v, want %#v", result.Timing, timing)
55 }
56}