package io.swagger.parser; import com.fasterxml.jackson.databind.node.ObjectNode; import io.swagger.matchers.SerializationMatchers; import io.swagger.models.*; import io.swagger.models.parameters.Parameter; import io.swagger.models.parameters.PathParameter; import io.swagger.models.parameters.QueryParameter; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.Property; import io.swagger.models.properties.RefProperty; import io.swagger.parser.util.SwaggerDeserializationResult; import io.swagger.util.ResourceUtils; import org.testng.annotations.Test; import java.io.IOException; import java.math.BigDecimal; import java.nio.file.Paths; import java.util.List; import static org.testng.Assert.*; public class SwaggerReaderTest { @Test(description = "it should read the uber api with file scheme") public void readUberApiFromFile() { final SwaggerParser parser = new SwaggerParser(); java.nio.file.Path currentRelativePath = Paths.get(""); String curPath = currentRelativePath.toAbsolutePath().toString(); final Swagger swagger = parser.read("file:///" + curPath + "/src/test/resources/uber.json"); assertNotNull(swagger); } @Test(description = "it should read the uber api with file scheme and spaces") public void readUberApiFromFileWithSpaces() { final SwaggerParser parser = new SwaggerParser(); java.nio.file.Path currentRelativePath = Paths.get(""); String curPath = currentRelativePath.toAbsolutePath().toString(); final Swagger swagger = parser.read("file:///" + curPath + "/src/test/resources/s%20p%20a%20c%20e%20s/uber.json"); assertNotNull(swagger); } @Test(description = "it should read the uber api from Path URI") public void readUberApiFromPathUri() { final SwaggerParser parser = new SwaggerParser(); java.nio.file.Path uberPath = Paths.get("src/test/resources/uber.json"); final Swagger swagger = parser.read(uberPath.toUri().toString()); assertNotNull(swagger); } @Test(description = "it should read the uber api from File URI") public void readUberApiFromFileUri() { final SwaggerParser parser = new SwaggerParser(); java.io.File uberFile = new java.io.File("src/test/resources/uber.json"); final Swagger swagger = parser.read(uberFile.toURI().toString()); assertNotNull(swagger); } @Test(description = "it should read the uber api with url string without file scheme") public void readUberApiFromFileNoScheme() { final SwaggerParser parser = new SwaggerParser(); final Swagger swagger = parser.read("src/test/resources/uber.json"); assertNotNull(swagger); } @Test(description = "it should read the uber api") public void readUberApi() { final SwaggerParser parser = new SwaggerParser(); final Swagger swagger = parser.read("uber.json"); assertNotNull(swagger); } @Test(description = "it should read the simple example with minimum values") public void readSimpleExampleWithMinimumValues() { final SwaggerParser parser = new SwaggerParser(); final Swagger swagger = parser.read("sampleWithMinimumValues.yaml"); final QueryParameter qp = (QueryParameter) swagger.getPaths().get("/pets").getGet().getParameters().get(0); assertEquals(qp.getMinimum(), new BigDecimal("0.0")); } @Test(description = "it should read the simple example with model extensions") public void readSimpleExampleWithModelExtensions() { final SwaggerParser parser = new SwaggerParser(); final Swagger swagger = parser.read("sampleWithMinimumValues.yaml"); final Model model = swagger.getDefinitions().get("Cat"); assertNotNull(model.getVendorExtensions().get("x-extension-here")); } @Test(description = "it should detect yaml") public void detectYaml() { final SwaggerParser parser = new SwaggerParser(); final Swagger swagger = parser.read("minimal_y"); assertEquals(swagger.getSwagger(), "2.0"); } @Test(description = "it should detect json") public void detectJson() { final SwaggerParser parser = new SwaggerParser(); final Swagger swagger = parser.read("minimal_j"); assertEquals(swagger.getSwagger(), "2.0"); } @Test(description = "it should read the issue 16 resource") public void testIssue16() { final SwaggerParser parser = new SwaggerParser(); final Swagger swagger = parser.read("issue_16.yaml"); assertNotNull(swagger); } @Test(description = "it should test https://github.com/swagger-api/swagger-codegen/issues/469") public void testIssue469() { final SwaggerParser parser = new SwaggerParser(); final Swagger swagger = parser.read("issue_469.json"); final String expectedJson = "{" + " \"id\" : 12345," + " \"name\" : \"Gorilla\"" + "}"; SerializationMatchers.assertEqualsToJson(swagger.getDefinitions().get("Pet").getExample(), expectedJson); } @Test(description = "it should read the issue 59 resource") public void testIssue59() throws IOException { final SwaggerParser parser = new SwaggerParser(); final String path = "uber.json"; final Swagger swaggerFromString = parser.parse(ResourceUtils.loadClassResource(getClass(), path)); final Swagger swaggerFromFile = parser.read(path); assertEquals(swaggerFromFile, swaggerFromString); } @Test public void testIssueSwaggerUi1792() throws Exception { final SwaggerParser parser = new SwaggerParser(); final String path = "thing.json"; final Swagger swaggerFromString = parser.parse(ResourceUtils.loadClassResource(getClass(), path)); Model thing = swaggerFromString.getDefinitions().get("Thing"); assertTrue(thing instanceof ComposedModel); ComposedModel composedModel = (ComposedModel) thing; List<Model> models = composedModel.getAllOf(); assertTrue(models.size() == 2); assertTrue(models.get(0) instanceof RefModel); assertTrue(models.get(1) instanceof ModelImpl); Model thingSummary = swaggerFromString.getDefinitions().get("ThingSummary"); assertTrue(thingSummary instanceof ModelImpl); } @Test public void testIssue207() throws Exception { String spec = "{\n" + " \"swagger\": \"2.0\",\n" + " \"paths\": {\n" + " \"/foo\": {\n" + " \"get\": {\n" + " \"parameters\": {},\n" + " \"responses\": {\n" + " \"200\": {\n" + " \"description\": \"successful operation\",\n" + " \"schema\": {\n" + " \"type\": \"array\",\n" + " \"items\": {\n" + " \"$ref\": \"#/definitions/Pet\"\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }\n" + " },\n" + " \"definitions\": {\n" + " \"Pet\": {\n" + " \"type\": \"object\",\n" + " \"properties\": {\n" + " \"name\": {\n" + " \"type\": \"string\"\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}"; SwaggerDeserializationResult result = new SwaggerParser().readWithInfo(spec); assertNotNull(result); Response response = result.getSwagger().getPath("/foo").getGet().getResponses().get("200"); assertNotNull(response); Property schema = response.getSchema(); assertTrue(schema instanceof ArrayProperty); ArrayProperty ap = (ArrayProperty) schema; assertTrue(ap.getItems() instanceof RefProperty); } @Test public void testIssue208() throws Exception { String spec = "{\n" + " \"swagger\": \"2.0\",\n" + " \"paths\": {},\n" + " \"definitions\": {\n" + " \"Dog\": {\n" + " \"title\": \"Dog\",\n" + " \"type\": \"object\",\n" + " \"allOf\": [\n" + " {\n" + " \"$ref\": \"#/definitions/Pet\"\n" + " }\n" + " ],\n" + " \"x-color\": \"red\"\n" + " }\n" + " }\n" + "}"; SwaggerDeserializationResult result = new SwaggerParser().readWithInfo(spec); assertNotNull(result); Swagger swagger = result.getSwagger(); assertNotNull(swagger); Model dog = swagger.getDefinitions().get("Dog"); assertNotNull(dog); assertTrue(dog instanceof ComposedModel); ComposedModel cm = (ComposedModel) dog; assertEquals(cm.getTitle(), "Dog"); assertTrue(cm.getAllOf().size() == 1); assertTrue(cm.getAllOf().get(0) instanceof RefModel); assertNotNull(cm.getVendorExtensions()); assertEquals(cm.getVendorExtensions().get("x-color"), "red"); } @Test(description = "issue 206, not supported yet") public void testIssue206() { String spec = "swagger: '2.0'\n" + "paths: {}\n" + "definitions:\n" + " Model:\n" + " properties:\n" + " name:\n" + " type: string\n" + " required: true"; SwaggerDeserializationResult result = new SwaggerParser().readWithInfo(spec); // TODO: when 206 is resolved, enable the assertions here } @Test public void testIssue205() { String spec = "swagger: '2.0'\n" + "info:\n" + " title: nice\n" + "paths: {}\n" + "definitions:\n" + " Empty:\n" + " type: string\n" + " description: 'Expected empty response could be {}'"; SwaggerDeserializationResult result = new SwaggerParser().readWithInfo(spec); assertTrue(result.getMessages().size() == 0); Swagger swagger = result.getSwagger(); Model definition = swagger.getDefinitions().get("Empty"); assertNotNull(definition); assertTrue(definition instanceof ModelImpl); } @Test public void testIssue136() { String spec = "swagger: '2.0'\n" + "info:\n" + " title: issue 136\n" + "paths:\n" + " /foo:\n" + " get:\n" + " parameters: []\n" + " responses:\n" + " 200:\n" + " description: 'the pet'\n" + " schema:\n" + " $ref: 'http://petstore.swagger.io/v2/swagger.json#/definitions/Pet'"; SwaggerDeserializationResult result = new SwaggerParser().readWithInfo(spec); Swagger swagger = result.getSwagger(); Property property = swagger.getPath("/foo").getGet().getResponses().get("200").getSchema(); assertNotNull(property); assertTrue(property instanceof RefProperty); } @Test public void testIssue192() { String spec = "swagger: '2.0'\n" + "info:\n" + " title: issue 192\n" + "paths:\n" + " /foo:\n" + " get:\n" + " parameters:\n" + " - name: Code\n" + " in: path\n" + " description: The code\n" + " required: true\n" + " type: string\n" + " minLength: 4\n" + " maxLength: 5\n" + " pattern: '^[a-zA-Z]'\n" + " responses:\n" + " 200:\n" + " description: 'the pet'"; SwaggerDeserializationResult result = new SwaggerParser().readWithInfo(spec); Swagger swagger = result.getSwagger(); Parameter param = swagger.getPath("/foo").getGet().getParameters().get(0); assertTrue(param instanceof PathParameter); PathParameter pathParameter = (PathParameter) param; assertEquals(pathParameter.getMinLength(), new Integer(4)); assertEquals(pathParameter.getMaxLength(), new Integer(5)); assertNull(pathParameter.isReadOnly()); assertEquals(pathParameter.getPattern(), "^[a-zA-Z]"); } @Test public void testIssue277() { final SwaggerParser parser = new SwaggerParser(); final Swagger swagger = parser.read("issue_277.yaml"); Path path = swagger.getPath("/buckets/{bucketKey}/details"); assertNotNull(path); Operation get = path.getGet(); assertNotNull(get); assertTrue(get.getParameters().size() == 1); Parameter param1 = get.getParameters().get(0); assertEquals(param1.getIn(), "path"); assertEquals(param1.getName(), "bucketKey"); } @Test public void testIssue364() { String spec = "swagger: '2.0'\n" + "info:\n" + " title: issue 192\n" + "paths:\n" + " /foo:\n" + " get:\n" + " parameters:\n" + " - name: Code\n" + " in: query\n" + " description: The code\n" + " required: true\n" + " readOnly: true\n" + " allowEmptyValue: true\n" + " responses:\n" + " 200:\n" + " description: 'the pet'"; SwaggerDeserializationResult result = new SwaggerParser().readWithInfo(spec); Swagger swagger = result.getSwagger(); Parameter param = swagger.getPath("/foo").getGet().getParameters().get(0); assertTrue(param instanceof QueryParameter); QueryParameter pathParameter = (QueryParameter) param; assertTrue(pathParameter.isReadOnly()); assertTrue(pathParameter.getAllowEmptyValue()); } @Test(description = "it should read an example within an inlined schema") public void testIssue1261InlineSchemaExample() { final SwaggerParser parser = new SwaggerParser(); final Swagger swagger = parser.read("issue-1261.yaml"); Path path = swagger.getPath("/user"); assertNotNull(path); Operation get = path.getGet(); assertNotNull(get); assertTrue(get.getResponses().size() == 1); Response response = get.getResponses().get("200"); Property schema = response.getSchema(); Object example = schema.getExample(); assertNotNull(example); assertTrue(example instanceof ObjectNode); ObjectNode objectNode = (ObjectNode) example; assertEquals(objectNode.get("id").intValue(), 42); assertEquals(objectNode.get("name").textValue(), "Arthur Dent"); } }