Skip to content

Commit 3c4960f

Browse files
committed
refactor: update NewListRoutesHandler and tests to use pointer for ListRoutesOptions
1 parent a60bbca commit 3c4960f

5 files changed

Lines changed: 30 additions & 23 deletions

File tree

examples/routes-cli/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ func setupRoutes() *teapot.Router {
184184
// ==================== DEBUG ROUTES ====================
185185
// Debug route (conditionally registered)
186186
if isDebug() {
187-
router.GET("/.internal/routes", teapot.NewListRoutesHandler(router, teapot.ListRoutesOptions{})).Name("debug.routes")
187+
router.GET("/.internal/routes", teapot.NewListRoutesHandler(router, nil)).Name("debug.routes")
188188
}
189189

190190
// TODO add a handler to output the ico file

pkg/teapot/internal_coverage_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ func TestNewListRoutesHandlerHTMLWithHeaders(t *testing.T) {
339339
d.When(m.HeaderEquals("X-Copy", "source")).FuncDo(testutil.NoopResponse).Name("hht.copy")
340340
})
341341

342-
handler := NewListRoutesHandler(r, ListRoutesOptions{})
342+
handler := NewListRoutesHandler(r, nil)
343343

344344
req := httptest.NewRequest("GET", "/.internal/routes", nil)
345345
w := httptest.NewRecorder()

