vladdnepr / graphql-test
GraphQL Test Cases
Requires
- php: ^8.1
Requires (Dev)
- phpspec/prophecy-phpunit: ^2.0
- symfony/browser-kit: ^5.4|^6.0
- symfony/framework-bundle: ^5.4|^6.0
- symfony/phpunit-bridge: ^5.4|^6.0
This package is auto-updated.
Last update: 2024-11-12 15:20:28 UTC
README
Makes testing your GraphQL queries and mutations easier.
Support for Symfony.
Documentation
Installation
1. Add dependency with composer
composer require --dev vladdnepr/graphql-test
If you are using Symfony you will have to install "symfony/browser-kit".
How to use
Depending on your framework, extend the correct TestCase
:
use VladDnepr\GraphQLTest\Bridge\Symfony\TestCase;
Everything you see in the next snippets is the same for all Test Cases.
In your tests you now have 2 additional helper methods:
public function query(QueryInterface $query, array $files = [], array $headers = []); public function mutation(MutationInterface $mutation, array $files = [], array $headers = [])
By default, endpoint is /graphql
, you can overwrite this by changing variable in your tests:
use VladDnepr\GraphQLTest\Bridge\Symfony\TestCase; class UserTest extends TestCase { public static $endpoint = '/'; }
There is a helper method that allows you to preset headers:
use VladDnepr\GraphQLTest\Bridge\Symfony\TestCase; class SettingsTest extends TestCase { protected function setUp() { $this->setDefaultHeaders([ 'Content-Type' => 'application/json', ]); } }
Examples
Query
use VladDnepr\GraphQLTest\Bridge\Symfony\TestCase; use VladDnepr\GraphQLTest\Operation\Query; class SettingsQueryTest extends TestCase { public static $endpoint = '/'; protected function setUp() { $this->setDefaultHeaders([ 'Content-Type' => 'application/json', ]); } public function testSettingsQuery(): void { $query = $this->query( new Query( 'settings', [], [ 'name', 'isEnabled', ], ) ); //Fetch response and do asserts } }
VladDnepr\GraphQLTest\Operation\Query
construct accepts 3 arguments:
- name of query (mandatory)
- parameters (optional)
- fields (optional)
Mutation
use VladDnepr\GraphQLTest\Bridge\Symfony\TestCase; use VladDnepr\GraphQLTest\Operation\Mutation; class SettingsMutationTest extends TestCase { public static $endpoint = '/'; protected function setUp() { $this->setDefaultHeaders([ 'Content-Type' => 'application/json', ]); } public function testSettingsMutation(): void { $mutation = $this->mutation( new Mutation( 'createSettings', [ 'name' => 'hide-menu-bar', 'isEnabled' => true, ], [ 'name', 'isEnabled', ], ) ); //Fetch response and do asserts } }
VladDnepr\GraphQLTest\Operation\Mutation
construct accepts 3 arguments:
- name of mutation (mandatory)
- parameters (optional)
- fields (optional)
If you have a Enum, Boolean or Array as an argument you can pass it as following:
use VladDnepr\GraphQLTest\Bridge\Symfony\TestCase; use VladDnepr\GraphQLTest\Operation\Mutation; use VladDnepr\GraphQLTest\Type\EnumType; use VladDnepr\GraphQLTest\Type\BooleanType; use VladDnepr\GraphQLTest\Type\ArrayType; class UserMutationTest extends TestCase { //... public function testUserMutation(): void { $mutation = $this->mutation( new Mutation( 'createUser', [ 'username' => 'kunicmarko20', 'salutation' => new EnumType('Mr'), 'enabled' => new BooleanType(true), 'roles' => new ArrayType(['ROLE_ADMIN', 'ROLE_TEST']), //.. ], [ 'username', 'salutation', ], ) ); //Fetch response and do asserts } }
Also, if you need a custom type you can always extend VladDnepr\GraphQLTest\Type\TypeInterface
and use your own Type instead.