From c3766f96696c543616b2245256cf70626fdf4219 Mon Sep 17 00:00:00 2001 From: Jannick Hemelhof Date: Wed, 5 Nov 2025 14:06:24 +0100 Subject: [PATCH] fix: examples not resolved when path parameter in reference chain (#2244) --- .../parser/processors/ExternalRefProcessor.java | 2 +- .../v3/parser/test/OpenAPIV3ParserTest.java | 14 ++++++++++++++ .../test/resources/issue-2244/components.yaml | 13 +++++++++++++ .../src/test/resources/issue-2244/openapi.yaml | 10 ++++++++++ .../test/resources/issue-2244/operations.yaml | 16 ++++++++++++++++ 5 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 modules/swagger-parser-v3/src/test/resources/issue-2244/components.yaml create mode 100644 modules/swagger-parser-v3/src/test/resources/issue-2244/openapi.yaml create mode 100644 modules/swagger-parser-v3/src/test/resources/issue-2244/operations.yaml diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java index af3b6aedbc..48d39fc9eb 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java @@ -969,7 +969,7 @@ private void processRefExamples(Map examples, String $ref) { if (example.get$ref() != null) { RefFormat ref = computeRefFormat(example.get$ref()); if (isAnExternalRefFormat(ref)) { - processRefExample(example, $ref); + processRefExample(example, file); } else { processRefToExternalExample(file + example.get$ref(), RefFormat.RELATIVE); } diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java index cba66fb1b1..e940792fc5 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java @@ -3313,6 +3313,20 @@ public void testIssue2081() { assertEquals(openAPI.getComponents().getSchemas().get("PetCreate").getProperties().size(), 2); } + @Test(description = "should resolve nested referenced examples even when parent reference contains path parameter") + public void testIssue2244() { + OpenAPIV3Parser openApiParser = new OpenAPIV3Parser(); + ParseOptions options = new ParseOptions(); + options.setResolve(true); + SwaggerParseResult parseResult = openApiParser.readLocation("issue-2244/openapi.yaml", null, options); + OpenAPI openAPI = parseResult.getOpenAPI(); + + assertNotNull(openAPI.getComponents().getExamples(), "should have resolved the component examples"); + Set exampleNames = new HashSet<>(); + exampleNames.add("ReproducerExample"); + assertEquals(openAPI.getComponents().getExamples().keySet(), exampleNames); + } + @Test(description = "responses should be inline") public void testFullyResolveResponses() { ParseOptions options = new ParseOptions(); diff --git a/modules/swagger-parser-v3/src/test/resources/issue-2244/components.yaml b/modules/swagger-parser-v3/src/test/resources/issue-2244/components.yaml new file mode 100644 index 0000000000..be5576599b --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/issue-2244/components.yaml @@ -0,0 +1,13 @@ +openapi: 3.0.3 + +components: + schemas: + ReproducerObject: + type: object + properties: + id: + type: integer + examples: + ReproducerExample: + value: + id: 1 \ No newline at end of file diff --git a/modules/swagger-parser-v3/src/test/resources/issue-2244/openapi.yaml b/modules/swagger-parser-v3/src/test/resources/issue-2244/openapi.yaml new file mode 100644 index 0000000000..fd0118c7e7 --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/issue-2244/openapi.yaml @@ -0,0 +1,10 @@ +openapi: 3.0.3 + +info: + title: Reproducer + description: Reproducer for the issue + version: 1.0.0 + +paths: + /reproducers/{id}: + $ref: "operations.yaml#/paths/~1reproducers~1{id}" \ No newline at end of file diff --git a/modules/swagger-parser-v3/src/test/resources/issue-2244/operations.yaml b/modules/swagger-parser-v3/src/test/resources/issue-2244/operations.yaml new file mode 100644 index 0000000000..bb9f684167 --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/issue-2244/operations.yaml @@ -0,0 +1,16 @@ +openapi: 3.0.3 + +paths: + /reproducers/{id}: + post: + description: Reproducer + responses: + "200": + description: Success + content: + application/json: + schema: + $ref: "components.yaml#/components/schemas/ReproducerObject" + examples: + normal: + $ref: "components.yaml#/components/examples/ReproducerExample" \ No newline at end of file