1package core
2
3import (
4 "context"
5 "strings"
6 "testing"
7
8 "github.com/bnema/zut/packages/provider"
9)
10
11type fastModeTestClient struct {
12 name string
13 lastReq provider.Request
14 called bool
15}
16
17func (c *fastModeTestClient) Name() string { return c.name }
18
19func (c *fastModeTestClient) Stream(_ context.Context, req provider.Request) (<-chan provider.Event, error) {
20 c.called = true
21 c.lastReq = req
22 out := make(chan provider.Event, 2)
23 out <- provider.EventTextDelta{Delta: "ok"}
24 out <- provider.EventDone{Stop: provider.StopEnd}
25 close(out)
26 return out, nil
27}
28
29func TestAgentPropagatesFastMode(t *testing.T) {
30 client := &fastModeTestClient{name: "openai"}
31 agent := NewAgent(client, "gpt-5", "", nil)
32 agent.FastMode = true
33
34 if err := agent.Prompt(context.Background(), "hello", nil, nil); err != nil {
35 t.Fatalf("Prompt returned %v", err)
36 }
37 if !client.called {
38 t.Fatal("provider was not called")
39 }
40 if !client.lastReq.FastMode {
41 t.Fatal("request FastMode = false, want true")
42 }
43}
44
45func TestAgentPropagatesFastModeToCompaction(t *testing.T) {
46 client := &fastModeTestClient{name: "openai"}
47 agent := NewAgent(client, "gpt-5", "", nil)
48 agent.FastMode = true
49 agent.SetMessages([]provider.Message{
50 {Role: provider.RoleUser, Content: []provider.Content{provider.TextBlock{Text: "old"}}},
51 {Role: provider.RoleAssistant, Content: []provider.Content{provider.TextBlock{Text: "answer"}}},
52 })
53
54 if _, err := agent.Compact(context.Background(), 1, nil); err != nil {
55 t.Fatalf("Compact returned %v", err)
56 }
57 if !client.lastReq.FastMode {
58 t.Fatal("compaction request FastMode = false, want true")
59 }
60}
61
62func TestAgentRejectsFastModeForNonOpenAIProvider(t *testing.T) {
63 client := &fastModeTestClient{name: "anthropic"}
64 agent := NewAgent(client, "claude-sonnet-4-5", "", nil)
65 agent.FastMode = true
66
67 err := agent.Prompt(context.Background(), "hello", nil, nil)
68 if err == nil || !strings.Contains(err.Error(), "only supported for OpenAI providers") {
69 t.Fatalf("Prompt error = %v, want unsupported-provider error", err)
70 }
71 if client.called {
72 t.Fatal("provider was called despite unsupported fast mode")
73 }
74}
75
76func TestAgentRejectsFastModeForNonOpenAIProviderDuringCompaction(t *testing.T) {
77 client := &fastModeTestClient{name: "anthropic"}
78 agent := NewAgent(client, "claude-sonnet-4-5", "", nil)
79 agent.FastMode = true
80 agent.SetMessages([]provider.Message{
81 {Role: provider.RoleUser, Content: []provider.Content{provider.TextBlock{Text: "old"}}},
82 {Role: provider.RoleAssistant, Content: []provider.Content{provider.TextBlock{Text: "answer"}}},
83 })
84
85 _, err := agent.Compact(context.Background(), 1, nil)
86 if err == nil || !strings.Contains(err.Error(), "only supported for OpenAI providers") {
87 t.Fatalf("Compact error = %v, want unsupported-provider error", err)
88 }
89 if client.called {
90 t.Fatal("provider was called despite unsupported fast mode")
91 }
92}