@@ -276,14 +276,14 @@ public function testMergedFragmentsFieldSelection(): void
276276 fragment MyImage on Image {
277277 url
278278 }
279-
279+
280280 fragment Replies01 on Article {
281281 _replies012: replies {
282282 body
283283 }
284284 }
285285 fragment Replies02 on Article {
286- _replies012: replies {
286+ _replies012: replies {
287287 author {
288288 id
289289 name
@@ -369,4 +369,80 @@ public function testMergedFragmentsFieldSelection(): void
369369 self ::assertEquals (['data ' => ['article ' => null ]], $ result );
370370 self ::assertEquals ($ expectedDeepSelection , $ actualDeepSelection );
371371 }
372+
373+ public function testDeepFieldSelectionOnDuplicatedFields (): void
374+ {
375+ $ level2 = new ObjectType ([
376+ 'name ' => 'level2 ' ,
377+ 'fields ' => [
378+ 'scalar1 ' => ['type ' => Type::int ()],
379+ 'scalar2 ' => ['type ' => Type::int ()],
380+ ],
381+ ]);
382+ $ level1 = new ObjectType ([
383+ 'name ' => 'level1 ' ,
384+ 'fields ' => [
385+ 'scalar1 ' => ['type ' => Type::int ()],
386+ 'scalar2 ' => ['type ' => Type::int ()],
387+ 'level2 ' => $ level2 ,
388+ ],
389+ ]);
390+
391+ $ hasCalled = false ;
392+ $ actualDeepSelection = null ;
393+
394+ $ query = new ObjectType ([
395+ 'name ' => 'Query ' ,
396+ 'fields ' => [
397+ 'level1 ' => [
398+ 'type ' => $ level1 ,
399+ 'resolve ' => static function (
400+ $ value ,
401+ array $ args ,
402+ $ context ,
403+ ResolveInfo $ info
404+ ) use (
405+ &$ hasCalled ,
406+ &$ actualDeepSelection
407+ ) {
408+ $ hasCalled = true ;
409+ $ actualDeepSelection = $ info ->getFieldSelection (2 );
410+
411+ return null ;
412+ },
413+ ],
414+ ],
415+ ]);
416+
417+ $ doc = '
418+ query deepMerge {
419+ level1 {
420+ level2 {
421+ scalar1
422+ }
423+ level2 {
424+ scalar2
425+ }
426+ scalar1
427+ scalar2
428+ }
429+ }
430+ ' ;
431+
432+ $ expectedDeepSelection = [
433+ 'level2 ' => [
434+ 'scalar1 ' => true ,
435+ 'scalar2 ' => true ,
436+ ],
437+ 'scalar1 ' => true ,
438+ 'scalar2 ' => true ,
439+ ];
440+
441+ $ schema = new Schema (['query ' => $ query ]);
442+ $ result = GraphQL::executeQuery ($ schema , $ doc )->toArray ();
443+
444+ self ::assertTrue ($ hasCalled );
445+ self ::assertEquals (['data ' => ['level1 ' => null ]], $ result );
446+ self ::assertEquals ($ expectedDeepSelection , $ actualDeepSelection );
447+ }
372448}
0 commit comments