package pkgserver import ( "net/http" "net/http/httptest" "strconv" "testing" "hakurei.app/internal/info" "hakurei.app/internal/rosa" ) // prefix is prepended to every API path. const prefix = "/api/" + apiVersion + "/" func TestAPIInfo(t *testing.T) { t.Parallel() w := httptest.NewRecorder() handleInfo(w, httptest.NewRequestWithContext( t.Context(), http.MethodGet, prefix+"info", nil, )) resp := w.Result() checkStatus(t, resp, http.StatusOK) checkAPIHeader(t, w.Header()) checkPayload(t, resp, struct { Count int `json:"count"` HakureiVersion string `json:"hakurei_version"` }{rosa.Native().Count(), info.Version()}) } func TestAPIGet(t *testing.T) { t.Parallel() const target = prefix + "get" index := newIndex(t) newRequest := func(suffix string) *httptest.ResponseRecorder { w := httptest.NewRecorder() index.handleGet(w, httptest.NewRequestWithContext( t.Context(), http.MethodGet, target+suffix, nil, )) return w } checkValidate := func(t *testing.T, suffix string, vmin, vmax int, wantErr string) { t.Run("invalid", func(t *testing.T) { t.Parallel() w := newRequest("?" + suffix + "=invalid") resp := w.Result() checkError(t, resp, wantErr, http.StatusBadRequest) }) t.Run("min", func(t *testing.T) { t.Parallel() w := newRequest("?" + suffix + "=" + strconv.Itoa(vmin-1)) resp := w.Result() checkError(t, resp, wantErr, http.StatusBadRequest) w = newRequest("?" + suffix + "=" + strconv.Itoa(vmin)) resp = w.Result() checkStatus(t, resp, http.StatusOK) }) t.Run("max", func(t *testing.T) { t.Parallel() w := newRequest("?" + suffix + "=" + strconv.Itoa(vmax+1)) resp := w.Result() checkError(t, resp, wantErr, http.StatusBadRequest) w = newRequest("?" + suffix + "=" + strconv.Itoa(vmax)) resp = w.Result() checkStatus(t, resp, http.StatusOK) }) } t.Run("limit", func(t *testing.T) { t.Parallel() checkValidate( t, "index=0&sort=0&limit", 1, 100, "limit must be an integer between 1 and 100", ) }) t.Run("index", func(t *testing.T) { t.Parallel() checkValidate( t, "limit=1&sort=0&index", 0, rosa.Native().Count()-1, "index must be an integer between 0 and "+strconv.Itoa(rosa.Native().Count()-1), ) }) t.Run("sort", func(t *testing.T) { t.Parallel() checkValidate( t, "index=0&limit=1&sort", 0, int(sortOrderEnd), "sort must be an integer between 0 and "+strconv.Itoa(int(sortOrderEnd)), ) }) }