package httpapi import ( "encoding/json" "strings" "testing" gatewaydocs "github.com/easyai/easyai-ai-gateway/apps/api/docs" ) func TestOpenAPIPublicRoutesUseCanonicalV1Prefix(t *testing.T) { var document struct { Paths map[string]any `json:"paths"` } if err := json.Unmarshal(gatewaydocs.SwaggerJSON, &document); err != nil { t.Fatalf("decode embedded OpenAPI document: %v", err) } legacyPrefixes := []string{ "/v1/", "/v1beta/", "/kling/", "/upload/", "/api/v3/", "/chat/", "/images/", "/song/", "/music/", "/speech/", "/voice_clone", "/tasks", } legacyExact := map[string]bool{ "/healthz": true, "/readyz": true, "/api-docs-json": true, "/api-docs-yaml": true, "/responses": true, "/embeddings": true, "/reranks": true, } for route := range document.Paths { if legacyExact[route] { t.Errorf("legacy public route must not be advertised in OpenAPI: %s", route) } for _, prefix := range legacyPrefixes { if strings.HasPrefix(route, prefix) { t.Errorf("legacy public route must not be advertised in OpenAPI: %s", route) } } } required := []string{ "/api/v1/healthz", "/api/v1/readyz", "/api/v1/openapi.json", "/api/v1/chat/completions", "/api/v1/responses", "/api/v1/images/generations", "/api/v1/images/vectorize", "/api/v1/videos/generations", "/api/v1/videos/upscales", "/api/v1/pricing/estimate", "/api/workspace/token-usage/daily", "/api/v1/models/{model}:generateContent", "/api/v1/videos/omni-video", "/api/v1/kling/v1/videos/omni-video", "/api/v1/kling/v2/omni-video/{model}", "/api/v1/contents/generations/tasks", } for _, route := range required { if _, ok := document.Paths[route]; !ok { t.Errorf("canonical public route missing from OpenAPI: %s", route) } } }