package meta_test import ( "context" "encoding/json" "errors" "net/http" "net/http/httptest" "testing" "time" "gitea.dwysokinski.me/twhelp/sessions/internal/router/meta" "gitea.dwysokinski.me/twhelp/sessions/internal/router/meta/internal/model" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/stretchr/testify/assert" ) func TestLivez(t *testing.T) { t.Parallel() rr := httptest.NewRecorder() meta.NewRouter(nil).ServeHTTP(rr, httptest.NewRequest(http.MethodGet, "/livez", nil)) assert.Equal(t, http.StatusNoContent, rr.Code) assert.Equal(t, 0, rr.Body.Len()) } func TestReadyz(t *testing.T) { t.Parallel() tests := []struct { name string checkers []meta.Checker expectedStatus int expectedResp model.ReadyResp }{ { name: "0 checks", checkers: nil, expectedStatus: http.StatusOK, expectedResp: model.ReadyResp{ Status: model.StatusPass, Checks: map[string][]model.ComponentStatus{}, }, }, { name: "2 passed", checkers: []meta.Checker{ checker{name: "test", err: nil}, checker{name: "test2", err: nil}, }, expectedStatus: http.StatusOK, expectedResp: model.ReadyResp{ Status: model.StatusPass, Checks: map[string][]model.ComponentStatus{ "test": { { Status: model.StatusPass, }, }, "test2": { { Status: model.StatusPass, }, }, }, }, }, { name: "1 passed and 1 failed", checkers: []meta.Checker{ checker{name: "test", err: nil}, checker{name: "test2", err: errors.New("any")}, }, expectedStatus: http.StatusFailedDependency, expectedResp: model.ReadyResp{ Status: model.StatusFail, Checks: map[string][]model.ComponentStatus{ "test": { { Status: model.StatusPass, }, }, "test2": { { Status: model.StatusFail, }, }, }, }, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() rr := httptest.NewRecorder() meta.NewRouter(tt.checkers).ServeHTTP(rr, httptest.NewRequest(http.MethodGet, "/readyz", nil)) assert.Equal(t, tt.expectedStatus, rr.Code) assert.Equal(t, "application/json", rr.Header().Get("Content-Type")) var target model.ReadyResp assert.NoError(t, json.NewDecoder(rr.Body).Decode(&target)) assert.Empty(t, cmp.Diff(tt.expectedResp, target, cmpopts.IgnoreTypes(time.Time{}))) }) } } type checker struct { name string err error } func (c checker) Name() string { return c.name } func (c checker) Check(_ context.Context) error { return c.err }