Commit 49e6179
Changed files (3)
pkg
test
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)
})
})