diff --git a/modules/swagger-parser-core/src/main/java/io/swagger/v3/parser/core/models/ParseOptions.java b/modules/swagger-parser-core/src/main/java/io/swagger/v3/parser/core/models/ParseOptions.java index 9814dde6d2..526f732cff 100644 --- a/modules/swagger-parser-core/src/main/java/io/swagger/v3/parser/core/models/ParseOptions.java +++ b/modules/swagger-parser-core/src/main/java/io/swagger/v3/parser/core/models/ParseOptions.java @@ -8,6 +8,7 @@ public class ParseOptions { private boolean flattenComposedSchemas; private boolean camelCaseFlattenNaming; private boolean skipMatches; + private boolean allowEmptyStrings = true; public boolean isResolve() { return resolve; @@ -59,4 +60,12 @@ public boolean isCamelCaseFlattenNaming() { public void setCamelCaseFlattenNaming(boolean camelCaseFlattenNaming) { this.camelCaseFlattenNaming = camelCaseFlattenNaming; } + + public boolean isAllowEmptyString() { + return allowEmptyStrings; + } + + public void setAllowEmptyString(boolean allowEmptyStrings) { + this.allowEmptyStrings = allowEmptyStrings; + } } diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java index be40ade290..719bd2e669 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java @@ -131,7 +131,10 @@ public SwaggerParseResult readWithInfo(String path, JsonNode node) { } public SwaggerParseResult parseJsonNode(String path, JsonNode node) { - return new OpenAPIDeserializer().deserialize(node, path); + return new OpenAPIDeserializer().deserialize(node, path,new ParseOptions()); + } + public SwaggerParseResult parseJsonNode(String path, JsonNode node, ParseOptions options) { + return new OpenAPIDeserializer().deserialize(node, path, options); } public SwaggerParseResult readContents(String yaml) { @@ -149,7 +152,12 @@ private SwaggerParseResult readContents(String swaggerAsString, List warnings = new ArrayList<>(); private List unique = new ArrayList<>(); private List uniqueTags = new ArrayList<>(); + private boolean allowEmptyStrings = true; public ParseResult() { } + public boolean isAllowEmptyStrings() { + return this.allowEmptyStrings; + } + + public void setAllowEmptyStrings(boolean allowEmptyStrings) { + this.allowEmptyStrings = allowEmptyStrings; + } + + public ParseResult allowEmptyStrings(boolean allowEmptyStrings) { + this.allowEmptyStrings = allowEmptyStrings; + return this; + } + public void unsupported(String location, String key, JsonNode value) { unsupported.put(new Location(location, key), value); } @@ -3186,6 +3214,7 @@ public boolean isValid() { return this.valid; } + public List getMessages() { List messages = new ArrayList(); for (Location l : extra.keySet()) { 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 4b63a6d9f5..bb902ea029 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 @@ -83,6 +83,40 @@ public class OpenAPIV3ParserTest { protected int serverPort = getDynamicPort(); protected WireMockServer wireMockServer; + + @Test + public void testEmptyStrings_False() throws Exception{ + ParseOptions options = new ParseOptions(); + options.setAllowEmptyString(false); + SwaggerParseResult result = new OpenAPIV3Parser().readLocation("src/test/resources/empty-strings.yaml", null, options); + + Assert.assertNotNull(result); + Assert.assertNotNull(result.getOpenAPI()); + OpenAPI openAPI = result.getOpenAPI(); + assertNull(openAPI.getInfo().getTitle()); + assertNotNull(openAPI.getInfo().getVersion()); + assertNull(openAPI.getInfo().getLicense().getName()); + assertNull(openAPI.getPaths().get("/something").getGet().getResponses().get("200").getDescription()); + assertNull(openAPI.getPaths().get("/something").getGet().getParameters().get(0).getDescription()); + } + + + @Test + public void testEmptyStrings_True() throws Exception{ + ParseOptions options = new ParseOptions(); + options.setAllowEmptyString(true); + SwaggerParseResult result = new OpenAPIV3Parser().readLocation("src/test/resources/empty-strings.yaml", null, options); + + Assert.assertNotNull(result); + Assert.assertNotNull(result.getOpenAPI()); + OpenAPI openAPI = result.getOpenAPI(); + assertNotNull(openAPI.getInfo().getTitle()); + assertNotNull(openAPI.getInfo().getLicense().getName()); + assertNotNull(openAPI.getPaths().get("/something").getGet().getResponses().get("200").getDescription()); + assertNotNull(openAPI.getPaths().get("/something").getGet().getParameters().get(0).getDescription()); + } + + @Test public void testIssue1561() { ParseOptions options = new ParseOptions(); @@ -1026,8 +1060,7 @@ public void test30(@Injectable final List auths) throws Exce pathFile = pathFile.replace("${dynamicPort}", String.valueOf(this.serverPort)); ParseOptions options = new ParseOptions(); options.setResolve(true); - - SwaggerParseResult result = new OpenAPIV3Parser().readContents(pathFile, auths, options ); + SwaggerParseResult result = new OpenAPIV3Parser().readContents(pathFile, auths, options); Assert.assertNotNull(result); Assert.assertNotNull(result.getOpenAPI()); diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/util/OpenAPIDeserializerTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/util/OpenAPIDeserializerTest.java index 9672fd5500..7d52415f59 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/util/OpenAPIDeserializerTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/util/OpenAPIDeserializerTest.java @@ -2966,7 +2966,6 @@ public void readPathsObject(JsonNode rootNode) throws Exception { final OpenAPI openAPI = result.getOpenAPI(); Assert.assertNotNull(openAPI); - //System.out.println(openAPI); final Paths paths = openAPI.getPaths(); Assert.assertNotNull(paths); @@ -2992,7 +2991,7 @@ public void readPathsObject(JsonNode rootNode) throws Exception { Assert.assertNotNull(petEndpoint.getPost().getTags()); Assert.assertEquals(petEndpoint.getPost().getTags().size(), 1); Assert.assertEquals(petEndpoint.getPost().getSummary(), "Add a new pet to the store"); - Assert.assertNull(petEndpoint.getPost().getDescription()); + Assert.assertEquals(petEndpoint.getPost().getDescription(), ""); Assert.assertEquals(petEndpoint.getPost().getOperationId(), "addPet"); Assert.assertNotNull(petEndpoint.getServers()); Assert.assertEquals(petEndpoint.getServers().size(), 1); @@ -3150,7 +3149,7 @@ public void readOAS(/*JsonNode rootNode*/) throws Exception { Assert.assertNotNull(stripe.getPost()); - Assert.assertNull(stripe.getPost().getDescription()); + Assert.assertEquals(stripe.getPost().getDescription(), ""); Assert.assertEquals(stripe.getPost().getOperationId(), "Create3DSecure"); Assert.assertNotNull(stripe.getPost().getParameters()); @@ -3169,7 +3168,7 @@ public void readOAS(/*JsonNode rootNode*/) throws Exception { Assert.assertNotNull(stripeGet.getGet()); - Assert.assertNull(stripeGet.getGet().getDescription()); + Assert.assertEquals(stripeGet.getGet().getDescription(), ""); Assert.assertEquals(stripeGet.getGet().getOperationId(), "AllAccountExternalAccounts"); Assert.assertNotNull(stripeGet.getGet().getParameters()); diff --git a/modules/swagger-parser-v3/src/test/resources/empty-strings.yaml b/modules/swagger-parser-v3/src/test/resources/empty-strings.yaml new file mode 100644 index 0000000000..015e88ea4e --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/empty-strings.yaml @@ -0,0 +1,55 @@ +openapi: 3.0.0 +info: + title: '' + description: '' + version: 1.0.0 + license: + name: '' + contact: + name: '' + +externalDocs: + url: https://example.com + description: '' + +servers: + - url: https://example.com + description: '' + +tags: + - name: tag1 + description: '' + +paths: + /something: + summary: '' + description: '' + get: + summary: '' + description: '' + parameters: + - name: role + in: query + schema: + type: string + example: '' + description: '' + example: '' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Foo' + +components: + schemas: + Foo: + type: object + description: '' + properties: + foo: + type: string + description: '' + example: '' \ No newline at end of file