package io.swagger; import com.google.common.base.Functions; import com.google.common.collect.Collections2; import com.google.common.collect.Sets; import io.swagger.jaxrs.Reader; import io.swagger.models.ArrayModel; import io.swagger.models.Model; import io.swagger.models.Operation; import io.swagger.models.RefModel; import io.swagger.models.Swagger; import io.swagger.models.TestEnum; import io.swagger.models.parameters.BodyParameter; import io.swagger.models.parameters.QueryParameter; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.Property; import io.swagger.models.properties.RefProperty; import io.swagger.models.properties.StringProperty; import io.swagger.models.properties.UUIDProperty; import io.swagger.resources.ResourceWithGenerics; import io.swagger.resources.generics.UserApiRoute; import org.testng.annotations.Test; import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Set; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; public class GenericsTest { private final Swagger swagger = new Reader(new Swagger()).read(ResourceWithGenerics.class); private final Set<String> enumValues = Sets.newHashSet(Collections2.transform(Arrays.asList(TestEnum.values()), Functions.toStringFunction())); private void testEnumCollection(QueryParameter p, String name) { testCollection(p, name, "string", null); StringProperty schema = (StringProperty) p.getItems(); assertEquals(schema.getEnum(), enumValues); } private void testCollection(QueryParameter p, String name, String type, String format) { assertEquals(p.getName(), name); assertEquals(p.getType(), "array"); assertEquals(p.getFormat(), null); assertEquals(p.getCollectionFormat(), "multi"); assertNotEquals(p.getItems(), null); Property schema = p.getItems(); assertEquals(schema.getType(), type); assertEquals(schema.getFormat(), format); } private void testScalar(QueryParameter p, String name, String type, String format) { assertEquals(p.getName(), name); assertEquals(p.getType(), type); assertEquals(p.getFormat(), format); assertEquals(p.getCollectionFormat(), null); assertEquals(p.getItems(), null); } private void testGenericType(Operation op, String type) { assertEquals(((RefModel) getBodyParameter(op, 0).getSchema()).getSimpleRef(), type); } private BodyParameter getBodyParameter(Operation op, int index) { return (BodyParameter) op.getParameters().get(index); } private Operation getOperation(String name) { return swagger.getPath("/generics/" + name).getPost(); } private QueryParameter getQueryParameter(Operation op, int index) { return (QueryParameter) op.getParameters().get(index); } private Property getProperty(String type, String name) { return (swagger.getDefinitions().get(type)).getProperties().get(name); } @Test(description = "check collections of integers") public void checkCollectionsOfIntegers() { Operation op = getOperation("testIntegerContainers"); assertEquals(op.getParameters().size(), 8); testCollection(getQueryParameter(op, 0), "set", "integer", "int32"); testCollection(getQueryParameter(op, 1), "list", "integer", "int32"); testCollection(getQueryParameter(op, 2), "list2D", "string", null); testCollection(getQueryParameter(op, 3), "array", "integer", "int32"); testCollection(getQueryParameter(op, 4), "arrayP", "integer", "int32"); testScalar(getQueryParameter(op, 5), "scalar", "integer", "int32"); testScalar(getQueryParameter(op, 6), "scalarP", "integer", "int32"); testCollection(getQueryParameter(op, 7), "forced", "integer", "int32"); } @Test(description = "check collections of strings") public void checkCollectionsOfStrings() { Operation op = getOperation("testStringContainers"); assertEquals(op.getParameters().size(), 5); QueryParameter set = getQueryParameter(op, 0); testCollection(set, "set", "string", null); assertEquals(((StringProperty) set.getItems()).getEnum(), Arrays.asList("1", "2", "3")); testCollection(getQueryParameter(op, 1), "list", "string", null); testCollection(getQueryParameter(op, 2), "list2D", "string", null); testCollection(getQueryParameter(op, 3), "array", "string", null); testScalar(getQueryParameter(op, 4), "scalar", "string", null); } @Test(description = "check collections of objects") public void checkCollectionsOfObjects() { Operation op = getOperation("testObjectContainers"); assertEquals(op.getParameters().size(), 5); testCollection(getQueryParameter(op, 0), "set", "string", null); testCollection(getQueryParameter(op, 1), "list", "string", null); testCollection(getQueryParameter(op, 2), "list2D", "string", null); testCollection(getQueryParameter(op, 3), "array", "string", null); testScalar(getQueryParameter(op, 4), "scalar", "string", null); } @Test(description = "check collections of enumerations") public void checkCollectionsOfEnumerations() { Operation op = getOperation("testEnumContainers"); assertEquals(op.getParameters().size(), 5); testEnumCollection(getQueryParameter(op, 0), "set"); testEnumCollection(getQueryParameter(op, 1), "list"); testCollection(getQueryParameter(op, 2), "list2D", "string", null); testEnumCollection(getQueryParameter(op, 3), "array"); QueryParameter scalar = getQueryParameter(op, 4); testScalar(scalar, "scalar", "string", null); assertEquals(scalar.getEnum(), enumValues); } @Test(description = "check collection of strings as body parameter") public void checkCollectionsOfStringsAsBodyParameter() { Operation op = getOperation("testStringsInBody"); assertEquals(op.getParameters().size(), 1); BodyParameter p = getBodyParameter(op, 0); ArrayModel strArray = (ArrayModel) p.getSchema(); assertEquals(strArray.getItems().getType(), "string"); } @Test(description = "check collection of objects as body parameter") public void checkCollectionsOfObjectsAsBodyParameter() { Operation op = getOperation("testObjectsInBody"); assertEquals(op.getParameters().size(), 1); BodyParameter p = getBodyParameter(op, 0); ArrayModel objArray = (ArrayModel) p.getSchema(); assertEquals(((RefProperty) objArray.getItems()).getSimpleRef(), "Tag"); } @Test(description = "check collection of enumerations as body parameter") public void checkCollectionsOfEnumerationsAsBodyParameter() { Operation op = getOperation("testEnumsInBody"); assertEquals(op.getParameters().size(), 1); BodyParameter p = getBodyParameter(op, 0); ArrayModel enumArray = (ArrayModel) p.getSchema(); assertEquals(((StringProperty) enumArray.getItems()).getEnum(), enumValues); } @Test(description = "check 2D array as body parameter") public void check2DArrayAsBodyParameter() { Operation op = getOperation("test2DInBody"); assertEquals(op.getParameters().size(), 1); BodyParameter p = getBodyParameter(op, 0); ArrayModel ddArray = (ArrayModel) p.getSchema(); assertEquals(((RefProperty) ((ArrayProperty) ddArray.getItems()).getItems()).getSimpleRef(), "Tag"); } @Test(description = "check parameters of generic types") public void checkParametersOfGenericTypes() { Set<String> genericTypes = new HashSet(Arrays.asList("GenericTypeString", "GenericTypeUUID", "GenericTypeGenericTypeString", "RenamedGenericTypeString", "RenamedGenericTypeRenamedGenericTypeString")); assertTrue(swagger.getDefinitions().keySet().containsAll(genericTypes)); Operation opString = getOperation("testGenericType"); testGenericType(opString, "GenericTypeString"); Property strValue = getProperty("GenericTypeString", "value"); assertNotEquals(strValue, null); assertEquals(strValue.getClass().getName(), StringProperty.class.getName()); Operation opUUID = getOperation("testStringBasedGenericType"); testGenericType(opUUID, "GenericTypeUUID"); Property uuidValue = getProperty("GenericTypeUUID", "value"); assertNotEquals(uuidValue, null); assertEquals(uuidValue.getClass().getName(), UUIDProperty.class.getName()); Operation opComplex = getOperation("testComplexGenericType"); testGenericType(opComplex, "GenericTypeGenericTypeString"); Property complexValue = getProperty("GenericTypeGenericTypeString", "value"); assertNotEquals(complexValue, null); assertEquals(complexValue.getClass().getName(), RefProperty.class.getName()); assertEquals(((RefProperty) complexValue).getSimpleRef(), "GenericTypeString"); Operation opRenamed = getOperation("testRenamedGenericType"); testGenericType(opRenamed, "RenamedGenericTypeRenamedGenericTypeString"); Property renamedComplexValue = getProperty("RenamedGenericTypeRenamedGenericTypeString", "value"); assertNotEquals(renamedComplexValue, null); assertTrue(renamedComplexValue instanceof RefProperty); assertEquals(((RefProperty) renamedComplexValue).getSimpleRef(), "RenamedGenericTypeString"); } @Test(description = "check generic result") public void checkGenericResult() { Operation op = swagger.getPath("/generics/testGenericResult").getGet(); Property schema = op.getResponses().get("200").getSchema(); assertEquals(schema.getClass().getName(), RefProperty.class.getName()); assertEquals(((RefProperty) schema).getSimpleRef(), "GenericListWrapperTag"); Property entries = getProperty("GenericListWrapperTag", "entries"); assertNotEquals(entries, null); assertEquals(entries.getClass().getName(), ArrayProperty.class.getName()); Property items = ((ArrayProperty) entries).getItems(); assertEquals(items.getClass().getName(), RefProperty.class.getName()); assertEquals(((RefProperty) items).getSimpleRef(), "Tag"); } @Test(description = "scan model with Generic Type") public void scanModelWithGenericType() { final Swagger swagger = new Reader(new Swagger()).read(UserApiRoute.class); assertNotNull(swagger); final Model userEntity = swagger.getDefinitions().get("UserEntity"); assertNotNull(userEntity); final Map<String, Property> properties = userEntity.getProperties(); assertEquals(properties.size(), 2); assertNotNull(properties.get("id")); assertNotNull(properties.get("name")); } }