Skip to content

Commit 6dfe793

Browse files
authored
fix: support GraphQL operationName attribute (#279)
1 parent dfb5538 commit 6dfe793

File tree

5 files changed

+109
-25
lines changed

5 files changed

+109
-25
lines changed

graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/GraphQLExecutor.java

+10
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,15 @@ public interface GraphQLExecutor {
4343
* @return GraphQL ExecutionResult
4444
*/
4545
ExecutionResult execute(String query, Map<String, Object> arguments);
46+
47+
/**
48+
* Execute GraphQL query provided in query argument and variables
49+
*
50+
* @param query GraphQL query string
51+
* @param operationName GraphQL operationName string
52+
* @param arguments GraphQL arguments key/value mapo
53+
* @return GraphQL ExecutionResult
54+
*/
55+
ExecutionResult execute(String query, String operationName, Map<String, Object> arguments);
4656

4757
}

graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaExecutor.java

+20-12
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,27 @@ public ExecutionResult execute(String query) {
8282
@Override
8383
@Transactional(TxType.REQUIRED)
8484
public ExecutionResult execute(String query, Map<String, Object> arguments) {
85-
Map<String, Object> variables = Optional.ofNullable(arguments)
86-
.orElseGet(Collections::emptyMap);
87-
88-
GraphQLExecutorContext executorContext = contextFactory.newExecutorContext(graphQLSchema);
85+
return execute(query, null, arguments);
86+
}
8987

90-
ExecutionInput.Builder executionInput = executorContext.newExecutionInput()
91-
.query(query)
92-
.variables(variables);
88+
@Override
89+
@Transactional(TxType.REQUIRED)
90+
public ExecutionResult execute(String query, String operationName, Map<String, Object> arguments) {
91+
Map<String, Object> variables = Optional.ofNullable(arguments)
92+
.orElseGet(Collections::emptyMap);
9393

94-
GraphQL.Builder graphQL = executorContext.newGraphQL();
95-
96-
return graphQL.build()
97-
.execute(executionInput);
98-
}
94+
GraphQLExecutorContext executorContext = contextFactory.newExecutorContext(graphQLSchema);
95+
96+
ExecutionInput.Builder executionInput = executorContext.newExecutionInput()
97+
.query(query)
98+
.variables(variables);
99+
Optional.ofNullable(operationName)
100+
.ifPresent(executionInput::operationName);
101+
102+
GraphQL.Builder graphQL = executorContext.newGraphQL();
103+
104+
return graphQL.build()
105+
.execute(executionInput);
106+
}
99107

100108
}

graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/GraphQLExecutorTests.java

+36
Original file line numberDiff line numberDiff line change
@@ -2379,4 +2379,40 @@ public void queryForBooksWithWhereCriteriaExpressionDateVariables() {
23792379
assertThat(result.toString()).isEqualTo(expected);
23802380
}
23812381

2382+
@Test
2383+
public void queryWithOperationName() {
2384+
//given
2385+
String query = "query findBooks {" +
2386+
" Books {" +
2387+
" select {" +
2388+
" id" +
2389+
" title" +
2390+
" }" +
2391+
" }" +
2392+
"}" +
2393+
"" +
2394+
"query findAuthors {" +
2395+
" Authors {" +
2396+
" select {" +
2397+
" id" +
2398+
" name" +
2399+
" }" +
2400+
" }" +
2401+
"}";
2402+
2403+
String expected = "{Books={select=["
2404+
+ "{id=2, title=War and Peace}, "
2405+
+ "{id=3, title=Anna Karenina}, "
2406+
+ "{id=5, title=The Cherry Orchard}, "
2407+
+ "{id=6, title=The Seagull}, "
2408+
+ "{id=7, title=Three Sisters}"
2409+
+ "]}}";
2410+
2411+
//when
2412+
Object result = executor.execute(query, "findBooks", null).getData();
2413+
2414+
// then
2415+
assertThat(result.toString()).isEqualTo(expected);
2416+
}
2417+
23822418
}

