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 d450386a03..3c73eb50ff 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 @@ -859,17 +859,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 if (exampleNode.isValueNode()) { - model.setExample(exampleNode.asText()); - } 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 5dfd10d3f7..d755074e10 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 @@ -28,6 +28,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; @@ -487,15 +488,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(); @@ -853,6 +846,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