Commit 49e6179

mo khan <mo@mokhan.ca>
2025-04-11 21:42:07
refactor: extract test helpers
1 parent 2c01823
Changed files (3)
pkg/test/test.go
@@ -0,0 +1,55 @@
+package test
+
+import (
+	"context"
+	"io"
+	"net/http"
+	"net/http/httptest"
+
+	"github.com/xlgmokha/x/pkg/serde"
+)
+
+type RequestOption func(*http.Request) *http.Request
+
+func Request(method, target string, options ...RequestOption) *http.Request {
+	request := httptest.NewRequest(method, target, nil)
+	for _, option := range options {
+		request = option(request)
+	}
+	return request
+}
+
+func RequestResponse(method, target string, options ...RequestOption) (*http.Request, *httptest.ResponseRecorder) {
+	return Request(method, target, options...), httptest.NewRecorder()
+}
+
+func WithAcceptHeader(value serde.MediaType) RequestOption {
+	return WithRequestHeader("Accept", string(value))
+}
+
+func WithRequestHeader(key, value string) RequestOption {
+	return func(r *http.Request) *http.Request {
+		r.Header.Set(key, value)
+		return r
+	}
+}
+
+func WithRequestBody(body io.ReadCloser) RequestOption {
+	return func(r *http.Request) *http.Request {
+		r.Body = body
+		return r
+	}
+}
+
+func WithContext(ctx context.Context) RequestOption {
+	return func(r *http.Request) *http.Request {
+		return r.WithContext(ctx)
+	}
+}
+
+func WithCookie(cookie *http.Cookie) RequestOption {
+	return func(r *http.Request) *http.Request {
+		r.AddCookie(cookie)
+		return r
+	}
+}
pkg/web/server.go
@@ -21,14 +21,15 @@ func NewServer(storage db.Repository) *Server {
 }
 
 func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
-	switch r.URL.String() {
-	case "/health":
-		w.WriteHeader(http.StatusOK)
-	case "/sparkles.json":
-		switch r.Method {
-		case "GET":
+	switch r.Method {
+	case "GET":
+		switch r.URL.String() {
+		case "/health":
+			w.WriteHeader(http.StatusOK)
+		case "/sparkles":
 			serde.ToHTTP(w, r, s.db.All())
 		}
+		break
 	default:
 		s.fileserver.ServeHTTP(w, r)
 		break
pkg/web/server_test.go
@@ -10,23 +10,39 @@ import (
 	"github.com/xlgmokha/x/pkg/serde"
 	"gitlab.com/mokhax/sparkled/pkg/db"
 	"gitlab.com/mokhax/sparkled/pkg/domain"
+	"gitlab.com/mokhax/sparkled/pkg/test"
 )
 
 func TestServer(t *testing.T) {
-	t.Run("GET /sparkles.json", func(t *testing.T) {
-		t.Run("returns the list of sparkles", func(t *testing.T) {
-			sparkle, _ := domain.NewSparkle("@tanuki for helping me")
-			store := db.NewRepository()
-			store.Save(sparkle)
+	repository := db.NewRepository()
+	server := NewServer(repository)
 
+	t.Run("GET /index.html", func(t *testing.T) {
+		t.Run("returns the homepage", func(t *testing.T) {
+			t.Skip()
 			response := httptest.NewRecorder()
-			request, err := http.NewRequest("GET", "/sparkles.json", nil)
-			require.NoError(t, err)
-
-			NewServer(store).ServeHTTP(response, request)
 
+			server.ServeHTTP(response, test.Request("GET", "/"))
 			assert.Equal(t, http.StatusOK, response.Code)
+		})
+	})
+
+	t.Run("GET /sparkles", func(t *testing.T) {
+		sparkle, _ := domain.NewSparkle("@tanuki for helping me")
+		store := db.NewRepository()
+		store.Save(sparkle)
+
+		server := NewServer(store)
 
+		t.Run("returns JSON", func(t *testing.T) {
+			request := test.Request("GET", "/sparkles",
+				test.WithAcceptHeader(serde.JSON),
+			)
+			response := httptest.NewRecorder()
+
+			server.ServeHTTP(response, request)
+
+			assert.Equal(t, http.StatusOK, response.Code)
 			items, err := serde.FromJSON[[]*domain.Sparkle](response.Body)
 			require.NoError(t, err)
 
@@ -39,10 +55,8 @@ func TestServer(t *testing.T) {
 	t.Run("GET /health", func(t *testing.T) {
 		t.Run("returns OK", func(t *testing.T) {
 			response := httptest.NewRecorder()
-			request, err := http.NewRequest("GET", "/health", nil)
-			require.NoError(t, err)
 
-			NewServer(db.NewRepository()).ServeHTTP(response, request)
+			server.ServeHTTP(response, test.Request("GET", "/health"))
 			assert.Equal(t, http.StatusOK, response.Code)
 		})
 	})