package server_test import ( "net/http" "testing" "gitea.meghsakha.com/platform/tenant-registry/internal/store" ) func TestGetCatalog(t *testing.T) { eachStore(t, func(t *testing.T, h *testHarness) { resp, body := h.do("GET", "/v1/catalog", nil) if resp.StatusCode != 200 { t.Fatalf("status = %d", resp.StatusCode) } out := decode[struct { Items []store.CatalogEntry `json:"items"` }](t, body) if len(out.Items) < 2 { t.Errorf("expected ≥2 catalog entries, got %d", len(out.Items)) } }) } func TestCatalogRequest(t *testing.T) { eachStore(t, func(t *testing.T, h *testHarness) { resp, body := h.do("POST", "/v1/catalog/request", map[string]any{ "tenant_id": h.tenant.ID, "product": "certifai", }) if resp.StatusCode != http.StatusAccepted { t.Fatalf("status = %d, body=%s", resp.StatusCode, body) } }) } func TestCatalogRequest_unknownProduct(t *testing.T) { eachStore(t, func(t *testing.T, h *testHarness) { resp, _ := h.do("POST", "/v1/catalog/request", map[string]any{ "tenant_id": h.tenant.ID, "product": "nonexistent", }) if resp.StatusCode != http.StatusBadRequest { t.Fatalf("status = %d", resp.StatusCode) } }) } func TestCatalogTrialRequest(t *testing.T) { eachStore(t, func(t *testing.T, h *testHarness) { // Make a fresh tenant so we don't conflict with the seeded acme entitlements _, body := h.do("POST", "/v1/tenants", map[string]any{ "slug": "trial-target", "name": "Trial Target", }) freshWrap := decode[struct { Tenant *store.Tenant `json:"tenant"` }](t, body) fresh := freshWrap.Tenant resp, body := h.do("POST", "/v1/catalog/trial-request", map[string]any{ "tenant_id": fresh.ID, "product": "compliance", }) if resp.StatusCode != http.StatusCreated { t.Fatalf("status = %d, body=%s", resp.StatusCode, body) } got := decode[store.TenantProduct](t, body) if got.Product != "compliance" || !got.Enabled || got.ExpiresAt == nil { t.Errorf("unexpected: %+v", got) } // Verify it shows up on /v1/entitlements?tenant_id=… resp, body = h.do("GET", "/v1/entitlements?tenant_id="+fresh.ID, nil) if resp.StatusCode != 200 { t.Fatalf("list status = %d", resp.StatusCode) } listed := decode[struct { Items []store.TenantProduct `json:"items"` }](t, body) if len(listed.Items) != 1 || listed.Items[0].Product != "compliance" { t.Errorf("list returned %+v", listed.Items) } }) }