From b0746650612b1ac8cd347ce07e3e64a4b7141669 Mon Sep 17 00:00:00 2001 From: gracekarina <> Date: Sat, 30 Sep 2017 19:42:55 -0500 Subject: [PATCH 1/9] class working, 3 tests OK --- .../parser/v3/util/InlineModelResolver.java | 458 ++++++++ .../v3/util/InlineModelResolverTest.java | 999 ++++++++++++++++++ 2 files changed, 1457 insertions(+) create mode 100644 modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java create mode 100644 modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java b/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java new file mode 100644 index 0000000000..357272d94f --- /dev/null +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java @@ -0,0 +1,458 @@ +package io.swagger.parser.v3.util; + +import io.swagger.oas.models.OpenAPI; +import io.swagger.oas.models.Operation; +import io.swagger.oas.models.PathItem; +import io.swagger.oas.models.media.ArraySchema; +import io.swagger.oas.models.media.ComposedSchema; +import io.swagger.oas.models.media.MediaType; +import io.swagger.oas.models.media.ObjectSchema; +import io.swagger.oas.models.media.Schema; +import io.swagger.oas.models.media.XML; +import io.swagger.oas.models.parameters.Parameter; +import io.swagger.oas.models.parameters.RequestBody; +import io.swagger.oas.models.responses.ApiResponse; +import io.swagger.util.Json; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class InlineModelResolver { + private OpenAPI openAPI; + private boolean skipMatches; + static Logger LOGGER = LoggerFactory.getLogger(InlineModelResolver.class); + + Map addedModels = new HashMap<>(); + Map generatedSignature = new HashMap<>(); + + public void flatten(OpenAPI openAPI) { + this.openAPI = openAPI; + + if (openAPI.getComponents() != null) { + + if (openAPI.getComponents().getSchemas() == null) { + openAPI.getComponents().setSchemas(new HashMap<>()); + } + } + + // operations + Map paths = openAPI.getPaths(); + Map models = openAPI.getComponents().getSchemas(); + + if (paths != null) { + for (String pathname : paths.keySet()) { + PathItem path = paths.get(pathname); + + for (Operation operation : path.readOperations()) { + RequestBody body = operation.getRequestBody(); + + if (body != null) { + if (body.getContent() != null) { + Map content = body.getContent(); + for(String key: content.keySet()) { + if (content.get(key) != null) { + MediaType mediaType = content.get(key); + if(mediaType.getSchema() != null) { + Schema model = mediaType.getSchema(); + if (model.getProperties() != null && model.getProperties().size() > 0) { + flattenProperties(model.getProperties(), pathname); + String modelName = resolveModelName(model.getTitle(), model.getName()); + mediaType.setSchema(new Schema().$ref(modelName)); + addGenerated(modelName, model); + openAPI.getComponents().addSchemas(modelName, model); + + } else if (model instanceof ArraySchema) { + ArraySchema am = (ArraySchema) model; + Schema inner = am.getItems(); + + if (inner instanceof ObjectSchema) { + ObjectSchema op = (ObjectSchema) inner; + if (op.getProperties() != null && op.getProperties().size() > 0) { + flattenProperties(op.getProperties(), pathname); + String modelName = resolveModelName(op.getTitle(), model.getName()); + Schema innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + if (existing != null) { + am.setItems(new Schema().$ref(existing)); + } else { + am.setItems(new Schema().$ref(modelName)); + addGenerated(modelName, innerModel); + openAPI.getComponents().addSchemas(modelName, innerModel); + } + } + } + } + } + } + } + } + } + Map responses = operation.getResponses(); + if (responses != null) { + for (String key : responses.keySet()) { + ApiResponse response = responses.get(key); + if (response.getContent() != null) { + Map content = response.getContent(); + for (String name: content.keySet()) { + if (content.get(name) != null) { + MediaType media = content.get(name); + if (media.getSchema() != null) { + Schema property = media.getSchema(); + if (property instanceof ObjectSchema) { + ObjectSchema op = (ObjectSchema) property; + if (op.getProperties() != null && op.getProperties().size() > 0) { + String modelName = resolveModelName(op.getTitle(), "inline_response_" + key); + Schema model = modelFromProperty(op, modelName); + String existing = matchGenerated(model); + if (existing != null) { + media.setSchema(this.makeRefProperty(existing, property)); + } else { + media.setSchema(this.makeRefProperty(modelName, property)); + addGenerated(modelName, model); + openAPI.getComponents().addSchemas(modelName, model); + } + } + } else if (property instanceof ArraySchema) { + ArraySchema ap = (ArraySchema) property; + Schema inner = ap.getItems(); + + if (inner instanceof ObjectSchema) { + ObjectSchema op = (ObjectSchema) inner; + if (op.getProperties() != null && op.getProperties().size() > 0) { + flattenProperties(op.getProperties(), pathname); + String modelName = resolveModelName(op.getTitle(), + "inline_response_" + key); + Schema innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + if (existing != null) { + ap.setItems(this.makeRefProperty(existing, op)); + } else { + ap.setItems(this.makeRefProperty(modelName, op)); + addGenerated(modelName, innerModel); + openAPI.getComponents().addSchemas(modelName, innerModel); + } + } + } + } else if (property.getAdditionalProperties() != null) { + + Schema innerProperty = property.getAdditionalProperties(); + if (innerProperty instanceof ObjectSchema) { + ObjectSchema op = (ObjectSchema) innerProperty; + if (op.getProperties() != null && op.getProperties().size() > 0) { + flattenProperties(op.getProperties(), pathname); + String modelName = resolveModelName(op.getTitle(), + "inline_response_" + key); + Schema innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + if (existing != null) { + property.setAdditionalProperties(new Schema().$ref(existing)); + } else { + property.setAdditionalProperties(new Schema().$ref(modelName)); + addGenerated(modelName, innerModel); + openAPI.getComponents().addSchemas(modelName, innerModel); + } + } + } + } + } + } + } + } + } + } + } + } + } + + // definitions + if (models != null) { + List modelNames = new ArrayList(models.keySet()); + for (String modelName : modelNames) { + Schema model = models.get(modelName); + if (model.getProperties() != null) { + Map properties = model.getProperties(); + flattenProperties(properties, modelName); + fixStringModel(model); + } else if (model instanceof ArraySchema) { + ArraySchema m = (ArraySchema) model; + Schema inner = m.getItems(); + if (inner instanceof ObjectSchema) { + ObjectSchema op = (ObjectSchema) inner; + if (op.getProperties() != null && op.getProperties().size() > 0) { + String innerModelName = resolveModelName(op.getTitle(), modelName + "_inner"); + Schema innerModel = modelFromProperty(op, innerModelName); + String existing = matchGenerated(innerModel); + if (existing == null) { + openAPI.getComponents().addSchemas(innerModelName, innerModel); + addGenerated(innerModelName, innerModel); + m.setItems(new Schema().$ref(innerModelName)); + } else { + m.setItems(new Schema().$ref(existing)); + } + } + } + } else if (model instanceof ComposedSchema) { + ComposedSchema composedSchema = (ComposedSchema) model; + List list = null; + if (composedSchema.getAllOf() != null) { + list = composedSchema.getAllOf(); + }else if (composedSchema.getAnyOf() != null) { + list = composedSchema.getAnyOf(); + }else if (composedSchema.getOneOf() != null) { + list = composedSchema.getOneOf(); + } + for(int i= 0; i 0) { + name = key + "_" + count; + } + if (openAPI.getComponents().getSchemas() == null) { + return name; + } else if (!openAPI.getComponents().getSchemas().containsKey(name)) { + return name; + } + count += 1; + } + return key; + } + + public void flattenProperties(Map properties, String path) { + if (properties == null) { + return; + } + Map propsToUpdate = new HashMap<>(); + Map modelsToAdd = new HashMap<>(); + for (String key : properties.keySet()) { + Schema property = properties.get(key); + if (property instanceof ObjectSchema && ((ObjectSchema) property).getProperties() != null + && ((ObjectSchema) property).getProperties().size() > 0) { + + ObjectSchema op = (ObjectSchema) property; + + String modelName = resolveModelName(op.getTitle(), path + "_" + key); + Schema model = modelFromProperty(op, modelName); + + String existing = matchGenerated(model); + + if (existing != null) { + propsToUpdate.put(key, new Schema().$ref(existing)); + } else { + propsToUpdate.put(key, new Schema().$ref(modelName)); + modelsToAdd.put(modelName, model); + addGenerated(modelName, model); + openAPI.getComponents().addSchemas(modelName, model); + } + } else if (property instanceof ArraySchema) { + ArraySchema ap = (ArraySchema) property; + Schema inner = ap.getItems(); + + if (inner instanceof ObjectSchema) { + ObjectSchema op = (ObjectSchema) inner; + if (op.getProperties() != null && op.getProperties().size() > 0) { + flattenProperties(op.getProperties(), path); + String modelName = resolveModelName(op.getTitle(), path + "_" + key); + Schema innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + if (existing != null) { + ap.setItems(new Schema().$ref(existing)); + } else { + ap.setItems(new Schema().$ref(modelName)); + addGenerated(modelName, innerModel); + openAPI.getComponents().addSchemas(modelName, innerModel); + } + } + } + } else if (property.getAdditionalProperties() != null) { + Schema inner = property.getAdditionalProperties(); + + if (inner instanceof ObjectSchema) { + ObjectSchema op = (ObjectSchema) inner; + if (op.getProperties() != null && op.getProperties().size() > 0) { + flattenProperties(op.getProperties(), path); + String modelName = resolveModelName(op.getTitle(), path + "_" + key); + Schema innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + if (existing != null) { + property.setAdditionalProperties(new Schema().$ref(existing)); + } else { + property.setAdditionalProperties(new Schema().$ref(modelName)); + addGenerated(modelName, innerModel); + openAPI.getComponents().addSchemas(modelName, innerModel); + } + } + } + } + } + if (propsToUpdate.size() > 0) { + for (String key : propsToUpdate.keySet()) { + properties.put(key, propsToUpdate.get(key)); + } + } + for (String key : modelsToAdd.keySet()) { + openAPI.getComponents().addSchemas(key, modelsToAdd.get(key)); + this.addedModels.put(key, modelsToAdd.get(key)); + } + } + + @SuppressWarnings("static-method") + public Schema modelFromProperty(ArraySchema object, @SuppressWarnings("unused") String path) { + String description = object.getDescription(); + String example = null; + + Object obj = object.getExample(); + if (obj != null) { + example = obj.toString(); + } + + Schema inner = object.getItems(); + if (inner instanceof ObjectSchema) { + ArraySchema model = new ArraySchema(); + model.setDescription(description); + model.setExample(example); + model.setItems(object.getItems()); + return model; + } + + return null; + } + + public Schema modelFromProperty(ObjectSchema object, String path) { + String description = object.getDescription(); + String example = null; + + Object obj = object.getExample(); + if (obj != null) { + example = obj.toString(); + } + String name = object.getName(); + XML xml = object.getXml(); + Map properties = object.getProperties(); + + Schema model = new Schema();//TODO Verify this! + model.setDescription(description); + model.setExample(example); + model.setName(name); + model.setXml(xml); + + if (properties != null) { + flattenProperties(properties, path); + model.setProperties(properties); + } + + return model; + } + + @SuppressWarnings("static-method") + public Schema modelFromProperty(Schema object, @SuppressWarnings("unused") String path) { + String description = object.getDescription(); + String example = null; + + Object obj = object.getExample(); + if (obj != null) { + example = obj.toString(); + } + + ArraySchema model = new ArraySchema(); + model.setDescription(description); + model.setExample(example); + model.setItems(object.getAdditionalProperties()); + + return model; + } + + /** + * Make a RefProperty + * + * @param ref new property name + * @param property Property + * @return + */ + public Schema makeRefProperty(String ref, Schema property) { + Schema newProperty = new Schema().$ref(ref); + + this.copyVendorExtensions(property, newProperty); + return newProperty; + } + + /** + * Copy vendor extensions from Property to another Property + * + * @param source source property + * @param target target property + */ + public void copyVendorExtensions(Schema source, Schema target) { + Map vendorExtensions = source.getExtensions(); + for (String extName : vendorExtensions.keySet()) { + target.addExtension(extName, vendorExtensions.get(extName)); + } + } + + public boolean isSkipMatches() { + return skipMatches; + } + + public void setSkipMatches(boolean skipMatches) { + this.skipMatches = skipMatches; + } + +} \ No newline at end of file diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java new file mode 100644 index 0000000000..dcb629b7cd --- /dev/null +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java @@ -0,0 +1,999 @@ +package io.swagger.parser.v3.util; + +import io.swagger.oas.models.Components; +import io.swagger.oas.models.OpenAPI; +import io.swagger.oas.models.media.ObjectSchema; +import io.swagger.oas.models.media.Schema; +import io.swagger.oas.models.media.StringSchema; +import io.swagger.util.Json; +import org.testng.annotations.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.testng.AssertJUnit.*; + +@SuppressWarnings("static-method") +public class InlineModelResolverTest { + @Test + public void resolveInlineModelTestWithoutTitle() throws Exception { + OpenAPI openAPI = new OpenAPI(); + openAPI.setComponents(new Components()); + + + Schema objectSchema = new ObjectSchema(); + objectSchema.setDefault("default"); + objectSchema.setReadOnly(false); + objectSchema.setDescription("description"); + objectSchema.setName("name"); + objectSchema.addProperties("street", new StringSchema()); + objectSchema.addProperties("city", new StringSchema()); + + Schema schema = new Schema(); + schema.setName("user"); + schema.setDescription("a common user"); + List required = new ArrayList<>(); + required.add("address"); + schema.setRequired(required); + schema.addProperties("name", new StringSchema()); + schema.addProperties("address", objectSchema); + + + openAPI.getComponents().addSchemas("User", schema); + + new InlineModelResolver().flatten(openAPI); + + Schema user = openAPI.getComponents().getSchemas().get("User"); + + assertNotNull(user); + Schema address = (Schema)user.getProperties().get("address"); + assertTrue((address.get$ref()!= null)); + + Schema userAddress = openAPI.getComponents().getSchemas().get("User_address"); + assertNotNull(userAddress); + assertNotNull(userAddress.getProperties().get("city")); + assertNotNull(userAddress.getProperties().get("street")); + } + + @Test + public void resolveInlineModelTestWithTitle() throws Exception { + OpenAPI openAPI = new OpenAPI(); + openAPI.setComponents(new Components()); + + + Schema objectSchema = new ObjectSchema(); + objectSchema.setTitle("UserAddressTitle"); + objectSchema.setDefault("default"); + objectSchema.setReadOnly(false); + objectSchema.setDescription("description"); + objectSchema.setName("name"); + objectSchema.addProperties("street", new StringSchema()); + objectSchema.addProperties("city", new StringSchema()); + + Schema schema = new Schema(); + schema.setName("user"); + schema.setDescription("a common user"); + List required = new ArrayList<>(); + required.add("address"); + schema.setRequired(required); + schema.addProperties("name", new StringSchema()); + schema.addProperties("address", objectSchema); + + + openAPI.getComponents().addSchemas("User", schema); + + new InlineModelResolver().flatten(openAPI); + + Schema user = openAPI.getComponents().getSchemas().get("User"); + + assertNotNull(user); + Schema address = (Schema)user.getProperties().get("address"); + assertTrue( address.get$ref() != null); + + Schema userAddressTitle = openAPI.getComponents().getSchemas().get("UserAddressTitle"); + assertNotNull(userAddressTitle); + assertNotNull(userAddressTitle.getProperties().get("city")); + assertNotNull(userAddressTitle.getProperties().get("street")); + } + + @Test + public void resolveInlineModel2EqualInnerModels() throws Exception { + OpenAPI openAPI = new OpenAPI(); + openAPI.setComponents(new Components()); + + + Schema objectSchema = new ObjectSchema(); + objectSchema.setTitle("UserAddressTitle"); + objectSchema.setDefault("default"); + objectSchema.setReadOnly(false); + objectSchema.setDescription("description"); + objectSchema.setName("name"); + objectSchema.addProperties("street", new StringSchema()); + objectSchema.addProperties("city", new StringSchema()); + + Schema schema = new Schema(); + schema.setName("user"); + schema.setDescription("a common user"); + List required = new ArrayList<>(); + required.add("address"); + schema.setRequired(required); + schema.addProperties("name", new StringSchema()); + schema.addProperties("address", objectSchema); + + + openAPI.getComponents().addSchemas("User", schema); + + Schema addressSchema = new ObjectSchema(); + addressSchema.setTitle("UserAddressTitle"); + addressSchema.setDefault("default"); + addressSchema.setReadOnly(false); + addressSchema.setDescription("description"); + addressSchema.setName("name"); + addressSchema.addProperties("street", new StringSchema()); + addressSchema.addProperties("city", new StringSchema()); + + Schema anotherSchema = new Schema(); + anotherSchema.setName("user"); + anotherSchema.setDescription("a common user"); + List requiredFields = new ArrayList<>(); + requiredFields.add("address"); + anotherSchema.setRequired(requiredFields); + anotherSchema.addProperties("name", new StringSchema()); + anotherSchema.addProperties("lastName", new StringSchema()); + anotherSchema.addProperties("address", addressSchema); + + openAPI.getComponents().addSchemas("AnotherUser", anotherSchema); + + new InlineModelResolver().flatten(openAPI); + + Schema user = openAPI.getComponents().getSchemas().get("User"); + + assertNotNull(user); + Schema addressSchema1 = (Schema) user.getProperties().get("address"); + assertTrue(addressSchema1.get$ref() != null); + + Schema address = openAPI.getComponents().getSchemas().get("UserAddressTitle"); + assertNotNull(address); + assertNotNull(address.getProperties().get("city")); + assertNotNull(address.getProperties().get("street")); + Schema duplicateAddress = openAPI.getComponents().getSchemas().get("UserAddressTitle_0"); + assertNull(duplicateAddress); + } + + @Test + public void resolveInlineModel2DifferentInnerModelsWIthSameTitle() throws Exception { + OpenAPI openAPI = new OpenAPI(); + openAPI.setComponents(new Components()); + + Schema objectSchema = new ObjectSchema(); + objectSchema.setTitle("UserAddressTitle"); + objectSchema.setDefault("default"); + objectSchema.setReadOnly(false); + objectSchema.setDescription("description"); + objectSchema.setName("name"); + objectSchema.addProperties("street", new StringSchema()); + objectSchema.addProperties("city", new StringSchema()); + + Schema schema = new Schema(); + schema.setName("user"); + schema.setDescription("a common user"); + List required = new ArrayList<>(); + required.add("address"); + schema.setRequired(required); + schema.addProperties("name", new StringSchema()); + schema.addProperties("address", objectSchema); + + + openAPI.getComponents().addSchemas("User", schema); + + Schema addressSchema = new ObjectSchema(); + addressSchema.setTitle("UserAddressTitle"); + addressSchema.setDefault("default"); + addressSchema.setReadOnly(false); + addressSchema.setDescription("description"); + addressSchema.setName("name"); + addressSchema.addProperties("street", new StringSchema()); + addressSchema.addProperties("city", new StringSchema()); + + + Schema anotherSchema = new Schema(); + anotherSchema.setName("AnotherUser"); + anotherSchema.setDescription("a common user"); + List requiredFields = new ArrayList<>(); + requiredFields.add("address"); + anotherSchema.setRequired(requiredFields); + anotherSchema.addProperties("name", new StringSchema()); + anotherSchema.addProperties("lastName", new StringSchema()); + anotherSchema.addProperties("address", addressSchema); + anotherSchema.addProperties("apartment", new StringSchema()); + + openAPI.getComponents().addSchemas("AnotherUser", anotherSchema); + + new InlineModelResolver().flatten(openAPI); + + Schema user = openAPI.getComponents().getSchemas().get("User"); + + assertNotNull(user); + Schema userAddress = (Schema) user.getProperties().get("address"); + assertTrue( userAddress.get$ref()!= null); + System.out.println(Json.pretty(openAPI)); + Schema address = openAPI.getComponents().getSchemas().get("UserAddressTitle"); + assertNotNull(address); + assertNotNull(address.getProperties().get("city")); + assertNotNull(address.getProperties().get("street")); + Schema duplicateAddress = openAPI.getComponents().getSchemas().get("UserAddressTitle_1"); + assertNotNull(duplicateAddress); + assertNotNull(duplicateAddress.getProperties().get("city")); + assertNotNull(duplicateAddress.getProperties().get("street")); + assertNotNull(duplicateAddress.getProperties().get("apartment")); + } + + + /*@Test + public void testInlineResponseModel() throws Exception { + Swagger swagger = new Swagger(); + + swagger.path("/foo/bar", new Path() + .get(new Operation() + .response(200, new Response() + .description("it works!") + .schema(new ObjectProperty() + .property("name", new StringProperty()).vendorExtension("x-ext", "ext-prop"))))) + .path("/foo/baz", new Path() + .get(new Operation() + .response(200, new Response() + .vendorExtension("x-foo", "bar") + .description("it works!") + .schema(new ObjectProperty() + .property("name", new StringProperty()).vendorExtension("x-ext", "ext-prop"))))); + new InlineModelResolver().flatten(swagger); + + Map responses = swagger.getPaths().get("/foo/bar").getGet().getResponses(); + + Response response = responses.get("200"); + assertNotNull(response); + Property schema = response.getSchema(); + assertTrue(schema instanceof RefProperty); + assertEquals(1, schema.getVendorExtensions().size()); + assertEquals("ext-prop", schema.getVendorExtensions().get("x-ext")); + + ModelImpl model = (ModelImpl)swagger.getDefinitions().get("inline_response_200"); + assertTrue(model.getProperties().size() == 1); + assertNotNull(model.getProperties().get("name")); + assertTrue(model.getProperties().get("name") instanceof StringProperty); + } + + + @Test + public void testInlineResponseModelWithTitle() throws Exception { + Swagger swagger = new Swagger(); + + String responseTitle = "GetBarResponse"; + swagger.path("/foo/bar", new Path() + .get(new Operation() + .response(200, new Response() + .description("it works!") + .schema(new ObjectProperty().title(responseTitle) + .property("name", new StringProperty()))))) + .path("/foo/baz", new Path() + .get(new Operation() + .response(200, new Response() + .vendorExtension("x-foo", "bar") + .description("it works!") + .schema(new ObjectProperty() + .property("name", new StringProperty()))))); + new InlineModelResolver().flatten(swagger); + + Map responses = swagger.getPaths().get("/foo/bar").getGet().getResponses(); + + Response response = responses.get("200"); + assertNotNull(response); + assertTrue(response.getSchema() instanceof RefProperty); + + ModelImpl model = (ModelImpl)swagger.getDefinitions().get(responseTitle); + assertTrue(model.getProperties().size() == 1); + assertNotNull(model.getProperties().get("name")); + assertTrue(model.getProperties().get("name") instanceof StringProperty); + } + + + @Test + public void resolveInlineArrayModelWithTitle() throws Exception { + Swagger swagger = new Swagger(); + + swagger.addDefinition("User", new ArrayModel() + .items(new ObjectProperty() + .title("InnerUserTitle") + ._default("default") + .access("access") + .readOnly(false) + .required(true) + .description("description") + .name("name") + .property("street", new StringProperty()) + .property("city", new StringProperty()))); + + new InlineModelResolver().flatten(swagger); + + Model model = swagger.getDefinitions().get("User"); + assertTrue(model instanceof ArrayModel); + + Model user = swagger.getDefinitions().get("InnerUserTitle"); + assertNotNull(user); + assertEquals("description", user.getDescription()); + } + + @Test + public void resolveInlineArrayModelWithoutTitle() throws Exception { + Swagger swagger = new Swagger(); + + swagger.addDefinition("User", new ArrayModel() + .items(new ObjectProperty() + ._default("default") + .access("access") + .readOnly(false) + .required(true) + .description("description") + .name("name") + .property("street", new StringProperty()) + .property("city", new StringProperty()))); + + new InlineModelResolver().flatten(swagger); + + Model model = swagger.getDefinitions().get("User"); + assertTrue(model instanceof ArrayModel); + + Model user = swagger.getDefinitions().get("User_inner"); + assertNotNull(user); + assertEquals("description", user.getDescription()); + } + + + + + @Test + public void resolveInlineBodyParameter() throws Exception { + Swagger swagger = new Swagger(); + + swagger.path("/hello", new Path() + .get(new Operation() + .parameter(new BodyParameter() + .name("body") + .schema(new ModelImpl() + .property("address", new ObjectProperty() + .property("street", new StringProperty())) + .property("name", new StringProperty()))))); + + new InlineModelResolver().flatten(swagger); + + Operation operation = swagger.getPaths().get("/hello").getGet(); + BodyParameter bp = (BodyParameter)operation.getParameters().get(0); + assertTrue(bp.getSchema() instanceof RefModel); + + Model body = swagger.getDefinitions().get("body"); + assertTrue(body instanceof ModelImpl); + + ModelImpl impl = (ModelImpl) body; + assertNotNull(impl.getProperties().get("address")); + } + + @Test + public void resolveInlineBodyParameterWithTitle() throws Exception { + Swagger swagger = new Swagger(); + + ModelImpl addressModelItem = new ModelImpl(); + String addressModelName = "DetailedAddress"; + addressModelItem.setTitle(addressModelName); + swagger.path("/hello", new Path() + .get(new Operation() + .parameter(new BodyParameter() + .name("body") + .schema(addressModelItem + .property("address", new ObjectProperty() + .property("street", new StringProperty())) + .property("name", new StringProperty()))))); + + new InlineModelResolver().flatten(swagger); + + Operation operation = swagger.getPaths().get("/hello").getGet(); + BodyParameter bp = (BodyParameter)operation.getParameters().get(0); + assertTrue(bp.getSchema() instanceof RefModel); + + Model body = swagger.getDefinitions().get(addressModelName); + assertTrue(body instanceof ModelImpl); + + ModelImpl impl = (ModelImpl) body; + assertNotNull(impl.getProperties().get("address")); + } + + @Test + public void notResolveNonModelBodyParameter() throws Exception { + Swagger swagger = new Swagger(); + + swagger.path("/hello", new Path() + .get(new Operation() + .parameter(new BodyParameter() + .name("body") + .schema(new ModelImpl() + .type("string") + .format("binary"))))); + + new InlineModelResolver().flatten(swagger); + + Operation operation = swagger.getPaths().get("/hello").getGet(); + BodyParameter bp = (BodyParameter)operation.getParameters().get(0); + assertTrue(bp.getSchema() instanceof ModelImpl); + ModelImpl m = (ModelImpl) bp.getSchema(); + assertEquals("string", m.getType()); + assertEquals("binary", m.getFormat()); + } + + @Test + public void resolveInlineArrayBodyParameter() throws Exception { + Swagger swagger = new Swagger(); + + swagger.path("/hello", new Path() + .get(new Operation() + .parameter(new BodyParameter() + .name("body") + .schema(new ArrayModel() + .items(new ObjectProperty() + .property("address", new ObjectProperty() + .property("street", new StringProperty()))))))); + + new InlineModelResolver().flatten(swagger); + + Parameter param = swagger.getPaths().get("/hello").getGet().getParameters().get(0); + assertTrue(param instanceof BodyParameter); + + BodyParameter bp = (BodyParameter) param; + Model schema = bp.getSchema(); + + assertTrue(schema instanceof ArrayModel); + + ArrayModel am = (ArrayModel) schema; + Property inner = am.getItems(); + assertTrue(inner instanceof RefProperty); + + RefProperty rp = (RefProperty) inner; + + assertEquals(rp.getType(), "ref"); + assertEquals(rp.get$ref(), "#/definitions/body"); + assertEquals(rp.getSimpleRef(), "body"); + + Model inline = swagger.getDefinitions().get("body"); + assertNotNull(inline); + assertTrue(inline instanceof ModelImpl); + ModelImpl impl = (ModelImpl) inline; + RefProperty rpAddress = (RefProperty) impl.getProperties().get("address"); + assertNotNull(rpAddress); + assertEquals(rpAddress.getType(), "ref"); + assertEquals(rpAddress.get$ref(), "#/definitions/hello_address"); + assertEquals(rpAddress.getSimpleRef(), "hello_address"); + + Model inlineProp = swagger.getDefinitions().get("hello_address"); + assertNotNull(inlineProp); + assertTrue(inlineProp instanceof ModelImpl); + ModelImpl implProp = (ModelImpl) inlineProp; + assertNotNull(implProp.getProperties().get("street")); + assertTrue(implProp.getProperties().get("street") instanceof StringProperty); + } + + @Test + public void resolveInlineArrayResponse() throws Exception { + Swagger swagger = new Swagger(); + + ArrayProperty schema = new ArrayProperty() + .items(new ObjectProperty() + .property("name", new StringProperty()) + .vendorExtension("x-ext", "ext-items")) + .vendorExtension("x-ext", "ext-prop"); + swagger.path("/foo/baz", new Path() + .get(new Operation() + .response(200, new Response() + .vendorExtension("x-foo", "bar") + .description("it works!") + .schema(schema)))); + + new InlineModelResolver().flatten(swagger); + + Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + assertNotNull(response); + + assertNotNull(response.getSchema()); + Property responseProperty = response.getSchema(); + + // no need to flatten more + assertTrue(responseProperty instanceof ArrayProperty); + + ArrayProperty ap = (ArrayProperty) responseProperty; + assertEquals(1, ap.getVendorExtensions().size()); + assertEquals("ext-prop", ap.getVendorExtensions().get("x-ext")); + + Property p = ap.getItems(); + + assertNotNull(p); + + RefProperty rp = (RefProperty) p; + assertEquals(rp.getType(), "ref"); + assertEquals(rp.get$ref(), "#/definitions/inline_response_200"); + assertEquals(rp.getSimpleRef(), "inline_response_200"); + assertEquals(1, rp.getVendorExtensions().size()); + assertEquals("ext-items", rp.getVendorExtensions().get("x-ext")); + + Model inline = swagger.getDefinitions().get("inline_response_200"); + assertNotNull(inline); + assertTrue(inline instanceof ModelImpl); + ModelImpl impl = (ModelImpl) inline; + assertNotNull(impl.getProperties().get("name")); + assertTrue(impl.getProperties().get("name") instanceof StringProperty); + } + + @Test + public void resolveInlineArrayResponseWithTitle() throws Exception { + Swagger swagger = new Swagger(); + + swagger.path("/foo/baz", new Path() + .get(new Operation() + .response(200, new Response() + .vendorExtension("x-foo", "bar") + .description("it works!") + .schema(new ArrayProperty() + .items(new ObjectProperty() + .title("FooBar") + .property("name", new StringProperty())))))); + + new InlineModelResolver().flatten(swagger); + + Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + assertNotNull(response); + + assertNotNull(response.getSchema()); + Property responseProperty = response.getSchema(); + + // no need to flatten more + assertTrue(responseProperty instanceof ArrayProperty); + + ArrayProperty ap = (ArrayProperty) responseProperty; + Property p = ap.getItems(); + + assertNotNull(p); + + RefProperty rp = (RefProperty) p; + assertEquals(rp.getType(), "ref"); + assertEquals(rp.get$ref(), "#/definitions/"+ "FooBar"); + assertEquals(rp.getSimpleRef(), "FooBar"); + + Model inline = swagger.getDefinitions().get("FooBar"); + assertNotNull(inline); + assertTrue(inline instanceof ModelImpl); + ModelImpl impl = (ModelImpl) inline; + assertNotNull(impl.getProperties().get("name")); + assertTrue(impl.getProperties().get("name") instanceof StringProperty); + } + + @Test + public void testInlineMapResponse() throws Exception { + Swagger swagger = new Swagger(); + + MapProperty schema = new MapProperty(); + schema.setAdditionalProperties(new StringProperty()); + schema.setVendorExtension("x-ext", "ext-prop"); + + swagger.path("/foo/baz", new Path() + .get(new Operation() + .response(200, new Response() + .vendorExtension("x-foo", "bar") + .description("it works!") + .schema(schema)))); + new InlineModelResolver().flatten(swagger); + Json.prettyPrint(swagger); + + Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + + Property property = response.getSchema(); + assertTrue(property instanceof MapProperty); + assertTrue(swagger.getDefinitions().size() == 0); + assertEquals(1, property.getVendorExtensions().size()); + assertEquals("ext-prop", property.getVendorExtensions().get("x-ext")); + } + + @Test + public void testInlineMapResponseWithObjectProperty() throws Exception { + Swagger swagger = new Swagger(); + + MapProperty schema = new MapProperty(); + schema.setAdditionalProperties(new ObjectProperty() + .property("name", new StringProperty())); + schema.setVendorExtension("x-ext", "ext-prop"); + + swagger.path("/foo/baz", new Path() + .get(new Operation() + .response(200, new Response() + .vendorExtension("x-foo", "bar") + .description("it works!") + .schema(schema)))); + new InlineModelResolver().flatten(swagger); + + Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + Property property = response.getSchema(); + assertTrue(property instanceof MapProperty); + assertEquals(1, property.getVendorExtensions().size()); + assertEquals("ext-prop", property.getVendorExtensions().get("x-ext")); + assertTrue(swagger.getDefinitions().size() == 1); + + Model inline = swagger.getDefinitions().get("inline_response_200"); + assertTrue(inline instanceof ModelImpl); + ModelImpl impl = (ModelImpl) inline; + assertNotNull(impl.getProperties().get("name")); + assertTrue(impl.getProperties().get("name") instanceof StringProperty); + } + + @Test + public void testArrayResponse() { + Swagger swagger = new Swagger(); + + ArrayProperty schema = new ArrayProperty(); + schema.setItems(new ObjectProperty() + .property("name", new StringProperty())); + + swagger.path("/foo/baz", new Path() + .get(new Operation() + .response(200, new Response() + .vendorExtension("x-foo", "bar") + .description("it works!") + .schema(schema)))); + new InlineModelResolver().flatten(swagger); + + Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + assertTrue(response.getSchema() instanceof ArrayProperty); + + ArrayProperty am = (ArrayProperty) response.getSchema(); + Property items = am.getItems(); + assertTrue(items instanceof RefProperty); + RefProperty rp = (RefProperty) items; + assertEquals(rp.getType(), "ref"); + assertEquals(rp.get$ref(), "#/definitions/inline_response_200"); + assertEquals(rp.getSimpleRef(), "inline_response_200"); + + Model inline = swagger.getDefinitions().get("inline_response_200"); + assertTrue(inline instanceof ModelImpl); + ModelImpl impl = (ModelImpl) inline; + assertNotNull(impl.getProperties().get("name")); + assertTrue(impl.getProperties().get("name") instanceof StringProperty); + } + + @Test + public void testBasicInput() { + Swagger swagger = new Swagger(); + + ModelImpl user = new ModelImpl() + .property("name", new StringProperty()); + + swagger.path("/foo/baz", new Path() + .post(new Operation() + .parameter(new BodyParameter() + .name("myBody") + .schema(new RefModel("User"))))); + + swagger.addDefinition("User", user); + + new InlineModelResolver().flatten(swagger); + + Json.prettyPrint(swagger); + } + + @Test + public void testArbitraryObjectBodyParam() { + Swagger swagger = new Swagger(); + + swagger.path("/hello", new Path() + .get(new Operation() + .parameter(new BodyParameter() + .name("body") + .schema(new ModelImpl())))); + + new InlineModelResolver().flatten(swagger); + + Operation operation = swagger.getPaths().get("/hello").getGet(); + BodyParameter bp = (BodyParameter)operation.getParameters().get(0); + assertTrue(bp.getSchema() instanceof ModelImpl); + ModelImpl m = (ModelImpl) bp.getSchema(); + assertNull(m.getType()); + } + + @Test + public void testArbitraryObjectBodyParamInline() { + Swagger swagger = new Swagger(); + + swagger.path("/hello", new Path() + .get(new Operation() + .parameter(new BodyParameter() + .name("body") + .schema(new ModelImpl() + .property("arbitrary", new ObjectProperty()))))); + + new InlineModelResolver().flatten(swagger); + + Operation operation = swagger.getPaths().get("/hello").getGet(); + BodyParameter bp = (BodyParameter)operation.getParameters().get(0); + assertTrue(bp.getSchema() instanceof RefModel); + + Model body = swagger.getDefinitions().get("body"); + assertTrue(body instanceof ModelImpl); + + ModelImpl impl = (ModelImpl) body; + Property p = impl.getProperties().get("arbitrary"); + assertNotNull(p); + assertTrue(p instanceof ObjectProperty); + } + + @Test + public void testArbitraryObjectBodyParamWithArray() { + Swagger swagger = new Swagger(); + + swagger.path("/hello", new Path() + .get(new Operation() + .parameter(new BodyParameter() + .name("body") + .schema(new ArrayModel() + .items(new ObjectProperty()))))); + + new InlineModelResolver().flatten(swagger); + + Parameter param = swagger.getPaths().get("/hello").getGet().getParameters().get(0); + assertTrue(param instanceof BodyParameter); + + BodyParameter bp = (BodyParameter) param; + Model schema = bp.getSchema(); + + assertTrue(schema instanceof ArrayModel); + + ArrayModel am = (ArrayModel) schema; + Property inner = am.getItems(); + assertTrue(inner instanceof ObjectProperty); + + ObjectProperty op = (ObjectProperty) inner; + assertNotNull(op); + assertNull(op.getProperties()); + } + + @Test + public void testArbitraryObjectBodyParamArrayInline() { + Swagger swagger = new Swagger(); + + swagger.path("/hello", new Path() + .get(new Operation() + .parameter(new BodyParameter() + .name("body") + .schema(new ArrayModel() + .items(new ObjectProperty() + .property("arbitrary", new ObjectProperty())))))); + + new InlineModelResolver().flatten(swagger); + + Parameter param = swagger.getPaths().get("/hello").getGet().getParameters().get(0); + assertTrue(param instanceof BodyParameter); + + BodyParameter bp = (BodyParameter) param; + Model schema = bp.getSchema(); + + assertTrue(schema instanceof ArrayModel); + + ArrayModel am = (ArrayModel) schema; + Property inner = am.getItems(); + assertTrue(inner instanceof RefProperty); + + RefProperty rp = (RefProperty) inner; + + assertEquals(rp.getType(), "ref"); + assertEquals(rp.get$ref(), "#/definitions/body"); + assertEquals(rp.getSimpleRef(), "body"); + + Model inline = swagger.getDefinitions().get("body"); + assertNotNull(inline); + assertTrue(inline instanceof ModelImpl); + ModelImpl impl = (ModelImpl) inline; + Property p = impl.getProperties().get("arbitrary"); + assertNotNull(p); + assertTrue(p instanceof ObjectProperty); + } + + @Test + public void testArbitraryObjectResponse() { + Swagger swagger = new Swagger(); + + swagger.path("/foo/bar", new Path() + .get(new Operation() + .response(200, new Response() + .description("it works!") + .schema(new ObjectProperty())))); + new InlineModelResolver().flatten(swagger); + + Map responses = swagger.getPaths().get("/foo/bar").getGet().getResponses(); + + Response response = responses.get("200"); + assertNotNull(response); + assertTrue(response.getSchema() instanceof ObjectProperty); + ObjectProperty op = (ObjectProperty) response.getSchema(); + assertNull(op.getProperties()); + } + + @Test + public void testArbitraryObjectResponseArray() { + Swagger swagger = new Swagger(); + + swagger.path("/foo/baz", new Path() + .get(new Operation() + .response(200, new Response() + .description("it works!") + .schema(new ArrayProperty() + .items(new ObjectProperty()))))); + new InlineModelResolver().flatten(swagger); + + Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + assertTrue(response.getSchema() instanceof ArrayProperty); + + ArrayProperty am = (ArrayProperty) response.getSchema(); + Property items = am.getItems(); + assertTrue(items instanceof ObjectProperty); + ObjectProperty op = (ObjectProperty) items; + assertNull(op.getProperties()); + } + + @Test + public void testArbitraryObjectResponseArrayInline() { + Swagger swagger = new Swagger(); + + swagger.path("/foo/baz", new Path() + .get(new Operation() + .response(200, new Response() + .vendorExtension("x-foo", "bar") + .description("it works!") + .schema(new ArrayProperty() + .items(new ObjectProperty() + .property("arbitrary", new ObjectProperty())))))); + + new InlineModelResolver().flatten(swagger); + + Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + assertNotNull(response); + + assertNotNull(response.getSchema()); + Property responseProperty = response.getSchema(); + assertTrue(responseProperty instanceof ArrayProperty); + + ArrayProperty ap = (ArrayProperty) responseProperty; + Property p = ap.getItems(); + assertNotNull(p); + + RefProperty rp = (RefProperty) p; + assertEquals(rp.getType(), "ref"); + assertEquals(rp.get$ref(), "#/definitions/inline_response_200"); + assertEquals(rp.getSimpleRef(), "inline_response_200"); + + Model inline = swagger.getDefinitions().get("inline_response_200"); + assertNotNull(inline); + assertTrue(inline instanceof ModelImpl); + ModelImpl impl = (ModelImpl) inline; + Property inlineProp = impl.getProperties().get("arbitrary"); + assertNotNull(inlineProp); + assertTrue(inlineProp instanceof ObjectProperty); + ObjectProperty op = (ObjectProperty) inlineProp; + assertNull(op.getProperties()); + } + + @Test + public void testArbitraryObjectResponseMapInline() { + Swagger swagger = new Swagger(); + + MapProperty schema = new MapProperty(); + schema.setAdditionalProperties(new ObjectProperty()); + + swagger.path("/foo/baz", new Path() + .get(new Operation() + .response(200, new Response() + .description("it works!") + .schema(schema)))); + new InlineModelResolver().flatten(swagger); + + Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + + Property property = response.getSchema(); + assertTrue(property instanceof MapProperty); + assertTrue(swagger.getDefinitions().size() == 0); + Property inlineProp = ((MapProperty) property).getAdditionalProperties(); + assertTrue(inlineProp instanceof ObjectProperty); + ObjectProperty op = (ObjectProperty) inlineProp; + assertNull(op.getProperties()); + } + + @Test + public void testArbitraryObjectModelInline() { + Swagger swagger = new Swagger(); + + swagger.addDefinition("User", new ModelImpl() + .name("user") + .description("a common user") + .property("name", new StringProperty()) + .property("arbitrary", new ObjectProperty() + .title("title") + ._default("default") + .access("access") + .readOnly(false) + .required(true) + .description("description") + .name("name"))); + + new InlineModelResolver().flatten(swagger); + + ModelImpl user = (ModelImpl)swagger.getDefinitions().get("User"); + assertNotNull(user); + Property inlineProp = user.getProperties().get("arbitrary"); + assertTrue(inlineProp instanceof ObjectProperty); + ObjectProperty op = (ObjectProperty) inlineProp; + assertNull(op.getProperties()); + } + + @Test + public void testArbitraryObjectModelWithArrayInlineWithoutTitle() { + Swagger swagger = new Swagger(); + + swagger.addDefinition("User", new ArrayModel() + .items(new ObjectProperty() + ._default("default") + .access("access") + .readOnly(false) + .required(true) + .description("description") + .name("name") + .property("arbitrary", new ObjectProperty()))); + + new InlineModelResolver().flatten(swagger); + + Model model = swagger.getDefinitions().get("User"); + assertTrue(model instanceof ArrayModel); + ArrayModel am = (ArrayModel) model; + Property inner = am.getItems(); + assertTrue(inner instanceof RefProperty); + + ModelImpl userInner = (ModelImpl)swagger.getDefinitions().get("User_inner"); + assertNotNull(userInner); + Property inlineProp = userInner.getProperties().get("arbitrary"); + assertTrue(inlineProp instanceof ObjectProperty); + ObjectProperty op = (ObjectProperty) inlineProp; + assertNull(op.getProperties()); + } + + @Test + public void testArbitraryObjectModelWithArrayInlineWithTitle() { + Swagger swagger = new Swagger(); + + swagger.addDefinition("User", new ArrayModel() + .items(new ObjectProperty() + .title("InnerUserTitle") + ._default("default") + .access("access") + .readOnly(false) + .required(true) + .description("description") + .name("name") + .property("arbitrary", new ObjectProperty()))); + + new InlineModelResolver().flatten(swagger); + + Model model = swagger.getDefinitions().get("User"); + assertTrue(model instanceof ArrayModel); + ArrayModel am = (ArrayModel) model; + Property inner = am.getItems(); + assertTrue(inner instanceof RefProperty); + + ModelImpl userInner = (ModelImpl)swagger.getDefinitions().get("InnerUserTitle"); + assertNotNull(userInner); + Property inlineProp = userInner.getProperties().get("arbitrary"); + assertTrue(inlineProp instanceof ObjectProperty); + ObjectProperty op = (ObjectProperty) inlineProp; + assertNull(op.getProperties()); + }*/ +} \ No newline at end of file From 27ddfbc88a4ae51a41d92a10fde9c21d2700f164 Mon Sep 17 00:00:00 2001 From: gracekarina <> Date: Sat, 30 Sep 2017 19:57:23 -0500 Subject: [PATCH 2/9] migrated class, 4out of 29 test working --- .../io/swagger/parser/v3/util/InlineModelResolverTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java index dcb629b7cd..b1b4422729 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java @@ -195,6 +195,7 @@ public void resolveInlineModel2DifferentInnerModelsWIthSameTitle() throws Except addressSchema.setName("name"); addressSchema.addProperties("street", new StringSchema()); addressSchema.addProperties("city", new StringSchema()); + addressSchema.addProperties("apartment", new StringSchema()); Schema anotherSchema = new Schema(); @@ -206,7 +207,7 @@ public void resolveInlineModel2DifferentInnerModelsWIthSameTitle() throws Except anotherSchema.addProperties("name", new StringSchema()); anotherSchema.addProperties("lastName", new StringSchema()); anotherSchema.addProperties("address", addressSchema); - anotherSchema.addProperties("apartment", new StringSchema()); + openAPI.getComponents().addSchemas("AnotherUser", anotherSchema); From 913cc4b463e47774775061a1eb97ed4acc862394 Mon Sep 17 00:00:00 2001 From: gracekarina <> Date: Mon, 2 Oct 2017 14:39:13 -0500 Subject: [PATCH 3/9] Failing 5th test --- .../parser/v3/util/InlineModelResolver.java | 12 ++- .../v3/util/InlineModelResolverTest.java | 100 +++++++++++++----- 2 files changed, 84 insertions(+), 28 deletions(-) diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java b/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java index 357272d94f..7f6f2ad758 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java @@ -1,5 +1,6 @@ package io.swagger.parser.v3.util; +import io.swagger.oas.models.Components; import io.swagger.oas.models.OpenAPI; import io.swagger.oas.models.Operation; import io.swagger.oas.models.PathItem; @@ -41,6 +42,9 @@ public void flatten(OpenAPI openAPI) { // operations Map paths = openAPI.getPaths(); + if(openAPI.getComponents()== null){ + openAPI.setComponents(new Components()); + } Map models = openAPI.getComponents().getSchemas(); if (paths != null) { @@ -441,9 +445,11 @@ public Schema makeRefProperty(String ref, Schema property) { * @param target target property */ public void copyVendorExtensions(Schema source, Schema target) { - Map vendorExtensions = source.getExtensions(); - for (String extName : vendorExtensions.keySet()) { - target.addExtension(extName, vendorExtensions.get(extName)); + if(source.getExtensions() != null) { + Map vendorExtensions = source.getExtensions(); + for (String extName : vendorExtensions.keySet()) { + target.addExtension(extName, vendorExtensions.get(extName)); + } } } diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java index b1b4422729..74e4de5df7 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java @@ -2,9 +2,15 @@ import io.swagger.oas.models.Components; import io.swagger.oas.models.OpenAPI; +import io.swagger.oas.models.Operation; +import io.swagger.oas.models.PathItem; +import io.swagger.oas.models.media.Content; +import io.swagger.oas.models.media.MediaType; import io.swagger.oas.models.media.ObjectSchema; import io.swagger.oas.models.media.Schema; import io.swagger.oas.models.media.StringSchema; +import io.swagger.oas.models.responses.ApiResponse; +import io.swagger.oas.models.responses.ApiResponses; import io.swagger.util.Json; import org.testng.annotations.Test; @@ -231,42 +237,86 @@ public void resolveInlineModel2DifferentInnerModelsWIthSameTitle() throws Except } - /*@Test + @Test public void testInlineResponseModel() throws Exception { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); - swagger.path("/foo/bar", new Path() - .get(new Operation() - .response(200, new Response() - .description("it works!") - .schema(new ObjectProperty() - .property("name", new StringProperty()).vendorExtension("x-ext", "ext-prop"))))) - .path("/foo/baz", new Path() - .get(new Operation() - .response(200, new Response() - .vendorExtension("x-foo", "bar") - .description("it works!") - .schema(new ObjectProperty() - .property("name", new StringProperty()).vendorExtension("x-ext", "ext-prop"))))); - new InlineModelResolver().flatten(swagger); - Map responses = swagger.getPaths().get("/foo/bar").getGet().getResponses(); + StringSchema stringSchema1 = new StringSchema(); + stringSchema1.addExtension("x-ext", "ext-prop"); - Response response = responses.get("200"); + ObjectSchema objectSchema1 = new ObjectSchema(); + objectSchema1.addProperties("name", stringSchema1); + + MediaType mediaType1 = new MediaType(); + mediaType1.setSchema(objectSchema1); + + Content content1 = new Content(); + content1.addMediaType("*/*", mediaType1 ); + + ApiResponse response1= new ApiResponse(); + response1.setDescription("it works!"); + response1.setContent(content1); + + ApiResponses responses1 = new ApiResponses(); + responses1.addApiResponse("200",response1); + + Operation operation1 = new Operation(); + operation1.setResponses(responses1); + + PathItem pathItem1 = new PathItem(); + pathItem1.setGet(operation1); + openAPI.path("/foo/bar",pathItem1); + + + + StringSchema stringSchema2 = new StringSchema(); + stringSchema1.addExtension("x-ext", "ext-prop"); + + ObjectSchema objectSchema2 = new ObjectSchema(); + objectSchema2.addProperties("name", stringSchema2); + + MediaType mediaType2 = new MediaType(); + mediaType2.setSchema(objectSchema2); + + Content content2 = new Content(); + content2.addMediaType("*/*", mediaType2 ); + + ApiResponse response2 = new ApiResponse(); + response2.setDescription("it works!"); + response2.addExtension("x-foo","bar"); + response2.setContent(content2); + + ApiResponses responses2 = new ApiResponses(); + responses2.addApiResponse("200",response2); + + Operation operation2 = new Operation(); + operation2.setResponses(responses2); + + PathItem pathItem2 = new PathItem(); + pathItem2.setGet(operation2); + openAPI.path("/foo/baz",pathItem2); + + new InlineModelResolver().flatten(openAPI); + + Map responses = openAPI.getPaths().get("/foo/bar").getGet().getResponses(); + + ApiResponse response = responses.get("200"); assertNotNull(response); - Property schema = response.getSchema(); - assertTrue(schema instanceof RefProperty); - assertEquals(1, schema.getVendorExtensions().size()); - assertEquals("ext-prop", schema.getVendorExtensions().get("x-ext")); + System.out.println(response); + Schema schema = response.getContent().get("*/*").getSchema(); + assertTrue(schema.get$ref() != null); + assertEquals(1, schema.getExtensions().size()); + assertEquals("ext-prop", schema.getExtensions().get("x-ext")); - ModelImpl model = (ModelImpl)swagger.getDefinitions().get("inline_response_200"); + Schema model = openAPI.getComponents().getSchemas().get("inline_response_200"); assertTrue(model.getProperties().size() == 1); assertNotNull(model.getProperties().get("name")); - assertTrue(model.getProperties().get("name") instanceof StringProperty); + assertTrue(model.getProperties().get("name") instanceof StringSchema); } - @Test + /*@Test public void testInlineResponseModelWithTitle() throws Exception { Swagger swagger = new Swagger(); From 6c8c08a8c53fe32bde16915fc8ab848cf7443fad Mon Sep 17 00:00:00 2001 From: gracekarina <> Date: Mon, 2 Oct 2017 18:36:37 -0500 Subject: [PATCH 4/9] fixing moar tests --- .../v3/util/InlineModelResolverTest.java | 229 ++++++++++++------ 1 file changed, 154 insertions(+), 75 deletions(-) diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java index 74e4de5df7..436c2f0e90 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java @@ -4,17 +4,21 @@ import io.swagger.oas.models.OpenAPI; import io.swagger.oas.models.Operation; import io.swagger.oas.models.PathItem; +import io.swagger.oas.models.media.ArraySchema; import io.swagger.oas.models.media.Content; import io.swagger.oas.models.media.MediaType; import io.swagger.oas.models.media.ObjectSchema; import io.swagger.oas.models.media.Schema; import io.swagger.oas.models.media.StringSchema; +import io.swagger.oas.models.parameters.RequestBody; import io.swagger.oas.models.responses.ApiResponse; import io.swagger.oas.models.responses.ApiResponses; import io.swagger.util.Json; import org.testng.annotations.Test; import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -224,7 +228,7 @@ public void resolveInlineModel2DifferentInnerModelsWIthSameTitle() throws Except assertNotNull(user); Schema userAddress = (Schema) user.getProperties().get("address"); assertTrue( userAddress.get$ref()!= null); - System.out.println(Json.pretty(openAPI)); + Schema address = openAPI.getComponents().getSchemas().get("UserAddressTitle"); assertNotNull(address); assertNotNull(address.getProperties().get("city")); @@ -243,10 +247,10 @@ public void testInlineResponseModel() throws Exception { StringSchema stringSchema1 = new StringSchema(); - stringSchema1.addExtension("x-ext", "ext-prop"); ObjectSchema objectSchema1 = new ObjectSchema(); objectSchema1.addProperties("name", stringSchema1); + objectSchema1.addExtension("x-ext", "ext-prop"); MediaType mediaType1 = new MediaType(); mediaType1.setSchema(objectSchema1); @@ -271,11 +275,10 @@ public void testInlineResponseModel() throws Exception { StringSchema stringSchema2 = new StringSchema(); - stringSchema1.addExtension("x-ext", "ext-prop"); ObjectSchema objectSchema2 = new ObjectSchema(); objectSchema2.addProperties("name", stringSchema2); - + objectSchema2.addExtension("x-ext", "ext-prop"); MediaType mediaType2 = new MediaType(); mediaType2.setSchema(objectSchema2); @@ -297,13 +300,14 @@ public void testInlineResponseModel() throws Exception { pathItem2.setGet(operation2); openAPI.path("/foo/baz",pathItem2); + new InlineModelResolver().flatten(openAPI); Map responses = openAPI.getPaths().get("/foo/bar").getGet().getResponses(); ApiResponse response = responses.get("200"); assertNotNull(response); - System.out.println(response); + Schema schema = response.getContent().get("*/*").getSchema(); assertTrue(schema.get$ref() != null); assertEquals(1, schema.getExtensions().size()); @@ -316,86 +320,147 @@ public void testInlineResponseModel() throws Exception { } - /*@Test + @Test public void testInlineResponseModelWithTitle() throws Exception { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); String responseTitle = "GetBarResponse"; - swagger.path("/foo/bar", new Path() - .get(new Operation() - .response(200, new Response() - .description("it works!") - .schema(new ObjectProperty().title(responseTitle) - .property("name", new StringProperty()))))) - .path("/foo/baz", new Path() - .get(new Operation() - .response(200, new Response() - .vendorExtension("x-foo", "bar") - .description("it works!") - .schema(new ObjectProperty() - .property("name", new StringProperty()))))); - new InlineModelResolver().flatten(swagger); - Map responses = swagger.getPaths().get("/foo/bar").getGet().getResponses(); + StringSchema stringSchema1 = new StringSchema(); - Response response = responses.get("200"); + ObjectSchema objectSchema1 = new ObjectSchema(); + objectSchema1.setTitle(responseTitle); + objectSchema1.addProperties("name", stringSchema1); + + + MediaType mediaType1 = new MediaType(); + mediaType1.setSchema(objectSchema1); + + Content content1 = new Content(); + content1.addMediaType("*/*", mediaType1 ); + + ApiResponse response1= new ApiResponse(); + response1.setDescription("it works!"); + response1.setContent(content1); + + ApiResponses responses1 = new ApiResponses(); + responses1.addApiResponse("200",response1); + + Operation operation1 = new Operation(); + operation1.setResponses(responses1); + + PathItem pathItem1 = new PathItem(); + pathItem1.setGet(operation1); + openAPI.path("/foo/bar",pathItem1); + + + + StringSchema stringSchema2 = new StringSchema(); + + ObjectSchema objectSchema2 = new ObjectSchema(); + objectSchema2.addProperties("name", stringSchema2); + objectSchema2.addExtension("x-foo", "bar"); + + MediaType mediaType2 = new MediaType(); + mediaType2.setSchema(objectSchema2); + + Content content2 = new Content(); + content2.addMediaType("*/*", mediaType2 ); + + ApiResponse response2 = new ApiResponse(); + response2.setDescription("it works!"); + + response2.setContent(content2); + + ApiResponses responses2 = new ApiResponses(); + responses2.addApiResponse("200",response2); + + Operation operation2 = new Operation(); + operation2.setResponses(responses2); + + PathItem pathItem2 = new PathItem(); + pathItem2.setGet(operation2); + openAPI.path("/foo/baz",pathItem2); + + + + new InlineModelResolver().flatten(openAPI); + + Map responses = openAPI.getPaths().get("/foo/bar").getGet().getResponses(); + + ApiResponse response = responses.get("200"); assertNotNull(response); - assertTrue(response.getSchema() instanceof RefProperty); + assertTrue(response.getContent().get("*/*").getSchema().get$ref() != null ); - ModelImpl model = (ModelImpl)swagger.getDefinitions().get(responseTitle); + Schema model = openAPI.getComponents().getSchemas().get(responseTitle); assertTrue(model.getProperties().size() == 1); assertNotNull(model.getProperties().get("name")); - assertTrue(model.getProperties().get("name") instanceof StringProperty); + assertTrue(model.getProperties().get("name") instanceof StringSchema); } @Test public void resolveInlineArrayModelWithTitle() throws Exception { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); + openAPI.setComponents(new Components()); - swagger.addDefinition("User", new ArrayModel() - .items(new ObjectProperty() - .title("InnerUserTitle") - ._default("default") - .access("access") - .readOnly(false) - .required(true) - .description("description") - .name("name") - .property("street", new StringProperty()) - .property("city", new StringProperty()))); + Schema objectSchema = new ObjectSchema(); + objectSchema.setTitle("InnerUserTitle"); + objectSchema.setDefault("default"); + objectSchema.setReadOnly(false); + objectSchema.setDescription("description"); + objectSchema.setName("name"); + objectSchema.addProperties("street", new StringSchema()); + objectSchema.addProperties("city", new StringSchema()); - new InlineModelResolver().flatten(swagger); + ArraySchema arraySchema = new ArraySchema(); + List required = new LinkedList<>(); + required.add("name"); + arraySchema.setRequired(required); + arraySchema.setItems(objectSchema); + + + openAPI.getComponents().addSchemas("User", arraySchema); - Model model = swagger.getDefinitions().get("User"); - assertTrue(model instanceof ArrayModel); - Model user = swagger.getDefinitions().get("InnerUserTitle"); + new InlineModelResolver().flatten(openAPI); + + Schema model = openAPI.getComponents().getSchemas().get("User"); + assertTrue(model instanceof ArraySchema); + + Schema user = openAPI.getComponents().getSchemas().get("InnerUserTitle"); assertNotNull(user); assertEquals("description", user.getDescription()); } @Test public void resolveInlineArrayModelWithoutTitle() throws Exception { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); + openAPI.setComponents(new Components()); - swagger.addDefinition("User", new ArrayModel() - .items(new ObjectProperty() - ._default("default") - .access("access") - .readOnly(false) - .required(true) - .description("description") - .name("name") - .property("street", new StringProperty()) - .property("city", new StringProperty()))); + Schema objectSchema = new ObjectSchema(); + objectSchema.setDefault("default"); + objectSchema.setReadOnly(false); + objectSchema.setDescription("description"); + objectSchema.setName("name"); + objectSchema.addProperties("street", new StringSchema()); + objectSchema.addProperties("city", new StringSchema()); - new InlineModelResolver().flatten(swagger); + ArraySchema arraySchema = new ArraySchema(); + List required = new LinkedList<>(); + required.add("name"); + arraySchema.setRequired(required); + arraySchema.setItems(objectSchema); - Model model = swagger.getDefinitions().get("User"); - assertTrue(model instanceof ArrayModel); + openAPI.getComponents().addSchemas("User", arraySchema); - Model user = swagger.getDefinitions().get("User_inner"); + + new InlineModelResolver().flatten(openAPI); + + Schema model = openAPI.getComponents().getSchemas().get("User"); + assertTrue(model instanceof ArraySchema); + + Schema user = openAPI.getComponents().getSchemas().get("User_inner"); assertNotNull(user); assertEquals("description", user.getDescription()); } @@ -405,31 +470,45 @@ public void resolveInlineArrayModelWithoutTitle() throws Exception { @Test public void resolveInlineBodyParameter() throws Exception { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); - swagger.path("/hello", new Path() - .get(new Operation() - .parameter(new BodyParameter() - .name("body") - .schema(new ModelImpl() - .property("address", new ObjectProperty() - .property("street", new StringProperty())) - .property("name", new StringProperty()))))); - new InlineModelResolver().flatten(swagger); + ObjectSchema objectSchema = new ObjectSchema(); + objectSchema.addProperties("street", new StringSchema()); - Operation operation = swagger.getPaths().get("/hello").getGet(); - BodyParameter bp = (BodyParameter)operation.getParameters().get(0); - assertTrue(bp.getSchema() instanceof RefModel); + Schema schema = new Schema(); + schema.addProperties("address", objectSchema); + schema.addProperties("name", new StringSchema()); - Model body = swagger.getDefinitions().get("body"); - assertTrue(body instanceof ModelImpl); + MediaType mediaType = new MediaType(); + mediaType.setSchema(schema); - ModelImpl impl = (ModelImpl) body; - assertNotNull(impl.getProperties().get("address")); + Content content = new Content(); + content.addMediaType("*/*", mediaType ); + + RequestBody requestBody = new RequestBody(); + requestBody.setContent(content); + + Operation operation = new Operation(); + operation.setRequestBody(requestBody); + + PathItem pathItem = new PathItem(); + pathItem.setGet(operation); + openAPI.path("/hello",pathItem); + + new InlineModelResolver().flatten(openAPI); + + Operation getOperation = openAPI.getPaths().get("/hello").getGet(); + RequestBody body = getOperation.getRequestBody(); + assertTrue(body.getContent().get("*/*").getSchema().get$ref() != null); + + Schema bodySchema = openAPI.getComponents().getSchemas().get("body"); + assertTrue(bodySchema instanceof Schema); + + assertNotNull(bodySchema.getProperties().get("address")); } - @Test + /* @Test public void resolveInlineBodyParameterWithTitle() throws Exception { Swagger swagger = new Swagger(); From 40af92867a1c1ad3178a69d30914d67793c35715 Mon Sep 17 00:00:00 2001 From: gracekarina <> Date: Tue, 3 Oct 2017 21:24:21 -0500 Subject: [PATCH 5/9] fixing more tests --- .../parser/v3/util/InlineModelResolver.java | 2 +- .../v3/util/InlineModelResolverTest.java | 41 ++++++++++--------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java b/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java index 7f6f2ad758..8e9ca59f03 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java @@ -64,7 +64,7 @@ public void flatten(OpenAPI openAPI) { Schema model = mediaType.getSchema(); if (model.getProperties() != null && model.getProperties().size() > 0) { flattenProperties(model.getProperties(), pathname); - String modelName = resolveModelName(model.getTitle(), model.getName()); + String modelName = resolveModelName(model.getTitle(), "body"); mediaType.setSchema(new Schema().$ref(modelName)); addGenerated(modelName, model); openAPI.getComponents().addSchemas(modelName, model); diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java index 436c2f0e90..1eb70a872c 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java @@ -469,7 +469,7 @@ public void resolveInlineArrayModelWithoutTitle() throws Exception { @Test - public void resolveInlineBodyParameter() throws Exception { + public void resolveInlineRequestBody() throws Exception { OpenAPI openAPI = new OpenAPI(); @@ -508,36 +508,37 @@ public void resolveInlineBodyParameter() throws Exception { assertNotNull(bodySchema.getProperties().get("address")); } - /* @Test + @Test public void resolveInlineBodyParameterWithTitle() throws Exception { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); - ModelImpl addressModelItem = new ModelImpl(); + ObjectSchema objectSchema = new ObjectSchema(); + objectSchema.addProperties("street", new StringSchema()); + objectSchema.addProperties("name", new StringSchema()); + Schema addressModelItem = new Schema(); String addressModelName = "DetailedAddress"; addressModelItem.setTitle(addressModelName); - swagger.path("/hello", new Path() + addressModelItem.addProperties("address", objectSchema); + + openAPI.path("/hello", new PathItem() .get(new Operation() - .parameter(new BodyParameter() - .name("body") - .schema(addressModelItem - .property("address", new ObjectProperty() - .property("street", new StringProperty())) - .property("name", new StringProperty()))))); + .requestBody(new RequestBody() + .content(new Content().addMediaType("*/*", new MediaType() + .schema(addressModelItem)))))); - new InlineModelResolver().flatten(swagger); + new InlineModelResolver().flatten(openAPI); - Operation operation = swagger.getPaths().get("/hello").getGet(); - BodyParameter bp = (BodyParameter)operation.getParameters().get(0); - assertTrue(bp.getSchema() instanceof RefModel); + Operation operation = openAPI.getPaths().get("/hello").getGet(); + RequestBody bp = operation.getRequestBody(); + assertTrue(bp.getContent().get("*/*").getSchema().get$ref() != null); - Model body = swagger.getDefinitions().get(addressModelName); - assertTrue(body instanceof ModelImpl); + Schema body = openAPI.getComponents().getSchemas().get(addressModelName); + assertTrue(body instanceof Schema); - ModelImpl impl = (ModelImpl) body; - assertNotNull(impl.getProperties().get("address")); + assertNotNull(body.getProperties().get("address")); } - @Test + /*@Test public void notResolveNonModelBodyParameter() throws Exception { Swagger swagger = new Swagger(); From 183c08b87e97ab103d06824e7870eaed3c350b5e Mon Sep 17 00:00:00 2001 From: gracekarina <> Date: Wed, 4 Oct 2017 21:41:43 -0500 Subject: [PATCH 6/9] fixing tests --- .../parser/v3/util/InlineModelResolver.java | 2 +- .../v3/util/InlineModelResolverTest.java | 495 ++++++++++-------- 2 files changed, 264 insertions(+), 233 deletions(-) diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java b/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java index 8e9ca59f03..c2caf92315 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java @@ -77,7 +77,7 @@ public void flatten(OpenAPI openAPI) { ObjectSchema op = (ObjectSchema) inner; if (op.getProperties() != null && op.getProperties().size() > 0) { flattenProperties(op.getProperties(), pathname); - String modelName = resolveModelName(op.getTitle(), model.getName()); + String modelName = resolveModelName(op.getTitle(), "body"); Schema innerModel = modelFromProperty(op, modelName); String existing = matchGenerated(innerModel); if (existing != null) { diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java index 1eb70a872c..911a5bce20 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java @@ -1,5 +1,6 @@ package io.swagger.parser.v3.util; +import com.sun.org.apache.regexp.internal.RE; import io.swagger.oas.models.Components; import io.swagger.oas.models.OpenAPI; import io.swagger.oas.models.Operation; @@ -15,6 +16,7 @@ import io.swagger.oas.models.responses.ApiResponses; import io.swagger.util.Json; import org.testng.annotations.Test; +import sun.jvm.hotspot.ui.action.HSDBActionManager; import java.util.ArrayList; import java.util.HashMap; @@ -509,7 +511,7 @@ public void resolveInlineRequestBody() throws Exception { } @Test - public void resolveInlineBodyParameterWithTitle() throws Exception { + public void resolveInlineRequestBodyWithTitle() throws Exception { OpenAPI openAPI = new OpenAPI(); ObjectSchema objectSchema = new ObjectSchema(); @@ -529,8 +531,8 @@ public void resolveInlineBodyParameterWithTitle() throws Exception { new InlineModelResolver().flatten(openAPI); Operation operation = openAPI.getPaths().get("/hello").getGet(); - RequestBody bp = operation.getRequestBody(); - assertTrue(bp.getContent().get("*/*").getSchema().get$ref() != null); + RequestBody requestBody = operation.getRequestBody(); + assertTrue(requestBody.getContent().get("*/*").getSchema().get$ref() != null); Schema body = openAPI.getComponents().getSchemas().get(addressModelName); assertTrue(body instanceof Schema); @@ -538,359 +540,388 @@ public void resolveInlineBodyParameterWithTitle() throws Exception { assertNotNull(body.getProperties().get("address")); } - /*@Test - public void notResolveNonModelBodyParameter() throws Exception { - Swagger swagger = new Swagger(); + @Test + public void notResolveNonModelRequestBody() throws Exception { + OpenAPI openAPI = new OpenAPI(); - swagger.path("/hello", new Path() + openAPI.path("/hello", new PathItem() .get(new Operation() - .parameter(new BodyParameter() - .name("body") - .schema(new ModelImpl() + .requestBody(new RequestBody() + .content(new Content().addMediaType("*/*", new MediaType().schema(new Schema() .type("string") - .format("binary"))))); + .format("binary"))))))); - new InlineModelResolver().flatten(swagger); + new InlineModelResolver().flatten(openAPI); - Operation operation = swagger.getPaths().get("/hello").getGet(); - BodyParameter bp = (BodyParameter)operation.getParameters().get(0); - assertTrue(bp.getSchema() instanceof ModelImpl); - ModelImpl m = (ModelImpl) bp.getSchema(); - assertEquals("string", m.getType()); - assertEquals("binary", m.getFormat()); + Operation operation = openAPI.getPaths().get("/hello").getGet(); + RequestBody body = operation.getRequestBody(); + assertTrue(body.getContent().get("*/*").getSchema() instanceof Schema); + Schema schema = body.getContent().get("*/*").getSchema(); + assertEquals("string", schema.getType()); + assertEquals("binary", schema.getFormat()); } @Test - public void resolveInlineArrayBodyParameter() throws Exception { - Swagger swagger = new Swagger(); + public void resolveInlineArrayRequestBody() throws Exception { + OpenAPI openAPI = new OpenAPI(); - swagger.path("/hello", new Path() - .get(new Operation() - .parameter(new BodyParameter() - .name("body") - .schema(new ArrayModel() - .items(new ObjectProperty() - .property("address", new ObjectProperty() - .property("street", new StringProperty()))))))); + ObjectSchema addressSchema = new ObjectSchema(); + addressSchema.addProperties("street",new StringSchema()); - new InlineModelResolver().flatten(swagger); + ObjectSchema objectSchema =new ObjectSchema(); + objectSchema.addProperties("address", addressSchema); - Parameter param = swagger.getPaths().get("/hello").getGet().getParameters().get(0); - assertTrue(param instanceof BodyParameter); + ArraySchema arraySchema = new ArraySchema(); + arraySchema.items(objectSchema); - BodyParameter bp = (BodyParameter) param; - Model schema = bp.getSchema(); - assertTrue(schema instanceof ArrayModel); + openAPI.path("/hello", new PathItem() + .get(new Operation() + .requestBody(new RequestBody() + .content(new Content().addMediaType("*/*",new MediaType() + .schema(arraySchema)))))); - ArrayModel am = (ArrayModel) schema; - Property inner = am.getItems(); - assertTrue(inner instanceof RefProperty); + new InlineModelResolver().flatten(openAPI); - RefProperty rp = (RefProperty) inner; + RequestBody body = openAPI.getPaths().get("/hello").getGet().getRequestBody(); + Schema schema = body.getContent().get("*/*").getSchema(); - assertEquals(rp.getType(), "ref"); - assertEquals(rp.get$ref(), "#/definitions/body"); - assertEquals(rp.getSimpleRef(), "body"); + assertTrue(schema instanceof ArraySchema); - Model inline = swagger.getDefinitions().get("body"); + ArraySchema am = (ArraySchema) schema; + Schema inner = am.getItems(); + assertTrue(inner.get$ref() != null); + + assertEquals( "#/components/schemas/body",inner.get$ref()); + + Schema inline = openAPI.getComponents().getSchemas().get("body"); assertNotNull(inline); - assertTrue(inline instanceof ModelImpl); - ModelImpl impl = (ModelImpl) inline; - RefProperty rpAddress = (RefProperty) impl.getProperties().get("address"); - assertNotNull(rpAddress); - assertEquals(rpAddress.getType(), "ref"); - assertEquals(rpAddress.get$ref(), "#/definitions/hello_address"); - assertEquals(rpAddress.getSimpleRef(), "hello_address"); + assertTrue(inline instanceof Schema); - Model inlineProp = swagger.getDefinitions().get("hello_address"); + Schema address = (Schema) inline.getProperties().get("address"); + assertNotNull(address); + + assertEquals( "#/components/schemas/hello_address",address.get$ref()); + + + Schema inlineProp = openAPI.getComponents().getSchemas().get("hello_address"); assertNotNull(inlineProp); - assertTrue(inlineProp instanceof ModelImpl); - ModelImpl implProp = (ModelImpl) inlineProp; - assertNotNull(implProp.getProperties().get("street")); - assertTrue(implProp.getProperties().get("street") instanceof StringProperty); + assertTrue(inlineProp instanceof Schema); + + assertNotNull(inlineProp.getProperties().get("street")); + assertTrue(inlineProp.getProperties().get("street") instanceof StringSchema); } @Test public void resolveInlineArrayResponse() throws Exception { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); - ArrayProperty schema = new ArrayProperty() - .items(new ObjectProperty() - .property("name", new StringProperty()) - .vendorExtension("x-ext", "ext-items")) - .vendorExtension("x-ext", "ext-prop"); - swagger.path("/foo/baz", new Path() + ObjectSchema items = new ObjectSchema(); + items.addExtension("x-ext", "ext-items"); + items.addProperties("name", new StringSchema()); + + + ArraySchema schema = new ArraySchema() + .items(items); + schema.addExtension("x-ext", "ext-prop"); + + ApiResponse response = new ApiResponse(); + response.addExtension("x-foo", "bar"); + response.description("it works!"); + response.content(new Content().addMediaType("*/*", new MediaType().schema(schema))); + + openAPI.path("/foo/baz", new PathItem() .get(new Operation() - .response(200, new Response() - .vendorExtension("x-foo", "bar") - .description("it works!") - .schema(schema)))); + .responses(new ApiResponses().addApiResponse("200",response)))); - new InlineModelResolver().flatten(swagger); + new InlineModelResolver().flatten(openAPI); - Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); - assertNotNull(response); + ApiResponse apiResponse = openAPI.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + assertNotNull(apiResponse); - assertNotNull(response.getSchema()); - Property responseProperty = response.getSchema(); + assertNotNull(apiResponse.getContent().get("*/*").getSchema()); + Schema responseProperty = apiResponse.getContent().get("*/*").getSchema(); // no need to flatten more - assertTrue(responseProperty instanceof ArrayProperty); + assertTrue(responseProperty instanceof ArraySchema); - ArrayProperty ap = (ArrayProperty) responseProperty; - assertEquals(1, ap.getVendorExtensions().size()); - assertEquals("ext-prop", ap.getVendorExtensions().get("x-ext")); + ArraySchema ap = (ArraySchema) responseProperty; + assertEquals(1, ap.getExtensions().size()); + assertEquals("ext-prop", ap.getExtensions().get("x-ext")); - Property p = ap.getItems(); + Schema p = ap.getItems(); assertNotNull(p); - RefProperty rp = (RefProperty) p; - assertEquals(rp.getType(), "ref"); - assertEquals(rp.get$ref(), "#/definitions/inline_response_200"); - assertEquals(rp.getSimpleRef(), "inline_response_200"); - assertEquals(1, rp.getVendorExtensions().size()); - assertEquals("ext-items", rp.getVendorExtensions().get("x-ext")); + assertEquals("#/components/schemas/inline_response_200", p.get$ref()); - Model inline = swagger.getDefinitions().get("inline_response_200"); + assertEquals(1, p.getExtensions().size()); + assertEquals("ext-items", p.getExtensions().get("x-ext")); + + Schema inline = openAPI.getComponents().getSchemas().get("inline_response_200"); assertNotNull(inline); - assertTrue(inline instanceof ModelImpl); - ModelImpl impl = (ModelImpl) inline; - assertNotNull(impl.getProperties().get("name")); - assertTrue(impl.getProperties().get("name") instanceof StringProperty); + assertTrue(inline instanceof Schema); + + assertNotNull(inline.getProperties().get("name")); + assertTrue(inline.getProperties().get("name") instanceof StringSchema); } @Test public void resolveInlineArrayResponseWithTitle() throws Exception { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); - swagger.path("/foo/baz", new Path() + ApiResponse apiResponse = new ApiResponse(); + apiResponse.addExtension("x-foo", "bar"); + apiResponse.description("it works!"); + + Map properties = new HashMap<>(); + properties.put("name", new StringSchema()); + + apiResponse.content(new Content().addMediaType("*/*", new MediaType().schema(new ArraySchema() + .items(new ObjectSchema() + .title("FooBar") + .properties(properties))))); + + openAPI.path("/foo/baz", new PathItem() .get(new Operation() - .response(200, new Response() - .vendorExtension("x-foo", "bar") - .description("it works!") - .schema(new ArrayProperty() - .items(new ObjectProperty() - .title("FooBar") - .property("name", new StringProperty())))))); + .responses(new ApiResponses().addApiResponse("200",apiResponse)))); - new InlineModelResolver().flatten(swagger); + new InlineModelResolver().flatten(openAPI); - Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + ApiResponse response = openAPI.getPaths().get("/foo/baz").getGet().getResponses().get("200"); assertNotNull(response); - assertNotNull(response.getSchema()); - Property responseProperty = response.getSchema(); + assertNotNull(response.getContent().get("*/*").getSchema()); + Schema responseProperty = response.getContent().get("*/*").getSchema(); // no need to flatten more - assertTrue(responseProperty instanceof ArrayProperty); + assertTrue(responseProperty instanceof ArraySchema); - ArrayProperty ap = (ArrayProperty) responseProperty; - Property p = ap.getItems(); + ArraySchema ap = (ArraySchema) responseProperty; + Schema p = ap.getItems(); assertNotNull(p); - RefProperty rp = (RefProperty) p; - assertEquals(rp.getType(), "ref"); - assertEquals(rp.get$ref(), "#/definitions/"+ "FooBar"); - assertEquals(rp.getSimpleRef(), "FooBar"); + assertEquals(p.get$ref(), "#/components/schemas/"+ "FooBar"); - Model inline = swagger.getDefinitions().get("FooBar"); + + Schema inline = openAPI.getComponents().getSchemas().get("FooBar"); assertNotNull(inline); - assertTrue(inline instanceof ModelImpl); - ModelImpl impl = (ModelImpl) inline; - assertNotNull(impl.getProperties().get("name")); - assertTrue(impl.getProperties().get("name") instanceof StringProperty); + assertTrue(inline instanceof Schema); + assertNotNull(inline.getProperties().get("name")); + assertTrue(inline.getProperties().get("name") instanceof StringSchema); } @Test public void testInlineMapResponse() throws Exception { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); - MapProperty schema = new MapProperty(); - schema.setAdditionalProperties(new StringProperty()); - schema.setVendorExtension("x-ext", "ext-prop"); + Schema schema = new Schema(); + schema.setAdditionalProperties(new StringSchema()); + schema.addExtension("x-ext", "ext-prop"); - swagger.path("/foo/baz", new Path() + ApiResponse apiResponse = new ApiResponse(); + apiResponse.description("it works!"); + MediaType mediaType = new MediaType(); + mediaType.setSchema(schema); + + Content content = new Content(); + content.addMediaType("*/*",mediaType); + + apiResponse.setContent(content); + apiResponse.addExtension("x-foo", "bar"); + + ApiResponses apiResponses = new ApiResponses(); + apiResponses.addApiResponse("200",apiResponse); + + + openAPI.path("/foo/baz", new PathItem() .get(new Operation() - .response(200, new Response() - .vendorExtension("x-foo", "bar") - .description("it works!") - .schema(schema)))); - new InlineModelResolver().flatten(swagger); - Json.prettyPrint(swagger); + .responses(apiResponses))); - Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); - Property property = response.getSchema(); - assertTrue(property instanceof MapProperty); - assertTrue(swagger.getDefinitions().size() == 0); - assertEquals(1, property.getVendorExtensions().size()); - assertEquals("ext-prop", property.getVendorExtensions().get("x-ext")); + new InlineModelResolver().flatten(openAPI); + Json.prettyPrint(openAPI); + + ApiResponse response = openAPI.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + + Schema property = response.getContent().get("*/*").getSchema(); + assertTrue(property.getAdditionalProperties() != null); + assertTrue(openAPI.getComponents().getSchemas() == null); + assertEquals(1, property.getExtensions().size()); + assertEquals("ext-prop", property.getExtensions().get("x-ext")); } @Test - public void testInlineMapResponseWithObjectProperty() throws Exception { - Swagger swagger = new Swagger(); + public void testInlineMapResponseWithObjectSchema() throws Exception { + OpenAPI openAPI = new OpenAPI(); - MapProperty schema = new MapProperty(); - schema.setAdditionalProperties(new ObjectProperty() - .property("name", new StringProperty())); - schema.setVendorExtension("x-ext", "ext-prop"); + Schema schema = new Schema(); + schema.setAdditionalProperties(new ObjectSchema() + .addProperties("name", new StringSchema())); + schema.addExtension("x-ext", "ext-prop"); - swagger.path("/foo/baz", new Path() + ApiResponse apiResponse = new ApiResponse() + .description("it works!") + .content(new Content().addMediaType("*/*",new MediaType().schema(schema))); + apiResponse.addExtension("x-foo", "bar"); + + ApiResponses apiResponses = new ApiResponses().addApiResponse("200",apiResponse); + + + + openAPI.path("/foo/baz", new PathItem() .get(new Operation() - .response(200, new Response() - .vendorExtension("x-foo", "bar") - .description("it works!") - .schema(schema)))); - new InlineModelResolver().flatten(swagger); + .responses(apiResponses))); - Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); - Property property = response.getSchema(); - assertTrue(property instanceof MapProperty); - assertEquals(1, property.getVendorExtensions().size()); - assertEquals("ext-prop", property.getVendorExtensions().get("x-ext")); - assertTrue(swagger.getDefinitions().size() == 1); - Model inline = swagger.getDefinitions().get("inline_response_200"); - assertTrue(inline instanceof ModelImpl); - ModelImpl impl = (ModelImpl) inline; - assertNotNull(impl.getProperties().get("name")); - assertTrue(impl.getProperties().get("name") instanceof StringProperty); + new InlineModelResolver().flatten(openAPI); + + ApiResponse response = openAPI.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + Schema property = response.getContent().get("*/*").getSchema(); + assertTrue(property.getAdditionalProperties() != null); + assertEquals(1, property.getExtensions().size()); + assertEquals("ext-prop", property.getExtensions().get("x-ext")); + assertTrue(openAPI.getComponents().getSchemas().size() == 1); + + Schema inline = openAPI.getComponents().getSchemas().get("inline_response_200"); + assertTrue(inline instanceof Schema); + assertNotNull(inline.getProperties().get("name")); + assertTrue(inline.getProperties().get("name") instanceof StringSchema); } @Test public void testArrayResponse() { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); - ArrayProperty schema = new ArrayProperty(); - schema.setItems(new ObjectProperty() - .property("name", new StringProperty())); - swagger.path("/foo/baz", new Path() + ObjectSchema objectSchema = new ObjectSchema(); + objectSchema.addProperties("name", new StringSchema()); + ArraySchema schema = new ArraySchema(); + schema.setItems(objectSchema); + + ApiResponse apiResponse = new ApiResponse(); + apiResponse.addExtension("x-foo", "bar"); + apiResponse.setDescription("it works!"); + apiResponse.setContent(new Content().addMediaType("*/*", new MediaType().schema(schema))); + + openAPI.path("/foo/baz", new PathItem() .get(new Operation() - .response(200, new Response() - .vendorExtension("x-foo", "bar") - .description("it works!") - .schema(schema)))); - new InlineModelResolver().flatten(swagger); + .responses(new ApiResponses().addApiResponse("200", apiResponse)))); - Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); - assertTrue(response.getSchema() instanceof ArrayProperty); + new InlineModelResolver().flatten(openAPI); - ArrayProperty am = (ArrayProperty) response.getSchema(); - Property items = am.getItems(); - assertTrue(items instanceof RefProperty); - RefProperty rp = (RefProperty) items; - assertEquals(rp.getType(), "ref"); - assertEquals(rp.get$ref(), "#/definitions/inline_response_200"); - assertEquals(rp.getSimpleRef(), "inline_response_200"); + ApiResponse response = openAPI.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + assertTrue(response.getContent().get("*/*").getSchema() instanceof ArraySchema); - Model inline = swagger.getDefinitions().get("inline_response_200"); - assertTrue(inline instanceof ModelImpl); - ModelImpl impl = (ModelImpl) inline; - assertNotNull(impl.getProperties().get("name")); - assertTrue(impl.getProperties().get("name") instanceof StringProperty); + ArraySchema am = (ArraySchema) response.getContent().get("*/*").getSchema(); + Schema items = am.getItems(); + assertTrue(items.get$ref() != null); + + assertEquals(items.get$ref(), "#/components/schemas/inline_response_200"); + + + Schema inline = openAPI.getComponents().getSchemas().get("inline_response_200"); + assertTrue(inline instanceof Schema); + + assertNotNull(inline.getProperties().get("name")); + assertTrue(inline.getProperties().get("name") instanceof StringSchema); } @Test public void testBasicInput() { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); + openAPI.setComponents(new Components()); - ModelImpl user = new ModelImpl() - .property("name", new StringProperty()); + Schema user = new Schema(); + user.addProperties("name", new StringSchema()); - swagger.path("/foo/baz", new Path() + openAPI.path("/foo/baz", new PathItem() .post(new Operation() - .parameter(new BodyParameter() - .name("myBody") - .schema(new RefModel("User"))))); + .requestBody(new RequestBody() + .content(new Content().addMediaType("*/*",new MediaType().schema(new Schema().$ref("User"))))))); - swagger.addDefinition("User", user); + openAPI.getComponents().addSchemas("User", user); - new InlineModelResolver().flatten(swagger); + new InlineModelResolver().flatten(openAPI); - Json.prettyPrint(swagger); + Json.prettyPrint(openAPI); } @Test - public void testArbitraryObjectBodyParam() { - Swagger swagger = new Swagger(); + public void testArbitraryRequestBody() { + OpenAPI openAPI = new OpenAPI(); - swagger.path("/hello", new Path() + openAPI.path("/hello", new PathItem() .get(new Operation() - .parameter(new BodyParameter() - .name("body") - .schema(new ModelImpl())))); + .requestBody(new RequestBody() + .content(new Content().addMediaType("*/*",new MediaType().schema(new Schema())))))); - new InlineModelResolver().flatten(swagger); + new InlineModelResolver().flatten(openAPI); - Operation operation = swagger.getPaths().get("/hello").getGet(); - BodyParameter bp = (BodyParameter)operation.getParameters().get(0); - assertTrue(bp.getSchema() instanceof ModelImpl); - ModelImpl m = (ModelImpl) bp.getSchema(); - assertNull(m.getType()); + Operation operation = openAPI.getPaths().get("/hello").getGet(); + RequestBody requestBody = operation.getRequestBody(); + assertTrue(requestBody.getContent().get("*/*").getSchema() instanceof Schema); + Schema schema = requestBody.getContent().get("*/*").getSchema(); + assertNull(schema.getType()); } @Test - public void testArbitraryObjectBodyParamInline() { - Swagger swagger = new Swagger(); + public void testArbitraryObjectRequestBodyInline() { + OpenAPI swagger = new OpenAPI(); - swagger.path("/hello", new Path() + Schema schema = new Schema(); + schema.addProperties("arbitrary", new ObjectSchema()); + + swagger.path("/hello", new PathItem() .get(new Operation() - .parameter(new BodyParameter() - .name("body") - .schema(new ModelImpl() - .property("arbitrary", new ObjectProperty()))))); + .requestBody(new RequestBody() + .content(new Content().addMediaType("*/*",new MediaType().schema(schema)))))); new InlineModelResolver().flatten(swagger); Operation operation = swagger.getPaths().get("/hello").getGet(); - BodyParameter bp = (BodyParameter)operation.getParameters().get(0); - assertTrue(bp.getSchema() instanceof RefModel); + RequestBody requestBody = operation.getRequestBody(); + assertTrue(requestBody.getContent().get("*/*").getSchema().get$ref() != null); - Model body = swagger.getDefinitions().get("body"); - assertTrue(body instanceof ModelImpl); + Schema body = swagger.getComponents().getSchemas().get("body"); + assertTrue(body instanceof Schema); - ModelImpl impl = (ModelImpl) body; - Property p = impl.getProperties().get("arbitrary"); - assertNotNull(p); - assertTrue(p instanceof ObjectProperty); + + Schema property = (Schema) body.getProperties().get("arbitrary"); + assertNotNull(property); + assertTrue(property instanceof ObjectSchema); } @Test public void testArbitraryObjectBodyParamWithArray() { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); - swagger.path("/hello", new Path() + openAPI.path("/hello", new PathItem() .get(new Operation() - .parameter(new BodyParameter() - .name("body") - .schema(new ArrayModel() - .items(new ObjectProperty()))))); + .requestBody(new RequestBody() + .content(new Content().addMediaType("*/*",new MediaType().schema(new ArraySchema() + .items(new ObjectSchema()))))))); - new InlineModelResolver().flatten(swagger); + new InlineModelResolver().flatten(openAPI); - Parameter param = swagger.getPaths().get("/hello").getGet().getParameters().get(0); - assertTrue(param instanceof BodyParameter); + RequestBody requestBody = openAPI.getPaths().get("/hello").getGet().getRequestBody(); - BodyParameter bp = (BodyParameter) param; - Model schema = bp.getSchema(); - assertTrue(schema instanceof ArrayModel); + Schema schema = requestBody.getContent().get("*/*").getSchema(); - ArrayModel am = (ArrayModel) schema; - Property inner = am.getItems(); - assertTrue(inner instanceof ObjectProperty); + assertTrue(schema instanceof ArraySchema); - ObjectProperty op = (ObjectProperty) inner; - assertNotNull(op); - assertNull(op.getProperties()); + ArraySchema arraySchema = (ArraySchema) schema; + Schema inner = arraySchema.getItems(); + assertTrue(inner instanceof ObjectSchema); + + ObjectSchema property = (ObjectSchema) inner; + assertNotNull(property); + assertNull(property.getProperties()); } - @Test + /*@Test public void testArbitraryObjectBodyParamArrayInline() { Swagger swagger = new Swagger(); @@ -931,7 +962,7 @@ public void testArbitraryObjectBodyParamArrayInline() { assertTrue(p instanceof ObjectProperty); } - @Test + /*@Test public void testArbitraryObjectResponse() { Swagger swagger = new Swagger(); From 3526688efffab133e8666de989c6edff0e4d5a0f Mon Sep 17 00:00:00 2001 From: gracekarina <> Date: Thu, 5 Oct 2017 08:55:54 -0500 Subject: [PATCH 7/9] fixed all test in falttening option --- .../v3/util/InlineModelResolverTest.java | 319 +++++++++--------- 1 file changed, 164 insertions(+), 155 deletions(-) diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java index 911a5bce20..8561a677a5 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java @@ -1,6 +1,7 @@ package io.swagger.parser.v3.util; -import com.sun.org.apache.regexp.internal.RE; + + import io.swagger.oas.models.Components; import io.swagger.oas.models.OpenAPI; import io.swagger.oas.models.Operation; @@ -16,7 +17,7 @@ import io.swagger.oas.models.responses.ApiResponses; import io.swagger.util.Json; import org.testng.annotations.Test; -import sun.jvm.hotspot.ui.action.HSDBActionManager; + import java.util.ArrayList; import java.util.HashMap; @@ -921,241 +922,249 @@ public void testArbitraryObjectBodyParamWithArray() { assertNull(property.getProperties()); } - /*@Test + @Test public void testArbitraryObjectBodyParamArrayInline() { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); + + ObjectSchema items = new ObjectSchema(); + items.addProperties("arbitrary", new ObjectSchema()); - swagger.path("/hello", new Path() + openAPI.path("/hello", new PathItem() .get(new Operation() - .parameter(new BodyParameter() - .name("body") - .schema(new ArrayModel() - .items(new ObjectProperty() - .property("arbitrary", new ObjectProperty())))))); + .requestBody(new RequestBody() + .content(new Content().addMediaType("*/*",new MediaType().schema(new ArraySchema().items(items))))))); - new InlineModelResolver().flatten(swagger); + new InlineModelResolver().flatten(openAPI); - Parameter param = swagger.getPaths().get("/hello").getGet().getParameters().get(0); - assertTrue(param instanceof BodyParameter); + RequestBody requestBody = openAPI.getPaths().get("/hello").getGet().getRequestBody(); - BodyParameter bp = (BodyParameter) param; - Model schema = bp.getSchema(); + Schema schema = requestBody.getContent().get("*/*").getSchema(); - assertTrue(schema instanceof ArrayModel); + assertTrue(schema instanceof ArraySchema); - ArrayModel am = (ArrayModel) schema; - Property inner = am.getItems(); - assertTrue(inner instanceof RefProperty); + ArraySchema arraySchema = (ArraySchema) schema; + Schema inner = arraySchema.getItems(); + assertTrue(inner.get$ref() != null); - RefProperty rp = (RefProperty) inner; - assertEquals(rp.getType(), "ref"); - assertEquals(rp.get$ref(), "#/definitions/body"); - assertEquals(rp.getSimpleRef(), "body"); + assertEquals(inner.get$ref(), "#/components/schemas/body"); - Model inline = swagger.getDefinitions().get("body"); + Schema inline = openAPI.getComponents().getSchemas().get("body"); assertNotNull(inline); - assertTrue(inline instanceof ModelImpl); - ModelImpl impl = (ModelImpl) inline; - Property p = impl.getProperties().get("arbitrary"); + + Schema p = (Schema)inline.getProperties().get("arbitrary"); assertNotNull(p); - assertTrue(p instanceof ObjectProperty); + assertTrue(p instanceof ObjectSchema); } - /*@Test + @Test public void testArbitraryObjectResponse() { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); - swagger.path("/foo/bar", new Path() + openAPI.path("/foo/bar", new PathItem() .get(new Operation() - .response(200, new Response() + .responses(new ApiResponses().addApiResponse("200", new ApiResponse() .description("it works!") - .schema(new ObjectProperty())))); - new InlineModelResolver().flatten(swagger); + .content(new Content().addMediaType("*/*", new MediaType().schema(new ObjectSchema()))))))); + + new InlineModelResolver().flatten(openAPI); - Map responses = swagger.getPaths().get("/foo/bar").getGet().getResponses(); + Map responses = openAPI.getPaths().get("/foo/bar").getGet().getResponses(); - Response response = responses.get("200"); + ApiResponse response = responses.get("200"); assertNotNull(response); - assertTrue(response.getSchema() instanceof ObjectProperty); - ObjectProperty op = (ObjectProperty) response.getSchema(); + assertTrue(response.getContent().get("*/*").getSchema() instanceof ObjectSchema); + ObjectSchema op = (ObjectSchema) response.getContent().get("*/*").getSchema(); assertNull(op.getProperties()); } @Test public void testArbitraryObjectResponseArray() { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); - swagger.path("/foo/baz", new Path() + openAPI.path("/foo/baz", new PathItem() .get(new Operation() - .response(200, new Response() + .responses(new ApiResponses().addApiResponse("200", new ApiResponse() .description("it works!") - .schema(new ArrayProperty() - .items(new ObjectProperty()))))); - new InlineModelResolver().flatten(swagger); + .content(new Content().addMediaType("*/*", new MediaType().schema(new ArraySchema() + .items(new ObjectSchema())))))))); - Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); - assertTrue(response.getSchema() instanceof ArrayProperty); + new InlineModelResolver().flatten(openAPI); - ArrayProperty am = (ArrayProperty) response.getSchema(); - Property items = am.getItems(); - assertTrue(items instanceof ObjectProperty); - ObjectProperty op = (ObjectProperty) items; + ApiResponse response = openAPI.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + assertTrue(response.getContent().get("*/*").getSchema() instanceof ArraySchema); + + ArraySchema arraySchema = (ArraySchema) response.getContent().get("*/*").getSchema(); + Schema items = arraySchema.getItems(); + assertTrue(items instanceof ObjectSchema); + ObjectSchema op = (ObjectSchema) items; assertNull(op.getProperties()); } @Test public void testArbitraryObjectResponseArrayInline() { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); + + ArraySchema arraySchema = new ArraySchema(); + ObjectSchema objectSchema = new ObjectSchema(); + objectSchema.addProperties("arbitrary", new ObjectSchema()); + arraySchema.items(objectSchema); + + + ApiResponse apiResponse = new ApiResponse(); + apiResponse.addExtension("x-foo", "bar"); + apiResponse.description("it works!"); + apiResponse.content(new Content().addMediaType("*/*", new MediaType().schema(arraySchema))); + + - swagger.path("/foo/baz", new Path() + openAPI.path("/foo/baz", new PathItem() .get(new Operation() - .response(200, new Response() - .vendorExtension("x-foo", "bar") - .description("it works!") - .schema(new ArrayProperty() - .items(new ObjectProperty() - .property("arbitrary", new ObjectProperty())))))); + .responses(new ApiResponses().addApiResponse("200",apiResponse)))); - new InlineModelResolver().flatten(swagger); + new InlineModelResolver().flatten(openAPI); - Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + ApiResponse response = openAPI.getPaths().get("/foo/baz").getGet().getResponses().get("200"); assertNotNull(response); - assertNotNull(response.getSchema()); - Property responseProperty = response.getSchema(); - assertTrue(responseProperty instanceof ArrayProperty); + assertNotNull(response.getContent().get("*/*").getSchema()); + Schema responseProperty = response.getContent().get("*/*").getSchema(); + assertTrue(responseProperty instanceof ArraySchema); - ArrayProperty ap = (ArrayProperty) responseProperty; - Property p = ap.getItems(); - assertNotNull(p); + ArraySchema arraySchema1 = (ArraySchema) responseProperty; + Schema items = arraySchema1.getItems(); + assertNotNull(items); - RefProperty rp = (RefProperty) p; - assertEquals(rp.getType(), "ref"); - assertEquals(rp.get$ref(), "#/definitions/inline_response_200"); - assertEquals(rp.getSimpleRef(), "inline_response_200"); + assertEquals( "#/components/schemas/inline_response_200",items.get$ref()); - Model inline = swagger.getDefinitions().get("inline_response_200"); + Schema inline = openAPI.getComponents().getSchemas().get("inline_response_200"); assertNotNull(inline); - assertTrue(inline instanceof ModelImpl); - ModelImpl impl = (ModelImpl) inline; - Property inlineProp = impl.getProperties().get("arbitrary"); + assertTrue(inline instanceof Schema); + + Schema inlineProp = (Schema) inline.getProperties().get("arbitrary"); assertNotNull(inlineProp); - assertTrue(inlineProp instanceof ObjectProperty); - ObjectProperty op = (ObjectProperty) inlineProp; - assertNull(op.getProperties()); + assertTrue(inlineProp instanceof ObjectSchema); + assertNull(inlineProp.getProperties()); } @Test public void testArbitraryObjectResponseMapInline() { - Swagger swagger = new Swagger(); + OpenAPI openAPI = new OpenAPI(); - MapProperty schema = new MapProperty(); - schema.setAdditionalProperties(new ObjectProperty()); + Schema schema = new Schema(); + schema.setAdditionalProperties(new ObjectSchema()); - swagger.path("/foo/baz", new Path() + openAPI.path("/foo/baz", new PathItem() .get(new Operation() - .response(200, new Response() + .responses(new ApiResponses().addApiResponse("200", new ApiResponse() .description("it works!") - .schema(schema)))); - new InlineModelResolver().flatten(swagger); + .content(new Content().addMediaType("*/*", new MediaType().schema(schema))))))); + + new InlineModelResolver().flatten(openAPI); - Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + ApiResponse response = openAPI.getPaths().get("/foo/baz").getGet().getResponses().get("200"); - Property property = response.getSchema(); - assertTrue(property instanceof MapProperty); - assertTrue(swagger.getDefinitions().size() == 0); - Property inlineProp = ((MapProperty) property).getAdditionalProperties(); - assertTrue(inlineProp instanceof ObjectProperty); - ObjectProperty op = (ObjectProperty) inlineProp; + Schema property = response.getContent().get("*/*").getSchema(); + assertTrue(property.getAdditionalProperties() != null); + assertTrue(openAPI.getComponents().getSchemas() == null); + Schema inlineProp = property.getAdditionalProperties(); + assertTrue(inlineProp instanceof ObjectSchema); + ObjectSchema op = (ObjectSchema) inlineProp; assertNull(op.getProperties()); } @Test public void testArbitraryObjectModelInline() { - Swagger swagger = new Swagger(); - - swagger.addDefinition("User", new ModelImpl() - .name("user") - .description("a common user") - .property("name", new StringProperty()) - .property("arbitrary", new ObjectProperty() - .title("title") - ._default("default") - .access("access") - .readOnly(false) - .required(true) - .description("description") - .name("name"))); + OpenAPI openAPI = new OpenAPI(); + openAPI.setComponents(new Components()); + + Schema userSchema = new Schema(); + userSchema.setName("user"); + userSchema.setDescription("a common user"); + userSchema.addProperties("name", new StringSchema()); + + ObjectSchema objectSchema = new ObjectSchema(); + objectSchema.setTitle("title"); + objectSchema.setDefault("default"); + objectSchema.setReadOnly(false); + objectSchema.setDescription("description"); + objectSchema.setName("name"); + + userSchema.addProperties("arbitrary", objectSchema); + List required = new ArrayList(); + required.add("arbitrary"); + userSchema.setRequired(required); - new InlineModelResolver().flatten(swagger); - ModelImpl user = (ModelImpl)swagger.getDefinitions().get("User"); + openAPI.getComponents().addSchemas("User", userSchema); + + new InlineModelResolver().flatten(openAPI); + + Schema user = openAPI.getComponents().getSchemas().get("User"); assertNotNull(user); - Property inlineProp = user.getProperties().get("arbitrary"); - assertTrue(inlineProp instanceof ObjectProperty); - ObjectProperty op = (ObjectProperty) inlineProp; - assertNull(op.getProperties()); + Schema inlineProp = (Schema) user.getProperties().get("arbitrary"); + assertTrue(inlineProp instanceof ObjectSchema); + assertNull(inlineProp.getProperties()); } @Test public void testArbitraryObjectModelWithArrayInlineWithoutTitle() { - Swagger swagger = new Swagger(); - - swagger.addDefinition("User", new ArrayModel() - .items(new ObjectProperty() - ._default("default") - .access("access") - .readOnly(false) - .required(true) - .description("description") - .name("name") - .property("arbitrary", new ObjectProperty()))); + OpenAPI openAPI = new OpenAPI(); + openAPI.setComponents(new Components()); - new InlineModelResolver().flatten(swagger); + Schema items = new ObjectSchema(); + items.setDefault("default"); + items.setReadOnly(false); + items.setDescription("description"); + items.setName("name"); + items.addProperties("arbitrary", new ObjectSchema()); + + openAPI.getComponents().addSchemas("User", new ArraySchema().items(items).addRequiredItem("name")); + + new InlineModelResolver().flatten(openAPI); - Model model = swagger.getDefinitions().get("User"); - assertTrue(model instanceof ArrayModel); - ArrayModel am = (ArrayModel) model; - Property inner = am.getItems(); - assertTrue(inner instanceof RefProperty); + Schema model = openAPI.getComponents().getSchemas().get("User"); + assertTrue(model instanceof ArraySchema); + ArraySchema am = (ArraySchema) model; + Schema inner = am.getItems(); + assertTrue(inner.get$ref() != null); - ModelImpl userInner = (ModelImpl)swagger.getDefinitions().get("User_inner"); + Schema userInner = openAPI.getComponents().getSchemas().get("User_inner"); assertNotNull(userInner); - Property inlineProp = userInner.getProperties().get("arbitrary"); - assertTrue(inlineProp instanceof ObjectProperty); - ObjectProperty op = (ObjectProperty) inlineProp; + Schema inlineProp = (Schema)userInner.getProperties().get("arbitrary"); + assertTrue(inlineProp instanceof ObjectSchema); + ObjectSchema op = (ObjectSchema) inlineProp; assertNull(op.getProperties()); } @Test public void testArbitraryObjectModelWithArrayInlineWithTitle() { - Swagger swagger = new Swagger(); - - swagger.addDefinition("User", new ArrayModel() - .items(new ObjectProperty() - .title("InnerUserTitle") - ._default("default") - .access("access") - .readOnly(false) - .required(true) - .description("description") - .name("name") - .property("arbitrary", new ObjectProperty()))); + OpenAPI openAPI = new OpenAPI(); + openAPI.setComponents(new Components()); - new InlineModelResolver().flatten(swagger); + Schema items = new ObjectSchema(); + items.setTitle("InnerUserTitle"); + items.setDefault("default"); + items.setReadOnly(false); + items.setDescription("description"); + items.setName("name"); + items.addProperties("arbitrary", new ObjectSchema()); + + openAPI.getComponents().addSchemas("User", new ArraySchema().items(items).addRequiredItem("name")); - Model model = swagger.getDefinitions().get("User"); - assertTrue(model instanceof ArrayModel); - ArrayModel am = (ArrayModel) model; - Property inner = am.getItems(); - assertTrue(inner instanceof RefProperty); + new InlineModelResolver().flatten(openAPI); - ModelImpl userInner = (ModelImpl)swagger.getDefinitions().get("InnerUserTitle"); + Schema model = openAPI.getComponents().getSchemas().get("User"); + assertTrue(model instanceof ArraySchema); + ArraySchema am = (ArraySchema) model; + Schema inner = am.getItems(); + assertTrue(inner.get$ref() != null); + + Schema userInner = openAPI.getComponents().getSchemas().get("InnerUserTitle"); assertNotNull(userInner); - Property inlineProp = userInner.getProperties().get("arbitrary"); - assertTrue(inlineProp instanceof ObjectProperty); - ObjectProperty op = (ObjectProperty) inlineProp; + Schema inlineProp = (Schema) userInner.getProperties().get("arbitrary"); + assertTrue(inlineProp instanceof ObjectSchema); + ObjectSchema op = (ObjectSchema) inlineProp; assertNull(op.getProperties()); - }*/ + } } \ No newline at end of file From 28b7210fc41aa16efb3f52f7eddc3c749af78116 Mon Sep 17 00:00:00 2001 From: gracekarina <> Date: Thu, 5 Oct 2017 12:53:14 -0500 Subject: [PATCH 8/9] implementing flattening as an option with test --- .../swagger/parser/models/ParseOptions.java | 5 ++ .../io/swagger/parser/v3/OpenAPIV3Parser.java | 7 ++ .../parser/test/OpenAPIV3ParserTest.java | 65 +++++++++++++++++++ .../src/test/resources/flatten.json | 30 +++++++++ 4 files changed, 107 insertions(+) create mode 100644 modules/swagger-parser-v3/src/test/resources/flatten.json diff --git a/modules/swagger-parser-core/src/main/java/io/swagger/parser/models/ParseOptions.java b/modules/swagger-parser-core/src/main/java/io/swagger/parser/models/ParseOptions.java index 0ea648eebb..67c906bb5b 100644 --- a/modules/swagger-parser-core/src/main/java/io/swagger/parser/models/ParseOptions.java +++ b/modules/swagger-parser-core/src/main/java/io/swagger/parser/models/ParseOptions.java @@ -3,6 +3,7 @@ public class ParseOptions { private boolean resolve; private boolean resolveFully; + private boolean flatten; public boolean isResolve() { return resolve; @@ -19,4 +20,8 @@ public boolean isResolveFully() { public void setResolveFully(boolean resolveFully) { this.resolveFully = resolveFully; } + + public boolean isFlatten() { return flatten; } + + public void setFlatten(boolean flatten) { this.flatten = flatten; } } diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/OpenAPIV3Parser.java b/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/OpenAPIV3Parser.java index 5a24d07ec6..02209ad8f2 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/OpenAPIV3Parser.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/OpenAPIV3Parser.java @@ -9,6 +9,7 @@ import io.swagger.parser.models.SwaggerParseResult; import io.swagger.parser.v3.util.ClasspathHelper; import io.swagger.parser.v3.util.DeserializationUtils; +import io.swagger.parser.v3.util.InlineModelResolver; import io.swagger.parser.v3.util.OpenAPIDeserializer; import io.swagger.parser.v3.util.RemoteUrl; import io.swagger.parser.v3.util.ResolverFully; @@ -54,6 +55,9 @@ public SwaggerParseResult readLocation(String url, List auth if (options.isResolveFully()) { result.setOpenAPI(resolver.resolve()); new ResolverFully().resolveFully(result.getOpenAPI()); + }else if (options.isFlatten()){ + InlineModelResolver inlineResolver = new InlineModelResolver(); + inlineResolver.flatten(result.getOpenAPI()); } } } @@ -177,6 +181,9 @@ public SwaggerParseResult readContents(String swaggerAsString, List auths) t Assert.assertEquals(result.getOpenAPI().getComponents().getSchemas().get("OrderRef").getType(),"object"); } + @Test + public void testInlineModelResolver(@Injectable final List auths) throws Exception{ + + + String pathFile = FileUtils.readFileToString(new File("src/test/resources/flatten.json")); + pathFile = pathFile.replace("${dynamicPort}", String.valueOf(this.serverPort)); + ParseOptions options = new ParseOptions(); + options.setFlatten(true); + + SwaggerParseResult result = new OpenAPIV3Parser().readContents(pathFile, auths, options); + + Assert.assertNotNull(result); + OpenAPI openAPI = result.getOpenAPI(); + Assert.assertNotNull(openAPI); + Schema user = openAPI.getComponents().getSchemas().get("User"); + + assertNotNull(user); + Schema address = (Schema)user.getProperties().get("address"); + + assertTrue((address.get$ref()!= null)); + + Schema userAddress = openAPI.getComponents().getSchemas().get("User_address"); + assertNotNull(userAddress); + assertNotNull(userAddress.getProperties().get("city")); + assertNotNull(userAddress.getProperties().get("street")); + } + @Test public void test30NoOptions(@Injectable final List auths) throws Exception{ @@ -204,6 +243,32 @@ public void testShellMethod(@Injectable final List auths){ Assert.assertEquals(openAPI.getOpenapi(), "3.0.0"); } + @Test + public void testInlineModelResolverByUrl(@Injectable final List auths){ + + String url = "http://localhost:${dynamicPort}/remote/json"; + url = url.replace("${dynamicPort}", String.valueOf(this.serverPort)); + + ParseOptions options = new ParseOptions(); + options.setFlatten(true); + + SwaggerParseResult result = new OpenAPIV3Parser().readLocation(url,auths,options); + Assert.assertNotNull(result); + OpenAPI openAPI = result.getOpenAPI(); + Assert.assertNotNull(openAPI); + Schema user = openAPI.getComponents().getSchemas().get("User"); + + assertNotNull(user); + Schema address = (Schema)user.getProperties().get("address"); + + assertTrue((address.get$ref()!= null)); + + Schema userAddress = openAPI.getComponents().getSchemas().get("User_address"); + assertNotNull(userAddress); + assertNotNull(userAddress.getProperties().get("city")); + assertNotNull(userAddress.getProperties().get("street")); + } + private static int getDynamicPort() { return new Random().ints(10000, 20000).findFirst().getAsInt(); diff --git a/modules/swagger-parser-v3/src/test/resources/flatten.json b/modules/swagger-parser-v3/src/test/resources/flatten.json new file mode 100644 index 0000000000..7535fbaa49 --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/flatten.json @@ -0,0 +1,30 @@ +{ + "openapi" : "3.0.0", + "components" : { + "schemas" : { + "User" : { + "required" : [ "address" ], + "properties" : { + "name" : { + "type" : "string" + }, + "address" : { + "type" : "object", + "properties" : { + "street" : { + "type" : "string" + }, + "city" : { + "type" : "string" + } + }, + "description" : "description", + "readOnly" : false, + "default" : "default" + } + }, + "description" : "a common user" + } + } + } +} \ No newline at end of file From d056405e08c87c3870feaed2495f5719159513da Mon Sep 17 00:00:00 2001 From: gracekarina <> Date: Thu, 5 Oct 2017 13:37:30 -0500 Subject: [PATCH 9/9] parameter support and test --- .../parser/v3/util/InlineModelResolver.java | 39 +++++++++++++++++ .../v3/util/InlineModelResolverTest.java | 42 +++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java b/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java index c2caf92315..a98469d5c0 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/parser/v3/util/InlineModelResolver.java @@ -95,6 +95,45 @@ public void flatten(OpenAPI openAPI) { } } } + List parameters = operation.getParameters(); + if (parameters != null){ + for (Parameter parameter : parameters) { + if (parameter.getSchema() != null) { + Schema model = parameter.getSchema(); + if (model.getProperties() != null) { + if (model.getType() == null || "object".equals(model.getType())) { + if (model.getProperties() != null && model.getProperties().size() > 0) { + flattenProperties(model.getProperties(), pathname); + String modelName = resolveModelName(model.getTitle(), parameter.getName()); + parameter.setSchema(new Schema().$ref(modelName)); + addGenerated(modelName, model); + openAPI.getComponents().addSchemas(modelName, model); + } + } + } else if (model instanceof ArraySchema) { + ArraySchema am = (ArraySchema) model; + Schema inner = am.getItems(); + + if (inner instanceof ObjectSchema) { + ObjectSchema op = (ObjectSchema) inner; + if (op.getProperties() != null && op.getProperties().size() > 0) { + flattenProperties(op.getProperties(), pathname); + String modelName = resolveModelName(op.getTitle(), parameter.getName()); + Schema innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + if (existing != null) { + am.setItems(new Schema().$ref(existing)); + } else { + am.setItems(new Schema().$ref(modelName)); + addGenerated(modelName, innerModel); + openAPI.getComponents().addSchemas(modelName, innerModel); + } + } + } + } + } + } + } Map responses = operation.getResponses(); if (responses != null) { for (String key : responses.keySet()) { diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java index 8561a677a5..33d67b8a35 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/parser/v3/util/InlineModelResolverTest.java @@ -12,6 +12,7 @@ import io.swagger.oas.models.media.ObjectSchema; import io.swagger.oas.models.media.Schema; import io.swagger.oas.models.media.StringSchema; +import io.swagger.oas.models.parameters.Parameter; import io.swagger.oas.models.parameters.RequestBody; import io.swagger.oas.models.responses.ApiResponse; import io.swagger.oas.models.responses.ApiResponses; @@ -511,6 +512,47 @@ public void resolveInlineRequestBody() throws Exception { assertNotNull(bodySchema.getProperties().get("address")); } + @Test + public void resolveInlineParameter() throws Exception { + OpenAPI openAPI = new OpenAPI(); + + + ObjectSchema objectSchema = new ObjectSchema(); + objectSchema.addProperties("street", new StringSchema()); + + Schema schema = new Schema(); + schema.addProperties("address", objectSchema); + schema.addProperties("name", new StringSchema()); + + Parameter parameter = new Parameter(); + parameter.setName("name"); + parameter.setSchema(schema); + + List parameters = new ArrayList(); + parameters.add(parameter); + + + Operation operation = new Operation(); + operation.setParameters(parameters); + + PathItem pathItem = new PathItem(); + pathItem.setGet(operation); + openAPI.path("/hello",pathItem); + + new InlineModelResolver().flatten(openAPI); + + Operation getOperation = openAPI.getPaths().get("/hello").getGet(); + Parameter param = getOperation.getParameters().get(0); + assertTrue(param.getSchema().get$ref() != null); + + + + Schema bodySchema = openAPI.getComponents().getSchemas().get("name"); + assertTrue(bodySchema instanceof Schema); + + assertNotNull(bodySchema.getProperties().get("address")); + } + @Test public void resolveInlineRequestBodyWithTitle() throws Exception { OpenAPI openAPI = new OpenAPI();