package server_test import ( "net/http" "testing" "gitea.meghsakha.com/platform/tenant-registry/internal/store" ) func TestHealthz(t *testing.T) { eachStore(t, func(t *testing.T, h *testHarness) { resp, _ := h.do("GET", "/healthz", nil) if resp.StatusCode != 200 { t.Fatalf("status = %d", resp.StatusCode) } }) } func TestCreateTenant(t *testing.T) { eachStore(t, func(t *testing.T, h *testHarness) { resp, body := h.do("POST", "/v1/tenants", map[string]any{ "slug": "beta-co", "name": "Beta Co.", "plan": "starter", }) if resp.StatusCode != http.StatusCreated { t.Fatalf("status = %d, body=%s", resp.StatusCode, body) } out := decode[struct { Tenant *store.Tenant `json:"tenant"` InviteURL string `json:"invite_url"` }](t, body) if out.Tenant.Slug != "beta-co" || out.Tenant.Status != "trial" || out.Tenant.Plan != "starter" { t.Errorf("unexpected: %+v", out.Tenant) } }) } func TestCreateTenant_invalidSlug(t *testing.T) { eachStore(t, func(t *testing.T, h *testHarness) { resp, _ := h.do("POST", "/v1/tenants", map[string]any{ "slug": "X", "name": "Bad", }) if resp.StatusCode != http.StatusBadRequest { t.Fatalf("status = %d", resp.StatusCode) } }) } func TestCreateTenant_duplicateSlugConflict(t *testing.T) { eachStore(t, func(t *testing.T, h *testHarness) { // 'acme' is pre-seeded resp, _ := h.do("POST", "/v1/tenants", map[string]any{ "slug": "acme", "name": "Dup", }) if resp.StatusCode != http.StatusConflict { t.Fatalf("status = %d", resp.StatusCode) } }) } func TestGetTenantBySlug(t *testing.T) { eachStore(t, func(t *testing.T, h *testHarness) { resp, body := h.do("GET", "/v1/tenants/by-slug/acme", nil) if resp.StatusCode != 200 { t.Fatalf("status = %d", resp.StatusCode) } got := decode[store.Tenant](t, body) if got.Slug != "acme" { t.Errorf("slug = %q", got.Slug) } }) } func TestGetTenantBySlug_notFound(t *testing.T) { eachStore(t, func(t *testing.T, h *testHarness) { resp, _ := h.do("GET", "/v1/tenants/by-slug/nope-nope", nil) if resp.StatusCode != http.StatusNotFound { t.Fatalf("status = %d", resp.StatusCode) } }) } func TestActivateTenant(t *testing.T) { eachStore(t, func(t *testing.T, h *testHarness) { _, body := h.do("POST", "/v1/tenants", map[string]any{ "slug": "trial-co", "name": "Trial Co.", }) createdWrap := decode[struct { Tenant *store.Tenant `json:"tenant"` }](t, body) created := createdWrap.Tenant if created.Status != "trial" { t.Fatalf("precondition: %q", created.Status) } resp, body := h.do("POST", "/v1/tenants/"+created.ID+"/activate", map[string]any{ "plan": "professional", "erp_customer_id": "ERP-001", }) if resp.StatusCode != 200 { t.Fatalf("status = %d, body=%s", resp.StatusCode, body) } got := decode[store.Tenant](t, body) if got.Status != "active" || got.Plan != "professional" || got.ErpCustomerID != "ERP-001" { t.Errorf("unexpected: %+v", got) } }) } func TestCancelTenant(t *testing.T) { eachStore(t, func(t *testing.T, h *testHarness) { resp, body := h.do("POST", "/v1/tenants/"+h.tenant.ID+"/cancel", map[string]any{ "reason": "test", "at_period_end": true, }) if resp.StatusCode != 200 { t.Fatalf("status = %d, body=%s", resp.StatusCode, body) } got := decode[store.Tenant](t, body) if got.Status != "frozen" { t.Errorf("status = %q", got.Status) } }) }