Skip to content

Commit

Permalink
Support react/promise v3
Browse files Browse the repository at this point in the history
  • Loading branch information
simPod committed Jan 21, 2024
1 parent 9dbc47a commit 84a9e2c
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 14 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ You can find and compare releases at the [GitHub release page](https://github.co

## Unreleased

## v15.9.0

### Added

- Support `react/promise` v3 https://github.com/webonyx/graphql-php/pull/1517

## v15.8.1

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"phpunit/phpunit": "^9.5 || ^10",
"psr/http-message": "^1 || ^2",
"react/http": "^1.6",
"react/promise": "^2.9",
"react/promise": "^2.0 || ^3.0",
"rector/rector": "^0.19",
"symfony/polyfill-php81": "^1.23",
"symfony/var-exporter": "^5 || ^6 || ^7",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
$deferred = new \React\Promise\Deferred();
$promise = $deferred->promise();
$promise = $promise = $promise->then(static fn (): string => $rootValue['prefix'] . $args['message']);
$deferred->resolve();
$deferred->resolve(null);

return $promise;
},
Expand Down
2 changes: 1 addition & 1 deletion src/Executor/Promise/Promise.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
*/
class Promise
{
/** @var SyncPromise|ReactPromise|AmpPromise<mixed> */
/** @var SyncPromise|ReactPromise<mixed>|AmpPromise<mixed> */
public $adoptedPromise;

private PromiseAdapter $adapter;
Expand Down
2 changes: 1 addition & 1 deletion tests/Executor/Promise/AmpPromiseAdapterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public function testIsThenableReturnsTrueWhenAnAmpPromiseIsGiven(): void
self::assertFalse($ampAdapter->isThenable(new \stdClass()));
}

public function testConvertsReactPromisesToGraphQlOnes(): void
public function testConvertsReactPromisesToGraphQLOnes(): void
{
$ampAdapter = new AmpPromiseAdapter();
$ampPromise = new Success(1);
Expand Down
46 changes: 36 additions & 10 deletions tests/Executor/Promise/ReactPromiseAdapterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,8 @@
use GraphQL\Executor\Promise\Adapter\ReactPromiseAdapter;
use PHPUnit\Framework\TestCase;
use React\Promise\Deferred;
use React\Promise\FulfilledPromise;
use React\Promise\Promise;
use React\Promise\Promise as ReactPromise;
use React\Promise\RejectedPromise;

use function React\Promise\reject;
use function React\Promise\resolve;
Expand All @@ -18,13 +16,41 @@
*/
final class ReactPromiseAdapterTest extends TestCase
{
/** @var class-string<object> */
private string $classFulfilledPromise;

/** @var class-string<object> */
private string $classRejectedPromise;

public function setUp(): void
{
/** @var class-string<object> $classFulfilledPromise */
$classFulfilledPromise = \class_exists('\React\Promise\FulfilledPromise')
? '\React\Promise\FulfilledPromise'
: '\React\Promise\Internal\FulfilledPromise';
$this->classFulfilledPromise = $classFulfilledPromise;

/** @var class-string<object> $classRejectedPromise */
$classRejectedPromise = \class_exists('\React\Promise\RejectedPromise')
? '\React\Promise\RejectedPromise'
: '\React\Promise\Internal\RejectedPromise';
$this->classRejectedPromise = $classRejectedPromise;
}

public function testIsThenableReturnsTrueWhenAReactPromiseIsGiven(): void
{
/** @var callable $reactPromiseSetRejectionHandler */
$reactPromiseSetRejectionHandler = \function_exists('\React\Promise\set_rejection_handler')
? '\React\Promise\set_rejection_handler'
: fn ($error) => null;

$reactAdapter = new ReactPromiseAdapter();

self::assertTrue($reactAdapter->isThenable(new ReactPromise(static fn () => null)));
self::assertTrue($reactAdapter->isThenable(resolve()));
self::assertTrue($reactAdapter->isThenable(reject()));
self::assertTrue($reactAdapter->isThenable(resolve(null)));
$original = $reactPromiseSetRejectionHandler(fn (\Throwable $reason) => null);
self::assertTrue($reactAdapter->isThenable(reject(new \Exception())));
$reactPromiseSetRejectionHandler($original);
self::assertFalse($reactAdapter->isThenable(static fn () => null));
self::assertFalse($reactAdapter->isThenable(false));
self::assertFalse($reactAdapter->isThenable(true));
Expand All @@ -36,14 +62,14 @@ public function testIsThenableReturnsTrueWhenAReactPromiseIsGiven(): void
self::assertFalse($reactAdapter->isThenable(new \stdClass()));
}

public function testConvertsReactPromisesToGraphQlOnes(): void
public function testConvertsReactPromisesToGraphQLOnes(): void
{
$reactAdapter = new ReactPromiseAdapter();
$reactPromise = resolve(1);

$promise = $reactAdapter->convertThenable($reactPromise);

self::assertInstanceOf(FulfilledPromise::class, $promise->adoptedPromise);
self::assertInstanceOf($this->classFulfilledPromise, $promise->adoptedPromise);
}

public function testThen(): void
Expand All @@ -61,7 +87,7 @@ static function ($value) use (&$result): void {
);

self::assertSame(1, $result);
self::assertInstanceOf(FulfilledPromise::class, $resultPromise->adoptedPromise);
self::assertInstanceOf($this->classFulfilledPromise, $resultPromise->adoptedPromise);
}

public function testCreate(): void
Expand All @@ -86,7 +112,7 @@ public function testCreateFulfilled(): void
$reactAdapter = new ReactPromiseAdapter();
$fulfilledPromise = $reactAdapter->createFulfilled(1);

self::assertInstanceOf(FulfilledPromise::class, $fulfilledPromise->adoptedPromise);
self::assertInstanceOf($this->classFulfilledPromise, $fulfilledPromise->adoptedPromise);

$result = null;
$fulfilledPromise->then(static function ($value) use (&$result): void {
Expand All @@ -101,7 +127,7 @@ public function testCreateRejected(): void
$reactAdapter = new ReactPromiseAdapter();
$rejectedPromise = $reactAdapter->createRejected(new \Exception('I am a bad promise'));

self::assertInstanceOf(RejectedPromise::class, $rejectedPromise->adoptedPromise);
self::assertInstanceOf($this->classRejectedPromise, $rejectedPromise->adoptedPromise);

$exception = null;
$rejectedPromise->then(
Expand All @@ -122,7 +148,7 @@ public function testAll(): void

$allPromise = $reactAdapter->all($promises);

self::assertInstanceOf(FulfilledPromise::class, $allPromise->adoptedPromise);
self::assertInstanceOf($this->classFulfilledPromise, $allPromise->adoptedPromise);

$result = null;
$allPromise->then(static function ($values) use (&$result): void {
Expand Down

0 comments on commit 84a9e2c

Please sign in to comment.