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 d3c3ab41..00d16f65 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 @@ -655,6 +655,18 @@ public EntityList hasSizeGreaterThan(int size) { getEntity().size() > size)); return this; } + + @Override + public Entity singleElement() { + this.hasSize(1); + + E element = this.get().get(0); + @SuppressWarnings("unchecked") + Class elementClass = (Class) element.getClass(); + + return new DefaultPath(DefaultPath.this.basePath, DefaultPath.this.path + "[0]", DefaultPath.this.delegate) + .entity(elementClass); + } } diff --git a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GraphQlTester.java b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GraphQlTester.java index 1165c5a9..c9937491 100644 --- a/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GraphQlTester.java +++ b/spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GraphQlTester.java @@ -470,6 +470,13 @@ interface EntityList extends Entity, EntityList> { */ EntityList hasSizeGreaterThan(int size); + /** + * Verify the list has a single element and return an {@code Entity} spec for it. + *

This is a convenience method that combines {@link #hasSize(int) hasSize(1)} + * with navigating to the first element in the list. + * @return an {@code Entity} spec for the single element that allows further assertions + */ + Entity singleElement(); } /** diff --git a/spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/GraphQlTesterTests.java b/spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/GraphQlTesterTests.java index 62e291c3..fdeb55e6 100644 --- a/spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/GraphQlTesterTests.java +++ b/spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/GraphQlTesterTests.java @@ -213,6 +213,35 @@ void entityList() { .containsExactly(han, leia); assertThat(getActualRequestDocument()).contains(document); + + assertThatThrownBy(() -> entityList.singleElement()) + .as("Should have exactly one element") + .hasMessage("Expecting list " + + "[MovieCharacter[name='Han Solo'], MovieCharacter[name='Leia Organa']] " + + "at path 'me.friends' to have size == 1\n" + + "Request: document='{me {name, friends}}'"); + } + + @Test + void entityListWithOneElement() { + + String document = "{me {name, friends}}"; + getGraphQlService().setDataAsJson(document, + "{" + + " \"me\":{" + + " \"name\":\"Luke Skywalker\"," + + " \"friends\":[{\"name\":\"Han Solo\"}]" + + " }" + + "}"); + + GraphQlTester.Response response = graphQlTester().document(document).execute(); + + MovieCharacter han = MovieCharacter.create("Han Solo"); + + response.path("me.friends") + .entityList(MovieCharacter.class) + .singleElement() + .isEqualTo(han); } @Test