Skip to content

Commit 10bd51a

Browse files
committed
fix tests
1 parent 50a98a4 commit 10bd51a

14 files changed

Lines changed: 102 additions & 194 deletions

internal/core/dispatcher_test.go

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,17 @@ import (
77
"testing"
88

99
"github.com/go-chi/chi/v5"
10-
"github.com/mallardduck/teapot-router/internal/testutil"
1110
"github.com/stretchr/testify/assert"
1211

12+
"github.com/mallardduck/teapot-router/internal/testutil"
1313
"github.com/mallardduck/teapot-router/pkg/dispatch"
1414
)
1515

1616
func TestDispatcherSingleRoute(t *testing.T) {
17-
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
18-
_, _ = w.Write([]byte("OK"))
19-
})
20-
2117
route := &Route{
2218
Method: "GET",
2319
Pattern: "/test",
24-
Handler: handler,
20+
Handler: testutil.OKResponseHandler,
2521
}
2622

2723
dispatcher := &Dispatcher{
@@ -34,27 +30,19 @@ func TestDispatcherSingleRoute(t *testing.T) {
3430
dispatcher.ServeHTTP(w, req)
3531

3632
assert.Equal(t, 200, w.Code)
37-
assert.Equal(t, "OK", w.Body.String())
3833
}
3934

4035
func TestDispatcherQueryMatching(t *testing.T) {
41-
handler1 := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
42-
_, _ = w.Write([]byte("HANDLER1"))
43-
})
44-
handler2 := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
45-
_, _ = w.Write([]byte("HANDLER2"))
46-
})
47-
4836
route1 := &Route{
4937
Method: "GET",
5038
Pattern: "/test",
51-
Handler: handler1,
39+
Handler: http.HandlerFunc(testutil.StringResponseWriterBuilder("HANDLER1")),
5240
QueryMatchers: []dispatch.Matcher{dispatch.QueryExistsMatcher{Key: "foo"}},
5341
}
5442
route2 := &Route{
5543
Method: "GET",
5644
Pattern: "/test",
57-
Handler: handler2,
45+
Handler: http.HandlerFunc(testutil.StringResponseWriterBuilder("HANDLER2")),
5846
}
5947

6048
dispatcher := &Dispatcher{}
@@ -77,14 +65,10 @@ func TestDispatcherQueryMatching(t *testing.T) {
7765
}
7866

7967
func TestDispatcherNoMatch(t *testing.T) {
80-
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
81-
_, _ = w.Write([]byte("OK"))
82-
})
83-
8468
route := &Route{
8569
Method: "GET",
8670
Pattern: "/test",
87-
Handler: handler,
71+
Handler: testutil.NoopResponseHandler,
8872
QueryMatchers: []dispatch.Matcher{dispatch.QueryExistsMatcher{Key: "required"}},
8973
}
9074

@@ -107,7 +91,7 @@ func TestDispatcherContextInjection(t *testing.T) {
10791
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
10892
capturedAction = GetAction(r.Context())
10993
capturedName = GetRouteName(r.Context())
110-
_, _ = w.Write([]byte("OK"))
94+
testutil.OKResponse(w, r)
11195
})
11296

11397
route := &Route{

internal/testutil/responses.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,21 @@ import (
44
"net/http"
55
)
66

7+
// NoopResponse is a simple response function that does nothing.
78
func NoopResponse(w http.ResponseWriter, req *http.Request) {}
89

10+
// NoopResponseHandler is an http.HandlerFunc wrapper for NoopResponse.
911
var NoopResponseHandler = http.HandlerFunc(NoopResponse)
1012

13+
// OKResponse writes a 200 OK status to the response writer.
14+
func OKResponse(w http.ResponseWriter, req *http.Request) {
15+
w.WriteHeader(http.StatusOK)
16+
}
17+
18+
// OKResponseHandler is an http.HandlerFunc wrapper for OKResponse.
19+
var OKResponseHandler = http.HandlerFunc(OKResponse)
20+
21+
// StringResponseWriterBuilder returns a response function that writes the given response string.
1122
func StringResponseWriterBuilder(response string) func(w http.ResponseWriter, req *http.Request) {
1223
return func(w http.ResponseWriter, req *http.Request) {
1324
_, _ = w.Write([]byte(response))

pkg/teapot/additional_methods_test.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,7 @@ func TestQueryHEAD(t *testing.T) {
8282
w.WriteHeader(200)
8383
})).Query("metadata")
8484

85-
r.QueryHEAD("/object", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
86-
w.WriteHeader(200)
87-
}))
85+
r.QueryHEAD("/object", testutil.OKResponseHandler)
8886

