diff --git a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultGraphQlTester.java b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultGraphQlTester.java index 2faeeb85..38063898 100644 --- a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultGraphQlTester.java +++ b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultGraphQlTester.java @@ -404,26 +404,22 @@ final class DefaultGraphQlTester implements GraphQlTester { @Override public Entity entity(Class entityType) { - D entity = this.delegate.read(this.jsonPath, new TypeRefAdapter<>(entityType)); - return new DefaultEntity<>(entity, this.basePath, this.path, this.delegate); + return new DefaultEntity<>(new TypeRefAdapter<>(entityType)); } @Override public Entity entity(ParameterizedTypeReference entityType) { - D entity = this.delegate.read(this.jsonPath, new TypeRefAdapter<>(entityType)); - return new DefaultEntity<>(entity, this.basePath, this.path, this.delegate); + return new DefaultEntity<>(new TypeRefAdapter<>(entityType)); } @Override public EntityList entityList(Class elementType) { - List entity = this.delegate.read(this.jsonPath, new TypeRefAdapter<>(List.class, elementType)); - return new DefaultEntityList<>(entity, this.basePath, this.path, this.delegate); + return new DefaultEntityList<>(new TypeRefAdapter<>(List.class, elementType)); } @Override public EntityList entityList(ParameterizedTypeReference elementType) { - List entity = this.delegate.read(this.jsonPath, new TypeRefAdapter<>(List.class, elementType)); - return new DefaultEntityList<>(entity, this.basePath, this.path, this.delegate); + return new DefaultEntityList<>(new TypeRefAdapter<>(List.class, elementType)); } @Override @@ -470,200 +466,190 @@ final class DefaultGraphQlTester implements GraphQlTester { return (basePath != null ? basePath + "." + path : path); } - } + /** + * Default {@link GraphQlTester.Entity} implementation. + */ + private class DefaultEntity> implements Entity { - /** - * Default {@link GraphQlTester.Entity} implementation. - */ - private static class DefaultEntity> implements Entity { + private final D entity; - private final D entity; + protected DefaultEntity(TypeRefAdapter typeAdapter) { + this.entity = delegate.read(jsonPath, typeAdapter); + } - @Nullable - private final String basePath; + protected D getEntity() { + return this.entity; + } - private final String path; + protected void doAssert(Runnable task) { + delegate.doAssert(task); + } - private final ResponseDelegate delegate; + protected String getPath() { + return path; + } - protected DefaultEntity(D entity, @Nullable String basePath, String path, ResponseDelegate delegate) { - this.entity = entity; - this.basePath = basePath; - this.path = path; - this.delegate = delegate; + @Override + public Path path(String path) { + return forPath(basePath, path, delegate); + } + + @Override + public Path path(String path, Consumer pathConsumer) { + return forNestedPath(basePath, path, delegate, pathConsumer); + } + + @Override + public T isEqualTo(Object expected) { + delegate.doAssert(() -> AssertionErrors.assertEquals(path, expected, this.entity)); + return self(); + } + + @Override + public T isNotEqualTo(Object other) { + delegate.doAssert(() -> AssertionErrors.assertNotEquals(path, other, this.entity)); + return self(); + } + + @Override + public T isSameAs(Object expected) { + delegate.doAssert(() -> AssertionErrors.assertTrue(path, expected == this.entity)); + return self(); + } + + @Override + public T isNotSameAs(Object other) { + delegate.doAssert(() -> AssertionErrors.assertTrue(path, other != this.entity)); + return self(); + } + + @Override + public T matches(Predicate predicate) { + delegate + .doAssert(() -> AssertionErrors.assertTrue(path, predicate.test(this.entity))); + return self(); + } + + @Override + public T satisfies(Consumer consumer) { + delegate.doAssert(() -> consumer.accept(this.entity)); + return self(); + } + + @Override + public D get() { + return this.entity; + } + + @SuppressWarnings("unchecked") + private T self() { + return (T) this; + } } - protected D getEntity() { - return this.entity; + + /** + * Default {@link EntityList} implementation. + */ + @SuppressWarnings("SlowListContainsAll") + private final class DefaultEntityList + extends DefaultEntity, EntityList> implements EntityList { + + public DefaultEntityList(TypeRefAdapter> typeAdapter) { + super(typeAdapter); + } + + @Override + @SuppressWarnings("unchecked") + public EntityList contains(E... values) { + doAssert(() -> { + List expected = Arrays.asList(values); + AssertionErrors.assertTrue( + "Expecting list " + getEntity() + " at path '" + getPath() + "' to contain " + expected, + getEntity().containsAll(expected)); + }); + return this; + } + + @Override + @SuppressWarnings("unchecked") + public EntityList doesNotContain(E... values) { + doAssert(() -> { + List expected = Arrays.asList(values); + AssertionErrors.assertTrue( + "Expecting list " + getEntity() + " at path '" + getPath() + "' to not contain " + expected, + !getEntity().containsAll(expected)); + }); + return this; + } + + @Override + @SuppressWarnings("unchecked") + public EntityList containsExactly(E... values) { + doAssert(() -> { + List expected = Arrays.asList(values); + AssertionErrors.assertTrue( + "Expecting list " + getEntity() + " at path '" + getPath() + "' to contain exactly " + expected, + getEntity().equals(expected)); + }); + return this; + } + + @Override + public EntityList hasSize(int size) { + doAssert(() -> AssertionErrors.assertTrue( + "Expecting list " + getEntity() + " at path '" + getPath() + "' to have size == " + size, + getEntity().size() == size)); + return this; + } + + @Override + public EntityList hasSizeLessThan(int size) { + doAssert(() -> AssertionErrors.assertTrue( + "Expecting list " + getEntity() + " at path '" + getPath() + "' to have size < " + size, + getEntity().size() < size)); + return this; + } + + @Override + public EntityList hasSizeGreaterThan(int size) { + doAssert(() -> AssertionErrors.assertTrue( + "Expecting list " + getEntity() + " at path '" + getPath() + "' to have size > " + size, + getEntity().size() > size)); + return this; + } } - protected void doAssert(Runnable task) { - this.delegate.doAssert(task); - } - protected String getPath() { - return this.path; - } + /** + * Adapt JSONPath {@link TypeRef} to {@link ParameterizedTypeReference}. + */ + private static final class TypeRefAdapter extends TypeRef { - @Override - public Path path(String path) { - return DefaultPath.forPath(this.basePath, path, this.delegate); - } + private final Type type; - @Override - public Path path(String path, Consumer pathConsumer) { - return DefaultPath.forNestedPath(this.basePath, path, this.delegate, pathConsumer); - } + TypeRefAdapter(Class clazz) { + this.type = clazz; + } - @Override - public T isEqualTo(Object expected) { - this.delegate.doAssert(() -> AssertionErrors.assertEquals(this.path, expected, this.entity)); - return self(); - } + TypeRefAdapter(ParameterizedTypeReference typeReference) { + this.type = typeReference.getType(); + } - @Override - public T isNotEqualTo(Object other) { - this.delegate.doAssert(() -> AssertionErrors.assertNotEquals(this.path, other, this.entity)); - return self(); - } + TypeRefAdapter(Class clazz, Class generic) { + this.type = ResolvableType.forClassWithGenerics(clazz, generic).getType(); + } - @Override - public T isSameAs(Object expected) { - this.delegate.doAssert(() -> AssertionErrors.assertTrue(this.path, expected == this.entity)); - return self(); - } + TypeRefAdapter(Class clazz, ParameterizedTypeReference generic) { + this.type = ResolvableType.forClassWithGenerics(clazz, ResolvableType.forType(generic)).getType(); + } - @Override - public T isNotSameAs(Object other) { - this.delegate.doAssert(() -> AssertionErrors.assertTrue(this.path, other != this.entity)); - return self(); - } + @Override + public Type getType() { + return this.type; + } - @Override - public T matches(Predicate predicate) { - this.delegate - .doAssert(() -> AssertionErrors.assertTrue(this.path, predicate.test(this.entity))); - return self(); - } - - @Override - public T satisfies(Consumer consumer) { - this.delegate.doAssert(() -> consumer.accept(this.entity)); - return self(); - } - - @Override - public D get() { - return this.entity; - } - - @SuppressWarnings("unchecked") - private T self() { - return (T) this; - } - } - - - /** - * Default {@link EntityList} implementation. - */ - @SuppressWarnings("SlowListContainsAll") - private static final class DefaultEntityList - extends DefaultEntity, EntityList> implements EntityList { - - private DefaultEntityList(List entity, @Nullable String basePath, String path, ResponseDelegate delegate) { - super(entity, basePath, path, delegate); - } - - @Override - @SuppressWarnings("unchecked") - public EntityList contains(E... values) { - doAssert(() -> { - List expected = Arrays.asList(values); - AssertionErrors.assertTrue( - "Expecting list " + getEntity() + " at path '" + getPath() + "' to contain " + expected, - getEntity().containsAll(expected)); - }); - return this; - } - - @Override - @SuppressWarnings("unchecked") - public EntityList doesNotContain(E... values) { - doAssert(() -> { - List expected = Arrays.asList(values); - AssertionErrors.assertTrue( - "Expecting list " + getEntity() + " at path '" + getPath() + "' to not contain " + expected, - !getEntity().containsAll(expected)); - }); - return this; - } - - @Override - @SuppressWarnings("unchecked") - public EntityList containsExactly(E... values) { - doAssert(() -> { - List expected = Arrays.asList(values); - AssertionErrors.assertTrue( - "Expecting list " + getEntity() + " at path '" + getPath() + "' to contain exactly " + expected, - getEntity().equals(expected)); - }); - return this; - } - - @Override - public EntityList hasSize(int size) { - doAssert(() -> AssertionErrors.assertTrue( - "Expecting list " + getEntity() + " at path '" + getPath() + "' to have size == " + size, - getEntity().size() == size)); - return this; - } - - @Override - public EntityList hasSizeLessThan(int size) { - doAssert(() -> AssertionErrors.assertTrue( - "Expecting list " + getEntity() + " at path '" + getPath() + "' to have size < " + size, - getEntity().size() < size)); - return this; - } - - @Override - public EntityList hasSizeGreaterThan(int size) { - doAssert(() -> AssertionErrors.assertTrue( - "Expecting list " + getEntity() + " at path '" + getPath() + "' to have size > " + size, - getEntity().size() > size)); - return this; - } - } - - - /** - * Adapt JSONPath {@link TypeRef} to {@link ParameterizedTypeReference}. - */ - private static final class TypeRefAdapter extends TypeRef { - - private final Type type; - - TypeRefAdapter(Class clazz) { - this.type = clazz; - } - - TypeRefAdapter(ParameterizedTypeReference typeReference) { - this.type = typeReference.getType(); - } - - TypeRefAdapter(Class clazz, Class generic) { - this.type = ResolvableType.forClassWithGenerics(clazz, generic).getType(); - } - - TypeRefAdapter(Class clazz, ParameterizedTypeReference generic) { - this.type = ResolvableType.forClassWithGenerics(clazz, ResolvableType.forType(generic)).getType(); - } - - @Override - public Type getType() { - return this.type; } }