Skip to content

Commit 2e0f87a

Browse files
Use actual graphql name on extending type (#301)
* Use actual graphql name on extending type If a type is extended via a GraphQLTypeExtension annotation, the simple class name is used instead of checking whether a GraphQLName annotation is available; if the GraphQL name differs from the class name, the field cannot be fetched. * Add different graphql name extension test case
1 parent 95ef03c commit 2e0f87a

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

src/main/java/graphql/annotations/processor/retrievers/GraphQLExtensionsHandler.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -44,22 +44,23 @@ public class GraphQLExtensionsHandler {
4444

4545
public List<GraphQLFieldDefinition> getExtensionFields(Class<?> object, List<String> definedFields, ProcessingElementsContainer container) throws CannotCastMemberException {
4646
List<GraphQLFieldDefinition> fields = new ArrayList<>();
47+
String typeName = graphQLObjectInfoRetriever.getTypeName(object);
4748
if (container.getExtensionsTypeRegistry().containsKey(object)) {
4849
for (Class<?> aClass : container.getExtensionsTypeRegistry().get(object)) {
4950
for (Method method : graphQLObjectInfoRetriever.getOrderedMethods(aClass)) {
5051
if (method.isBridge() || method.isSynthetic()) {
5152
continue;
5253
}
5354
if (methodSearchAlgorithm.isFound(method)) {
54-
addExtensionField(fieldRetriever.getField(object.getSimpleName(), method, container), fields, definedFields);
55+
addExtensionField(fieldRetriever.getField(typeName, method, container), fields, definedFields);
5556
}
5657
}
5758
for (Field field : getAllFields(aClass).values()) {
5859
if (Modifier.isStatic(field.getModifiers())) {
5960
continue;
6061
}
6162
if (fieldSearchAlgorithm.isFound(field)) {
62-
addExtensionField(fieldRetriever.getField(object.getSimpleName(), field, container), fields, definedFields);
63+
addExtensionField(fieldRetriever.getField(typeName, field, container), fields, definedFields);
6364
}
6465
}
6566
}

src/test/java/graphql/annotations/GraphQLExtensionsTest.java

+57
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,31 @@ public Object get(DataFetchingEnvironment environment) {
9494
}
9595
}
9696

97+
@GraphQLDescription("Object with different GraphQL name")
98+
@GraphQLName("DifferentObject")
99+
public static class DifferentNameTestObject {
100+
@GraphQLField
101+
public String field() {
102+
return "different";
103+
}
104+
105+
}
106+
107+
@GraphQLTypeExtension(GraphQLExtensionsTest.DifferentNameTestObject.class)
108+
public static class DifferentNameTestObjectExtension {
109+
private final DifferentNameTestObject obj;
110+
111+
public DifferentNameTestObjectExtension(DifferentNameTestObject obj) {
112+
this.obj = obj;
113+
}
114+
115+
@GraphQLField
116+
public String field2() {
117+
return obj.field() + " field2";
118+
}
119+
120+
}
121+
97122
@Test
98123
public void fields() {
99124
GraphQLAnnotations instance = new GraphQLAnnotations();
@@ -113,6 +138,24 @@ public void fields() {
113138
assertEquals(fields.get(2).getType(), GraphQLString);
114139
}
115140

141+
@Test
142+
public void fieldsDifferentGraphQLName() {
143+
GraphQLAnnotations instance = new GraphQLAnnotations();
144+
instance.registerTypeExtension(DifferentNameTestObjectExtension.class);
145+
GraphQLObjectHandler graphQLObjectHandler = instance.getObjectHandler();
146+
GraphQLObjectType object = graphQLObjectHandler.getGraphQLType(GraphQLExtensionsTest.DifferentNameTestObject.class, instance.getContainer());
147+
148+
List<GraphQLFieldDefinition> fields = object.getFieldDefinitions();
149+
assertEquals(fields.size(), 2);
150+
151+
fields = ImmutableList.sortedCopyOf(Comparator.comparing(GraphQLFieldDefinition::getName), fields);
152+
153+
assertEquals(fields.get(0).getName(), "field");
154+
assertEquals(fields.get(1).getName(), "field2");
155+
assertEquals(fields.get(0).getType(), GraphQLString);
156+
assertEquals(fields.get(1).getType(), GraphQLString);
157+
}
158+
116159
@Test
117160
public void values() {
118161
GraphQLSchema schema = newAnnotationsSchema().query(TestObject.class).typeExtension(TestObjectExtension.class).build();
@@ -127,6 +170,19 @@ public void values() {
127170
assertEquals(data.get("field5"), "test test5");
128171
}
129172

173+
@Test
174+
public void valuesDifferentGraphQLName() {
175+
GraphQLSchema schema = newAnnotationsSchema().query(DifferentNameTestObject.class).typeExtension(DifferentNameTestObjectExtension.class).build();
176+
177+
assertTrue(schema.getCodeRegistry().hasDataFetcher(FieldCoordinates.coordinates("DifferentObject", "field2")));
178+
179+
ExecutionResult result = GraphQL.newGraphQL( schema ).build().execute(
180+
GraphQLHelper.createExecutionInput( "{field field2}", new GraphQLExtensionsTest.DifferentNameTestObject() ) );
181+
Map<String, Object> data = result.getData();
182+
assertEquals(data.get("field"), "different");
183+
assertEquals(data.get("field2"), "different field2");
184+
}
185+
130186
@Test
131187
public void testDuplicateField() {
132188
GraphQLAnnotations instance = new GraphQLAnnotations();
@@ -135,4 +191,5 @@ public void testDuplicateField() {
135191
GraphQLAnnotationsException e = expectThrows(GraphQLAnnotationsException.class, () -> graphQLObjectHandler.getGraphQLType(TestObject.class, instance.getContainer()));
136192
assertTrue(e.getMessage().startsWith("Duplicate field"));
137193
}
194+
138195
}

0 commit comments

Comments
 (0)