Skip to content

Commit 34e880a

Browse files
author
Carlo Feliciano Aureus
committed
Issue-8: Fix failing entity batch loader tests
1 parent 4e19316 commit 34e880a

File tree

3 files changed

+119
-55
lines changed

3 files changed

+119
-55
lines changed

src/test/groovy/com/intuit/graphql/orchestrator/federation/EntityFetcherBatchLoaderSpec.groovy

Lines changed: 79 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,12 @@ import graphql.ExecutionInput
1616
import graphql.GraphQLContext
1717
import graphql.Scalars
1818
import graphql.execution.DataFetcherResult
19+
import graphql.execution.ExecutionStepInfo
20+
import graphql.execution.MergedField
1921
import graphql.language.Field
22+
import graphql.language.SelectionSet
2023
import graphql.schema.DataFetchingEnvironment
24+
import graphql.schema.GraphQLObjectType
2125
import org.powermock.reflect.Whitebox
2226
import spock.lang.Specification
2327

@@ -33,11 +37,24 @@ class EntityFetcherBatchLoaderSpec extends Specification {
3337
private FederationMetadata.EntityExtensionMetadata metadataMock
3438
private ServiceMetadata serviceMetadata
3539

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()
3754

3855
private EntityFetcherBatchLoader specUnderTest
3956

40-
def setup(){
57+
def setup() {
4158
serviceProviderMock = Mock(ServiceProvider)
4259
metadataMock = Mock(FederationMetadata.EntityExtensionMetadata)
4360
serviceMetadata = Mock(ServiceMetadata)
@@ -47,29 +64,29 @@ class EntityFetcherBatchLoaderSpec extends Specification {
4764
serviceProviderMock.getNameSpace() >> "MOCK_PROVIDER"
4865
}
4966

50-
def "batchloader throws exception if no key directive"(){
67+
def "batchloader throws exception if no key directive"() {
5168
given:
5269
metadataMock.getKeyDirectives() >> Collections.emptyList()
5370

5471
when:
55-
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityField)
72+
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityFieldName)
5673

5774
then:
5875
def exception = thrown(RuntimeException)
5976
exception in EntityFetchingException
6077
exception.getMessage().contains("No Key Directive Found")
6178
}
6279

63-
def "batchloader creates singular representation request"(){
80+
def "batchloader creates singular representation request"() {
6481
given:
6582
List<KeyDirectiveMetadata> keyDirectives = Arrays.asList(KeyDirectiveMetadata.from(generateKeyDirective("keyField1")))
6683
metadataMock.getKeyDirectives() >> keyDirectives
6784

68-
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityField)
85+
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityFieldName)
6986

7087
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")
7390
List<String> representationFieldTemplateField = Whitebox.getInternalState(specUnderTest, "representationFieldTemplate")
7491
BatchResultTransformer batchResultTransformerField = Whitebox.getInternalState(specUnderTest, "batchResultTransformer")
7592

@@ -81,7 +98,7 @@ class EntityFetcherBatchLoaderSpec extends Specification {
8198
representationFieldTemplateField.get(0) == "keyField1"
8299
}
83100

84-
def "batchLoader required fields are added"(){
101+
def "batchLoader required fields are added"() {
85102
given:
86103
List<KeyDirectiveMetadata> keyDirectives = Arrays.asList(KeyDirectiveMetadata.from(generateKeyDirective("keyField1")))
87104
metadataMock.getKeyDirectives() >> keyDirectives
@@ -91,13 +108,13 @@ class EntityFetcherBatchLoaderSpec extends Specification {
91108
requiredFields.add(Field.newField().name("requiredField1").build())
92109
requiredFields.add(Field.newField().name("requiredField2").build())
93110

94-
metadataMock.getRequiredFields(extEntityField) >> requiredFields
111+
metadataMock.getRequiredFields(extEntityFieldName) >> requiredFields
95112

96-
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityField)
113+
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityFieldName)
97114

98115
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")
101118
List<String> representationFieldTemplateField = Whitebox.getInternalState(specUnderTest, "representationFieldTemplate")
102119
BatchResultTransformer batchResultTransformerField = Whitebox.getInternalState(specUnderTest, "batchResultTransformer")
103120

@@ -112,7 +129,7 @@ class EntityFetcherBatchLoaderSpec extends Specification {
112129
representationFieldTemplateField.stream().anyMatch({ templateField -> templateField.equals("requiredField2") })
113130
}
114131

115-
def "batchloader creates multiple required fields as single template"(){
132+
def "batchloader creates multiple required fields as single template"() {
116133
given:
117134
List<KeyDirectiveMetadata> keyDirectives = Arrays.asList(
118135
KeyDirectiveMetadata.from(generateKeyDirective("keyField1")),
@@ -123,11 +140,11 @@ class EntityFetcherBatchLoaderSpec extends Specification {
123140

124141
metadataMock.getKeyDirectives() >> keyDirectives
125142

126-
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityField)
143+
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityFieldName)
127144

128145
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")
131148
List<String> representationFieldTemplateField = Whitebox.getInternalState(specUnderTest, "representationFieldTemplate")
132149
BatchResultTransformer batchResultTransformerField = Whitebox.getInternalState(specUnderTest, "batchResultTransformer")
133150

@@ -147,16 +164,17 @@ class EntityFetcherBatchLoaderSpec extends Specification {
147164
List<KeyDirectiveMetadata> keyDirectives = Arrays.asList(KeyDirectiveMetadata.from(generateKeyDirective("keyField1")))
148165
metadataMock.getKeyDirectives() >> keyDirectives
149166

150-
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityField)
167+
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityFieldName)
151168

152169
DataFetchingEnvironment dfeMock = Mock(DataFetchingEnvironment.class)
153170
Map<String, Object> dfeDataSource = new HashMap<>()
154-
dfeDataSource.put("keyField1", "keyValue")
171+
dfeDataSource.put(entityKeyField1Name, entityKeyFieldValue)
155172

156173
dfeMock.getSource() >> dfeDataSource
157-
dfeMock.getField() >> Field.newField().name(extEntityField).build()
174+
dfeMock.getField() >> entityField
158175
dfeMock.getFieldType() >> Scalars.GraphQLString
159176
dfeMock.getContext() >> GraphQLContext.newContext().build()
177+
dfeMock.getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
160178

161179
AtomicReference<ExecutionInput> queryToProviderRef = new AtomicReference<>()
162180

@@ -166,7 +184,7 @@ class EntityFetcherBatchLoaderSpec extends Specification {
166184
HashMap<String, Object> data = new HashMap<>()
167185
List<HashMap<String, Object>> entities = new ArrayList<>()
168186
HashMap<String, Object> entity = new HashMap<>()
169-
entity.put(extEntityField, "ENTITY1_FIELD")
187+
entity.put(extEntityFieldName, "ENTITY1_FIELD")
170188
entities.add(entity)
171189
data.put("data", ImmutableMap.of("_entities", entities))
172190
return CompletableFuture.completedFuture(data)
@@ -194,24 +212,25 @@ class EntityFetcherBatchLoaderSpec extends Specification {
194212

195213
representationVariables.size() == 1
196214
representationVariables.get(0).get("__typename") == "MOCK_ENTITY"
197-
representationVariables.get(0).get("keyField1") == "keyValue"
215+
representationVariables.get(0).get(entityKeyField1Name) == "keyValue1"
198216
}
199217

200218
def "batchloader retrieves entity for singular dfe null result"() {
201219
given:
202220
List<KeyDirectiveMetadata> keyDirectives = Arrays.asList(KeyDirectiveMetadata.from(generateKeyDirective("keyField1")))
203221
metadataMock.getKeyDirectives() >> keyDirectives
204222

205-
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityField)
223+
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityFieldName)
206224

207225
DataFetchingEnvironment dfeMock = Mock(DataFetchingEnvironment.class)
208226
Map<String, Object> dfeDataSource = new HashMap<>()
209227
dfeDataSource.put("keyField1", "keyValue")
210228

211229
dfeMock.getSource() >> dfeDataSource
212-
dfeMock.getField() >> Field.newField().name(extEntityField).build()
230+
dfeMock.getField() >> Field.newField().name(extEntityFieldName).build()
213231
dfeMock.getFieldType() >> Scalars.GraphQLString
214232
dfeMock.getContext() >> GraphQLContext.newContext().build()
233+
dfeMock.getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
215234

216235
AtomicReference<ExecutionInput> queryToProviderRef = new AtomicReference<>()
217236

@@ -221,7 +240,7 @@ class EntityFetcherBatchLoaderSpec extends Specification {
221240
HashMap<String, Object> data = new HashMap<>()
222241
List<HashMap<String, Object>> entities = new ArrayList<>()
223242
HashMap<String, Object> entity = new HashMap<>()
224-
entity.put(extEntityField, null)
243+
entity.put(extEntityFieldName, null)
225244
entities.add(entity)
226245
data.put("data", ImmutableMap.of("_entities", entities))
227246
return CompletableFuture.completedFuture(data)
@@ -253,33 +272,36 @@ class EntityFetcherBatchLoaderSpec extends Specification {
253272
List<KeyDirectiveMetadata> keyDirectives = Arrays.asList(KeyDirectiveMetadata.from(generateKeyDirective("keyField1")))
254273
metadataMock.getKeyDirectives() >> keyDirectives
255274

256-
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityField)
275+
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityFieldName)
257276

258277
DataFetchingEnvironment dfeMock1 = Mock(DataFetchingEnvironment.class)
259278
Map<String, Object> dfe1DataSource = new HashMap<>()
260279
dfe1DataSource.put("keyField1", "dfeKey1")
261280

262281
dfeMock1.getSource() >> dfe1DataSource
263-
dfeMock1.getField() >> Field.newField().name(extEntityField).build()
282+
dfeMock1.getField() >> Field.newField().name(extEntityFieldName).build()
264283
dfeMock1.getFieldType() >> Scalars.GraphQLString
265284
dfeMock1.getContext() >> GraphQLContext.newContext().build()
285+
dfeMock1.getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
266286

267287
DataFetchingEnvironment dfeMock2 = Mock(DataFetchingEnvironment.class)
268288
Map<String, Object> dfe2DataSource = new HashMap<>()
269289
dfe2DataSource.put("keyField1", "dfeKey2")
270290

271291
dfeMock2.getSource() >> dfe2DataSource
272-
dfeMock2.getField() >> Field.newField().name(extEntityField).build()
292+
dfeMock2.getField() >> Field.newField().name(extEntityFieldName).build()
273293
dfeMock2.getFieldType() >> Scalars.GraphQLString
274294
dfeMock2.getContext() >> GraphQLContext.newContext().build()
295+
dfeMock2.getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
275296

276297
DataFetchingEnvironment dfeMock3 = Mock(DataFetchingEnvironment.class)
277298
Map<String, Object> dfe3DataSource = new HashMap<>()
278299
dfe3DataSource.put("keyField1", "dfeKey3")
279300

280301
dfeMock3.getSource() >> dfe3DataSource
281-
dfeMock3.getField() >> Field.newField().name(extEntityField).build()
302+
dfeMock3.getField() >> Field.newField().name(extEntityFieldName).build()
282303
dfeMock3.getContext() >> GraphQLContext.newContext().build()
304+
dfeMock3.getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
283305

284306
AtomicReference<ExecutionInput> queryToProviderRef = new AtomicReference<>()
285307

@@ -289,9 +311,9 @@ class EntityFetcherBatchLoaderSpec extends Specification {
289311
Map<String, Object> data = new HashMap<>()
290312
List<Map<String, Object>> entities = new ArrayList<>()
291313

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")
295317

296318
entities.add(entity1)
297319
entities.add(entity2)
@@ -337,33 +359,36 @@ class EntityFetcherBatchLoaderSpec extends Specification {
337359
List<KeyDirectiveMetadata> keyDirectives = Arrays.asList(KeyDirectiveMetadata.from(generateKeyDirective("keyField1")))
338360
metadataMock.getKeyDirectives() >> keyDirectives
339361

340-
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityField)
362+
specUnderTest = new EntityFetcherBatchLoader(metadataMock, serviceMetadata, extEntityFieldName)
341363

342364
DataFetchingEnvironment dfeMock1 = Mock(DataFetchingEnvironment.class)
343365
Map<String, Object> dfe1DataSource = new HashMap<>()
344366
dfe1DataSource.put("keyField1", "dfeKey1")
345367

346368
dfeMock1.getSource() >> dfe1DataSource
347-
dfeMock1.getField() >> Field.newField().name(extEntityField).build()
369+
dfeMock1.getField() >> Field.newField().name(extEntityFieldName).build()
348370
dfeMock1.getFieldType() >> Scalars.GraphQLString
349371
dfeMock1.getContext() >> GraphQLContext.newContext().build()
372+
dfeMock1.getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
350373

351374
DataFetchingEnvironment dfeMock2 = Mock(DataFetchingEnvironment.class)
352375
Map<String, Object> dfe2DataSource = new HashMap<>()
353376
dfe2DataSource.put("keyField1", "dfeKey2")
354377

355378
dfeMock2.getSource() >> dfe2DataSource
356-
dfeMock2.getField() >> Field.newField().name(extEntityField).build()
379+
dfeMock2.getField() >> Field.newField().name(extEntityFieldName).build()
357380
dfeMock2.getFieldType() >> Scalars.GraphQLString
358381
dfeMock2.getContext() >> GraphQLContext.newContext().build()
382+
dfeMock2.getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
359383

360384
DataFetchingEnvironment dfeMock3 = Mock(DataFetchingEnvironment.class)
361385
Map<String, Object> dfe3DataSource = new HashMap<>()
362386
dfe3DataSource.put("keyField1", "dfeKey3")
363387

364388
dfeMock3.getSource() >> dfe3DataSource
365-
dfeMock3.getField() >> Field.newField().name(extEntityField).build()
389+
dfeMock3.getField() >> Field.newField().name(extEntityFieldName).build()
366390
dfeMock3.getContext() >> GraphQLContext.newContext().build()
391+
dfeMock3.getExecutionStepInfo() >> createExecutionStepInfo(keyField, parentField)
367392

368393
AtomicReference<ExecutionInput> queryToProviderRef = new AtomicReference<>()
369394

@@ -373,11 +398,11 @@ class EntityFetcherBatchLoaderSpec extends Specification {
373398
Map<String, Object> data = new HashMap<>()
374399
List<Map<String, Object>> entities = new ArrayList<>()
375400

376-
Map<String, Object> entity1 = ImmutableMap.of(extEntityField, "ENTITY1_FIELD")
401+
Map<String, Object> entity1 = ImmutableMap.of(extEntityFieldName, "ENTITY1_FIELD")
377402
Map<String, Object> entity2 = new HashMap()
378-
entity2.put(extEntityField, null)
403+
entity2.put(extEntityFieldName, null)
379404

380-
Map<String, Object> entity3 = ImmutableMap.of(extEntityField, "ENTITY3_FIELD")
405+
Map<String, Object> entity3 = ImmutableMap.of(extEntityFieldName, "ENTITY3_FIELD")
381406

382407
entities.add(entity1)
383408
entities.add(entity2)
@@ -434,4 +459,19 @@ class EntityFetcherBatchLoaderSpec extends Specification {
434459
keyDir.getArguments().add(fieldsArgument)
435460
return keyDir
436461
}
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+
}
437477
}

0 commit comments

Comments
 (0)