@@ -16,8 +16,12 @@ import graphql.ExecutionInput
16
16
import graphql.GraphQLContext
17
17
import graphql.Scalars
18
18
import graphql.execution.DataFetcherResult
19
+ import graphql.execution.ExecutionStepInfo
20
+ import graphql.execution.MergedField
19
21
import graphql.language.Field
22
+ import graphql.language.SelectionSet
20
23
import graphql.schema.DataFetchingEnvironment
24
+ import graphql.schema.GraphQLObjectType
21
25
import org.powermock.reflect.Whitebox
22
26
import spock.lang.Specification
23
27
@@ -33,11 +37,24 @@ class EntityFetcherBatchLoaderSpec extends Specification {
33
37
private FederationMetadata.EntityExtensionMetadata metadataMock
34
38
private ServiceMetadata serviceMetadata
35
39
36
- private String extEntityField = " requestedExtEntityField"
40
+ private String extEntityFieldName = " requestedExtEntityField"
41
+ private Field entityField = Field . newField(). name(extEntityFieldName). build()
42
+
43
+ private String entityKeyField1Name = " keyField1"
44
+ private String entityKeyFieldValue = " keyValue1"
45
+
46
+ Field keyField = Field . newField(). name(entityKeyField1Name). build()
47
+
48
+ Field parentField = Field . newField(). name(" parentField" )
49
+ .selectionSet(SelectionSet . newSelectionSet()
50
+ .selection(keyField)
51
+ .selection(entityField)
52
+ .build())
53
+ .build()
37
54
38
55
private EntityFetcherBatchLoader specUnderTest
39
56
40
- def setup (){
57
+ def setup () {
41
58
serviceProviderMock = Mock (ServiceProvider )
42
59
metadataMock = Mock (FederationMetadata.EntityExtensionMetadata )
43
60
serviceMetadata = Mock (ServiceMetadata )
@@ -47,29 +64,29 @@ class EntityFetcherBatchLoaderSpec extends Specification {
47
64
serviceProviderMock. getNameSpace() >> " MOCK_PROVIDER"
48
65
}
49
66
50
- def " batchloader throws exception if no key directive" (){
67
+ def " batchloader throws exception if no key directive" () {
51
68
given :
52
69
metadataMock. getKeyDirectives() >> Collections . emptyList()
53
70
54
71
when :
55
- specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityField )
72
+ specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityFieldName )
56
73
57
74
then :
58
75
def exception = thrown(RuntimeException )
59
76
exception in EntityFetchingException
60
77
exception. getMessage(). contains(" No Key Directive Found" )
61
78
}
62
79
63
- def " batchloader creates singular representation request" (){
80
+ def " batchloader creates singular representation request" () {
64
81
given :
65
82
List<KeyDirectiveMetadata > keyDirectives = Arrays . asList(KeyDirectiveMetadata . from(generateKeyDirective(" keyField1" )))
66
83
metadataMock. getKeyDirectives() >> keyDirectives
67
84
68
- specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityField )
85
+ specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityFieldName )
69
86
70
87
when :
71
- ServiceProvider entityServiceProviderField = Whitebox . getInternalState(specUnderTest, " entityServiceProvider" )
72
- String entityTypeNameField = Whitebox . getInternalState(specUnderTest, " entityTypeName" )
88
+ ServiceProvider entityServiceProviderField = Whitebox . getInternalState(specUnderTest, " entityServiceProvider" )
89
+ String entityTypeNameField = Whitebox . getInternalState(specUnderTest, " entityTypeName" )
73
90
List<String > representationFieldTemplateField = Whitebox . getInternalState(specUnderTest, " representationFieldTemplate" )
74
91
BatchResultTransformer batchResultTransformerField = Whitebox . getInternalState(specUnderTest, " batchResultTransformer" )
75
92
@@ -81,7 +98,7 @@ class EntityFetcherBatchLoaderSpec extends Specification {
81
98
representationFieldTemplateField. get(0 ) == " keyField1"
82
99
}
83
100
84
- def " batchLoader required fields are added" (){
101
+ def " batchLoader required fields are added" () {
85
102
given :
86
103
List<KeyDirectiveMetadata > keyDirectives = Arrays . asList(KeyDirectiveMetadata . from(generateKeyDirective(" keyField1" )))
87
104
metadataMock. getKeyDirectives() >> keyDirectives
@@ -91,13 +108,13 @@ class EntityFetcherBatchLoaderSpec extends Specification {
91
108
requiredFields. add(Field . newField(). name(" requiredField1" ). build())
92
109
requiredFields. add(Field . newField(). name(" requiredField2" ). build())
93
110
94
- metadataMock. getRequiredFields(extEntityField ) >> requiredFields
111
+ metadataMock. getRequiredFields(extEntityFieldName ) >> requiredFields
95
112
96
- specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityField )
113
+ specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityFieldName )
97
114
98
115
when :
99
- ServiceProvider entityServiceProviderField = Whitebox . getInternalState(specUnderTest, " entityServiceProvider" )
100
- String entityTypeNameField = Whitebox . getInternalState(specUnderTest, " entityTypeName" )
116
+ ServiceProvider entityServiceProviderField = Whitebox . getInternalState(specUnderTest, " entityServiceProvider" )
117
+ String entityTypeNameField = Whitebox . getInternalState(specUnderTest, " entityTypeName" )
101
118
List<String > representationFieldTemplateField = Whitebox . getInternalState(specUnderTest, " representationFieldTemplate" )
102
119
BatchResultTransformer batchResultTransformerField = Whitebox . getInternalState(specUnderTest, " batchResultTransformer" )
103
120
@@ -112,7 +129,7 @@ class EntityFetcherBatchLoaderSpec extends Specification {
112
129
representationFieldTemplateField. stream(). anyMatch({ templateField -> templateField. equals(" requiredField2" ) })
113
130
}
114
131
115
- def " batchloader creates multiple required fields as single template" (){
132
+ def " batchloader creates multiple required fields as single template" () {
116
133
given :
117
134
List<KeyDirectiveMetadata > keyDirectives = Arrays . asList(
118
135
KeyDirectiveMetadata . from(generateKeyDirective(" keyField1" )),
@@ -123,11 +140,11 @@ class EntityFetcherBatchLoaderSpec extends Specification {
123
140
124
141
metadataMock. getKeyDirectives() >> keyDirectives
125
142
126
- specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityField )
143
+ specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityFieldName )
127
144
128
145
when :
129
- ServiceProvider entityServiceProviderField = Whitebox . getInternalState(specUnderTest, " entityServiceProvider" )
130
- String entityTypeNameField = Whitebox . getInternalState(specUnderTest, " entityTypeName" )
146
+ ServiceProvider entityServiceProviderField = Whitebox . getInternalState(specUnderTest, " entityServiceProvider" )
147
+ String entityTypeNameField = Whitebox . getInternalState(specUnderTest, " entityTypeName" )
131
148
List<String > representationFieldTemplateField = Whitebox . getInternalState(specUnderTest, " representationFieldTemplate" )
132
149
BatchResultTransformer batchResultTransformerField = Whitebox . getInternalState(specUnderTest, " batchResultTransformer" )
133
150
@@ -147,16 +164,17 @@ class EntityFetcherBatchLoaderSpec extends Specification {
147
164
List<KeyDirectiveMetadata > keyDirectives = Arrays . asList(KeyDirectiveMetadata . from(generateKeyDirective(" keyField1" )))
148
165
metadataMock. getKeyDirectives() >> keyDirectives
149
166
150
- specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityField )
167
+ specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityFieldName )
151
168
152
169
DataFetchingEnvironment dfeMock = Mock (DataFetchingEnvironment . class)
153
170
Map<String , Object > dfeDataSource = new HashMap<> ()
154
- dfeDataSource. put(" keyField1 " , " keyValue " )
171
+ dfeDataSource. put(entityKeyField1Name, entityKeyFieldValue )
155
172
156
173
dfeMock. getSource() >> dfeDataSource
157
- dfeMock. getField() >> Field . newField() . name(extEntityField) . build()
174
+ dfeMock. getField() >> entityField
158
175
dfeMock. getFieldType() >> Scalars.GraphQLString
159
176
dfeMock. getContext() >> GraphQLContext . newContext(). build()
177
+ dfeMock. getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
160
178
161
179
AtomicReference<ExecutionInput > queryToProviderRef = new AtomicReference<> ()
162
180
@@ -166,7 +184,7 @@ class EntityFetcherBatchLoaderSpec extends Specification {
166
184
HashMap<String , Object > data = new HashMap<> ()
167
185
List<HashMap<String , Object > > entities = new ArrayList<> ()
168
186
HashMap<String , Object > entity = new HashMap<> ()
169
- entity. put(extEntityField , " ENTITY1_FIELD" )
187
+ entity. put(extEntityFieldName , " ENTITY1_FIELD" )
170
188
entities. add(entity)
171
189
data. put(" data" , ImmutableMap . of(" _entities" , entities))
172
190
return CompletableFuture . completedFuture(data)
@@ -194,24 +212,25 @@ class EntityFetcherBatchLoaderSpec extends Specification {
194
212
195
213
representationVariables. size() == 1
196
214
representationVariables. get(0 ). get(" __typename" ) == " MOCK_ENTITY"
197
- representationVariables. get(0 ). get(" keyField1 " ) == " keyValue "
215
+ representationVariables. get(0 ). get(entityKeyField1Name ) == " keyValue1 "
198
216
}
199
217
200
218
def " batchloader retrieves entity for singular dfe null result" () {
201
219
given :
202
220
List<KeyDirectiveMetadata > keyDirectives = Arrays . asList(KeyDirectiveMetadata . from(generateKeyDirective(" keyField1" )))
203
221
metadataMock. getKeyDirectives() >> keyDirectives
204
222
205
- specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityField )
223
+ specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityFieldName )
206
224
207
225
DataFetchingEnvironment dfeMock = Mock (DataFetchingEnvironment . class)
208
226
Map<String , Object > dfeDataSource = new HashMap<> ()
209
227
dfeDataSource. put(" keyField1" , " keyValue" )
210
228
211
229
dfeMock. getSource() >> dfeDataSource
212
- dfeMock. getField() >> Field . newField(). name(extEntityField ). build()
230
+ dfeMock. getField() >> Field . newField(). name(extEntityFieldName ). build()
213
231
dfeMock. getFieldType() >> Scalars.GraphQLString
214
232
dfeMock. getContext() >> GraphQLContext . newContext(). build()
233
+ dfeMock. getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
215
234
216
235
AtomicReference<ExecutionInput > queryToProviderRef = new AtomicReference<> ()
217
236
@@ -221,7 +240,7 @@ class EntityFetcherBatchLoaderSpec extends Specification {
221
240
HashMap<String , Object > data = new HashMap<> ()
222
241
List<HashMap<String , Object > > entities = new ArrayList<> ()
223
242
HashMap<String , Object > entity = new HashMap<> ()
224
- entity. put(extEntityField , null )
243
+ entity. put(extEntityFieldName , null )
225
244
entities. add(entity)
226
245
data. put(" data" , ImmutableMap . of(" _entities" , entities))
227
246
return CompletableFuture . completedFuture(data)
@@ -253,33 +272,36 @@ class EntityFetcherBatchLoaderSpec extends Specification {
253
272
List<KeyDirectiveMetadata > keyDirectives = Arrays . asList(KeyDirectiveMetadata . from(generateKeyDirective(" keyField1" )))
254
273
metadataMock. getKeyDirectives() >> keyDirectives
255
274
256
- specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityField )
275
+ specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityFieldName )
257
276
258
277
DataFetchingEnvironment dfeMock1 = Mock (DataFetchingEnvironment . class)
259
278
Map<String , Object > dfe1DataSource = new HashMap<> ()
260
279
dfe1DataSource. put(" keyField1" , " dfeKey1" )
261
280
262
281
dfeMock1. getSource() >> dfe1DataSource
263
- dfeMock1. getField() >> Field . newField(). name(extEntityField ). build()
282
+ dfeMock1. getField() >> Field . newField(). name(extEntityFieldName ). build()
264
283
dfeMock1. getFieldType() >> Scalars.GraphQLString
265
284
dfeMock1. getContext() >> GraphQLContext . newContext(). build()
285
+ dfeMock1. getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
266
286
267
287
DataFetchingEnvironment dfeMock2 = Mock (DataFetchingEnvironment . class)
268
288
Map<String , Object > dfe2DataSource = new HashMap<> ()
269
289
dfe2DataSource. put(" keyField1" , " dfeKey2" )
270
290
271
291
dfeMock2. getSource() >> dfe2DataSource
272
- dfeMock2. getField() >> Field . newField(). name(extEntityField ). build()
292
+ dfeMock2. getField() >> Field . newField(). name(extEntityFieldName ). build()
273
293
dfeMock2. getFieldType() >> Scalars.GraphQLString
274
294
dfeMock2. getContext() >> GraphQLContext . newContext(). build()
295
+ dfeMock2. getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
275
296
276
297
DataFetchingEnvironment dfeMock3 = Mock (DataFetchingEnvironment . class)
277
298
Map<String , Object > dfe3DataSource = new HashMap<> ()
278
299
dfe3DataSource. put(" keyField1" , " dfeKey3" )
279
300
280
301
dfeMock3. getSource() >> dfe3DataSource
281
- dfeMock3. getField() >> Field . newField(). name(extEntityField ). build()
302
+ dfeMock3. getField() >> Field . newField(). name(extEntityFieldName ). build()
282
303
dfeMock3. getContext() >> GraphQLContext . newContext(). build()
304
+ dfeMock3. getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
283
305
284
306
AtomicReference<ExecutionInput > queryToProviderRef = new AtomicReference<> ()
285
307
@@ -289,9 +311,9 @@ class EntityFetcherBatchLoaderSpec extends Specification {
289
311
Map<String , Object > data = new HashMap<> ()
290
312
List<Map<String , Object > > entities = new ArrayList<> ()
291
313
292
- Map<String , Object > entity1 = ImmutableMap . of(extEntityField , " ENTITY1_FIELD" )
293
- Map<String , Object > entity2 = ImmutableMap . of(extEntityField , " ENTITY2_FIELD" )
294
- Map<String , Object > entity3 = ImmutableMap . of(extEntityField , " ENTITY3_FIELD" )
314
+ Map<String , Object > entity1 = ImmutableMap . of(extEntityFieldName , " ENTITY1_FIELD" )
315
+ Map<String , Object > entity2 = ImmutableMap . of(extEntityFieldName , " ENTITY2_FIELD" )
316
+ Map<String , Object > entity3 = ImmutableMap . of(extEntityFieldName , " ENTITY3_FIELD" )
295
317
296
318
entities. add(entity1)
297
319
entities. add(entity2)
@@ -337,33 +359,36 @@ class EntityFetcherBatchLoaderSpec extends Specification {
337
359
List<KeyDirectiveMetadata > keyDirectives = Arrays . asList(KeyDirectiveMetadata . from(generateKeyDirective(" keyField1" )))
338
360
metadataMock. getKeyDirectives() >> keyDirectives
339
361
340
- specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityField )
362
+ specUnderTest = new EntityFetcherBatchLoader (metadataMock, serviceMetadata, extEntityFieldName )
341
363
342
364
DataFetchingEnvironment dfeMock1 = Mock (DataFetchingEnvironment . class)
343
365
Map<String , Object > dfe1DataSource = new HashMap<> ()
344
366
dfe1DataSource. put(" keyField1" , " dfeKey1" )
345
367
346
368
dfeMock1. getSource() >> dfe1DataSource
347
- dfeMock1. getField() >> Field . newField(). name(extEntityField ). build()
369
+ dfeMock1. getField() >> Field . newField(). name(extEntityFieldName ). build()
348
370
dfeMock1. getFieldType() >> Scalars.GraphQLString
349
371
dfeMock1. getContext() >> GraphQLContext . newContext(). build()
372
+ dfeMock1. getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
350
373
351
374
DataFetchingEnvironment dfeMock2 = Mock (DataFetchingEnvironment . class)
352
375
Map<String , Object > dfe2DataSource = new HashMap<> ()
353
376
dfe2DataSource. put(" keyField1" , " dfeKey2" )
354
377
355
378
dfeMock2. getSource() >> dfe2DataSource
356
- dfeMock2. getField() >> Field . newField(). name(extEntityField ). build()
379
+ dfeMock2. getField() >> Field . newField(). name(extEntityFieldName ). build()
357
380
dfeMock2. getFieldType() >> Scalars.GraphQLString
358
381
dfeMock2. getContext() >> GraphQLContext . newContext(). build()
382
+ dfeMock2. getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
359
383
360
384
DataFetchingEnvironment dfeMock3 = Mock (DataFetchingEnvironment . class)
361
385
Map<String , Object > dfe3DataSource = new HashMap<> ()
362
386
dfe3DataSource. put(" keyField1" , " dfeKey3" )
363
387
364
388
dfeMock3. getSource() >> dfe3DataSource
365
- dfeMock3. getField() >> Field . newField(). name(extEntityField ). build()
389
+ dfeMock3. getField() >> Field . newField(). name(extEntityFieldName ). build()
366
390
dfeMock3. getContext() >> GraphQLContext . newContext(). build()
391
+ dfeMock3. getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
367
392
368
393
AtomicReference<ExecutionInput > queryToProviderRef = new AtomicReference<> ()
369
394
@@ -373,11 +398,11 @@ class EntityFetcherBatchLoaderSpec extends Specification {
373
398
Map<String , Object > data = new HashMap<> ()
374
399
List<Map<String , Object > > entities = new ArrayList<> ()
375
400
376
- Map<String , Object > entity1 = ImmutableMap . of(extEntityField , " ENTITY1_FIELD" )
401
+ Map<String , Object > entity1 = ImmutableMap . of(extEntityFieldName , " ENTITY1_FIELD" )
377
402
Map<String , Object > entity2 = new HashMap ()
378
- entity2. put(extEntityField , null )
403
+ entity2. put(extEntityFieldName , null )
379
404
380
- Map<String , Object > entity3 = ImmutableMap . of(extEntityField , " ENTITY3_FIELD" )
405
+ Map<String , Object > entity3 = ImmutableMap . of(extEntityFieldName , " ENTITY3_FIELD" )
381
406
382
407
entities. add(entity1)
383
408
entities. add(entity2)
@@ -434,4 +459,19 @@ class EntityFetcherBatchLoaderSpec extends Specification {
434
459
keyDir. getArguments(). add(fieldsArgument)
435
460
return keyDir
436
461
}
462
+
463
+ private ExecutionStepInfo createExecutionStepInfo (Field field , Field parentField ) {
464
+ return ExecutionStepInfo . newExecutionStepInfo()
465
+ .type(Scalars.GraphQLString )
466
+ .field(MergedField . newMergedField()
467
+ .addField(field)
468
+ .build())
469
+ .parentInfo(ExecutionStepInfo . newExecutionStepInfo()
470
+ .field(MergedField . newMergedField()
471
+ .addField(parentField)
472
+ .build())
473
+ .type(GraphQLObjectType . newObject(). name(" ParentType" ). build())
474
+ .build())
475
+ .build()
476
+ }
437
477
}
0 commit comments