From d8131e0369e637245751e92760cd6e867fbe926d Mon Sep 17 00:00:00 2001 From: Manuel Boillod Date: Wed, 26 Apr 2017 15:34:09 +0200 Subject: [PATCH] fix Parsing of Model "example" is not consistent with parsing of Property "example" #448 --- .../parser/util/SwaggerDeserializer.java | 12 +--- .../io/swagger/parser/SwaggerParserTest.java | 58 ++++++++++++++++--- .../io/swagger/parser/util/TestUtils.java | 22 +++++++ .../test/resources/definition_example.yaml | 57 ++++++++++++++++++ .../src/test/resources/objectExample.json | 42 -------------- 5 files changed, 130 insertions(+), 61 deletions(-) create mode 100644 modules/swagger-parser/src/test/java/io/swagger/parser/util/TestUtils.java create mode 100644 modules/swagger-parser/src/test/resources/definition_example.yaml delete mode 100644 modules/swagger-parser/src/test/resources/objectExample.json diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java b/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java index 2bd540c129..04986ce87f 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java @@ -829,16 +829,8 @@ else if(!SCHEMA_KEYS.contains(key)) { } JsonNode exampleNode = node.get("example"); if(exampleNode != null) { - // we support text or object nodes - if(exampleNode.getNodeType().equals(JsonNodeType.OBJECT)) { - ObjectNode on = getObject("example", node, false, location, result); - if(on != null) { - model.setExample(on); - } - } - else { - model.setExample(exampleNode.toString()); - } + Object example = Json.mapper().convertValue(exampleNode, Object.class); + model.setExample(example); } if(model != null) { diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java b/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java index 6f2851ae12..d48b0ee568 100644 --- a/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java @@ -24,6 +24,7 @@ import io.swagger.models.properties.RefProperty; import io.swagger.models.properties.StringProperty; import io.swagger.parser.util.SwaggerDeserializationResult; +import io.swagger.parser.util.TestUtils; import io.swagger.util.Json; import io.swagger.util.Yaml; import org.testng.Assert; @@ -468,15 +469,7 @@ public void testIssue292WithCSVCollectionFormat() { QueryParameter qp = (QueryParameter) param; assertEquals(qp.getCollectionFormat(), "csv"); } - - @Test - public void testIssue255() { - SwaggerParser parser = new SwaggerParser(); - - Swagger swagger = parser.read("objectExample.json"); - assertEquals(swagger.getDefinitions().get("SamplePayload").getExample(), "[{\"op\":\"replace\",\"path\":\"/s\",\"v\":\"w\"}]"); - } - + @Test public void testIssue286() { SwaggerParser parser = new SwaggerParser(); @@ -803,6 +796,53 @@ public void testBadFormat() throws Exception { assertEquals(queryParameter.isUniqueItems(), true); } + @Test + public void testDefinitionExample() throws Exception { + SwaggerParser parser = new SwaggerParser(); + final Swagger swagger = parser.read(TestUtils.getResourceAbsolutePath("/definition_example.yaml")); + + ModelImpl model; + ArrayModel arrayModel; + + model = (ModelImpl)swagger.getDefinitions().get("NumberType"); + assertEquals((Double)model.getExample(), 2.0d, 0d); + + model = (ModelImpl)swagger.getDefinitions().get("IntegerType"); + assertEquals((int)model.getExample(), 2); + + model = (ModelImpl)swagger.getDefinitions().get("StringType"); + assertEquals((String)model.getExample(), "2"); + + model = (ModelImpl)swagger.getDefinitions().get("ObjectType"); + assertTrue(model.getExample() instanceof Map); + Map objectExample = (Map) model.getExample(); + assertEquals((String)objectExample.get("propertyA"), "valueA"); + assertEquals((Integer)objectExample.get("propertyB"), new Integer(123)); + + arrayModel = (ArrayModel)swagger.getDefinitions().get("ArrayType"); + assertTrue(arrayModel.getExample() instanceof List); + List arrayExample = (List) arrayModel.getExample(); + assertEquals((String)arrayExample.get(0).get("propertyA"), "valueA1"); + assertEquals((Integer)arrayExample.get(0).get("propertyB"), new Integer(123)); + assertEquals((String)arrayExample.get(1).get("propertyA"), "valueA2"); + assertEquals((Integer)arrayExample.get(1).get("propertyB"), new Integer(456)); + + model = (ModelImpl)swagger.getDefinitions().get("NumberTypeStringExample"); + assertEquals((String)model.getExample(), "2.0"); + + model = (ModelImpl)swagger.getDefinitions().get("IntegerTypeStringExample"); + assertEquals((String)model.getExample(), "2"); + + model = (ModelImpl)swagger.getDefinitions().get("StringTypeStringExample"); + assertEquals((String)model.getExample(), "2"); + + model = (ModelImpl)swagger.getDefinitions().get("ObjectTypeStringExample"); + assertEquals((String)model.getExample(), "{\"propertyA\": \"valueA\", \"propertyB\": 123}"); + + arrayModel = (ArrayModel) swagger.getDefinitions().get("ArrayTypeStringExample"); + assertEquals((String)arrayModel.getExample(), "[{\"propertyA\": \"valueA1\", \"propertyB\": 123}, {\"propertyA\": \"valueA2\", \"propertyB\": 456}]"); + } + @Test public void testIssue357() { SwaggerParser parser = new SwaggerParser(); diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/util/TestUtils.java b/modules/swagger-parser/src/test/java/io/swagger/parser/util/TestUtils.java new file mode 100644 index 0000000000..6c572ad228 --- /dev/null +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/util/TestUtils.java @@ -0,0 +1,22 @@ +package io.swagger.parser.util; + +import java.io.File; +import java.net.URISyntaxException; + +public class TestUtils { + + /** + * @param resourceLocation The resource location relative to classpath root (ie: starts with '/') + */ + public static String getResourceAbsolutePath(String resourceLocation) { + if (!resourceLocation.startsWith("/")) { + throw new RuntimeException("resourceLocation should be relative to classpath root (ie: starts with '/')"); + } + try { + // we use toURI + return new File(TestUtils.class.getResource(resourceLocation).toURI()).getAbsolutePath(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } +} diff --git a/modules/swagger-parser/src/test/resources/definition_example.yaml b/modules/swagger-parser/src/test/resources/definition_example.yaml new file mode 100644 index 0000000000..bbfd7db96e --- /dev/null +++ b/modules/swagger-parser/src/test/resources/definition_example.yaml @@ -0,0 +1,57 @@ +--- +swagger: '2.0' +info: + version: 1.0.0 + title: Pets Store +paths: {} +definitions: + + NumberType: + type: number + example: 2.0 + + IntegerType: + type: integer + example: 2 + + StringType: + type: string + example: "2" + + ObjectType: + type: object + example: + propertyA: valueA + propertyB: 123 + + ArrayType: + type: array + items: + type: object + example: + - propertyA: valueA1 + propertyB: 123 + - propertyA: valueA2 + propertyB: 456 + + NumberTypeStringExample: + type: number + example: "2.0" + + IntegerTypeStringExample: + type: integer + example: "2" + + StringTypeStringExample: + type: string + example: "2" + + ObjectTypeStringExample: + type: object + example: "{\"propertyA\": \"valueA\", \"propertyB\": 123}" + + ArrayTypeStringExample: + type: array + items: + type: object + example: "[{\"propertyA\": \"valueA1\", \"propertyB\": 123}, {\"propertyA\": \"valueA2\", \"propertyB\": 456}]" diff --git a/modules/swagger-parser/src/test/resources/objectExample.json b/modules/swagger-parser/src/test/resources/objectExample.json deleted file mode 100644 index 3582e3fe6d..0000000000 --- a/modules/swagger-parser/src/test/resources/objectExample.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "info": { - "title": "foo" - }, - "swagger": "2.0", - "paths": { - "/bar": { - "patch": { - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/SamplePayload" - } - } - ] - } - } - }, - "definitions": { - "SamplePayload": { - "type": "array", - "items": { - "type": "object", - "example": { - "op": "replace", - "path": "/s", - "v": "w" - } - }, - "example": [ - { - "op": "replace", - "path": "/s", - "v": "w" - } - ] - } - } -} \ No newline at end of file