@@ -273,12 +273,12 @@ public function testQueryPlan(): void
273273 $ schema = new Schema (['query ' => $ blogQuery ]);
274274 $ result = GraphQL::executeQuery ($ schema , $ doc )->toArray ();
275275
276- self ::assertEquals (['data ' => ['article ' => null ]], $ result );
276+ self ::assertSame (['data ' => ['article ' => null ]], $ result );
277277 self ::assertInstanceOf (QueryPlan::class, $ queryPlan );
278278 self ::assertEquals ($ expectedQueryPlan , $ queryPlan ->queryPlan ());
279- self ::assertEquals ($ expectedReferencedTypes , $ queryPlan ->getReferencedTypes ());
280- self ::assertEquals ($ expectedReferencedFields , $ queryPlan ->getReferencedFields ());
281- self ::assertEquals (['url ' , 'width ' , 'height ' ], $ queryPlan ->subFields ('Image ' ));
279+ self ::assertSame ($ expectedReferencedTypes , $ queryPlan ->getReferencedTypes ());
280+ self ::assertSame ($ expectedReferencedFields , $ queryPlan ->getReferencedFields ());
281+ self ::assertSame (['url ' , 'width ' , 'height ' ], $ queryPlan ->subFields ('Image ' ));
282282
283283 self ::assertTrue ($ queryPlan ->hasField ('url ' ));
284284 self ::assertFalse ($ queryPlan ->hasField ('test ' ));
@@ -388,25 +388,15 @@ public function testQueryPlanOnInterface(): void
388388 'name ' ,
389389 ];
390390
391- /** @var QueryPlan $queryPlan */
391+ /** @var QueryPlan|null $queryPlan */
392392 $ queryPlan = null ;
393- $ hasCalled = false ;
394393
395394 $ petsQuery = new ObjectType ([
396395 'name ' => 'Query ' ,
397396 'fields ' => [
398397 'pets ' => [
399398 'type ' => Type::listOf ($ petType ),
400- 'resolve ' => static function (
401- $ value ,
402- $ args ,
403- $ context ,
404- ResolveInfo $ info
405- ) use (
406- &$ hasCalled ,
407- &$ queryPlan
408- ): array {
409- $ hasCalled = true ;
399+ 'resolve ' => static function ($ value , array $ args , $ context , ResolveInfo $ info ) use (&$ queryPlan ): array {
410400 $ queryPlan = $ info ->lookAhead ();
411401
412402 return [];
@@ -428,11 +418,11 @@ public function testQueryPlanOnInterface(): void
428418 ]);
429419 GraphQL::executeQuery ($ schema , $ query )->toArray ();
430420
431- self ::assertTrue ( $ hasCalled );
421+ self ::assertInstanceOf (QueryPlan::class, $ queryPlan );
432422 self ::assertEquals ($ expectedQueryPlan , $ queryPlan ->queryPlan ());
433- self ::assertEquals ($ expectedReferencedTypes , $ queryPlan ->getReferencedTypes ());
434- self ::assertEquals ($ expectedReferencedFields , $ queryPlan ->getReferencedFields ());
435- self ::assertEquals (['woofs ' ], $ queryPlan ->subFields ('Dog ' ));
423+ self ::assertSame ($ expectedReferencedTypes , $ queryPlan ->getReferencedTypes ());
424+ self ::assertSame ($ expectedReferencedFields , $ queryPlan ->getReferencedFields ());
425+ self ::assertSame (['woofs ' ], $ queryPlan ->subFields ('Dog ' ));
436426
437427 self ::assertTrue ($ queryPlan ->hasField ('name ' ));
438428 self ::assertFalse ($ queryPlan ->hasField ('test ' ));
@@ -441,6 +431,61 @@ public function testQueryPlanOnInterface(): void
441431 self ::assertFalse ($ queryPlan ->hasType ('Test ' ));
442432 }
443433
434+ public function testQueryPlanTypenameOnUnion (): void
435+ {
436+ $ dogType = new ObjectType ([
437+ 'name ' => 'Dog ' ,
438+ 'isTypeOf ' => static fn ($ obj ): bool => $ obj instanceof Dog,
439+ 'fields ' => static fn (): array => [
440+ 'name ' => ['type ' => Type::string ()],
441+ ],
442+ ]);
443+
444+ $ petType = new UnionType ([
445+ 'name ' => 'Pet ' ,
446+ 'types ' => [$ dogType ],
447+ ]);
448+
449+ /** @var QueryPlan|null $queryPlan */
450+ $ queryPlan = null ;
451+ $ petsQuery = new ObjectType ([
452+ 'name ' => 'Query ' ,
453+ 'fields ' => [
454+ 'pets ' => [
455+ 'type ' => Type::listOf ($ petType ),
456+ 'resolve ' => static function ($ value , array $ args , $ context , ResolveInfo $ info ) use (&$ queryPlan ): array {
457+ $ queryPlan = $ info ->lookAhead ();
458+
459+ return [];
460+ },
461+ ],
462+ ],
463+ ]);
464+
465+ $ schema = new Schema (['query ' => $ petsQuery ]);
466+ GraphQL::executeQuery ($ schema , /** @lang GraphQL */ '
467+ {
468+ pets {
469+ __typename
470+ }
471+ }
472+ ' );
473+
474+ self ::assertInstanceOf (QueryPlan::class, $ queryPlan );
475+ self ::assertSame ([], $ queryPlan ->queryPlan ());
476+ self ::assertSame (['Pet ' ], $ queryPlan ->getReferencedTypes ());
477+ self ::assertSame ([], $ queryPlan ->getReferencedFields ());
478+ self ::assertSame ([], $ queryPlan ->subFields ('Dog ' ));
479+
480+ // TODO really? maybe change in next major version
481+ self ::assertFalse ($ queryPlan ->hasField ('__typename ' ));
482+ self ::assertFalse ($ queryPlan ->hasField ('non-existent ' ));
483+
484+ self ::assertTrue ($ queryPlan ->hasType ('Pet ' ));
485+ self ::assertFalse ($ queryPlan ->hasType ('Dog ' ));
486+ self ::assertFalse ($ queryPlan ->hasType ('Non-Existent ' ));
487+ }
488+
444489 public function testMergedFragmentsQueryPlan (): void
445490 {
446491 $ image = new ObjectType ([
@@ -719,11 +764,11 @@ public function testMergedFragmentsQueryPlan(): void
719764 $ result = GraphQL::executeQuery ($ schema , $ doc )->toArray ();
720765
721766 self ::assertTrue ($ hasCalled );
722- self ::assertEquals (['data ' => ['article ' => null ]], $ result );
767+ self ::assertSame (['data ' => ['article ' => null ]], $ result );
723768 self ::assertEquals ($ expectedQueryPlan , $ queryPlan ->queryPlan ());
724- self ::assertEquals ($ expectedReferencedTypes , $ queryPlan ->getReferencedTypes ());
725- self ::assertEquals ($ expectedReferencedFields , $ queryPlan ->getReferencedFields ());
726- self ::assertEquals (['url ' , 'width ' , 'height ' ], $ queryPlan ->subFields ('Image ' ));
769+ self ::assertSame ($ expectedReferencedTypes , $ queryPlan ->getReferencedTypes ());
770+ self ::assertSame ($ expectedReferencedFields , $ queryPlan ->getReferencedFields ());
771+ self ::assertSame (['url ' , 'width ' , 'height ' ], $ queryPlan ->subFields ('Image ' ));
727772
728773 self ::assertTrue ($ queryPlan ->hasField ('url ' ));
729774 self ::assertFalse ($ queryPlan ->hasField ('test ' ));
@@ -943,12 +988,12 @@ public function testQueryPlanGroupingImplementorFieldsForAbstractTypes(): void
943988 $ result = GraphQL::executeQuery ($ schema , $ query )->toArray ();
944989
945990 self ::assertTrue ($ hasCalled );
946- self ::assertEquals ($ expectedResult , $ result );
947- self ::assertEquals ($ expectedQueryPlan , $ queryPlan ->queryPlan ());
991+ self ::assertSame ($ expectedResult , $ result );
992+ self ::assertSame ($ expectedQueryPlan , $ queryPlan ->queryPlan ());
948993 self ::assertEquals ($ expectedReferencedTypes , $ queryPlan ->getReferencedTypes ());
949- self ::assertEquals ($ expectedReferencedFields , $ queryPlan ->getReferencedFields ());
950- self ::assertEquals ($ expectedItemSubFields , $ queryPlan ->subFields ('Item ' ));
951- self ::assertEquals ($ expectedBuildingSubFields , $ queryPlan ->subFields ('Building ' ));
994+ self ::assertSame ($ expectedReferencedFields , $ queryPlan ->getReferencedFields ());
995+ self ::assertSame ($ expectedItemSubFields , $ queryPlan ->subFields ('Item ' ));
996+ self ::assertSame ($ expectedBuildingSubFields , $ queryPlan ->subFields ('Building ' ));
952997 }
953998
954999 public function testQueryPlanForMultipleFieldNodes (): void
0 commit comments