8987
w := request(t, r, "HEAD", "/object?metadata")
9088
assert.Equal(t, 200, w.Code)

pkg/teapot/dispatch_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ import (
55
"net/http/httptest"
66
"testing"
77

8-
"github.com/mallardduck/teapot-router/internal/testutil"
98
"github.com/stretchr/testify/assert"
109
"github.com/stretchr/testify/require"
10+
11+
"github.com/mallardduck/teapot-router/internal/testutil"
1112
)
1213

1314
func TestDispatchBasicRouting(t *testing.T) {

pkg/teapot/helpers_test.go

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/stretchr/testify/assert"
99

10+
"github.com/mallardduck/teapot-router/internal/testutil"
1011
"github.com/mallardduck/teapot-router/pkg/teapot"
1112
)
1213

@@ -58,12 +59,10 @@ func TestChiAccessor(t *testing.T) {
5859
r.Chi().NotFound(func(w http.ResponseWriter, r *http.Request) {
5960
notFoundCalled = true
6061
w.WriteHeader(404)
61-
_, _ = w.Write([]byte("Custom 404"))
62+
testutil.StringResponseWriterBuilder("Custom 404")(w, r)
6263
})
6364

64-
r.GET("/exists", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
65-
w.WriteHeader(200)
66-
}))
65+
r.GET("/exists", testutil.OKResponseHandler)
6766

6867
// Test normal route works
6968
req := httptest.NewRequest("GET", "/exists", nil)
@@ -103,19 +102,13 @@ func TestRouterWith(t *testing.T) {
103102
}
104103

105104
// Route without middleware
106-
r.GET("/public", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
107-
_, _ = w.Write([]byte("PUBLIC"))
108-
}))
105+
r.Func().GET("/public", testutil.StringResponseWriterBuilder("PUBLIC"))
109106

110107
// Route with mw1
111-
r.With(mw1).GET("/protected", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
112-
_, _ = w.Write([]byte("PROTECTED"))
113-
}))
108+
r.With(mw1).Func().GET("/protected", testutil.StringResponseWriterBuilder("PROTECTED"))
114109

115110
// Route with mw1 and mw2
116-
r.With(mw1, mw2).GET("/admin", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
117-
_, _ = w.Write([]byte("ADMIN"))
118-
}))
111+
r.With(mw1, mw2).Func().GET("/admin", testutil.StringResponseWriterBuilder("ADMIN"))
119112

120113
// Test public route
121114
calls = nil
@@ -195,19 +188,13 @@ func TestMiddlewareGroup(t *testing.T) {
195188
}
196189

197190
// Public routes (no middleware)
198-
r.GET("/public", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
199-
_, _ = w.Write([]byte("PUBLIC"))
200-
})).Name("public")
191+
r.Func().GET("/public", testutil.StringResponseWriterBuilder("PUBLIC")).Name("public")
201192

202193
// Protected routes (with auth + logging middleware)
203194
r.MiddlewareGroup(func(r *teapot.Router) {
204-
r.GET("/admin", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
205-
_, _ = w.Write([]byte("ADMIN"))
206-
})).Name("admin")
195+
r.Func().GET("/admin", testutil.StringResponseWriterBuilder("ADMIN")).Name("admin")
207196

208-
r.GET("/dashboard", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
209-
_, _ = w.Write([]byte("DASHBOARD"))
210-
})).Name("dashboard")
197+
r.Func().GET("/dashboard", testutil.StringResponseWriterBuilder("DASHBOARD")).Name("dashboard")
211198
}, auth, logging)
212199

213200
// Test public route (no middleware)
@@ -297,9 +284,7 @@ func TestMiddlewareGroupWithNamedGroup(t *testing.T) {
297284

298285
r.MiddlewareGroup(func(r *teapot.Router) {
299286
r.NamedGroup("/api", "api", func(r *teapot.Router) {
300-
r.GET("/users", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
301-
_, _ = w.Write([]byte("USERS"))
302-
})).Name("users")
287+
r.Func().GET("/users", testutil.StringResponseWriterBuilder("USERS")).Name("users")
303288
})
304289
}, auth)
305290

