zestic / pest-plugin-graphql
Test your PHP GraphQL server in style, with Pest!
Fund package maintenance!
miniaturebase
Patreon
Requires
- php: ^8.1
- pestphp/pest: ^2.0
- pestphp/pest-plugin: ^2.0.1
- psr/http-message: ^1.0
- webonyx/graphql-php: >=15
- zestic/graphql-simple-client: ^0.1.0
Requires (Dev)
- laminas/laminas-diactoros: ^2.6
- pestphp/pest-dev-tools: ^2.16.0
README
Test your GraphQL API in style, with Pest!
Installation
Simply install through Composer!
composer require --dev zestic/pest-plugin-graphql
In your .env
file, set the testing url
TEST_GRAPHQL_URL=http://localhost
To organize your tests, create an Api
directory in your tests
directory.
Make sure your namespace is set up correctly in the composer.json
file.
"autoload-dev": { "psr-4": { "Tests\\": "tests/" } }
Finally, in your Pest.php file add the following line:
uses(Pest\GraphQl\ApiTestCase::class)->in('Api');
What's Added?
- Test your schema as code;
- Assert PSR-7 GraphQL response data and errors;
- Testing resolvers (Coming Soon!);
Expectations
schema(string|Schema $document)
isValidSdl()
toHaveDirective(string $directive)
toHaveEnum(string $enum)
toHaveInput(string $input)
toHaveInterface(string $interface)
toHaveScalar(string $scalar)
toHaveType(string $type)
toHaveUnion(string $union)
toBeGraphQlResponse()
toHavePath(string $path, $value = null)
toHaveData(array $data)
toHaveErrors(array $errors)
And more on the way!
schema(string|Schema $document)
Create a new expectation with a GraphQL\Type\Schema
instance as the underlying
value.
test('my schema')->schema(); it('is my schema')->schema(); Pest\GraphQl\schema();
You can also provide an alternative schema path or document contents, like so.
it('uses any schema you want')->schema(sprintf('%s/../app/schema.graphql', __DIR__)); test('inline content')->schema(<<<'GRAPHQL' type Query { foo: Int bar: Int } GRAPHQL); it('even uses your instance')->schema(AcmeSchemaBuilder::build());
isValidSdl()
Assert that the schema is valid and written to the GraphQL specification.
it('validates your schema')->schema()->isValidSdl();
toHaveDirective(string $directive)
Assert that the given directive definition exists with the schema document.
it('has a directive')->schema()->toHaveDirective('auth') it('will also use base classnames')->schema()->toHaveDirective(Auth::class);
toHaveEnum(string $enum)
Assert that the given enum definition exists with the schema document.
it('has an enum')->schema()->toHaveEnum('Status') it('will also use base classnames')->schema()->toHaveEnum(Status::class);
toHaveInput(string $input)
Assert that the given input definition exists with the schema document.
it('has a input')->schema()->toHaveInput('Message') it('will also use base classnames')->schema()->toHaveInput(Message::class);
toHaveInterface(string $interface)
Assert that the given interface definition exists with the schema document.
it('has a interface')->schema()->toHaveInterface('Notification') it('will also use base classnames')->schema()->toHaveInterface(Notification::class);
toHaveScalar(string $scalar)
Assert that the given scalar definition exists with the schema document.
it('has a scalar')->schema()->toHaveScalar('Date') it('will also use base classnames')->schema()->toHaveScalar(Date::class);
toHaveType(string $type)
Assert that the given (object) type has been defined within the schema document.
it('has mutations')->schema()->toHaveType('Mutation'); test('user defined types too')->schema()->toHaveType('User'); it('will also use your base classnames')->schema()->toHaveType(User::class);
toHaveUnion(string $union)
Assert that the given union definition exists with the schema document.
it('has a union')->schema()->toHaveUnion('Character') it('will also use your base classnames')->schema()->toHaveUnion(Character::class);
toBeGraphQlResponse()
Assert that an underlying (PSR-7) response value is a compliant with the GraphQL specification.
test('response validity') ->expect($response) // a Psr\Http\Message\ResponseInterface instance ->toBeGraphQlResponse();
toHavePath(string $path, $value = null)
Assert that the underlying GraphQL response contains data at the given path. Optionally provide a value to be checked as well!
it('reads paths') ->expect($response) // a Psr\Http\Message\ResponseInterface instance ->toHavePath('foo') ->toHavePath('foo', 1) ->not() ->toHavePath('foo.bar') ->not() ->toHavePath('foo', 0);
toHaveData(array $data)
Assert that the underlying response GraphQL data is canonically equal to the expected data.
it('contains response data') ->expect($response) // a Psr\Http\Message\ResponseInterface instance ->toHaveData([ 'foo' => 1, ]);
toHaveErrors(array $errors)
Assert that the underlying response GraphQL errors are canonically equal to the expected set of errors.
it('has errors') ->expect($response) // a Psr\Http\Message\ResponseInterface instance ->toHaveErrors([ [ 'message' => 'Oops, I did it again', 'locations' => [['line' => 1, 'column' => 5]], 'path' => ['foo'], ], ]);
This repository was based off of the Pest Plugin Template.
Pest was created by Nuno Maduro under the Sponsorware license. It got open-sourced and is now licensed under the MIT license.