From 357ce8a81d2fb4e83d2412bd6a43700ecde6d8d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20Dobe=C5=A1?= Date: Wed, 4 Jun 2025 14:14:58 +0200 Subject: [PATCH] Fix check of compatible parent type --- src/GraphQL/CorrespondanceRule.php | 2 +- .../AbstractCorrespondanceRuleTest.php | 14 +++++++++++- tests-shared/Resolvers/Entity.php | 11 ++++++++++ .../EntityParentTypeNameFieldResolver.php | 19 ++++++++++++++++ tests-shared/Resolvers/Person.php | 2 +- ... => PersonParentTypeNameFieldResolver.php} | 2 +- ...lidEntityParentTypeArrayFieldResolver.php} | 2 +- ...alidPersonParentTypeArrayFieldResolver.php | 19 ++++++++++++++++ ...lidPersonParentTypeEntityFieldResolver.php | 19 ++++++++++++++++ ...alidPersonParentTypeThingFieldResolver.php | 19 ++++++++++++++++ ...lidEntityParentTypeEntityFieldResolver.php | 19 ++++++++++++++++ ...lidEntityParentTypePersonFieldResolver.php | 19 ++++++++++++++++ ...alidEntityParentTypeThingFieldResolver.php | 19 ++++++++++++++++ ...lidPersonParentTypePersonFieldResolver.php | 19 ++++++++++++++++ tests-shared/Resolvers/Thing.php | 13 +++++++++++ tests-shared/schema.graphqls | 22 ++++++++++++++----- tests/CustomAdapter.php | 14 ++++++++++-- 17 files changed, 222 insertions(+), 12 deletions(-) create mode 100644 tests-shared/Resolvers/Entity.php create mode 100644 tests-shared/Resolvers/EntityParentTypeNameFieldResolver.php rename tests-shared/Resolvers/{InvalidParentTypeNameFieldResolver.php => PersonParentTypeNameFieldResolver.php} (77%) rename tests-shared/Resolvers/{QueryProviderOfInvalidParentTypeFieldResolver.php => QueryProviderOfInvalidEntityParentTypeArrayFieldResolver.php} (72%) create mode 100644 tests-shared/Resolvers/QueryProviderOfInvalidPersonParentTypeArrayFieldResolver.php create mode 100644 tests-shared/Resolvers/QueryProviderOfInvalidPersonParentTypeEntityFieldResolver.php create mode 100644 tests-shared/Resolvers/QueryProviderOfInvalidPersonParentTypeThingFieldResolver.php create mode 100644 tests-shared/Resolvers/QueryProviderOfValidEntityParentTypeEntityFieldResolver.php create mode 100644 tests-shared/Resolvers/QueryProviderOfValidEntityParentTypePersonFieldResolver.php create mode 100644 tests-shared/Resolvers/QueryProviderOfValidEntityParentTypeThingFieldResolver.php create mode 100644 tests-shared/Resolvers/QueryProviderOfValidPersonParentTypePersonFieldResolver.php create mode 100644 tests-shared/Resolvers/Thing.php diff --git a/src/GraphQL/CorrespondanceRule.php b/src/GraphQL/CorrespondanceRule.php index c29e25b..c2d6f66 100644 --- a/src/GraphQL/CorrespondanceRule.php +++ b/src/GraphQL/CorrespondanceRule.php @@ -264,7 +264,7 @@ private function listFieldResolvedValueTypes( $expectedParentType = $resolverClassType->getTemplateType(Vojtechdobes\GraphQL\FieldResolver::class, 'TObjectValue'); foreach ($this->listObjectTypeResolvedValueTypes($scope, $schemaServiceOraculum, $objectType) as $parentType) { - if ($parentType->isSuperTypeOf($expectedParentType)->yes() === false) { + if ($expectedParentType->isSuperTypeOf($parentType)->yes() === false) { $errors[] = sprintf( "Resolver %s of field %s expects parent to be %s, but parent is resolved to %s", $resolverClassType->describe(PHPStan\Type\VerbosityLevel::precise()), diff --git a/tests-shared/AbstractCorrespondanceRuleTest.php b/tests-shared/AbstractCorrespondanceRuleTest.php index 381d2bc..ba4f272 100644 --- a/tests-shared/AbstractCorrespondanceRuleTest.php +++ b/tests-shared/AbstractCorrespondanceRuleTest.php @@ -41,7 +41,19 @@ final public function testRule(): void -1, ], [ - "Resolver Vojtechdobes\TestsShared\Resolvers\InvalidParentTypeNameFieldResolver of field InvalidParentType.name expects parent to be Vojtechdobes\TestsShared\Resolvers\Person, but parent is resolved to array{}", + "Resolver Vojtechdobes\TestsShared\Resolvers\PersonParentTypeNameFieldResolver of field PersonParentType.name expects parent to be Vojtechdobes\TestsShared\Resolvers\Person, but parent is resolved to array{}", + -1, + ], + [ + "Resolver Vojtechdobes\TestsShared\Resolvers\PersonParentTypeNameFieldResolver of field PersonParentType.name expects parent to be Vojtechdobes\TestsShared\Resolvers\Person, but parent is resolved to Vojtechdobes\TestsShared\Resolvers\Entity", + -1, + ], + [ + "Resolver Vojtechdobes\TestsShared\Resolvers\PersonParentTypeNameFieldResolver of field PersonParentType.name expects parent to be Vojtechdobes\TestsShared\Resolvers\Person, but parent is resolved to Vojtechdobes\TestsShared\Resolvers\Thing", + -1, + ], + [ + "Resolver Vojtechdobes\TestsShared\Resolvers\EntityParentTypeNameFieldResolver of field EntityParentType.name expects parent to be Vojtechdobes\TestsShared\Resolvers\Entity, but parent is resolved to array{}", -1, ], ]); diff --git a/tests-shared/Resolvers/Entity.php b/tests-shared/Resolvers/Entity.php new file mode 100644 index 0000000..847f30d --- /dev/null +++ b/tests-shared/Resolvers/Entity.php @@ -0,0 +1,11 @@ + + */ +final class EntityParentTypeNameFieldResolver implements Vojtechdobes\GraphQL\FieldResolver +{ + + public function resolveField(mixed $objectValue, Vojtechdobes\GraphQL\FieldSelection $field): mixed + { + return $objectValue->name; + } + +} diff --git a/tests-shared/Resolvers/Person.php b/tests-shared/Resolvers/Person.php index 963b00c..9a24090 100644 --- a/tests-shared/Resolvers/Person.php +++ b/tests-shared/Resolvers/Person.php @@ -3,7 +3,7 @@ namespace Vojtechdobes\TestsShared\Resolvers; -final class Person +final class Person implements Entity { public function __construct( diff --git a/tests-shared/Resolvers/InvalidParentTypeNameFieldResolver.php b/tests-shared/Resolvers/PersonParentTypeNameFieldResolver.php similarity index 77% rename from tests-shared/Resolvers/InvalidParentTypeNameFieldResolver.php rename to tests-shared/Resolvers/PersonParentTypeNameFieldResolver.php index 7754231..725012d 100644 --- a/tests-shared/Resolvers/InvalidParentTypeNameFieldResolver.php +++ b/tests-shared/Resolvers/PersonParentTypeNameFieldResolver.php @@ -8,7 +8,7 @@ /** * @implements Vojtechdobes\GraphQL\FieldResolver */ -final class InvalidParentTypeNameFieldResolver implements Vojtechdobes\GraphQL\FieldResolver +final class PersonParentTypeNameFieldResolver implements Vojtechdobes\GraphQL\FieldResolver { public function resolveField(mixed $objectValue, Vojtechdobes\GraphQL\FieldSelection $field): mixed diff --git a/tests-shared/Resolvers/QueryProviderOfInvalidParentTypeFieldResolver.php b/tests-shared/Resolvers/QueryProviderOfInvalidEntityParentTypeArrayFieldResolver.php similarity index 72% rename from tests-shared/Resolvers/QueryProviderOfInvalidParentTypeFieldResolver.php rename to tests-shared/Resolvers/QueryProviderOfInvalidEntityParentTypeArrayFieldResolver.php index 6025872..aef830e 100644 --- a/tests-shared/Resolvers/QueryProviderOfInvalidParentTypeFieldResolver.php +++ b/tests-shared/Resolvers/QueryProviderOfInvalidEntityParentTypeArrayFieldResolver.php @@ -8,7 +8,7 @@ /** * @implements Vojtechdobes\GraphQL\FieldResolver */ -final class QueryProviderOfInvalidParentTypeFieldResolver implements Vojtechdobes\GraphQL\FieldResolver +final class QueryProviderOfInvalidEntityParentTypeArrayFieldResolver implements Vojtechdobes\GraphQL\FieldResolver { public function resolveField(mixed $objectValue, Vojtechdobes\GraphQL\FieldSelection $field): mixed diff --git a/tests-shared/Resolvers/QueryProviderOfInvalidPersonParentTypeArrayFieldResolver.php b/tests-shared/Resolvers/QueryProviderOfInvalidPersonParentTypeArrayFieldResolver.php new file mode 100644 index 0000000..e65b182 --- /dev/null +++ b/tests-shared/Resolvers/QueryProviderOfInvalidPersonParentTypeArrayFieldResolver.php @@ -0,0 +1,19 @@ + + */ +final class QueryProviderOfInvalidPersonParentTypeArrayFieldResolver implements Vojtechdobes\GraphQL\FieldResolver +{ + + public function resolveField(mixed $objectValue, Vojtechdobes\GraphQL\FieldSelection $field): mixed + { + return []; + } + +} diff --git a/tests-shared/Resolvers/QueryProviderOfInvalidPersonParentTypeEntityFieldResolver.php b/tests-shared/Resolvers/QueryProviderOfInvalidPersonParentTypeEntityFieldResolver.php new file mode 100644 index 0000000..8c21eb4 --- /dev/null +++ b/tests-shared/Resolvers/QueryProviderOfInvalidPersonParentTypeEntityFieldResolver.php @@ -0,0 +1,19 @@ + + */ +final class QueryProviderOfInvalidPersonParentTypeEntityFieldResolver implements Vojtechdobes\GraphQL\FieldResolver +{ + + public function resolveField(mixed $objectValue, Vojtechdobes\GraphQL\FieldSelection $field): mixed + { + return new Person(name: 'Almond'); + } + +} diff --git a/tests-shared/Resolvers/QueryProviderOfInvalidPersonParentTypeThingFieldResolver.php b/tests-shared/Resolvers/QueryProviderOfInvalidPersonParentTypeThingFieldResolver.php new file mode 100644 index 0000000..b2284cc --- /dev/null +++ b/tests-shared/Resolvers/QueryProviderOfInvalidPersonParentTypeThingFieldResolver.php @@ -0,0 +1,19 @@ + + */ +final class QueryProviderOfInvalidPersonParentTypeThingFieldResolver implements Vojtechdobes\GraphQL\FieldResolver +{ + + public function resolveField(mixed $objectValue, Vojtechdobes\GraphQL\FieldSelection $field): mixed + { + return new Thing(name: 'Almond'); + } + +} diff --git a/tests-shared/Resolvers/QueryProviderOfValidEntityParentTypeEntityFieldResolver.php b/tests-shared/Resolvers/QueryProviderOfValidEntityParentTypeEntityFieldResolver.php new file mode 100644 index 0000000..be70281 --- /dev/null +++ b/tests-shared/Resolvers/QueryProviderOfValidEntityParentTypeEntityFieldResolver.php @@ -0,0 +1,19 @@ + + */ +final class QueryProviderOfValidEntityParentTypeEntityFieldResolver implements Vojtechdobes\GraphQL\FieldResolver +{ + + public function resolveField(mixed $objectValue, Vojtechdobes\GraphQL\FieldSelection $field): mixed + { + return new Thing(name: 'Almong'); + } + +} diff --git a/tests-shared/Resolvers/QueryProviderOfValidEntityParentTypePersonFieldResolver.php b/tests-shared/Resolvers/QueryProviderOfValidEntityParentTypePersonFieldResolver.php new file mode 100644 index 0000000..d6448a1 --- /dev/null +++ b/tests-shared/Resolvers/QueryProviderOfValidEntityParentTypePersonFieldResolver.php @@ -0,0 +1,19 @@ + + */ +final class QueryProviderOfValidEntityParentTypePersonFieldResolver implements Vojtechdobes\GraphQL\FieldResolver +{ + + public function resolveField(mixed $objectValue, Vojtechdobes\GraphQL\FieldSelection $field): mixed + { + return new Person(name: 'Alice'); + } + +} diff --git a/tests-shared/Resolvers/QueryProviderOfValidEntityParentTypeThingFieldResolver.php b/tests-shared/Resolvers/QueryProviderOfValidEntityParentTypeThingFieldResolver.php new file mode 100644 index 0000000..62541ba --- /dev/null +++ b/tests-shared/Resolvers/QueryProviderOfValidEntityParentTypeThingFieldResolver.php @@ -0,0 +1,19 @@ + + */ +final class QueryProviderOfValidEntityParentTypeThingFieldResolver implements Vojtechdobes\GraphQL\FieldResolver +{ + + public function resolveField(mixed $objectValue, Vojtechdobes\GraphQL\FieldSelection $field): mixed + { + return new Thing(name: 'Almond'); + } + +} diff --git a/tests-shared/Resolvers/QueryProviderOfValidPersonParentTypePersonFieldResolver.php b/tests-shared/Resolvers/QueryProviderOfValidPersonParentTypePersonFieldResolver.php new file mode 100644 index 0000000..ee8c5da --- /dev/null +++ b/tests-shared/Resolvers/QueryProviderOfValidPersonParentTypePersonFieldResolver.php @@ -0,0 +1,19 @@ + + */ +final class QueryProviderOfValidPersonParentTypePersonFieldResolver implements Vojtechdobes\GraphQL\FieldResolver +{ + + public function resolveField(mixed $objectValue, Vojtechdobes\GraphQL\FieldSelection $field): mixed + { + return new Person(name: 'Almond'); + } + +} diff --git a/tests-shared/Resolvers/Thing.php b/tests-shared/Resolvers/Thing.php new file mode 100644 index 0000000..79dd59d --- /dev/null +++ b/tests-shared/Resolvers/Thing.php @@ -0,0 +1,13 @@ + new Vojtechdobes\GraphQL\GetterFieldResolver(), 'ObjectType.withProperty' => new Vojtechdobes\GraphQL\PropertyFieldResolver(), - 'Query.providerOfInvalidParentType' => new Vojtechdobes\TestsShared\Resolvers\QueryProviderOfInvalidParentTypeFieldResolver(), - 'InvalidParentType.name' => new Vojtechdobes\TestsShared\Resolvers\InvalidParentTypeNameFieldResolver(), + 'Query.providerOfInvalidPersonParentTypeArray' => new Vojtechdobes\TestsShared\Resolvers\QueryProviderOfInvalidPersonParentTypeArrayFieldResolver(), + 'Query.providerOfInvalidPersonParentTypeEntity' => new Vojtechdobes\TestsShared\Resolvers\QueryProviderOfInvalidPersonParentTypeEntityFieldResolver(), + 'Query.providerOfInvalidPersonParentTypeThing' => new Vojtechdobes\TestsShared\Resolvers\QueryProviderOfInvalidPersonParentTypeThingFieldResolver(), + 'Query.providerOfValidPersonParentTypePerson' => new Vojtechdobes\TestsShared\Resolvers\QueryProviderOfValidPersonParentTypePersonFieldResolver(), + + 'Query.providerOfInvalidEntityParentTypeArray' => new Vojtechdobes\TestsShared\Resolvers\QueryProviderOfInvalidEntityParentTypeArrayFieldResolver(), + 'Query.providerOfValidEntityParentTypeEntity' => new Vojtechdobes\TestsShared\Resolvers\QueryProviderOfValidEntityParentTypeEntityFieldResolver(), + 'Query.providerOfValidEntityParentTypePerson' => new Vojtechdobes\TestsShared\Resolvers\QueryProviderOfValidEntityParentTypePersonFieldResolver(), + 'Query.providerOfValidEntityParentTypeThing' => new Vojtechdobes\TestsShared\Resolvers\QueryProviderOfValidEntityParentTypeThingFieldResolver(), + + 'PersonParentType.name' => new Vojtechdobes\TestsShared\Resolvers\PersonParentTypeNameFieldResolver(), + 'EntityParentType.name' => new Vojtechdobes\TestsShared\Resolvers\EntityParentTypeNameFieldResolver(), ]); }