pkg/teapot/router_test.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@ func TestBasicHTTPMethods(t *testing.T) {
3333
r.Func().POST("/post", testutil.StringResponseWriterBuilder("POST"))
3434
r.Func().PUT("/put", testutil.StringResponseWriterBuilder("PUT"))
3535
r.Func().DELETE("/delete", testutil.StringResponseWriterBuilder("DELETE"))
36-
r.Func().HEAD("/head", func(w http.ResponseWriter, r *http.Request) {
37-
w.WriteHeader(200)
38-
})
36+
r.Func().HEAD("/head", testutil.OKResponse)
3937

4038
assert.Equal(t, "GET", request(t, r, "GET", "/get").Body.String())
4139
assert.Equal(t, "POST", request(t, r, "POST", "/post").Body.String())

tests/context_injection_test.go

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
chiMiddleware "github.com/go-chi/chi/v5/middleware"
99
"github.com/stretchr/testify/assert"
1010

11+
"github.com/mallardduck/teapot-router/internal/testutil"
1112
"github.com/mallardduck/teapot-router/pkg/teapot"
1213
)
1314

@@ -494,17 +495,13 @@ func TestContextInjection_GlobalVsRouteMiddleware(t *testing.T) {
494495
// Add global middleware (before Route() group - no route context available)
495496
r.Use(globalMiddleware)
496497

497-
handler := func(w http.ResponseWriter, req *http.Request) {
498-
w.WriteHeader(http.StatusOK)
499-
}
500-
501498
// Create Route() group with RouteContextMiddleware for route metadata
502499
r.Route("/", func(r *teapot.Router) {
503500
// Add RouteContextMiddleware to inject route metadata early
504501
r.Use(teapot.RouteContextMiddleware(r))
505502
r.Use(routeLevelMiddleware)
506503

507-
r.Func().GET("/test", handler).
504+
r.Func().GET("/test", testutil.OKResponse).
508505
Name("test.route").
509506
Action("test:Action").
510507
With(routeSpecificMiddleware)
@@ -559,11 +556,6 @@ func TestContextInjection_RouteContextMiddleware(t *testing.T) {
559556
})
560557
}
561558

562-
// Register various routes
563-
handler := func(w http.ResponseWriter, req *http.Request) {
564-
w.WriteHeader(http.StatusOK)
565-
}
566-
567559
// IMPORTANT: Use Route() to ensure RouteContext is available (recommended pattern)
568560
r.Use(chiMiddleware.StripSlashes) // Truly global middleware
569561
r.Route("/", func(r *teapot.Router) {
@@ -572,20 +564,20 @@ func TestContextInjection_RouteContextMiddleware(t *testing.T) {
572564
r.Use(auditMiddleware)
573565

574566
// Direct routes
575-
r.Func().GET("/users", handler).
567+
r.Func().GET("/users", testutil.OKResponse).
576568
Name("users.index").
577569
Action("list:users")
578570

579-
r.Func().GET("/users/{id}", handler).
571+
r.Func().GET("/users/{id}", testutil.OKResponse).
580572
Name("users.show").
581573
Action("read:user")
582574

583575
// Query-multiplexed routes
584-
r.Func().QueryGET("/{bucket}", handler).
576+
r.Func().QueryGET("/{bucket}", testutil.OKResponse).
585577
Name("bucket.list").
586578
Action("s3:ListBucket")
587579

588-
r.Func().QueryGET("/{bucket}", handler).
580+
r.Func().QueryGET("/{bucket}", testutil.OKResponse).
589581
Query("acl").
590582
Name("bucket.acl").
591583
Action("s3:GetBucketAcl")

tests/debug_logging_test.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package tests
33
import (
44
"bytes"
55
"log"
6-
"net/http"
76
"net/http/httptest"
87
"os"
98
"testing"
@@ -55,14 +54,14 @@ func TestDebugLogging(t *testing.T) {
5554
t.Run("debug logging with complex routing", func(t *testing.T) {
5655
r := teapot.New().SetDebugLog(true)
5756

58-
r.Func().GET("/users", func(w http.ResponseWriter, req *http.Request) {}).Name("users.list")
59-
r.Func().POST("/users", func(w http.ResponseWriter, req *http.Request) {}).Name("users.create")
57+
r.Func().GET("/users", testutil.NoopResponse).Name("users.list")
58+
r.Func().POST("/users", testutil.NoopResponse).Name("users.create")
6059

6160
r.NamedGroup("/api", "api", func(sub *teapot.Router) {
62-
sub.Func().GET("/test", func(w http.ResponseWriter, req *http.Request) {})
61+
sub.Func().GET("/test", testutil.NoopResponse)
6362
})
6463

65-
r.Func().QueryGET("/bucket", func(w http.ResponseWriter, req *http.Request) {}).Query("acl")
64+
r.Func().QueryGET("/bucket", testutil.NoopResponse).Query("acl")
6665

6766
r.Finalize()
6867

0 commit comments

Comments
 (0)