pkg/teapot/routes_helpers.go

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,26 +78,27 @@ func (o ListRoutesOptions) resolveBaseURL(req *http.Request) string {
7878

7979
// NewListRoutesHandler returns an HTTP handler that displays registered routes.
8080
// The handler responds with JSON or HTML based on the Accept header.
81+
// opts may be nil to use default behaviour (no filter, no base URL).
8182
//
8283
// Example:
8384
//
84-
// // Show all routes
85-
// r.GET("/.internal/routes", teapot.NewListRoutesHandler(router, teapot.ListRoutesOptions{}))
85+
// // Show all routes (nil opts)
86+
// r.GET("/.internal/routes", teapot.NewListRoutesHandler(router, nil))
8687
//
8788
// // Exclude internal routes
88-
// r.GET("/.internal/routes", teapot.NewListRoutesHandler(router, teapot.ListRoutesOptions{
89+
// r.GET("/.internal/routes", teapot.NewListRoutesHandler(router, &teapot.ListRoutesOptions{
8990
// Filter: func(route teapot.RouteInfo) bool {
9091
// return !strings.HasPrefix(route.Pattern, "/.internal/")
9192
// },
9293
// }))
9394
//
9495
// // With a static base URL for clickable links in the HTML output
95-
// r.GET("/.internal/routes", teapot.NewListRoutesHandler(router, teapot.ListRoutesOptions{
96+
// r.GET("/.internal/routes", teapot.NewListRoutesHandler(router, &teapot.ListRoutesOptions{
9697
// BaseURL: "http://localhost:8080",
9798
// }))
9899
//
99100
// // With a dynamic base URL derived from each incoming request
100-
// r.GET("/.internal/routes", teapot.NewListRoutesHandler(router, teapot.ListRoutesOptions{
101+
// r.GET("/.internal/routes", teapot.NewListRoutesHandler(router, &teapot.ListRoutesOptions{
101102
// BaseURLFunc: func(r *http.Request) string {
102103
// scheme := "https"
103104
// if r.TLS == nil {
@@ -109,7 +110,7 @@ func (o ListRoutesOptions) resolveBaseURL(req *http.Request) string {
109110
//
110111
// If you want to merge routes from multiple routers, use [AggregateRoutes] and
111112
// then [NewListRoutesHandlerWithRoutes].
112-
func NewListRoutesHandler(router *Router, opts ListRoutesOptions) http.HandlerFunc {
113+
func NewListRoutesHandler(router *Router, opts *ListRoutesOptions) http.HandlerFunc {
113114
return func(w http.ResponseWriter, req *http.Request) {
114115
NewListRoutesHandlerWithRoutes(router.Routes(), opts)(w, req)
115116
}
@@ -118,10 +119,16 @@ func NewListRoutesHandler(router *Router, opts ListRoutesOptions) http.HandlerFu
118119
// NewListRoutesHandlerWithRoutes returns an HTTP handler that displays the
119120
// provided routes slice. This is useful when combining routes from multiple
120121
// routers via [AggregateRoutes].
121-
func NewListRoutesHandlerWithRoutes(routes []RouteInfo, opts ListRoutesOptions) http.HandlerFunc {
122+
func NewListRoutesHandlerWithRoutes(routes []RouteInfo, opts *ListRoutesOptions) http.HandlerFunc {
122123
return func(w http.ResponseWriter, req *http.Request) {
123-
filteredRoutes := FilterRoutes(routes, opts.Filter)
124-
renderListRoutes(w, req, filteredRoutes, opts.resolveBaseURL(req))
124+
var filter RouteFilter
125+
var baseURL string
126+
if opts != nil {
127+
filter = opts.Filter
128+
baseURL = opts.resolveBaseURL(req)
129+
}
130+
filteredRoutes := FilterRoutes(routes, filter)
131+
renderListRoutes(w, req, filteredRoutes, baseURL)
125132
}
126133
}
127134

pkg/teapot/routes_helpers_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ func TestListRoutesOptionsBaseURL(t *testing.T) {
456456
}
457457

458458
t.Run("static BaseURL produces clickable link", func(t *testing.T) {
459-
handler := teapot.NewListRoutesHandlerWithRoutes(routes, teapot.ListRoutesOptions{
459+
handler := teapot.NewListRoutesHandlerWithRoutes(routes, &teapot.ListRoutesOptions{
460460
BaseURL: "http://localhost:9000",
461461
})
462462
w := httptest.NewRecorder()
@@ -467,7 +467,7 @@ func TestListRoutesOptionsBaseURL(t *testing.T) {
467467
})
468468

469469
t.Run("BaseURLFunc overrides static BaseURL", func(t *testing.T) {
470-
handler := teapot.NewListRoutesHandlerWithRoutes(routes, teapot.ListRoutesOptions{
470+
handler := teapot.NewListRoutesHandlerWithRoutes(routes, &teapot.ListRoutesOptions{
471471
BaseURL: "http://should-not-appear.example.com",
472472
BaseURLFunc: func(r *http.Request) string {
473473
return "https://dynamic.example.com"
@@ -486,7 +486,7 @@ func TestListRoutesOptionsBaseURL(t *testing.T) {
486486
req.Host = "myapp.example.com"
487487

488488
var capturedHost string
489-
handler := teapot.NewListRoutesHandlerWithRoutes(routes, teapot.ListRoutesOptions{
489+
handler := teapot.NewListRoutesHandlerWithRoutes(routes, &teapot.ListRoutesOptions{
490490
BaseURLFunc: func(r *http.Request) string {
491491
capturedHost = r.Host
492492
return "http://" + r.Host
@@ -500,7 +500,7 @@ func TestListRoutesOptionsBaseURL(t *testing.T) {
500500
})
501501

502502
t.Run("neither BaseURL nor BaseURLFunc yields no links", func(t *testing.T) {
503-
handler := teapot.NewListRoutesHandlerWithRoutes(routes, teapot.ListRoutesOptions{})
503+
handler := teapot.NewListRoutesHandlerWithRoutes(routes, nil)
504504
w := httptest.NewRecorder()
505505
handler(w, htmlReq())
506506

pkg/teapot/routes_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func TestNewListRoutesHandler(t *testing.T) {
2323
r.DELETE("/users/{id}", dummyHandler).Name("users.destroy")
2424

2525
// Get the handler (no filter - show all)
26-
handler := teapot.NewListRoutesHandler(r, teapot.ListRoutesOptions{})
26+
handler := teapot.NewListRoutesHandler(r, nil)
2727

2828
// Test JSON response (with Accept header)
2929
req := httptest.NewRequest("GET", "/.internal/routes", nil)
@@ -65,7 +65,7 @@ func TestNewListRoutesHandlerHTML(t *testing.T) {
6565
r.GET("/users", dummyHandler).Name("users.index")
6666
r.GET("/posts", dummyHandler).Name("posts.index")
6767

68-
handler := teapot.NewListRoutesHandler(r, teapot.ListRoutesOptions{})
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)
@@ -97,7 +97,7 @@ func TestNewListRoutesHandlerHTMLQueryParams(t *testing.T) {
9797
r.QueryGET("/bucket", dummyHandler).Query("acl").Name("bucket.get-acl")
9898
r.QueryGET("/bucket", dummyHandler).QueryValue("list-type", "v2").Name("bucket.list-v2")
9999

100-
handler := teapot.NewListRoutesHandler(r, teapot.ListRoutesOptions{})
100+
handler := teapot.NewListRoutesHandler(r, nil)
101101

102102
req := httptest.NewRequest("GET", "/.internal/routes", nil)
103103
w := httptest.NewRecorder()
@@ -118,7 +118,7 @@ func TestNewListRoutesHandlerAsRoute(t *testing.T) {
118118

119119
r.GET("/api/users", dummyHandler).Name("api.users")
120120
r.GET("/api/posts", dummyHandler).Name("api.posts")
121-
r.GET("/.internal/routes", teapot.NewListRoutesHandler(r, teapot.ListRoutesOptions{})).Name("debug.routes")
121+
r.GET("/.internal/routes", teapot.NewListRoutesHandler(r, nil)).Name("debug.routes")
122122

123123
// Test it works via ServeHTTP
124124
req := httptest.NewRequest("GET", "/.internal/routes", nil)
@@ -151,7 +151,7 @@ func TestNewListRoutesHandlerBaseURL(t *testing.T) {
151151
r.GET("/users/{id}", dummyHandler).Name("users.show")
152152
r.POST("/users", dummyHandler).Name("users.store")
153153

154-
handler := teapot.NewListRoutesHandler(r, teapot.ListRoutesOptions{
154+
handler := teapot.NewListRoutesHandler(r, &teapot.ListRoutesOptions{
155155
BaseURL: "http://localhost:8080",
156156
})
157157

@@ -170,7 +170,7 @@ func TestNewListRoutesHandlerBaseURL(t *testing.T) {
170170
assert.Contains(t, body, `/users/{id}`)
171171

172172
// BaseURL with trailing slash should still produce correct URLs
173-
handler2 := teapot.NewListRoutesHandler(r, teapot.ListRoutesOptions{
173+
handler2 := teapot.NewListRoutesHandler(r, &teapot.ListRoutesOptions{
174174
BaseURL: "http://localhost:8080/",
175175
})
176176
w2 := httptest.NewRecorder()
@@ -183,7 +183,7 @@ func TestNewListRoutesHandlerNoBaseURL(t *testing.T) {
183183
r := teapot.New()
184184
r.GET("/users", dummyHandler).Name("users.index")
185185

186-
handler := teapot.NewListRoutesHandler(r, teapot.ListRoutesOptions{})
186+
handler := teapot.NewListRoutesHandler(r, nil)
187187

188188
req := httptest.NewRequest("GET", "/.internal/routes", nil)
189189
w := httptest.NewRecorder()
@@ -352,7 +352,7 @@ func TestNewListRoutesHandlerWithFilter(t *testing.T) {
352352

353353
r.GET("/api/users", dummyHandler).Name("api.users")
354354
r.GET("/api/posts", dummyHandler).Name("api.posts")
355-
r.GET("/.internal/routes", teapot.NewListRoutesHandler(r, teapot.ListRoutesOptions{
355+
r.GET("/.internal/routes", teapot.NewListRoutesHandler(r, &teapot.ListRoutesOptions{
356356
Filter: func(route teapot.RouteInfo) bool {
357357
return !strings.HasPrefix(route.Pattern, "/.internal/")
358358
},

0 commit comments

Comments
 (0)