diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/PathsProcessor.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/PathsProcessor.java index 1aacbe7d81..d9bce72bb7 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/PathsProcessor.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/PathsProcessor.java @@ -199,10 +199,16 @@ protected void updateRefs(Parameter param, String pathRef) { if (param.get$ref() != null){ param.set$ref(computeRef(param.get$ref(), pathRef)); } - if(param.getSchema() != null) { + if (param.getSchema() != null) { updateRefs(param.getSchema(), pathRef); } - if(param.getContent() != null) { + if (param.getExamples() != null) { + Map examples = param.getExamples(); + for (Example example : examples.values()) { + updateRefs(example, pathRef); + } + } + if (param.getContent() != null) { Map content = param.getContent(); for (String key: content.keySet()) { MediaType mediaType = content.get(key); 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..c7dfcb0e73 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,24 @@ public void testIssue2081() { assertEquals(openAPI.getComponents().getSchemas().get("PetCreate").getProperties().size(), 2); } + @Test(description = "should resolve nested relative references in examples") + public void testIssue2229() { + OpenAPIV3Parser openApiParser = new OpenAPIV3Parser(); + ParseOptions options = new ParseOptions(); + options.setResolve(true); + SwaggerParseResult parseResult = openApiParser.readLocation("issue-2229/openapi-rest.yml", null, options); + OpenAPI openAPI = parseResult.getOpenAPI(); + + Map parameterExamples = openAPI.getPaths().get("/api/v1/rules").getGet().getParameters().get(0).getExamples(); + assertEquals(parameterExamples.get("default").get$ref(), "#/components/examples/StatusQueryParameter"); + + assertNotNull(openAPI.getComponents(), "should have resolved the components"); + assertNotNull(openAPI.getComponents().getExamples(), "should have resolved the examples"); + Set exampleNames = new HashSet<>(); + exampleNames.add("StatusQueryParameter"); + 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-2229/examples/rule/rule-parameters.yml b/modules/swagger-parser-v3/src/test/resources/issue-2229/examples/rule/rule-parameters.yml new file mode 100644 index 0000000000..37c2845690 --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/issue-2229/examples/rule/rule-parameters.yml @@ -0,0 +1,2 @@ +StatusQueryParameter: + value: 'ACTIVE' \ No newline at end of file diff --git a/modules/swagger-parser-v3/src/test/resources/issue-2229/openapi-rest.yml b/modules/swagger-parser-v3/src/test/resources/issue-2229/openapi-rest.yml new file mode 100644 index 0000000000..9545c7923e --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/issue-2229/openapi-rest.yml @@ -0,0 +1,24 @@ +openapi: 3.0.3 +info: + title: Rules + contact: + name: myname + email: zzz@mail.com + description: API desgined for creating, updating, retrieving, and deleting rules and reference entities (reasons, processes). + version: 1.0.2 +security: + - itxBearerAuth: [] +servers: + - description: The localhost API server. + url: '{protocol}://localhost:{port}' + variables: + protocol: + default: 'http' + port: + default: "8080" +tags: + - name: Rule + description: A rule defines when a product should be restricted from certain business processes based on specific conditions. +paths: + /api/v1/rules: + $ref: './paths/rules/rules.yml' \ No newline at end of file diff --git a/modules/swagger-parser-v3/src/test/resources/issue-2229/paths/rules/rules.yml b/modules/swagger-parser-v3/src/test/resources/issue-2229/paths/rules/rules.yml new file mode 100644 index 0000000000..e7dc6d2281 --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/issue-2229/paths/rules/rules.yml @@ -0,0 +1,25 @@ +get: + tags: + - Rule + summary: Search rules (paginated) + description: My description + operationId: searchRulesPaginated + parameters: + - name: status + in: query + description: Filter by rule status (ACTIVE, INACTIVE, ARCHIVED). + required: false + schema: + type: string + enum: [ ACTIVE, INACTIVE, ARCHIVED ] + description: "Current lifecycle status of the rule." + examples: + default: + $ref: '../../examples/rule/rule-parameters.yml#/StatusQueryParameter' + responses: + '200': + description: OK - Paginated list of rules successfully retrieved. + content: + application/json: + schema: + type: object \ No newline at end of file