1package agent
2
3import (
4 "testing"
5
6 "github.com/bnema/zut/packages/agent/subagents"
7 "github.com/bnema/zut/packages/agent/tools"
8)
9
10func TestOrchestratorAlwaysReceivesResearchTools(t *testing.T) {
11 for _, tc := range []struct {
12 name string
13 args Args
14 wantResearch bool
15 wantWriteTool bool
16 }{
17 {
18 name: "requested allowlist",
19 args: Args{Orchestrate: true, ToolsSet: true, Tools: []string{"subagent_spawn"}},
20 wantResearch: true,
21 wantWriteTool: false,
22 },
23 {
24 name: "web search policy disabled",
25 args: Args{Orchestrate: true, WebSearchPolicy: subagents.WebSearchDeny},
26 wantResearch: true,
27 wantWriteTool: true,
28 },
29 {
30 name: "tools disabled",
31 args: Args{Orchestrate: true, NoTools: true, ToolsSet: true, Tools: []string{"write"}},
32 wantResearch: false,
33 wantWriteTool: false,
34 },
35 {
36 name: "normal session",
37 args: Args{ToolsSet: true, Tools: []string{"write"}},
38 wantResearch: false,
39 wantWriteTool: true,
40 },
41 } {
42 t.Run(tc.name, func(t *testing.T) {
43 registry := buildToolRegistry(tc.args, t.TempDir(), nil, false, false, false)
44
45 if got := orchestratorExplorationToolsAllowed(tc.args); got != tc.wantResearch {
46 t.Fatalf("orchestratorExplorationToolsAllowed = %v, want %v", got, tc.wantResearch)
47 }
48 _, gotRead := registry["read"]
49 if gotRead != tc.wantResearch {
50 t.Fatalf("read present = %v, want %v", gotRead, tc.wantResearch)
51 }
52 if _, ok := registry["grep"].(*tools.GrepTool); ok != tc.wantResearch {
53 t.Fatalf("grep = %T, want research tool present = %v", registry["grep"], tc.wantResearch)
54 }
55 if _, ok := registry["web_search"].(*tools.WebSearchTool); ok != tc.wantResearch {
56 t.Fatalf("web_search = %T, want research tool present = %v", registry["web_search"], tc.wantResearch)
57 }
58 _, gotWrite := registry["write"]
59 if gotWrite != tc.wantWriteTool {
60 t.Fatalf("write present = %v, want %v", gotWrite, tc.wantWriteTool)
61 }
62 })
63 }
64}