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 wantWeb bool
16 wantWriteTool bool
17 }{
18 {
19 name: "requested allowlist",
20 args: Args{Orchestrate: true, ToolsSet: true, Tools: []string{"subagent_spawn"}},
21 wantResearch: true,
22 wantWeb: true,
23 wantWriteTool: false,
24 },
25 {
26 name: "web search policy disabled",
27 args: Args{Orchestrate: true, WebSearchPolicy: subagents.WebSearchDeny},
28 wantResearch: true,
29 wantWeb: true,
30 wantWriteTool: true,
31 },
32 {
33 name: "permission ceiling",
34 args: Args{Orchestrate: true, PermissionSet: &tools.PermissionSet{}},
35 wantResearch: true,
36 wantWeb: false,
37 wantWriteTool: true,
38 },
39 {
40 name: "tools disabled",
41 args: Args{Orchestrate: true, NoTools: true, ToolsSet: true, Tools: []string{"write"}},
42 wantResearch: false,
43 wantWeb: false,
44 wantWriteTool: false,
45 },
46 {
47 name: "normal session",
48 args: Args{ToolsSet: true, Tools: []string{"write"}},
49 wantResearch: false,
50 wantWeb: false,
51 wantWriteTool: true,
52 },
53 } {
54 t.Run(tc.name, func(t *testing.T) {
55 registry := buildToolRegistry(tc.args, t.TempDir(), nil, false, false, false)
56
57 if got := orchestratorExplorationToolsAllowed(tc.args); got != tc.wantResearch {
58 t.Fatalf("orchestratorExplorationToolsAllowed = %v, want %v", got, tc.wantResearch)
59 }
60 _, gotRead := registry["read"]
61 if gotRead != tc.wantResearch {
62 t.Fatalf("read present = %v, want %v", gotRead, tc.wantResearch)
63 }
64 if _, ok := registry["grep"].(*tools.GrepTool); ok != tc.wantResearch {
65 t.Fatalf("grep = %T, want research tool present = %v", registry["grep"], tc.wantResearch)
66 }
67 for _, name := range tools.WebCapabilityNames {
68 _, gotWebTool := registry[name]
69 if gotWebTool != tc.wantWeb {
70 t.Fatalf("%s present = %v, want web tool present = %v", name, gotWebTool, tc.wantWeb)
71 }
72 }
73 _, gotWrite := registry["write"]
74 if gotWrite != tc.wantWriteTool {
75 t.Fatalf("write present = %v, want %v", gotWrite, tc.wantWriteTool)
76 }
77 })
78 }
79}