package server_test import ( "context" "path/filepath" "testing" "github.com/getkin/kin-openapi/openapi3" "github.com/getkin/kin-openapi/openapi3filter" "github.com/getkin/kin-openapi/routers/gorillamux" ) // TestOpenAPISpec_loads_and_validates is the contract gate: the committed // openapi.yaml must parse, every $ref must resolve, and every documented // operation must be reachable from the router. If a handler is missing // from the spec or vice-versa, this fails. func TestOpenAPISpec_loadsAndIsConsistent(t *testing.T) { loader := &openapi3.Loader{Context: context.Background(), IsExternalRefsAllowed: false} specPath, _ := filepath.Abs("../../openapi.yaml") doc, err := loader.LoadFromFile(specPath) if err != nil { t.Fatalf("load spec: %v", err) } if err := doc.Validate(loader.Context); err != nil { t.Fatalf("validate spec: %v", err) } // Replace the servers block so the validator matches any host. doc.Servers = openapi3.Servers{{URL: "/"}} router, err := gorillamux.NewRouter(doc) if err != nil { t.Fatalf("build router: %v", err) } // Run a few sample requests through the validator. Each one must be // matched to an operation in the spec. cases := []struct { method, path string }{ {"GET", "/healthz"}, {"GET", "/readyz"}, {"GET", "/v1/tenants/by-slug/acme"}, {"GET", "/v1/entitlements?tenant_id=00000000-0000-0000-0000-000000000001"}, {"GET", "/v1/api-keys?tenant_id=00000000-0000-0000-0000-000000000001"}, {"GET", "/v1/catalog"}, {"GET", "/v1/audit?limit=10"}, {"POST", "/v1/internal/keycloak/claims"}, } for _, c := range cases { req := newRequest(t, c.method, c.path) _, _, err := router.FindRoute(req) if err != nil { t.Errorf("%s %s: not in spec — %v", c.method, c.path, err) } } } // Reference the openapi3filter package so its symbol survives if the // per-request validation block grows back later. var _ = openapi3filter.ValidateRequest