package httpapi import ( "encoding/json" "net/http" "net/http/httptest" "testing" ) func TestOKEnvelope(t *testing.T) { t.Parallel() rec := httptest.NewRecorder() v1OK(rec, http.StatusOK, []string{"a"}, map[string]any{"page": 1, "limit": 25, "total": 1}) if rec.Code != http.StatusOK { t.Fatalf("status = %d", rec.Code) } var body map[string]any if err := json.Unmarshal(rec.Body.Bytes(), &body); err != nil { t.Fatal(err) } if _, ok := body["data"]; !ok { t.Fatalf("missing data: %#v", body) } meta, _ := body["meta"].(map[string]any) if meta["page"] != float64(1) || meta["limit"] != float64(25) { t.Fatalf("meta = %#v", body["meta"]) } } func TestPresentV1ExportFeedPublicURLs(t *testing.T) { t.Parallel() out := presentV1ExportFeed(map[string]any{ "id": "799ba83a-6a7e-4e1d-b5de-c02182aacec5", "name": "XML", "format": "xml", "public_token": "9bf8905985e4c2bb2e5f6a0f89ddc1b6", "is_active": true, }) urls, _ := out["public_urls"].(map[string]string) if urls["xml"] != "/api/public/export-feeds/9bf8905985e4c2bb2e5f6a0f89ddc1b6.xml" { t.Fatalf("public_urls = %#v", urls) } if urls["token"] != urls["xml"] { t.Fatalf("token url should match format: %#v", urls) } if _, hasCSV := urls["csv"]; hasCSV { t.Fatalf("must not advertise wrong-format url: %#v", urls) } if out["root_xpath"] != nil || out["mappings"] == nil { t.Fatalf("legacy fields missing: %#v", out) } } func TestParsePageLimitOffset(t *testing.T) { t.Parallel() r := httptest.NewRequest(http.MethodGet, "/x?page=2&limit=10", nil) page, limit, offset := ParsePageLimitOffset(r) if page != 2 || limit != 10 || offset != 10 { t.Fatalf("page=%d limit=%d offset=%d", page, limit, offset) } r2 := httptest.NewRequest(http.MethodGet, "/x?offset=5&limit=10", nil) page, limit, offset = ParsePageLimitOffset(r2) if page != 1 || limit != 10 || offset != 5 { t.Fatalf("offset mode: page=%d limit=%d offset=%d", page, limit, offset) } }