diff --git a/docs/class-reference.md b/docs/class-reference.md index 70947cdff..38f6990be 100644 --- a/docs/class-reference.md +++ b/docs/class-reference.md @@ -76,6 +76,8 @@ static function executeQuery( * @param array|null $variableValues * @param array|null $validationRules * + * @return Promise + * * @api */ static function promiseToExecute( @@ -1305,6 +1307,8 @@ static function execute( * @param mixed $contextValue * @param array|null $variableValues * + * @return Promise + * * @phpstan-param FieldResolver|null $fieldResolver * * @api @@ -1457,7 +1461,11 @@ function isThenable($value): bool /** * Converts thenable of the underlying platform into GraphQL\Executor\Promise\Promise instance. * - * @param mixed $thenable + * @template T + * + * @param T $thenable + * + * @return Promise * * @api */ @@ -1466,8 +1474,22 @@ function convertThenable($thenable): GraphQL\Executor\Promise\Promise ```php /** - * Accepts our Promise wrapper, extracts adopted promise out of it and executes actual `then` logic described - * in Promises/A+ specs. Then returns new wrapped instance of GraphQL\Executor\Promise\Promise. + * Accepts our Promise wrapper, extracts adopted promise out of it and executes actual `then` logic described in Promises/A+ specs. + * Then returns new wrapped instance of @see \GraphQL\Executor\Promise\Promise. + * + * @template T + * @template TFulfilled of mixed + * @template TRejected of mixed + * + * @param Promise $promise + * @param (callable(T): (Promise|TFulfilled))|null $onFulfilled + * @param (callable(\Throwable): (Promise|TRejected))|null $onRejected + * + * @return Promise<( + * $onFulfilled is not null + * ? ($onRejected is not null ? TFulfilled|TRejected : TFulfilled) + * : ($onRejected is not null ? TRejected : T) + * )> * * @api */ @@ -1482,7 +1504,11 @@ function then( /** * Creates a Promise from the given resolver callable. * - * @param callable(callable $resolve, callable $reject): void $resolver + * @template V + * + * @param callable(callable(V): void $resolve, callable(\Throwable): void $reject): void $resolver + * + * @return Promise * * @api */ @@ -1493,7 +1519,11 @@ function create(callable $resolver): GraphQL\Executor\Promise\Promise /** * Creates a fulfilled Promise for a value if the value is not a promise. * - * @param mixed $value + * @template V + * + * @param V $value + * + * @return Promise * * @api */ @@ -1506,6 +1536,8 @@ function createFulfilled($value = null): GraphQL\Executor\Promise\Promise * * If the provided reason is a promise, then it is returned as-is. * + * @return Promise + * * @api */ function createRejected(Throwable $reason): GraphQL\Executor\Promise\Promise @@ -1516,7 +1548,11 @@ function createRejected(Throwable $reason): GraphQL\Executor\Promise\Promise * Given an iterable of promises (or values), returns a promise that is fulfilled when all the * items in the iterable are fulfilled. * - * @param iterable $promisesOrValues + * @template V + * + * @param iterable $promisesOrValues + * + * @return Promise> * * @api */ @@ -1874,7 +1910,7 @@ function handleRequest($parsedBody = null): void * * @param OperationParams|array $parsedBody * - * @return ExecutionResult|array|Promise + * @return ExecutionResult|array|Promise|Promise> * * @api */ @@ -1888,7 +1924,7 @@ function executeRequest($parsedBody = null) * See `executePsrRequest()` if you prefer to create response yourself * (e.g. using specific JsonResponse instance of some framework). * - * @return ResponseInterface|Promise + * @return ResponseInterface|Promise * * @api */ @@ -1904,7 +1940,7 @@ function processPsrRequest( * Executes GraphQL operation and returns execution result * (or promise when promise adapter is different from SyncPromiseAdapter). * - * @return ExecutionResult|array|Promise + * @return ExecutionResult|array|Promise|Promise> * * @api */ @@ -2116,7 +2152,7 @@ function validateOperationParams(GraphQL\Server\OperationParams $params): array * Executes GraphQL operation with given server configuration and returns execution result * (or promise when promise adapter is different from SyncPromiseAdapter). * - * @return ExecutionResult|Promise + * @return ExecutionResult|Promise * * @api */ @@ -2130,7 +2166,7 @@ function executeOperation(GraphQL\Server\ServerConfig $config, GraphQL\Server\Op * * @param array $operations * - * @return array|Promise + * @return array|Promise> * * @api */ @@ -2141,7 +2177,7 @@ function executeBatch(GraphQL\Server\ServerConfig $config, array $operations) /** * Send response using standard PHP `header()` and `echo`. * - * @param Promise|ExecutionResult|array $result + * @param Promise|Promise>|ExecutionResult|array $result * * @api */ @@ -2165,9 +2201,9 @@ function parsePsrRequest(Psr\Http\Message\RequestInterface $request) /** * Converts query execution result to PSR-7 response. * - * @param Promise|ExecutionResult|array $result + * @param Promise|Promise>|ExecutionResult|array $result * - * @return Promise|ResponseInterface + * @return Promise|ResponseInterface * * @api */ diff --git a/src/Deferred.php b/src/Deferred.php index d0f99ec13..73aa47fac 100644 --- a/src/Deferred.php +++ b/src/Deferred.php @@ -5,23 +5,21 @@ use GraphQL\Executor\Promise\Adapter\SyncPromise; /** - * @phpstan-import-type Executor from SyncPromise + * @template V + * + * @extends SyncPromise */ class Deferred extends SyncPromise { /** - * @param Executor $executor + * @template T + * + * @param callable(): T $executor + * + * @return self */ public static function create(callable $executor): self { return new self($executor); } - - /** - * @param Executor $executor - */ - public function __construct(callable $executor) - { - parent::__construct($executor); - } } diff --git a/src/Executor/Executor.php b/src/Executor/Executor.php index 88c132d2a..c652006b8 100644 --- a/src/Executor/Executor.php +++ b/src/Executor/Executor.php @@ -132,6 +132,8 @@ public static function execute( * @param mixed $contextValue * @param array|null $variableValues * + * @return Promise + * * @phpstan-param FieldResolver|null $fieldResolver * * @api diff --git a/src/Executor/ExecutorImplementation.php b/src/Executor/ExecutorImplementation.php index b614d8b73..b0e4726c2 100644 --- a/src/Executor/ExecutorImplementation.php +++ b/src/Executor/ExecutorImplementation.php @@ -8,6 +8,8 @@ interface ExecutorImplementation { /** * Returns promise of {@link ExecutionResult}. Promise should always resolve, never reject. + * + * @return Promise */ public function doExecute(): Promise; } diff --git a/src/Executor/Promise/Adapter/SyncPromise.php b/src/Executor/Promise/Adapter/SyncPromise.php index 36a41f3e1..9bd048c7d 100644 --- a/src/Executor/Promise/Adapter/SyncPromise.php +++ b/src/Executor/Promise/Adapter/SyncPromise.php @@ -15,7 +15,7 @@ * The whole point of Deferred is to ensure it never happens and that any resolver creates * at least one $executor to start the promise chain. * - * @phpstan-type Executor callable(): mixed + * @template V */ class SyncPromise { @@ -34,7 +34,7 @@ class SyncPromise * @var array< * int, * array{ - * self, + * self, * (callable(mixed): mixed)|null, * (callable(\Throwable): mixed)|null * } @@ -52,7 +52,7 @@ public static function runQueue(): void } /** - * @param Executor|null $executor + * @param (callable(): V)|null $executor */ public function __construct(?callable $executor = null) { @@ -71,6 +71,8 @@ public function __construct(?callable $executor = null) /** * @param mixed $value + * + * @return self */ public function resolve($value): self { @@ -110,6 +112,9 @@ function ($reason): void { return $this; } + /** + * @return self + */ public function reject(\Throwable $reason): self { switch ($this->state) { @@ -175,8 +180,17 @@ public static function getQueue(): \SplQueue } /** - * @param (callable(mixed): mixed)|null $onFulfilled - * @param (callable(\Throwable): mixed)|null $onRejected + * @template VFulfilled + * @template VRejected + * + * @param (callable(V): VFulfilled)|null $onFulfilled + * @param (callable(\Throwable): VRejected)|null $onRejected + * + * @return self<( + * $onFulfilled is not null + * ? ($onRejected is not null ? VFulfilled|VRejected : VFulfilled) + * : ($onRejected is not null ? VRejected : V) + * )> */ public function then(?callable $onFulfilled = null, ?callable $onRejected = null): self { @@ -200,6 +214,8 @@ public function then(?callable $onFulfilled = null, ?callable $onRejected = null /** * @param callable(\Throwable): mixed $onRejected + * + * @return self */ public function catch(callable $onRejected): self { diff --git a/src/Executor/Promise/Adapter/SyncPromiseAdapter.php b/src/Executor/Promise/Adapter/SyncPromiseAdapter.php index 1852de96a..d47b44b1a 100644 --- a/src/Executor/Promise/Adapter/SyncPromiseAdapter.php +++ b/src/Executor/Promise/Adapter/SyncPromiseAdapter.php @@ -110,7 +110,13 @@ static function ($value) use (&$result, $index, &$count, &$resolveAllWhenFinishe /** * Synchronously wait when promise completes. * - * @return mixed + * @template V + * + * @param Promise $promise + * + * @throws InvariantViolation + * + * @return V */ public function wait(Promise $promise) { @@ -141,6 +147,8 @@ public function wait(Promise $promise) /** * Execute just before starting to run promise completion. + * + * @param Promise $promise */ protected function beforeWait(Promise $promise): void { @@ -148,6 +156,8 @@ protected function beforeWait(Promise $promise): void /** * Execute while running promise completion. + * + * @param Promise $promise */ protected function onWait(Promise $promise): void { diff --git a/src/Executor/Promise/Promise.php b/src/Executor/Promise/Promise.php index b0dbb0c7a..ec6224192 100644 --- a/src/Executor/Promise/Promise.php +++ b/src/Executor/Promise/Promise.php @@ -3,33 +3,43 @@ namespace GraphQL\Executor\Promise; use Amp\Promise as AmpPromise; -use GraphQL\Error\InvariantViolation; use GraphQL\Executor\Promise\Adapter\SyncPromise; use React\Promise\PromiseInterface as ReactPromise; /** * Convenience wrapper for promises represented by Promise Adapter. + * + * @template T */ class Promise { - /** @var SyncPromise|ReactPromise|AmpPromise */ + /** @var SyncPromise|ReactPromise|AmpPromise */ public $adoptedPromise; private PromiseAdapter $adapter; /** - * @param mixed $adoptedPromise + * @param SyncPromise|ReactPromise|AmpPromise $adoptedPromise */ public function __construct($adoptedPromise, PromiseAdapter $adapter) { - if ($adoptedPromise instanceof self) { - throw new InvariantViolation('Expecting promise from adapted system, got ' . self::class); - } - $this->adoptedPromise = $adoptedPromise; $this->adapter = $adapter; } + /** + * @template TFulfilled + * @template TRejected + * + * @param (callable(T): (Promise|TFulfilled))|null $onFulfilled + * @param (callable(mixed): (Promise|TRejected))|null $onRejected + * + * @return Promise<( + * $onFulfilled is not null + * ? ($onRejected is not null ? TFulfilled|TRejected : TFulfilled) + * : ($onRejected is not null ? TRejected : T) + * )> + */ public function then(?callable $onFulfilled = null, ?callable $onRejected = null): Promise { return $this->adapter->then($this, $onFulfilled, $onRejected); diff --git a/src/Executor/Promise/PromiseAdapter.php b/src/Executor/Promise/PromiseAdapter.php index a91ee243d..51cf1f9e5 100644 --- a/src/Executor/Promise/PromiseAdapter.php +++ b/src/Executor/Promise/PromiseAdapter.php @@ -19,15 +19,33 @@ public function isThenable($value): bool; /** * Converts thenable of the underlying platform into GraphQL\Executor\Promise\Promise instance. * - * @param mixed $thenable + * @template T + * + * @param T $thenable + * + * @return Promise * * @api */ public function convertThenable($thenable): Promise; /** - * Accepts our Promise wrapper, extracts adopted promise out of it and executes actual `then` logic described - * in Promises/A+ specs. Then returns new wrapped instance of GraphQL\Executor\Promise\Promise. + * Accepts our Promise wrapper, extracts adopted promise out of it and executes actual `then` logic described in Promises/A+ specs. + * Then returns new wrapped instance of @see \GraphQL\Executor\Promise\Promise. + * + * @template T + * @template TFulfilled of mixed + * @template TRejected of mixed + * + * @param Promise $promise + * @param (callable(T): (Promise|TFulfilled))|null $onFulfilled + * @param (callable(\Throwable): (Promise|TRejected))|null $onRejected + * + * @return Promise<( + * $onFulfilled is not null + * ? ($onRejected is not null ? TFulfilled|TRejected : TFulfilled) + * : ($onRejected is not null ? TRejected : T) + * )> * * @api */ @@ -36,7 +54,11 @@ public function then(Promise $promise, ?callable $onFulfilled = null, ?callable /** * Creates a Promise from the given resolver callable. * - * @param callable(callable $resolve, callable $reject): void $resolver + * @template V + * + * @param callable(callable(V): void $resolve, callable(\Throwable): void $reject): void $resolver + * + * @return Promise * * @api */ @@ -45,7 +67,11 @@ public function create(callable $resolver): Promise; /** * Creates a fulfilled Promise for a value if the value is not a promise. * - * @param mixed $value + * @template V + * + * @param V $value + * + * @return Promise * * @api */ @@ -56,6 +82,8 @@ public function createFulfilled($value = null): Promise; * * If the provided reason is a promise, then it is returned as-is. * + * @return Promise + * * @api */ public function createRejected(\Throwable $reason): Promise; @@ -64,7 +92,11 @@ public function createRejected(\Throwable $reason): Promise; * Given an iterable of promises (or values), returns a promise that is fulfilled when all the * items in the iterable are fulfilled. * - * @param iterable $promisesOrValues + * @template V + * + * @param iterable $promisesOrValues + * + * @return Promise> * * @api */ diff --git a/src/Executor/ReferenceExecutor.php b/src/Executor/ReferenceExecutor.php index 7fb87153b..e83a4462b 100644 --- a/src/Executor/ReferenceExecutor.php +++ b/src/Executor/ReferenceExecutor.php @@ -100,8 +100,14 @@ public static function create( if (\is_array($exeContext)) { return new class($promiseAdapter->createFulfilled(new ExecutionResult(null, $exeContext))) implements ExecutorImplementation { + /** + * @var Promise + */ private Promise $result; + /** + * @param Promise $result + */ public function __construct(Promise $result) { $this->result = $result; @@ -243,7 +249,7 @@ public function doExecute(): Promise /** * @param mixed $data * - * @return ExecutionResult|Promise + * @return ExecutionResult|Promise */ protected function buildResponse($data) { @@ -269,7 +275,7 @@ protected function buildResponse($data) * * @param mixed $rootValue * - * @return array|Promise|\stdClass|null + * @return array|Promise|\stdClass|null */ protected function executeOperation(OperationDefinitionNode $operation, $rootValue) { @@ -301,6 +307,8 @@ protected function executeOperation(OperationDefinitionNode $operation, $rootVal /** * @param mixed $error + * + * @return Promise|null */ public function onError($error): ?Promise { @@ -509,7 +517,7 @@ protected function doesFragmentConditionMatch(Node $fragment, ObjectType $type): * * @phpstan-param Fields $fields * - * @return array|Promise|\stdClass + * @return array|Promise>|\stdClass */ protected function executeFieldsSerially(ObjectType $parentType, $rootValue, array $path, \ArrayObject $fields) { @@ -702,7 +710,7 @@ protected function resolveFieldValueOrError( * * @param mixed $result * - * @return array|Promise|\stdClass|null + * @return array|Promise>|\stdClass|null */ protected function completeValueCatchingError( Type $returnType, @@ -792,7 +800,7 @@ protected function handleFieldError($rawError, \ArrayObject $fieldNodes, array $ * @throws Error * @throws \Throwable * - * @return array|mixed|Promise|null + * @return array|mixed|Promise>|null */ protected function completeValue( Type $returnType, @@ -877,7 +885,11 @@ protected function isPromise($value): bool * Only returns the value if it acts like a Promise, i.e. has a "then" function, * otherwise returns null. * - * @param mixed $value + * @template V + * + * @param V $value + * + * @return Promise|null */ protected function getPromise($value): ?Promise { @@ -931,7 +943,7 @@ function ($previous, $value) use ($callback) { * * @throws \Exception * - * @return array|Promise|\stdClass + * @return array|Promise>|\stdClass */ protected function completeListValue( ListOfType $returnType, @@ -998,7 +1010,7 @@ protected function completeLeafValue(LeafType $returnType, &$result) * * @throws Error * - * @return array|Promise|\stdClass + * @return array|Promise>|\stdClass */ protected function completeAbstractValue( AbstractType $returnType, @@ -1062,7 +1074,7 @@ protected function completeAbstractValue( * @param mixed|null $contextValue * @param AbstractType&Type $abstractType * - * @return Promise|Type|string|null + * @return Promise|Type|string|null */ protected function defaultTypeResolver($value, $contextValue, ResolveInfo $info, AbstractType $abstractType) { @@ -1121,7 +1133,7 @@ protected function defaultTypeResolver($value, $contextValue, ResolveInfo $info, * * @throws Error * - * @return array|Promise|\stdClass + * @return array|Promise>|\stdClass */ protected function completeObjectValue( ObjectType $returnType, @@ -1194,7 +1206,7 @@ protected function invalidReturnTypeError( * * @throws Error * - * @return array|Promise|\stdClass + * @return array|Promise>|\stdClass */ protected function collectAndExecuteSubfields( ObjectType $returnType, @@ -1249,7 +1261,7 @@ protected function collectSubFields(ObjectType $returnType, \ArrayObject $fieldN * * @phpstan-param Fields $fields * - * @return Promise|\stdClass|array + * @return Promise>|\stdClass|array */ protected function executeFields(ObjectType $parentType, $rootValue, array $path, \ArrayObject $fields) { @@ -1303,7 +1315,9 @@ protected static function fixResultsIfEmptyArray($results) * Transform an associative array with Promises to a Promise which resolves to an * associative array where all Promises were resolved. * - * @param array $assoc + * @param array|mixed> $assoc + * + * @return Promise> */ protected function promiseForAssocArray(array $assoc): Promise { diff --git a/src/GraphQL.php b/src/GraphQL.php index bded57793..a2e42e038 100644 --- a/src/GraphQL.php +++ b/src/GraphQL.php @@ -109,6 +109,8 @@ public static function executeQuery( * @param array|null $variableValues * @param array|null $validationRules * + * @return Promise + * * @api */ public static function promiseToExecute( diff --git a/src/Server/Helper.php b/src/Server/Helper.php index a4cb799ba..5f3ee02b6 100644 --- a/src/Server/Helper.php +++ b/src/Server/Helper.php @@ -172,7 +172,7 @@ public function validateOperationParams(OperationParams $params): array * Executes GraphQL operation with given server configuration and returns execution result * (or promise when promise adapter is different from SyncPromiseAdapter). * - * @return ExecutionResult|Promise + * @return ExecutionResult|Promise * * @api */ @@ -194,7 +194,7 @@ public function executeOperation(ServerConfig $config, OperationParams $op) * * @param array $operations * - * @return array|Promise + * @return array|Promise> * * @api */ @@ -217,6 +217,9 @@ public function executeBatch(ServerConfig $config, array $operations) return $result; } + /** + * @return Promise + */ protected function promiseToExecuteOperation( PromiseAdapter $promiseAdapter, ServerConfig $config, @@ -389,7 +392,7 @@ protected function resolveContextValue( /** * Send response using standard PHP `header()` and `echo`. * - * @param Promise|ExecutionResult|array $result + * @param Promise|Promise>|ExecutionResult|array $result * * @api */ @@ -513,9 +516,9 @@ protected function assertJsonObjectOrArray($bodyParams): void /** * Converts query execution result to PSR-7 response. * - * @param Promise|ExecutionResult|array $result + * @param Promise|Promise>|ExecutionResult|array $result * - * @return Promise|ResponseInterface + * @return Promise|ResponseInterface * * @api */ diff --git a/src/Server/StandardServer.php b/src/Server/StandardServer.php index ede83407c..ea1f8c22e 100644 --- a/src/Server/StandardServer.php +++ b/src/Server/StandardServer.php @@ -90,7 +90,7 @@ public function handleRequest($parsedBody = null): void * * @param OperationParams|array $parsedBody * - * @return ExecutionResult|array|Promise + * @return ExecutionResult|array|Promise|Promise> * * @api */ @@ -113,7 +113,7 @@ public function executeRequest($parsedBody = null) * See `executePsrRequest()` if you prefer to create response yourself * (e.g. using specific JsonResponse instance of some framework). * - * @return ResponseInterface|Promise + * @return ResponseInterface|Promise * * @api */ @@ -131,7 +131,7 @@ public function processPsrRequest( * Executes GraphQL operation and returns execution result * (or promise when promise adapter is different from SyncPromiseAdapter). * - * @return ExecutionResult|array|Promise + * @return ExecutionResult|array|Promise|Promise> * * @api */ diff --git a/src/Type/Definition/AbstractType.php b/src/Type/Definition/AbstractType.php index c646b8805..754b501ed 100644 --- a/src/Type/Definition/AbstractType.php +++ b/src/Type/Definition/AbstractType.php @@ -5,7 +5,7 @@ use GraphQL\Deferred; /** - * @phpstan-type ResolveTypeReturn ObjectType|string|callable(): (ObjectType|string|null)|Deferred|null + * @phpstan-type ResolveTypeReturn ObjectType|string|callable(): ObjectType|string|null|Deferred * @phpstan-type ResolveType callable(mixed $objectValue, mixed $context, ResolveInfo $resolveInfo): ResolveTypeReturn */ interface AbstractType @@ -16,7 +16,7 @@ interface AbstractType * @param mixed $objectValue The resolved value for the object type * @param mixed $context The context that was passed to GraphQL::execute() * - * @return ObjectType|string|callable|Deferred|null + * @return ObjectType|string|callable|Deferred|null * * @phpstan-return ResolveTypeReturn */ diff --git a/src/Type/Definition/ObjectType.php b/src/Type/Definition/ObjectType.php index 9c2d72efe..3025196a7 100644 --- a/src/Type/Definition/ObjectType.php +++ b/src/Type/Definition/ObjectType.php @@ -57,7 +57,7 @@ * resolveField?: FieldResolver|null, * fields: (callable(): iterable)|iterable, * interfaces?: iterable|callable(): iterable, - * isTypeOf?: (callable(mixed $objectValue, mixed $context, ResolveInfo $resolveInfo): (bool|Deferred|null))|null, + * isTypeOf?: (callable(mixed $objectValue, mixed $context, ResolveInfo $resolveInfo): (bool|null|Deferred))|null, * astNode?: ObjectTypeDefinitionNode|null, * extensionASTNodes?: array|null * } @@ -116,7 +116,7 @@ public static function assertObjectType($type): self * @param mixed $objectValue The resolved value for the object type * @param mixed $context The context that was passed to GraphQL::execute() * - * @return bool|Deferred|null + * @return bool|Deferred|null */ public function isTypeOf($objectValue, $context, ResolveInfo $info) { diff --git a/tests/Executor/Promise/SyncPromiseAdapterTest.php b/tests/Executor/Promise/SyncPromiseAdapterTest.php index b61860f6d..12bf7fb64 100644 --- a/tests/Executor/Promise/SyncPromiseAdapterTest.php +++ b/tests/Executor/Promise/SyncPromiseAdapterTest.php @@ -74,6 +74,9 @@ public function testCreatePromise(): void } /** + * @template T + * + * @param Promise $promise * @param mixed $expectedNextValue */ private static function assertValidPromise(Promise $promise, ?string $expectedNextReason, $expectedNextValue, string $expectedNextState): void diff --git a/tests/Executor/Promise/SyncPromiseTest.php b/tests/Executor/Promise/SyncPromiseTest.php index dafccbad1..3354925e5 100644 --- a/tests/Executor/Promise/SyncPromiseTest.php +++ b/tests/Executor/Promise/SyncPromiseTest.php @@ -137,6 +137,9 @@ static function () use (&$onRejectedCalled): void { } /** + * @template V + * + * @param SyncPromise $promise * @param mixed $expectedNextValue */ private static function assertValidPromise( diff --git a/tests/Executor/SyncTest.php b/tests/Executor/SyncTest.php index 1e245aa62..0ce8f6211 100644 --- a/tests/Executor/SyncTest.php +++ b/tests/Executor/SyncTest.php @@ -77,6 +77,8 @@ public function testDoesNotReturnAPromiseForInitialErrors(): void /** * @param mixed $rootValue + * + * @return Promise */ private function execute(Schema $schema, DocumentNode $doc, $rootValue = null): Promise { @@ -85,6 +87,7 @@ private function execute(Schema $schema, DocumentNode $doc, $rootValue = null): /** * @param array $expectedFinalArray + * @param Promise $actualResult */ private static function assertSync(array $expectedFinalArray, Promise $actualResult): void { @@ -145,6 +148,7 @@ public function testReturnsAPromiseIfAnyFieldIsAsynchronous(): void /** * @param array $expectedFinalArray + * @param Promise $actualResult */ private function assertAsync(array $expectedFinalArray, Promise $actualResult): void { @@ -155,7 +159,6 @@ private function assertAsync(array $expectedFinalArray, Promise $actualResult): self::assertEquals(SyncPromise::PENDING, $adoptedPromise->state, $message); $resolvedResult = $this->promiseAdapter->wait($actualResult); - self::assertInstanceOf(ExecutionResult::class, $resolvedResult); self::assertArraySubset($expectedFinalArray, $resolvedResult->toArray()); } @@ -183,6 +186,8 @@ public function testDoesNotReturnAPromiseForSyntaxErrors(): void /** * @param mixed $rootValue + * + * @return Promise */ private function graphqlSync(Schema $schema, string $doc, $rootValue = null): Promise { diff --git a/tests/Executor/TestClasses/Root.php b/tests/Executor/TestClasses/Root.php index 9d192b127..e7ceed200 100644 --- a/tests/Executor/TestClasses/Root.php +++ b/tests/Executor/TestClasses/Root.php @@ -13,6 +13,9 @@ public function __construct(float $originalNumber) $this->numberHolder = new NumberHolder($originalNumber); } + /** + * @return Deferred + */ public function promiseToChangeTheNumber(float $newNumber): Deferred { return new Deferred(fn (): NumberHolder => $this->immediatelyChangeTheNumber($newNumber)); @@ -30,6 +33,9 @@ public function failToChangeTheNumber(): void throw new \Exception('Cannot change the number'); } + /** + * @return Deferred + */ public function promiseAndFailToChangeTheNumber(): Deferred { return new Deferred(function (): void {