From f8bfcedb82010413f66afc1eb88311b63905c2ee Mon Sep 17 00:00:00 2001 From: gracekarina Date: Mon, 23 Jan 2023 20:52:19 -0500 Subject: [PATCH] fix for issue-1865 - dereferencing files with dots Co-authored-by: gracekarina Co-authored-by: frantuma --- .../io/swagger/v3/parser/util/RefUtils.java | 14 +++++---- .../v3/parser/test/OpenAPIV3ParserTest.java | 30 +++++++++++++++++++ .../resources/issue-1621/example.get.yaml | 0 .../resources/issue-1621/example.openapi.yaml | 0 .../resources/issue-1621/example.post.yaml | 0 .../test/resources/issue-1865/apis/foo.yaml | 24 +++++++++++++++ .../issue-1865/examples/foo.example.yaml | 3 ++ .../issue-1865/models/foo.model.yaml | 6 ++++ .../test/resources/issue-1865/openapi30.yaml | 9 ++++++ .../io/swagger/parser/OpenAPIParserTest.java | 20 ------------- 10 files changed, 81 insertions(+), 25 deletions(-) rename modules/{swagger-parser => swagger-parser-v3}/src/test/resources/issue-1621/example.get.yaml (100%) rename modules/{swagger-parser => swagger-parser-v3}/src/test/resources/issue-1621/example.openapi.yaml (100%) rename modules/{swagger-parser => swagger-parser-v3}/src/test/resources/issue-1621/example.post.yaml (100%) create mode 100644 modules/swagger-parser-v3/src/test/resources/issue-1865/apis/foo.yaml create mode 100644 modules/swagger-parser-v3/src/test/resources/issue-1865/examples/foo.example.yaml create mode 100644 modules/swagger-parser-v3/src/test/resources/issue-1865/models/foo.model.yaml create mode 100644 modules/swagger-parser-v3/src/test/resources/issue-1865/openapi30.yaml diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/RefUtils.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/RefUtils.java index 7fcf56a4c6..561a3b5679 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/RefUtils.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/RefUtils.java @@ -14,6 +14,7 @@ import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -47,10 +48,13 @@ public static String computeDefinitionName(String ref) { plausibleName = filePathElements[filePathElements.length - 1]; final String[] split = plausibleName.split("\\."); - // Fix for issue-1621 - plausibleName = split[0]; - for (int i = 1; i < split.length - 1; i++) { - plausibleName += "." + split[i]; + // Fix for issue-1621 and issue-1865 + //validate number of dots + if(split.length > 2) { + //Remove dot so ref can be interpreted as internal and relative in Swagger-Core schema class 'set$ref' + plausibleName = String.join("", Arrays.copyOf(split, split.length - 1)); + }else{ + plausibleName = split[0]; } } @@ -225,4 +229,4 @@ private static String readAll(Path path) throws IOException { return IOUtils.toString(inputStream, UTF_8); } } -} \ No newline at end of file +} 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 5bb8fc8182..97eac48a99 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 @@ -86,6 +86,36 @@ public class OpenAPIV3ParserTest { protected int serverPort = getDynamicPort(); protected WireMockServer wireMockServer; + @Test + public void testIssue1621() { + final ParseOptions parseOptions = new ParseOptions(); + parseOptions.setResolve(true); + parseOptions.setResolveFully(true); + parseOptions.setResolveCombinators(false); + SwaggerParseResult parseResult = new OpenAPIV3Parser().readLocation("issue-1621/example.openapi.yaml", null, parseOptions); + assertEquals(0, parseResult.getMessages().size()); + OpenAPI api = parseResult.getOpenAPI(); + assertEquals( api.getPaths() + .get("/example") + .getPost() + .getRequestBody() + .getContent() + .get("application/json") + .getSchema() + .getTitle(),"POST Example"); + } + + @Test + public void testIssue1865() throws Exception { + ParseOptions options = new ParseOptions(); + options.setResolve(true); + SwaggerParseResult result = new OpenAPIV3Parser().readLocation("src/test/resources/issue-1865/openapi30.yaml", null, options); + + Assert.assertNotNull(result); + Assert.assertNotNull(result.getOpenAPI()); + Assert.assertEquals(result.getOpenAPI().getComponents().getSchemas().get("Foo").get$ref(), "#/components/schemas/foomodel"); + } + @Test public void testIssue1777() { OpenAPIV3Parser openApiParser = new OpenAPIV3Parser(); diff --git a/modules/swagger-parser/src/test/resources/issue-1621/example.get.yaml b/modules/swagger-parser-v3/src/test/resources/issue-1621/example.get.yaml similarity index 100% rename from modules/swagger-parser/src/test/resources/issue-1621/example.get.yaml rename to modules/swagger-parser-v3/src/test/resources/issue-1621/example.get.yaml diff --git a/modules/swagger-parser/src/test/resources/issue-1621/example.openapi.yaml b/modules/swagger-parser-v3/src/test/resources/issue-1621/example.openapi.yaml similarity index 100% rename from modules/swagger-parser/src/test/resources/issue-1621/example.openapi.yaml rename to modules/swagger-parser-v3/src/test/resources/issue-1621/example.openapi.yaml diff --git a/modules/swagger-parser/src/test/resources/issue-1621/example.post.yaml b/modules/swagger-parser-v3/src/test/resources/issue-1621/example.post.yaml similarity index 100% rename from modules/swagger-parser/src/test/resources/issue-1621/example.post.yaml rename to modules/swagger-parser-v3/src/test/resources/issue-1621/example.post.yaml diff --git a/modules/swagger-parser-v3/src/test/resources/issue-1865/apis/foo.yaml b/modules/swagger-parser-v3/src/test/resources/issue-1865/apis/foo.yaml new file mode 100644 index 0000000000..2b0c3d42b5 --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/issue-1865/apis/foo.yaml @@ -0,0 +1,24 @@ +#broken-ref/apis/foo.yaml +openapi: 3.0.0 +info: + title: swagger parser bug, worked until 2.0.28 but not since 2.0.29 + version: '1.0' + +paths: + + '/foo': + post: + summary: create foo + description: Create a new foo. + responses: + '200': + description: a Foo + content: + application/json: + schema: + $ref: '#/components/schemas/Foo' + +components: + schemas: + Foo: + $ref: ../models/foo.model.yaml \ No newline at end of file diff --git a/modules/swagger-parser-v3/src/test/resources/issue-1865/examples/foo.example.yaml b/modules/swagger-parser-v3/src/test/resources/issue-1865/examples/foo.example.yaml new file mode 100644 index 0000000000..43f0089b9b --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/issue-1865/examples/foo.example.yaml @@ -0,0 +1,3 @@ +# broken-ref/examples/foo.example.yaml +value: + foo: bar \ No newline at end of file diff --git a/modules/swagger-parser-v3/src/test/resources/issue-1865/models/foo.model.yaml b/modules/swagger-parser-v3/src/test/resources/issue-1865/models/foo.model.yaml new file mode 100644 index 0000000000..8687b26293 --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/issue-1865/models/foo.model.yaml @@ -0,0 +1,6 @@ +#broken-ref/models/foo.model.yaml +title: Foo +type: object +properties: + foo: + type: string \ No newline at end of file diff --git a/modules/swagger-parser-v3/src/test/resources/issue-1865/openapi30.yaml b/modules/swagger-parser-v3/src/test/resources/issue-1865/openapi30.yaml new file mode 100644 index 0000000000..f8895579a5 --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/issue-1865/openapi30.yaml @@ -0,0 +1,9 @@ +# broken-ref/openapi30.yaml +openapi: 3.0.3 +info: + title: ref chain + version: '1' + +paths: + /foo: + $ref: ./apis/foo.yaml#/paths/~1foo \ No newline at end of file diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java b/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java index 26dde2981c..cfcdafe211 100644 --- a/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java @@ -65,26 +65,6 @@ public void testIssue1143(){ assertNotNull(result.getOpenAPI().getComponents().getSchemas().get("identificacion_usuario_aplicacion")); } - @Test - public void testIssue1621() { - final ParseOptions parseOptions = new ParseOptions(); - parseOptions.setResolve(true); - parseOptions.setResolveFully(true); - parseOptions.setResolveCombinators(false); - OpenAPIParser openAPIParser = new OpenAPIParser(); - SwaggerParseResult swaggerParseResult = openAPIParser.readLocation("issue-1621/example.openapi.yaml", null, parseOptions); - assertEquals(0, swaggerParseResult.getMessages().size()); - OpenAPI api = swaggerParseResult.getOpenAPI(); - assertEquals("POST Example", api.getPaths() - .get("/example") - .getPost() - .getRequestBody() - .getContent() - .get("application/json") - .getSchema() - .getTitle()); - } - @Test public void testIssue749() { ParseOptions options = new ParseOptions();