main
 1package sparkles
 2
 3import (
 4	"net/http"
 5	"net/http/httptest"
 6	"testing"
 7
 8	"github.com/stretchr/testify/assert"
 9	"github.com/stretchr/testify/require"
10	"github.com/xlgmokha/x/pkg/serde"
11	"gitlab.com/mokhax/sparkled/pkg/db"
12	"gitlab.com/mokhax/sparkled/pkg/domain"
13	"gitlab.com/mokhax/sparkled/pkg/test"
14)
15
16func TestSparkles(t *testing.T) {
17	t.Run("GET /sparkles", func(t *testing.T) {
18		sparkle, _ := domain.NewSparkle("@tanuki for helping me")
19		store := db.NewRepository()
20		store.Save(sparkle)
21
22		controller := New(store)
23
24		t.Run("returns JSON", func(t *testing.T) {
25			request := test.Request("GET", "/sparkles",
26				test.WithAcceptHeader(serde.JSON),
27			)
28			response := httptest.NewRecorder()
29
30			controller.Index(response, request)
31
32			assert.Equal(t, http.StatusOK, response.Code)
33			items, err := serde.FromJSON[[]*domain.Sparkle](response.Body)
34			require.NoError(t, err)
35
36			assert.Equal(t, 1, len(items))
37			assert.Equal(t, "@tanuki", items[0].Sparklee)
38			assert.Equal(t, "for helping me", items[0].Reason)
39		})
40	})
41
42	t.Run("POST /sparkles", func(t *testing.T) {
43		t.Run("saves a new sparkle", func(t *testing.T) {
44			repository := db.NewRepository()
45			controller := New(repository)
46
47			sparkle, _ := domain.NewSparkle("@tanuki for reviewing my MR!")
48			request := test.Request("POST", "/sparkles", test.WithContentType(sparkle, serde.JSON))
49			response := httptest.NewRecorder()
50
51			controller.Create(response, request)
52
53			require.Equal(t, http.StatusCreated, response.Code)
54			assert.Equal(t, 1, len(repository.All()))
55		})
56	})
57}