1package agent
2
3import "testing"
4
5func TestConfigSettingsStorePersistsShowInstructionsAtStartup(t *testing.T) {
6 t.Setenv("ZUT_HOME", t.TempDir())
7 if err := SaveConfig(Config{Theme: "dark"}); err != nil {
8 t.Fatal(err)
9 }
10
11 if err := (configSettingsStore{}).SetShowInstructionsAtStartup(true); err != nil {
12 t.Fatal(err)
13 }
14 cfg, err := LoadConfig()
15 if err != nil {
16 t.Fatal(err)
17 }
18 if cfg.ShowInstructionsAtStartup == nil || !*cfg.ShowInstructionsAtStartup {
19 t.Fatal("show_instructions_at_startup was not persisted as enabled")
20 }
21 if cfg.Theme != "dark" {
22 t.Fatalf("unrelated config changed: theme = %q, want dark", cfg.Theme)
23 }
24}
25
26func TestConfigSettingsStorePersistsTerminalAlerts(t *testing.T) {
27 t.Setenv("ZUT_HOME", t.TempDir())
28 if err := SaveConfig(Config{Theme: "dark"}); err != nil {
29 t.Fatal(err)
30 }
31
32 if err := (configSettingsStore{}).SetTerminalAlertsEnabled(false); err != nil {
33 t.Fatal(err)
34 }
35 cfg, err := LoadConfig()
36 if err != nil {
37 t.Fatal(err)
38 }
39 if cfg.TerminalAlertsEnabled == nil || *cfg.TerminalAlertsEnabled {
40 t.Fatal("terminal_alerts_enabled was not persisted as disabled")
41 }
42 if cfg.Theme != "dark" {
43 t.Fatalf("unrelated config changed: theme = %q, want dark", cfg.Theme)
44 }
45}
46
47func TestConfigSettingsStorePersistsTerminalTitle(t *testing.T) {
48 t.Setenv("ZUT_HOME", t.TempDir())
49 if err := SaveConfig(Config{Theme: "dark"}); err != nil {
50 t.Fatal(err)
51 }
52
53 if err := (configSettingsStore{}).SetTerminalTitleEnabled(false); err != nil {
54 t.Fatal(err)
55 }
56 cfg, err := LoadConfig()
57 if err != nil {
58 t.Fatal(err)
59 }
60 if cfg.TerminalTitleEnabled == nil || *cfg.TerminalTitleEnabled {
61 t.Fatal("terminal_title_enabled was not persisted as disabled")
62 }
63 if cfg.Theme != "dark" {
64 t.Fatalf("unrelated config changed: theme = %q, want dark", cfg.Theme)
65 }
66}
67
68func TestConfigSettingsStorePersistsJailByDefault(t *testing.T) {
69 t.Setenv("ZUT_HOME", t.TempDir())
70 if err := SaveConfig(Config{Theme: "dark"}); err != nil {
71 t.Fatal(err)
72 }
73
74 if err := (configSettingsStore{}).SetJailByDefault(true); err != nil {
75 t.Fatal(err)
76 }
77 cfg, err := LoadConfig()
78 if err != nil {
79 t.Fatal(err)
80 }
81 if cfg.JailByDefault == nil || !*cfg.JailByDefault {
82 t.Fatal("jail_by_default was not persisted as enabled")
83 }
84 if cfg.Theme != "dark" {
85 t.Fatalf("unrelated config changed: theme = %q, want dark", cfg.Theme)
86 }
87}
88
89func TestConfigSettingsStorePersistsAutoCompactThreshold(t *testing.T) {
90 t.Setenv("ZUT_HOME", t.TempDir())
91 if err := SaveConfig(Config{Theme: "dark"}); err != nil {
92 t.Fatal(err)
93 }
94
95 if err := (configSettingsStore{}).SetAutoCompactThreshold(70); err != nil {
96 t.Fatal(err)
97 }
98 cfg, err := LoadConfig()
99 if err != nil {
100 t.Fatal(err)
101 }
102 if cfg.AutoCompactThreshold == nil || *cfg.AutoCompactThreshold != 70 {
103 t.Fatalf("auto_compact_threshold = %v, want 70", cfg.AutoCompactThreshold)
104 }
105 if cfg.Theme != "dark" {
106 t.Fatalf("unrelated config changed: theme = %q, want dark", cfg.Theme)
107 }
108}
109
110func TestConfigSettingsStorePersistsLSPDefaults(t *testing.T) {
111 t.Setenv("ZUT_HOME", t.TempDir())
112 if err := SaveConfig(Config{Theme: "dark"}); err != nil {
113 t.Fatal(err)
114 }
115
116 if err := (configSettingsStore{}).SetLSPEnabled(false); err != nil {
117 t.Fatal(err)
118 }
119 if err := (configSettingsStore{}).SetSubagentLSPEnabled(false); err != nil {
120 t.Fatal(err)
121 }
122 cfg, err := LoadConfig()
123 if err != nil {
124 t.Fatal(err)
125 }
126 if cfg.LSPEnabled == nil || *cfg.LSPEnabled {
127 t.Fatal("lsp_enabled was not persisted as disabled")
128 }
129 if cfg.SubagentLSPEnabled == nil || *cfg.SubagentLSPEnabled {
130 t.Fatal("subagent_lsp_enabled was not persisted as disabled")
131 }
132 if cfg.Theme != "dark" {
133 t.Fatalf("unrelated config changed: theme = %q, want dark", cfg.Theme)
134 }
135}
136
137func TestConfigLSPEnabledForDefaultsToTrue(t *testing.T) {
138 cfg := Config{}
139 if !cfg.LSPEnabledFor(false) {
140 t.Fatal("main-session LSP should default to enabled")
141 }
142 if !cfg.LSPEnabledFor(true) {
143 t.Fatal("sub-agent LSP should default to enabled")
144 }
145
146 noMain, noSub := false, false
147 cfg.LSPEnabled = &noMain
148 cfg.SubagentLSPEnabled = &noSub
149 if cfg.LSPEnabledFor(false) || cfg.LSPEnabledFor(true) {
150 t.Fatal("explicitly disabled LSP settings were ignored")
151 }
152 yesSub := true
153 cfg.SubagentLSPEnabled = &yesSub
154 write, edit := true, true
155 cfg.LSPDiagnosticsOnWrite = &write
156 cfg.LSPDiagnosticsOnEdit = &edit
157 if cfg.LSPDiagnosticsOnWriteEnabled(false) || cfg.LSPDiagnosticsOnEditEnabled(false) {
158 t.Fatal("diagnostics remained enabled with main-session LSP disabled")
159 }
160 if !cfg.LSPDiagnosticsOnWriteEnabled(true) || !cfg.LSPDiagnosticsOnEditEnabled(true) {
161 t.Fatal("sub-agent diagnostics did not follow sub-agent LSP settings")
162 }
163}
164
165func TestConfigSettingsStorePersistsSubagentPosition(t *testing.T) {
166 t.Setenv("ZUT_HOME", t.TempDir())
167 if err := SaveConfig(Config{Theme: "dark"}); err != nil {
168 t.Fatal(err)
169 }
170
171 if err := (configSettingsStore{}).SetTUISubagentPosition("above_input"); err != nil {
172 t.Fatal(err)
173 }
174 cfg, err := LoadConfig()
175 if err != nil {
176 t.Fatal(err)
177 }
178 if cfg.TUISubagentPosition != "above_input" {
179 t.Fatalf("tui_subagent_position = %q, want above_input", cfg.TUISubagentPosition)
180 }
181 if cfg.Theme != "dark" {
182 t.Fatalf("unrelated config changed: theme = %q, want dark", cfg.Theme)
183 }
184
185 if err := (configSettingsStore{}).SetTUISubagentPosition("below_input"); err != nil {
186 t.Fatal(err)
187 }
188 cfg, err = LoadConfig()
189 if err != nil {
190 t.Fatal(err)
191 }
192 if cfg.TUISubagentPosition != "" {
193 t.Fatalf("default tui_subagent_position = %q, want omitted", cfg.TUISubagentPosition)
194 }
195}
196
197func TestConfigSettingsStorePersistsInheritedTheme(t *testing.T) {
198 t.Setenv("ZUT_HOME", t.TempDir())
199 if err := SaveConfig(Config{Theme: "dark"}); err != nil {
200 t.Fatal(err)
201 }
202
203 if err := (configSettingsStore{}).SetTheme("inherited"); err != nil {
204 t.Fatal(err)
205 }
206 cfg, err := LoadConfig()
207 if err != nil {
208 t.Fatal(err)
209 }
210 if cfg.Theme != "inherited" {
211 t.Fatalf("theme = %q, want inherited", cfg.Theme)
212 }
213}
214
215func TestConfigWebSearchEnabledForCLIDefaultsToTrue(t *testing.T) {
216 cfg := Config{}
217 if !cfg.WebSearchEnabledForCLI() {
218 t.Fatal("web search should default to enabled when the config field is absent")
219 }
220 disabled := false
221 cfg.WebSearchEnabled = &disabled
222 if cfg.WebSearchEnabledForCLI() {
223 t.Fatal("explicitly disabled web search setting was ignored")
224 }
225}
226
227func TestConfigSettingsStorePersistsWebSearch(t *testing.T) {
228 t.Setenv("ZUT_HOME", t.TempDir())
229 if err := SaveConfig(Config{Theme: "dark"}); err != nil {
230 t.Fatal(err)
231 }
232
233 if err := (configSettingsStore{}).SetWebSearchEnabled(false); err != nil {
234 t.Fatal(err)
235 }
236 cfg, err := LoadConfig()
237 if err != nil {
238 t.Fatal(err)
239 }
240 if cfg.WebSearchEnabled == nil || *cfg.WebSearchEnabled {
241 t.Fatal("web_search_enabled was not persisted as disabled")
242 }
243 if cfg.Theme != "dark" {
244 t.Fatalf("unrelated config changed: theme = %q, want dark", cfg.Theme)
245 }
246}