graphql-jpa-query-web/src/main/java/com/introproventures/graphql/jpa/query/web/GraphQLController.java

+13-2
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import com.fasterxml.jackson.databind.ObjectMapper;
4545
import com.introproventures.graphql.jpa.query.schema.GraphQLExecutor;
4646
import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaExecutor;
47+
4748
import graphql.DeferredExecutionResult;
4849
import graphql.ExecutionResult;
4950
import graphql.GraphQL;
@@ -167,6 +168,7 @@ public void postJson(@RequestBody @Valid final GraphQLQueryRequest queryRequest,
167168
HttpServletResponse httpServletResponse) throws IOException
168169
{
169170
ExecutionResult executionResult = graphQLExecutor.execute(queryRequest.getQuery(),
171+
queryRequest.getOperationName(),
170172
queryRequest.getVariables());
171173
sendResponse(httpServletResponse, executionResult);
172174
}
@@ -269,8 +271,10 @@ public static class GraphQLQueryRequest {
269271

270272
@NotNull
271273
private String query;
274+
275+
private String operationName;
272276

273-
private Map<String, Object> variables;
277+
private Map<String, Object> variables;
274278

275279
GraphQLQueryRequest() {}
276280

@@ -309,7 +313,14 @@ public Map<String, Object> getVariables() {
309313
public void setVariables(Map<String, Object> variables) {
310314
this.variables = variables;
311315
}
312-
316+
317+
public String getOperationName() {
318+
return operationName;
319+
}
320+
321+
public void setOperationName(String operationName) {
322+
this.operationName = operationName;
323+
}
313324
}
314325

315326
private void sendResponse(HttpServletResponse response, ExecutionResult executionResult) throws IOException {

graphql-jpa-query-web/src/test/java/com/introproventures/graphql/jpa/query/test/web/GraphQLControllerTest.java

+30-11
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package com.introproventures.graphql.jpa.query.test.web;
1717

18+
import static java.util.Collections.emptyMap;
19+
import static java.util.Collections.singletonMap;
1820
import static org.mockito.Mockito.never;
1921
import static org.mockito.Mockito.verify;
2022
import static org.mockito.Mockito.when;
@@ -77,9 +79,11 @@ public void setUp() {
7779
when(executor.execute(Mockito.anyString()))
7880
.thenReturn(new ExecutionResultImpl(new HashMap<>(), new ArrayList<>()));
7981

80-
when(executor.execute(Mockito.anyString(),Mockito.any()))
82+
when(executor.execute(Mockito.anyString(),Mockito.nullable(Map.class)))
8183
.thenReturn(new ExecutionResultImpl(new HashMap<>(), new ArrayList<>()));
8284

85+
when(executor.execute(Mockito.anyString(),Mockito.nullable(String.class),Mockito.nullable(Map.class)))
86+
.thenReturn(new ExecutionResultImpl(new HashMap<>(), new ArrayList<>()));
8387
}
8488

8589
private void ok(final GraphQLQueryRequest query) throws Exception, JsonProcessingException {
@@ -206,7 +210,7 @@ public void testGraphqlQuery() throws Exception {
206210
ok(new GraphQLQueryRequest("{Tasks(where: {name: {EQ: \"name\"}}){select{id}}}"));
207211

208212
verify(executor)
209-
.execute("{Tasks(where: {name: {EQ: \"name\"}}){select{id}}}", null);
213+
.execute("{Tasks(where: {name: {EQ: \"name\"}}){select{id}}}", null, null);
210214
}
211215

212216
@Test
@@ -215,7 +219,6 @@ public void testGraphqlQueryNull() throws Exception {
215219
.andExpect(status().isBadRequest());
216220
}
217221

218-
@SuppressWarnings("serial")
219222
@Test
220223
public void testGraphqlArguments() throws Exception {
221224
GraphQLQueryRequest query = new GraphQLQueryRequest("query TasksQuery($title: String!){Tasks(where:{name: {EQ: $title}}){select{id name}}}");
@@ -227,35 +230,50 @@ public void testGraphqlArguments() throws Exception {
227230
ok(query);
228231

229232
verify(executor)
230-
.execute(query.getQuery(), variables);
233+
.execute(query.getQuery(), null, variables);
231234
}
232235

236+
@Test
237+
public void testGraphqlOperationName() throws Exception {
238+
String operationName = "TasksQuery";
239+
GraphQLQueryRequest query = new GraphQLQueryRequest("query TasksQuery($title: String!){Tasks(where:{name: {EQ: $title}}){select{id name}}}");
240+
241+
Map<String, Object> variables = new HashMap<>();
242+
variables.put("title", "value");
243+
query.setVariables(variables);
244+
query.setOperationName(operationName);
245+
246+
ok(query);
247+
248+
verify(executor)
249+
.execute(query.getQuery(), operationName, variables);
250+
}
233251
// Json directly
234252
@Test
235253
public void testGraphqlArgumentsJson() throws Exception {
236-
String json = "{\"query\": \"{Tasks(where:{name:{EQ: \\\"title\\\"}}){select{ title genre }}\", \"arguments\": {\"title\": \"title\"}}";
254+
String json = "{\"query\": \"{Tasks(where:{name:{EQ: \\\"title\\\"}}){select{ title genre }}\", \"variables\": {\"key\": \"value\"}}";
237255

238256
ok(json);
239257

240-
verify(executor).execute("{Tasks(where:{name:{EQ: \"title\"}}){select{ title genre }}", null);
258+
verify(executor).execute("{Tasks(where:{name:{EQ: \"title\"}}){select{ title genre }}", null, singletonMap("key", "value"));
241259
}
242260

243261
@Test
244262
public void testGraphqlArgumentsEmptyString() throws Exception {
245-
String json = "{\"query\": \"{Tasks(where:{name:{EQ: \\\"title\\\"}}){select{id name}}\", \"arguments\": \"\"}";
263+
String json = "{\"query\": \"{Tasks(where:{name:{EQ: \\\"title\\\"}}){select{id name}}\", \"variables\": {}}";
246264

247265
ok(json);
248266

249-
verify(executor).execute("{Tasks(where:{name:{EQ: \"title\"}}){select{id name}}", null);
267+
verify(executor).execute("{Tasks(where:{name:{EQ: \"title\"}}){select{id name}}", null, emptyMap());
250268
}
251269

252270
@Test
253271
public void testGraphqlArgumentsNull() throws Exception {
254-
String json = "{\"query\": \"{Tasks(where:{name:{EQ: \\\"title\\\"}}){select{id name}}\", \"arguments\": null}";
272+
String json = "{\"query\": \"{Tasks(where:{name:{EQ: \\\"title\\\"}}){select{id name}}\", \"variables\": null}";
255273

256274
ok(json);
257275

258-
verify(executor).execute("{Tasks(where:{name:{EQ: \"title\"}}){select{id name}}", null);
276+
verify(executor).execute("{Tasks(where:{name:{EQ: \"title\"}}){select{id name}}", null, null);
259277
}
260278

261279
@Test
@@ -264,7 +282,7 @@ public void testGraphqlNoArguments() throws Exception {
264282

265283
ok(json);
266284

267-
verify(executor).execute("{Tasks(where:{name:{EQ: \"title\"}}){select{id name}}", null);
285+
verify(executor).execute("{Tasks(where:{name:{EQ: \"title\"}}){select{id name}}", null, null);
268286
}
269287

270288
// Form submitted data
@@ -308,4 +326,5 @@ public void testGraphqlArgumentsParamsVariablesEmpty() throws Exception {
308326

309327
verify(executor).execute(query, null);
310328
}
329+
311330
}

0 commit comments

Comments
 (0)