Do not generate models for "object" type with no properties

Also updated the petstore sample to include operations to cover the case
in model property and response, and updated Java clients to sync with
it.

Closes #2237
This commit is contained in:
xhh
2016-03-02 21:08:41 +08:00
parent 336d80cbf3
commit 7bea6da587
21 changed files with 2184 additions and 105 deletions

View File

@@ -179,7 +179,7 @@ public class InlineModelResolverTest {
assertTrue(inner instanceof RefProperty);
RefProperty rp = (RefProperty) inner;
assertEquals(rp.getType(), "ref");
assertEquals(rp.get$ref(), "#/definitions/body");
assertEquals(rp.getSimpleRef(), "body");
@@ -349,4 +349,287 @@ public class InlineModelResolverTest {
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<String, Response> 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 testArbitraryObjectModelWithArrayInline() {
Swagger swagger = new Swagger();
swagger.addDefinition("User", new ArrayModel()
.items(new ObjectProperty()
.title("title")
._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());
}
}