@@ -12,8 +12,8 @@ import (
1212 "github.com/mallardduck/teapot-router/pkg/teapot"
1313)
1414
15- // TestRoutesHandler verifies the HTTP routes handler returns JSON
16- func TestRoutesHandler (t * testing.T ) {
15+ // TestNewListRoutesHandler verifies the HTTP routes handler returns JSON
16+ func TestNewListRoutesHandler (t * testing.T ) {
1717 r := teapot .New ()
1818
1919 // Register some routes
@@ -22,8 +22,8 @@ func TestRoutesHandler(t *testing.T) {
2222 r .GET ("/users/{id}" , dummyHandler ).Name ("users.show" ).Action ("s3:GetObject" )
2323 r .DELETE ("/users/{id}" , dummyHandler ).Name ("users.destroy" )
2424
25- // Get the handler
26- handler := r . ListRoutesHandler ( )
25+ // Get the handler (no filter - show all)
26+ handler := teapot . NewListRoutesHandler ( r , nil )
2727
2828 // Test JSON response (with Accept header)
2929 req := httptest .NewRequest ("GET" , "/.internal/routes" , nil )
@@ -58,14 +58,14 @@ func TestRoutesHandler(t *testing.T) {
5858 }
5959}
6060
61- // TestRoutesHandlerHTML verifies HTML output for browsers
62- func TestRoutesHandlerHTML (t * testing.T ) {
61+ // TestNewListRoutesHandlerHTML verifies HTML output for browsers
62+ func TestNewListRoutesHandlerHTML (t * testing.T ) {
6363 r := teapot .New ()
6464
6565 r .GET ("/users" , dummyHandler ).Name ("users.index" )
6666 r .GET ("/posts" , dummyHandler ).Name ("posts.index" )
6767
68- handler := r . ListRoutesHandler ( )
68+ handler := teapot . NewListRoutesHandler ( r , nil )
6969
7070 // Test HTML response (no Accept header defaults to HTML)
7171 req := httptest .NewRequest ("GET" , "/.internal/routes" , nil )
@@ -90,18 +90,15 @@ func TestRoutesHandlerHTML(t *testing.T) {
9090 }
9191}
9292
93- // TestRegisterDebugRoute verifies convenience method
94- func TestRegisterDebugRoute (t * testing.T ) {
93+ // TestNewListRoutesHandlerAsRoute verifies wiring NewListRoutesHandler into a route
94+ func TestNewListRoutesHandlerAsRoute (t * testing.T ) {
9595 r := teapot .New ()
9696
97- // Register some routes
9897 r .GET ("/api/users" , dummyHandler ).Name ("api.users" )
9998 r .GET ("/api/posts" , dummyHandler ).Name ("api.posts" )
99+ r .GET ("/.internal/routes" , teapot .NewListRoutesHandler (r , nil )).Name ("debug.routes" )
100100
101- // Register debug route
102- r .RegisterDebugRoute ("/.internal/routes" , "debug.routes" )
103-
104- // Test it works
101+ // Test it works via ServeHTTP
105102 req := httptest .NewRequest ("GET" , "/.internal/routes" , nil )
106103 req .Header .Set ("Accept" , "application/json" )
107104 w := httptest .NewRecorder ()
@@ -274,25 +271,43 @@ func TestRoutesSorting(t *testing.T) {
274271 }
275272}
276273
277- // TestConditionalDebugRoute demonstrates conditional registration
278- func TestConditionalDebugRoute (t * testing.T ) {
279- debug := true // In real app, this would be from config/env
280-
274+ // TestNewListRoutesHandlerWithFilter verifies the filter excludes routes
275+ func TestNewListRoutesHandlerWithFilter (t * testing.T ) {
281276 r := teapot .New ()
282- r .GET ("/api/users" , dummyHandler ).Name ("api.users" )
283277
284- // Conditionally register debug route
285- if debug {
286- r .RegisterDebugRoute ("/.internal/routes" , "debug.routes" )
287- }
278+ r .GET ("/api/users" , dummyHandler ).Name ("api.users" )
279+ r .GET ("/api/posts" , dummyHandler ).Name ("api.posts" )
280+ r .GET ("/.internal/routes" , teapot .NewListRoutesHandler (r , func (route teapot.RouteInfo ) bool {
281+ return ! strings .HasPrefix (route .Pattern , "/.internal/" )
282+ })).Name ("debug.routes" )
288283
289- // Verify debug route exists
290284 req := httptest .NewRequest ("GET" , "/.internal/routes" , nil )
291285 req .Header .Set ("Accept" , "application/json" )
292286 w := httptest .NewRecorder ()
293287 r .ServeHTTP (w , req )
294288
295289 if w .Code != 200 {
296- t .Errorf ("expected debug route to work, got status %d" , w .Code )
290+ t .Errorf ("expected 200, got %d" , w .Code )
291+ }
292+
293+ var response map [string ]any
294+ if err := json .NewDecoder (w .Body ).Decode (& response ); err != nil {
295+ t .Fatalf ("failed to decode JSON: %v" , err )
296+ }
297+
298+ // Should have 2 routes - the /.internal/routes route is filtered out
299+ count , ok := response ["count" ].(float64 )
300+ if ! ok || count != 2 {
301+ t .Errorf ("expected count=2, got %v" , response ["count" ])
302+ }
303+
304+ // Verify no internal routes leaked through
305+ routes , _ := response ["routes" ].([]any )
306+ for _ , route := range routes {
307+ r , _ := route .(map [string ]any )
308+ pattern , _ := r ["Pattern" ].(string )
309+ if strings .HasPrefix (pattern , "/.internal/" ) {
310+ t .Errorf ("internal route %q should have been filtered out" , pattern )
311+ }
297312 }
298313}
0 commit comments