mirror of
https://github.com/retailcrm/graphql-php.git
synced 2024-11-26 14:56:03 +03:00
226 lines
5.5 KiB
PHP
226 lines
5.5 KiB
PHP
|
<?php
|
||
|
namespace GraphQL\Executor;
|
||
|
|
||
|
use GraphQL\Language\Parser;
|
||
|
use GraphQL\Schema;
|
||
|
use GraphQL\Type\Definition\ObjectType;
|
||
|
use GraphQL\Type\Definition\Type;
|
||
|
|
||
|
class DirectivesTest extends \PHPUnit_Framework_TestCase
|
||
|
{
|
||
|
// Execute: handles directives
|
||
|
// works without directives
|
||
|
public function testWorksWithoutDirectives()
|
||
|
{
|
||
|
// basic query works
|
||
|
$this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery('{ a, b }'));
|
||
|
}
|
||
|
|
||
|
public function testWorksOnScalars()
|
||
|
{
|
||
|
// if true includes scalar
|
||
|
$this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery('{ a, b @if:true }'));
|
||
|
|
||
|
// if false omits on scalar
|
||
|
$this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery('{ a, b @if:false }'));
|
||
|
|
||
|
// unless false includes scalar
|
||
|
$this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery('{ a, b @unless:false }'));
|
||
|
|
||
|
// unless true omits scalar
|
||
|
$this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery('{ a, b @unless:true }'));
|
||
|
}
|
||
|
|
||
|
public function testWorksOnFragmentSpreads()
|
||
|
{
|
||
|
// if false omits fragment spread
|
||
|
$q = '
|
||
|
query Q {
|
||
|
a
|
||
|
...Frag @if:false
|
||
|
}
|
||
|
fragment Frag on TestType {
|
||
|
b
|
||
|
}
|
||
|
';
|
||
|
$this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery($q));
|
||
|
|
||
|
// if true includes fragment spread
|
||
|
$q = '
|
||
|
query Q {
|
||
|
a
|
||
|
...Frag @if:true
|
||
|
}
|
||
|
fragment Frag on TestType {
|
||
|
b
|
||
|
}
|
||
|
';
|
||
|
$this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery($q));
|
||
|
|
||
|
// unless false includes fragment spread
|
||
|
$q = '
|
||
|
query Q {
|
||
|
a
|
||
|
...Frag @unless:false
|
||
|
}
|
||
|
fragment Frag on TestType {
|
||
|
b
|
||
|
}
|
||
|
';
|
||
|
$this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery($q));
|
||
|
|
||
|
// unless true omits fragment spread
|
||
|
$q = '
|
||
|
query Q {
|
||
|
a
|
||
|
...Frag @unless:true
|
||
|
}
|
||
|
fragment Frag on TestType {
|
||
|
b
|
||
|
}
|
||
|
';
|
||
|
$this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery($q));
|
||
|
}
|
||
|
|
||
|
public function testWorksOnInlineFragment()
|
||
|
{
|
||
|
// if false omits inline fragment
|
||
|
$q = '
|
||
|
query Q {
|
||
|
a
|
||
|
... on TestType @if:false {
|
||
|
b
|
||
|
}
|
||
|
}
|
||
|
fragment Frag on TestType {
|
||
|
b
|
||
|
}
|
||
|
';
|
||
|
$this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery($q));
|
||
|
|
||
|
// if true includes inline fragment
|
||
|
$q = '
|
||
|
query Q {
|
||
|
a
|
||
|
... on TestType @if:true {
|
||
|
b
|
||
|
}
|
||
|
}
|
||
|
fragment Frag on TestType {
|
||
|
b
|
||
|
}
|
||
|
';
|
||
|
$this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery($q));
|
||
|
|
||
|
// unless false includes inline fragment
|
||
|
$q = '
|
||
|
query Q {
|
||
|
a
|
||
|
... on TestType @unless:false {
|
||
|
b
|
||
|
}
|
||
|
}
|
||
|
fragment Frag on TestType {
|
||
|
b
|
||
|
}
|
||
|
';
|
||
|
$this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery($q));
|
||
|
|
||
|
// unless true includes inline fragment
|
||
|
$q = '
|
||
|
query Q {
|
||
|
a
|
||
|
... on TestType @unless:true {
|
||
|
b
|
||
|
}
|
||
|
}
|
||
|
fragment Frag on TestType {
|
||
|
b
|
||
|
}
|
||
|
';
|
||
|
$this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery($q));
|
||
|
}
|
||
|
|
||
|
public function testWorksOnFragment()
|
||
|
{
|
||
|
// if false omits fragment
|
||
|
$q = '
|
||
|
query Q {
|
||
|
a
|
||
|
...Frag
|
||
|
}
|
||
|
fragment Frag on TestType @if:false {
|
||
|
b
|
||
|
}
|
||
|
';
|
||
|
$this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery($q));
|
||
|
|
||
|
// if true includes fragment
|
||
|
$q = '
|
||
|
query Q {
|
||
|
a
|
||
|
...Frag
|
||
|
}
|
||
|
fragment Frag on TestType @if:true {
|
||
|
b
|
||
|
}
|
||
|
';
|
||
|
$this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery($q));
|
||
|
|
||
|
// unless false includes fragment
|
||
|
$q = '
|
||
|
query Q {
|
||
|
a
|
||
|
...Frag
|
||
|
}
|
||
|
fragment Frag on TestType @unless:false {
|
||
|
b
|
||
|
}
|
||
|
';
|
||
|
$this->assertEquals(['data' => ['a' => 'a', 'b' => 'b']], $this->executeTestQuery($q));
|
||
|
|
||
|
// unless true omits fragment
|
||
|
$q = '
|
||
|
query Q {
|
||
|
a
|
||
|
...Frag
|
||
|
}
|
||
|
fragment Frag on TestType @unless:true {
|
||
|
b
|
||
|
}
|
||
|
';
|
||
|
$this->assertEquals(['data' => ['a' => 'a']], $this->executeTestQuery($q));
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
private static $schema;
|
||
|
|
||
|
private static $data;
|
||
|
|
||
|
private static function getSchema()
|
||
|
{
|
||
|
return self::$schema ?: (self::$schema = new Schema(new ObjectType([
|
||
|
'name' => 'TestType',
|
||
|
'fields' => [
|
||
|
'a' => ['type' => Type::string()],
|
||
|
'b' => ['type' => Type::string()]
|
||
|
]
|
||
|
])));
|
||
|
}
|
||
|
|
||
|
private static function getData()
|
||
|
{
|
||
|
return self::$data ?: (self::$data = [
|
||
|
'a' => function() { return 'a'; },
|
||
|
'b' => function() { return 'b'; }
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
private function executeTestQuery($doc)
|
||
|
{
|
||
|
return Executor::execute(self::getSchema(), self::getData(), Parser::parse($doc));
|
||
|
}
|
||
|
}
|