From 0bef608297d7def2a18d054e7230fe0e0a3710a7 Mon Sep 17 00:00:00 2001 From: mo khan Date: Sat, 12 Apr 2025 18:11:05 -0600 Subject: refactor: extract mountable interface to allow controllers to mount themselves into the mux --- app/controllers/health/controller.go | 4 ++ app/controllers/sparkles/controller.go | 5 +++ app/controllers/sparkles/controller_test.go | 57 +++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 app/controllers/sparkles/controller_test.go (limited to 'app/controllers') diff --git a/app/controllers/health/controller.go b/app/controllers/health/controller.go index e241885..5bcff66 100644 --- a/app/controllers/health/controller.go +++ b/app/controllers/health/controller.go @@ -9,6 +9,10 @@ func New() *Controller { return &Controller{} } +func (c *Controller) MountTo(mux *http.ServeMux) { + mux.HandleFunc("GET /health", c.Index) +} + func (c *Controller) Index(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) } diff --git a/app/controllers/sparkles/controller.go b/app/controllers/sparkles/controller.go index 365184f..f00f40c 100644 --- a/app/controllers/sparkles/controller.go +++ b/app/controllers/sparkles/controller.go @@ -16,6 +16,11 @@ func New(db db.Repository) *Controller { return &Controller{db: db} } +func (c *Controller) MountTo(mux *http.ServeMux) { + mux.HandleFunc("GET /sparkles", c.Index) + mux.HandleFunc("POST /sparkles", c.Create) +} + func (c *Controller) Index(w http.ResponseWriter, r *http.Request) { serde.ToHTTP(w, r, c.db.All()) } diff --git a/app/controllers/sparkles/controller_test.go b/app/controllers/sparkles/controller_test.go new file mode 100644 index 0000000..a351da1 --- /dev/null +++ b/app/controllers/sparkles/controller_test.go @@ -0,0 +1,57 @@ +package sparkles + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "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 TestSparkles(t *testing.T) { + t.Run("GET /sparkles", func(t *testing.T) { + sparkle, _ := domain.NewSparkle("@tanuki for helping me") + store := db.NewRepository() + store.Save(sparkle) + + controller := New(store) + + t.Run("returns JSON", func(t *testing.T) { + request := test.Request("GET", "/sparkles", + test.WithAcceptHeader(serde.JSON), + ) + response := httptest.NewRecorder() + + controller.Index(response, request) + + assert.Equal(t, http.StatusOK, response.Code) + items, err := serde.FromJSON[[]*domain.Sparkle](response.Body) + require.NoError(t, err) + + assert.Equal(t, 1, len(items)) + assert.Equal(t, "@tanuki", items[0].Sparklee) + assert.Equal(t, "for helping me", items[0].Reason) + }) + }) + + t.Run("POST /sparkles", func(t *testing.T) { + t.Run("saves a new sparkle", func(t *testing.T) { + repository := db.NewRepository() + controller := New(repository) + + sparkle, _ := domain.NewSparkle("@tanuki for reviewing my MR!") + request := test.Request("POST", "/sparkles", test.WithContentType(sparkle, serde.JSON)) + response := httptest.NewRecorder() + + controller.Create(response, request) + + require.Equal(t, http.StatusCreated, response.Code) + assert.Equal(t, 1, len(repository.All())) + }) + }) +} -- cgit v1.2.3