@@ -169,3 +169,163 @@ func TestFakeDataTypes(t *testing.T) {
169169 // ensure fake orphaned users report is compatible with notifier
170170 var _ * okta.OrphanedUsersReport = fakeOrphanedUsersReport ()
171171}
172+
173+ func TestCheckAdminAuth (t * testing.T ) {
174+ tests := []struct {
175+ name string
176+ adminToken string
177+ authHeader string
178+ expectError bool
179+ }{
180+ {
181+ name : "no token configured, no header" ,
182+ adminToken : "" ,
183+ authHeader : "" ,
184+ expectError : false ,
185+ },
186+ {
187+ name : "no token configured, with header" ,
188+ adminToken : "" ,
189+ authHeader : "Bearer some-token" ,
190+ expectError : false ,
191+ },
192+ {
193+ name : "token configured, no header" ,
194+ adminToken : "secret-token" ,
195+ authHeader : "" ,
196+ expectError : true ,
197+ },
198+ {
199+ name : "token configured, wrong token" ,
200+ adminToken : "secret-token" ,
201+ authHeader : "Bearer wrong-token" ,
202+ expectError : true ,
203+ },
204+ {
205+ name : "token configured, correct token" ,
206+ adminToken : "secret-token" ,
207+ authHeader : "Bearer secret-token" ,
208+ expectError : false ,
209+ },
210+ {
211+ name : "token configured, lowercase bearer" ,
212+ adminToken : "secret-token" ,
213+ authHeader : "bearer secret-token" ,
214+ expectError : false ,
215+ },
216+ }
217+
218+ for _ , tt := range tests {
219+ t .Run (tt .name , func (t * testing.T ) {
220+ app := & App {
221+ Config : & config.Config {AdminToken : tt .adminToken },
222+ Logger : slog .New (slog .NewTextHandler (os .Stderr , nil )),
223+ }
224+
225+ headers := map [string ]string {}
226+ if tt .authHeader != "" {
227+ headers ["authorization" ] = tt .authHeader
228+ }
229+
230+ req := Request {Headers : headers }
231+ resp := app .checkAdminAuth (req )
232+
233+ if tt .expectError && resp == nil {
234+ t .Error ("expected error response, got nil" )
235+ }
236+ if ! tt .expectError && resp != nil {
237+ t .Errorf ("expected no error, got status %d" , resp .StatusCode )
238+ }
239+ if tt .expectError && resp != nil && resp .StatusCode != 401 {
240+ t .Errorf ("expected status 401, got %d" , resp .StatusCode )
241+ }
242+ })
243+ }
244+ }
245+
246+ func TestHandleRequest_AdminAuthOnProtectedEndpoints (t * testing.T ) {
247+ tests := []struct {
248+ name string
249+ path string
250+ method string
251+ adminToken string
252+ authHeader string
253+ expectedStatus int
254+ }{
255+ {
256+ name : "status endpoint, no token configured" ,
257+ path : "/server/status" ,
258+ method : "GET" ,
259+ adminToken : "" ,
260+ authHeader : "" ,
261+ expectedStatus : 200 ,
262+ },
263+ {
264+ name : "status endpoint, token required, missing" ,
265+ path : "/server/status" ,
266+ method : "GET" ,
267+ adminToken : "secret" ,
268+ authHeader : "" ,
269+ expectedStatus : 401 ,
270+ },
271+ {
272+ name : "status endpoint, token required, correct" ,
273+ path : "/server/status" ,
274+ method : "GET" ,
275+ adminToken : "secret" ,
276+ authHeader : "Bearer secret" ,
277+ expectedStatus : 200 ,
278+ },
279+ {
280+ name : "config endpoint, token required, missing" ,
281+ path : "/server/config" ,
282+ method : "GET" ,
283+ adminToken : "secret" ,
284+ authHeader : "" ,
285+ expectedStatus : 401 ,
286+ },
287+ {
288+ name : "config endpoint, token required, correct" ,
289+ path : "/server/config" ,
290+ method : "GET" ,
291+ adminToken : "secret" ,
292+ authHeader : "Bearer secret" ,
293+ expectedStatus : 200 ,
294+ },
295+ {
296+ name : "scheduled endpoint, token required, missing" ,
297+ path : "/scheduled/slack-test" ,
298+ method : "POST" ,
299+ adminToken : "secret" ,
300+ authHeader : "" ,
301+ expectedStatus : 401 ,
302+ },
303+ }
304+
305+ for _ , tt := range tests {
306+ t .Run (tt .name , func (t * testing.T ) {
307+ app := & App {
308+ Config : & config.Config {AdminToken : tt .adminToken },
309+ Logger : slog .New (slog .NewTextHandler (os .Stderr , nil )),
310+ }
311+
312+ headers := map [string ]string {}
313+ if tt .authHeader != "" {
314+ headers ["authorization" ] = tt .authHeader
315+ }
316+
317+ req := Request {
318+ Type : RequestTypeHTTP ,
319+ Method : tt .method ,
320+ Path : tt .path ,
321+ Headers : headers ,
322+ }
323+
324+ resp := app .HandleRequest (context .Background (), req )
325+
326+ if resp .StatusCode != tt .expectedStatus {
327+ t .Errorf ("expected status %d, got %d" , tt .expectedStatus , resp .StatusCode )
328+ }
329+ })
330+ }
331+ }
0 commit comments