@Test
public void testCollectionResponse() throws Exception {

  String apiConfigSource = g.generateConfig(TestEndpoint.class).get("myapi-v1.api");
  ObjectNode root = objectMapper.readValue(apiConfigSource, ObjectNode.class);
  // regular collection response
  assertEquals("bar", root.path("methods").path("myapi.testEndpoint.list").path("path").asText());
  assertNotNull(root.path("descriptor").path("schemas").path("Bar"));
  assertNotNull(root.path("descriptor").path("schemas").path("BarCollection"));
  assertEquals("array", root.path("descriptor").path("schemas").path("BarCollection")
      .path("properties").path("items").path("type").asText());
  assertEquals("Bar", root.path("descriptor").path("schemas").path("BarCollection")
      .path("properties").path("items").path("items").path("$ref").asText());
  String backendName = TestEndpoint.class.getName();
  // specific CollectionResponse
  assertEquals("baz", root.path("methods").path("myapi.testEndpoint.listWithPagination")
      .path("path").asText());
  assertEquals("CollectionResponse_Baz", root.path("descriptor").path("methods")
      .path(backendName + ".listWithPagination").path("response").path("$ref").asText());
  assertNotNull(root.path("descriptor").path("schemas").path("Baz"));
  assertNotNull(root.path("descriptor").path("schemas").path("CollectionResponse_Baz"));
  assertEquals("array", root.path("descriptor").path("schemas").path("CollectionResponse_Baz")
      .path("properties").path("items").path("type").asText());
  assertEquals("Baz", root.path("descriptor").path("schemas").path("CollectionResponse_Baz")
      .path("properties").path("items").path("items").path("$ref").asText());
  assertEquals("string", root.path("descriptor").path("schemas").path("CollectionResponse_Baz")
      .path("properties").path("nextPageToken").path("type").asText());
  assertEquals("CollectionResponse_Baz", root.path("descriptor").path("methods")
      .path(backendName + ".listWithPagination").path("response").path("$ref").asText());
  // subclass of CollectionResponse
  assertEquals("foo", root.path("methods").path("myapi.testEndpoint.listWithMyCollectionResponse")
      .path("path").asText());
  assertEquals("MyCollectionResponse_Foo", root.path("descriptor").path("methods")
      .path(backendName + ".listWithMyCollectionResponse").path("response")
      .path("$ref").asText());
  assertNotNull(root.path("descriptor").path("schemas").path("Foo"));
  assertNotNull(root.path("descriptor").path("schemas").path("MyCollectionResponse_Foo"));
  assertEquals("array", root.path("descriptor").path("schemas").path("MyCollectionResponse_Foo")
      .path("properties").path("items").path("type").asText());
  assertEquals("Foo", root.path("descriptor").path("schemas").path("MyCollectionResponse_Foo")
      .path("properties").path("items").path("items").path("$ref").asText());
  assertEquals("string", root.path("descriptor").path("schemas").path("MyCollectionResponse_Foo")
      .path("properties").path("nextPageToken").path("type").asText());
  assertEquals("MyCollectionResponse_Foo", root.path("descriptor").path("methods")
      .path(backendName + ".listWithMyCollectionResponse").path("response")
      .path("$ref").asText());
}