blob: 5482d0c22887f64d45c39ef05cbaec7ed76dd62e [file] [log] [blame]
Akron90f65212025-06-12 14:32:55 +02001package config
2
3import (
4 "os"
5 "path/filepath"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9)
10
11func TestDefaultConfig(t *testing.T) {
12 cfg := DefaultConfig()
13
14 assert.NotNil(t, cfg)
15
16 // Note: Server name and version are now set by the CLI layer as constants
17 // so they will be empty in the default config
18
19 // Test KorAP defaults
20 assert.Equal(t, "https://korap.ids-mannheim.de", cfg.KorAP.BaseURL)
21 assert.Equal(t, "v1.0", cfg.KorAP.APIVersion)
22 assert.Equal(t, 30, cfg.KorAP.Timeout)
23 assert.Equal(t, 3, cfg.KorAP.MaxRetries)
24
25 // Test OAuth defaults
26 assert.False(t, cfg.OAuth.Enabled, "Expected OAuth to be disabled by default")
27
28 // Test logging defaults
29 assert.Equal(t, "info", cfg.Logging.Level)
30 assert.Equal(t, "text", cfg.Logging.Format)
31}
32
33func TestConfigValidate(t *testing.T) {
34 // Test valid configuration
35 cfg := DefaultConfig()
36 err := cfg.Validate()
37 assert.NoError(t, err)
38
39 // Test invalid OAuth configuration
40 cfg.OAuth.Enabled = true
41 cfg.OAuth.ClientID = ""
42 err = cfg.Validate()
43 assert.Error(t, err, "Expected validation error for empty OAuth client ID")
44
45 // Test invalid KorAP configuration
46 cfg = DefaultConfig()
47 cfg.KorAP.BaseURL = ""
48 err = cfg.Validate()
49 assert.Error(t, err, "Expected validation error for empty KorAP base URL")
50
51 // Test invalid logging configuration
52 cfg = DefaultConfig()
53 cfg.Logging.Level = "invalid"
54 err = cfg.Validate()
55 assert.Error(t, err, "Expected validation error for invalid log level")
56}
57
58func TestKorAPConfigValidate(t *testing.T) {
59 tests := []struct {
60 name string
61 config KorAPConfig
62 expectErr bool
63 }{
64 {
65 name: "valid config",
66 config: KorAPConfig{
67 BaseURL: "https://korap.ids-mannheim.de",
68 APIVersion: "v1.0",
69 Timeout: 30,
70 MaxRetries: 3,
71 },
72 expectErr: false,
73 },
74 {
75 name: "empty base URL",
76 config: KorAPConfig{
77 BaseURL: "",
78 APIVersion: "v1.0",
79 Timeout: 30,
80 MaxRetries: 3,
81 },
82 expectErr: true,
83 },
84 {
85 name: "empty API version",
86 config: KorAPConfig{
87 BaseURL: "https://korap.ids-mannheim.de",
88 APIVersion: "",
89 Timeout: 30,
90 MaxRetries: 3,
91 },
92 expectErr: true,
93 },
94 {
95 name: "zero timeout",
96 config: KorAPConfig{
97 BaseURL: "https://korap.ids-mannheim.de",
98 APIVersion: "v1.0",
99 Timeout: 0,
100 MaxRetries: 3,
101 },
102 expectErr: true,
103 },
104 {
105 name: "negative timeout",
106 config: KorAPConfig{
107 BaseURL: "https://korap.ids-mannheim.de",
108 APIVersion: "v1.0",
109 Timeout: -1,
110 MaxRetries: 3,
111 },
112 expectErr: true,
113 },
114 {
115 name: "negative max retries",
116 config: KorAPConfig{
117 BaseURL: "https://korap.ids-mannheim.de",
118 APIVersion: "v1.0",
119 Timeout: 30,
120 MaxRetries: -1,
121 },
122 expectErr: true,
123 },
124 }
125
126 for _, tt := range tests {
127 t.Run(tt.name, func(t *testing.T) {
128 err := tt.config.Validate()
129 if tt.expectErr {
130 assert.Error(t, err, "Expected validation error but got none")
131 } else {
132 assert.NoError(t, err, "Unexpected validation error")
133 }
134 })
135 }
136}
137
138func TestKorAPConfigGetEndpoint(t *testing.T) {
139 config := KorAPConfig{
140 BaseURL: "https://korap.ids-mannheim.de",
141 APIVersion: "v1.0",
142 }
143
144 expected := "https://korap.ids-mannheim.de/api/v1.0"
145 actual := config.GetKorAPEndpoint()
146
147 assert.Equal(t, expected, actual)
148}
149
150func TestLoggingConfigValidate(t *testing.T) {
151 tests := []struct {
152 name string
153 config LoggingConfig
154 expectErr bool
155 }{
156 {
157 name: "valid text format",
158 config: LoggingConfig{
159 Level: "info",
160 Format: "text",
161 },
162 expectErr: false,
163 },
164 {
165 name: "valid json format",
166 config: LoggingConfig{
167 Level: "debug",
168 Format: "json",
169 },
170 expectErr: false,
171 },
172 {
173 name: "invalid level",
174 config: LoggingConfig{
175 Level: "invalid",
176 Format: "text",
177 },
178 expectErr: true,
179 },
180 {
181 name: "invalid format",
182 config: LoggingConfig{
183 Level: "info",
184 Format: "invalid",
185 },
186 expectErr: true,
187 },
188 {
189 name: "all log levels",
190 config: LoggingConfig{
191 Level: "trace",
192 Format: "json",
193 },
194 expectErr: false,
195 },
196 }
197
198 for _, tt := range tests {
199 t.Run(tt.name, func(t *testing.T) {
200 err := tt.config.Validate()
201 if tt.expectErr {
202 assert.Error(t, err, "Expected validation error but got none")
203 } else {
204 assert.NoError(t, err, "Unexpected validation error")
205 }
206 })
207 }
208}
209
210func TestLoggingConfigValidateWithFile(t *testing.T) {
211 // Create a temporary directory for testing
212 tempDir, err := os.MkdirTemp("", "korap-mcp-test")
213 assert.NoError(t, err, "Failed to create temp dir")
214 defer os.RemoveAll(tempDir)
215
216 // Create a writable log file
217 logFile := filepath.Join(tempDir, "test.log")
218 file, err := os.Create(logFile)
219 assert.NoError(t, err)
220 file.Close()
221
222 config := LoggingConfig{
223 Level: "info",
224 Format: "json",
225 File: logFile,
226 }
227
228 err = config.Validate()
229 assert.NoError(t, err, "Validation failed for writable log file")
230
231 // Test with invalid log file path
232 config.File = "/root/invalid.log"
233 err = config.Validate()
234 assert.Error(t, err, "Expected validation error for invalid log file path")
235}
236
237func TestServerConfigDefaults(t *testing.T) {
238 cfg := DefaultConfig()
239
240 assert.Empty(t, cfg.Server.ConfigFile, "Expected empty config file by default")
241
242 // Name and version are now constants set by CLI layer, so they will be empty here
243 assert.Empty(t, cfg.Server.Name, "Server name should be empty in default config (set by CLI constants)")
244 assert.Empty(t, cfg.Server.Version, "Server version should be empty in default config (set by CLI constants)")
245}
246
247// Benchmark tests
248func BenchmarkDefaultConfig(b *testing.B) {
249 for i := 0; i < b.N; i++ {
250 _ = DefaultConfig()
251 }
252}
253
254func BenchmarkConfigValidate(b *testing.B) {
255 cfg := DefaultConfig()
256 b.ResetTimer()
257
258 for i := 0; i < b.N; i++ {
259 _ = cfg.Validate()
260 }
261}
262
263func BenchmarkKorAPGetEndpoint(b *testing.B) {
264 config := KorAPConfig{
265 BaseURL: "https://korap.ids-mannheim.de",
266 APIVersion: "v1.0",
267 }
268 b.ResetTimer()
269
270 for i := 0; i < b.N; i++ {
271 _ = config.GetKorAPEndpoint()
272 }
273}