package system_test import ( "context" "encoding/json" "errors" "net/http" "net/http/httptest" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "pipu/api/internal/server" "pipu/api/internal/system" ) func newServer(checks map[string]system.Checker) http.Handler { h := system.NewHandler(system.Info{ Version: "1.2.3", SupportedLocales: []string{"ru", "en"}, MinAndroidVersionCode: 10203, }, checks) return server.NewRouter(server.Deps{System: h}) } func get(t *testing.T, h http.Handler, path string) (*httptest.ResponseRecorder, map[string]any) { t.Helper() rec := httptest.NewRecorder() h.ServeHTTP(rec, httptest.NewRequest(http.MethodGet, path, nil)) var body map[string]any require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &body), rec.Body.String()) return rec, body } func TestServerInfo(t *testing.T) { rec, body := get(t, newServer(nil), "/api/v1/server-info") assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, "pipu-music", body["name"]) assert.Equal(t, "1.2.3", body["version"]) assert.Equal(t, "v1", body["api_version"]) assert.Equal(t, []any{"ru", "en"}, body["supported_locales"]) assert.EqualValues(t, 10203, body["min_android_version_code"]) } func TestHealthz(t *testing.T) { rec, body := get(t, newServer(nil), "/healthz") assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, "ok", body["status"]) } func TestReadyz(t *testing.T) { ok := system.CheckerFunc(func(context.Context) error { return nil }) down := system.CheckerFunc(func(context.Context) error { return errors.New("connection refused") }) t.Run("all dependencies up", func(t *testing.T) { rec, body := get(t, newServer(map[string]system.Checker{"postgres": ok, "redis": ok}), "/readyz") assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, "ok", body["status"]) assert.Equal(t, map[string]any{"postgres": "ok", "redis": "ok"}, body["checks"]) }) t.Run("one dependency down", func(t *testing.T) { rec, body := get(t, newServer(map[string]system.Checker{"postgres": ok, "redis": down}), "/readyz") assert.Equal(t, http.StatusServiceUnavailable, rec.Code) assert.Equal(t, "degraded", body["status"]) assert.Equal(t, map[string]any{"postgres": "ok", "redis": "connection refused"}, body["checks"]) }) } func TestUnknownRouteIsProblemJSON(t *testing.T) { rec, body := get(t, newServer(nil), "/api/v1/nope") assert.Equal(t, http.StatusNotFound, rec.Code) assert.Equal(t, "application/problem+json", rec.Header().Get("Content-Type")) assert.Equal(t, "common.not_found", body["code"]) }