mirror of
https://github.com/retailcrm/graphql-php.git
synced 2024-11-25 06:16:05 +03:00
Fix CS in tests/Utils
This commit is contained in:
parent
ec54d6152b
commit
737da333fb
@ -1,4 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace GraphQL\Tests\Utils;
|
namespace GraphQL\Tests\Utils;
|
||||||
|
|
||||||
use GraphQL\Error\Error;
|
use GraphQL\Error\Error;
|
||||||
@ -9,7 +12,6 @@ use PHPUnit\Framework\TestCase;
|
|||||||
class AssertValidNameTest extends TestCase
|
class AssertValidNameTest extends TestCase
|
||||||
{
|
{
|
||||||
// Describe: assertValidName()
|
// Describe: assertValidName()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('throws for use of leading double underscores')
|
* @see it('throws for use of leading double underscores')
|
||||||
*/
|
*/
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace GraphQL\Tests\Utils;
|
namespace GraphQL\Tests\Utils;
|
||||||
|
|
||||||
use GraphQL\Language\AST\BooleanValueNode;
|
use GraphQL\Language\AST\BooleanValueNode;
|
||||||
@ -16,10 +19,12 @@ use GraphQL\Type\Definition\InputObjectType;
|
|||||||
use GraphQL\Type\Definition\Type;
|
use GraphQL\Type\Definition\Type;
|
||||||
use GraphQL\Utils\AST;
|
use GraphQL\Utils\AST;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use stdClass;
|
||||||
|
|
||||||
class AstFromValueTest extends TestCase
|
class AstFromValueTest extends TestCase
|
||||||
{
|
{
|
||||||
// Describe: astFromValue
|
/** @var stdClass */
|
||||||
|
private $complexValue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('converts boolean values to ASTs')
|
* @see it('converts boolean values to ASTs')
|
||||||
@ -31,8 +36,14 @@ class AstFromValueTest extends TestCase
|
|||||||
$this->assertEquals(new NullValueNode([]), AST::astFromValue(null, Type::boolean()));
|
$this->assertEquals(new NullValueNode([]), AST::astFromValue(null, Type::boolean()));
|
||||||
$this->assertEquals(new BooleanValueNode(['value' => false]), AST::astFromValue(0, Type::boolean()));
|
$this->assertEquals(new BooleanValueNode(['value' => false]), AST::astFromValue(0, Type::boolean()));
|
||||||
$this->assertEquals(new BooleanValueNode(['value' => true]), AST::astFromValue(1, Type::boolean()));
|
$this->assertEquals(new BooleanValueNode(['value' => true]), AST::astFromValue(1, Type::boolean()));
|
||||||
$this->assertEquals(new BooleanValueNode(['value' => false]), AST::astFromValue(0, Type::nonNull(Type::boolean())));
|
$this->assertEquals(
|
||||||
$this->assertEquals(null, AST::astFromValue(null, Type::nonNull(Type::boolean()))); // Note: null means that AST cannot
|
new BooleanValueNode(['value' => false]),
|
||||||
|
AST::astFromValue(0, Type::nonNull(Type::boolean()))
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
null,
|
||||||
|
AST::astFromValue(null, Type::nonNull(Type::boolean()))
|
||||||
|
); // Note: null means that AST cannot
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -59,7 +70,10 @@ class AstFromValueTest extends TestCase
|
|||||||
{
|
{
|
||||||
$this->expectException(\Throwable::class);
|
$this->expectException(\Throwable::class);
|
||||||
$this->expectExceptionMessage('Int cannot represent non 32-bit signed integer value: 1.0E+40');
|
$this->expectExceptionMessage('Int cannot represent non 32-bit signed integer value: 1.0E+40');
|
||||||
AST::astFromValue(1e40, Type::int()); // Note: js version will produce 1e+40, both values are valid GraphQL floats
|
AST::astFromValue(
|
||||||
|
1e40,
|
||||||
|
Type::int()
|
||||||
|
); // Note: js version will produce 1e+40, both values are valid GraphQL floats
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -121,7 +135,10 @@ class AstFromValueTest extends TestCase
|
|||||||
public function testConvertsStringValuesToEnumASTsIfPossible() : void
|
public function testConvertsStringValuesToEnumASTsIfPossible() : void
|
||||||
{
|
{
|
||||||
$this->assertEquals(new EnumValueNode(['value' => 'HELLO']), AST::astFromValue('HELLO', $this->myEnum()));
|
$this->assertEquals(new EnumValueNode(['value' => 'HELLO']), AST::astFromValue('HELLO', $this->myEnum()));
|
||||||
$this->assertEquals(new EnumValueNode(['value' => 'COMPLEX']), AST::astFromValue($this->complexValue(), $this->myEnum()));
|
$this->assertEquals(
|
||||||
|
new EnumValueNode(['value' => 'COMPLEX']),
|
||||||
|
AST::astFromValue($this->complexValue(), $this->myEnum())
|
||||||
|
);
|
||||||
|
|
||||||
// Note: case sensitive
|
// Note: case sensitive
|
||||||
$this->assertEquals(null, AST::astFromValue('hello', $this->myEnum()));
|
$this->assertEquals(null, AST::astFromValue('hello', $this->myEnum()));
|
||||||
@ -130,6 +147,31 @@ class AstFromValueTest extends TestCase
|
|||||||
$this->assertEquals(null, AST::astFromValue('VALUE', $this->myEnum()));
|
$this->assertEquals(null, AST::astFromValue('VALUE', $this->myEnum()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return EnumType
|
||||||
|
*/
|
||||||
|
private function myEnum()
|
||||||
|
{
|
||||||
|
return new EnumType([
|
||||||
|
'name' => 'MyEnum',
|
||||||
|
'values' => [
|
||||||
|
'HELLO' => [],
|
||||||
|
'GOODBYE' => [],
|
||||||
|
'COMPLEX' => ['value' => $this->complexValue()],
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function complexValue()
|
||||||
|
{
|
||||||
|
if (! $this->complexValue) {
|
||||||
|
$this->complexValue = new \stdClass();
|
||||||
|
$this->complexValue->someArbitrary = 'complexValue';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->complexValue;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('converts array values to List ASTs')
|
* @see it('converts array values to List ASTs')
|
||||||
*/
|
*/
|
||||||
@ -138,8 +180,8 @@ class AstFromValueTest extends TestCase
|
|||||||
$value1 = new ListValueNode([
|
$value1 = new ListValueNode([
|
||||||
'values' => [
|
'values' => [
|
||||||
new StringValueNode(['value' => 'FOO']),
|
new StringValueNode(['value' => 'FOO']),
|
||||||
new StringValueNode(['value' => 'BAR'])
|
new StringValueNode(['value' => 'BAR']),
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
$this->assertEquals($value1, AST::astFromValue(['FOO', 'BAR'], Type::listOf(Type::string())));
|
$this->assertEquals($value1, AST::astFromValue(['FOO', 'BAR'], Type::listOf(Type::string())));
|
||||||
|
|
||||||
@ -147,7 +189,7 @@ class AstFromValueTest extends TestCase
|
|||||||
'values' => [
|
'values' => [
|
||||||
new EnumValueNode(['value' => 'HELLO']),
|
new EnumValueNode(['value' => 'HELLO']),
|
||||||
new EnumValueNode(['value' => 'GOODBYE']),
|
new EnumValueNode(['value' => 'GOODBYE']),
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
$this->assertEquals($value2, AST::astFromValue(['HELLO', 'GOODBYE'], Type::listOf($this->myEnum())));
|
$this->assertEquals($value2, AST::astFromValue(['HELLO', 'GOODBYE'], Type::listOf($this->myEnum())));
|
||||||
}
|
}
|
||||||
@ -157,7 +199,10 @@ class AstFromValueTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testConvertsListSingletons() : void
|
public function testConvertsListSingletons() : void
|
||||||
{
|
{
|
||||||
$this->assertEquals(new StringValueNode(['value' => 'FOO']), AST::astFromValue('FOO', Type::listOf(Type::string())));
|
$this->assertEquals(
|
||||||
|
new StringValueNode(['value' => 'FOO']),
|
||||||
|
AST::astFromValue('FOO', Type::listOf(Type::string()))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -166,18 +211,18 @@ class AstFromValueTest extends TestCase
|
|||||||
public function testConvertsInputObjects() : void
|
public function testConvertsInputObjects() : void
|
||||||
{
|
{
|
||||||
$inputObj = new InputObjectType([
|
$inputObj = new InputObjectType([
|
||||||
'name' => 'MyInputObj',
|
'name' => 'MyInputObj',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'foo' => Type::float(),
|
'foo' => Type::float(),
|
||||||
'bar' => $this->myEnum()
|
'bar' => $this->myEnum(),
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$expected = new ObjectValueNode([
|
$expected = new ObjectValueNode([
|
||||||
'fields' => [
|
'fields' => [
|
||||||
$this->objectField('foo', new IntValueNode(['value' => '3'])),
|
$this->objectField('foo', new IntValueNode(['value' => '3'])),
|
||||||
$this->objectField('bar', new EnumValueNode(['value' => 'HELLO']))
|
$this->objectField('bar', new EnumValueNode(['value' => 'HELLO'])),
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$data = ['foo' => 3, 'bar' => 'HELLO'];
|
$data = ['foo' => 3, 'bar' => 'HELLO'];
|
||||||
@ -185,62 +230,38 @@ class AstFromValueTest extends TestCase
|
|||||||
$this->assertEquals($expected, AST::astFromValue((object) $data, $inputObj));
|
$this->assertEquals($expected, AST::astFromValue((object) $data, $inputObj));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $value
|
||||||
|
* @return ObjectFieldNode
|
||||||
|
*/
|
||||||
|
private function objectField(string $name, $value)
|
||||||
|
{
|
||||||
|
return new ObjectFieldNode([
|
||||||
|
'name' => new NameNode(['value' => $name]),
|
||||||
|
'value' => $value,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('converts input objects with explicit nulls')
|
* @see it('converts input objects with explicit nulls')
|
||||||
*/
|
*/
|
||||||
public function testConvertsInputObjectsWithExplicitNulls() : void
|
public function testConvertsInputObjectsWithExplicitNulls() : void
|
||||||
{
|
{
|
||||||
$inputObj = new InputObjectType([
|
$inputObj = new InputObjectType([
|
||||||
'name' => 'MyInputObj',
|
'name' => 'MyInputObj',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'foo' => Type::float(),
|
'foo' => Type::float(),
|
||||||
'bar' => $this->myEnum()
|
'bar' => $this->myEnum(),
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->assertEquals(new ObjectValueNode([
|
$this->assertEquals(
|
||||||
|
new ObjectValueNode([
|
||||||
'fields' => [
|
'fields' => [
|
||||||
$this->objectField('foo', new NullValueNode([]))
|
$this->objectField('foo', new NullValueNode([])),
|
||||||
]
|
],
|
||||||
]), AST::astFromValue(['foo' => null], $inputObj));
|
]),
|
||||||
}
|
AST::astFromValue(['foo' => null], $inputObj)
|
||||||
|
);
|
||||||
private $complexValue;
|
|
||||||
|
|
||||||
private function complexValue()
|
|
||||||
{
|
|
||||||
if (!$this->complexValue) {
|
|
||||||
$this->complexValue = new \stdClass();
|
|
||||||
$this->complexValue->someArbitrary = 'complexValue';
|
|
||||||
}
|
|
||||||
return $this->complexValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return EnumType
|
|
||||||
*/
|
|
||||||
private function myEnum()
|
|
||||||
{
|
|
||||||
return new EnumType([
|
|
||||||
'name' => 'MyEnum',
|
|
||||||
'values' => [
|
|
||||||
'HELLO' => [],
|
|
||||||
'GOODBYE' => [],
|
|
||||||
'COMPLEX' => ['value' => $this->complexValue()]
|
|
||||||
]
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param $name
|
|
||||||
* @param $value
|
|
||||||
* @return ObjectFieldNode
|
|
||||||
*/
|
|
||||||
private function objectField($name, $value)
|
|
||||||
{
|
|
||||||
return new ObjectFieldNode([
|
|
||||||
'name' => new NameNode(['value' => $name]),
|
|
||||||
'value' => $value
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace GraphQL\Tests\Utils;
|
namespace GraphQL\Tests\Utils;
|
||||||
|
|
||||||
use GraphQL\Language\Parser;
|
use GraphQL\Language\Parser;
|
||||||
@ -8,14 +11,6 @@ use PHPUnit\Framework\TestCase;
|
|||||||
class AstFromValueUntypedTest extends TestCase
|
class AstFromValueUntypedTest extends TestCase
|
||||||
{
|
{
|
||||||
// Describe: valueFromASTUntyped
|
// Describe: valueFromASTUntyped
|
||||||
|
|
||||||
private function assertTestCase($valueText, $expected, array $variables = null) {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
AST::valueFromASTUntyped(Parser::parseValue($valueText), $variables)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('parses simple values')
|
* @see it('parses simple values')
|
||||||
*/
|
*/
|
||||||
@ -29,6 +24,17 @@ class AstFromValueUntypedTest extends TestCase
|
|||||||
$this->assertTestCase('abc123', 'abc123');
|
$this->assertTestCase('abc123', 'abc123');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed[]|null $variables
|
||||||
|
*/
|
||||||
|
private function assertTestCase($valueText, $expected, ?array $variables = null) : void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
AST::valueFromASTUntyped(Parser::parseValue($valueText), $variables)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('parses lists of values')
|
* @see it('parses lists of values')
|
||||||
*/
|
*/
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace GraphQL\Tests\Utils;
|
namespace GraphQL\Tests\Utils;
|
||||||
|
|
||||||
use GraphQL\Error\Error;
|
use GraphQL\Error\Error;
|
||||||
@ -8,24 +11,19 @@ use GraphQL\Language\AST\InterfaceTypeDefinitionNode;
|
|||||||
use GraphQL\Language\AST\ObjectTypeDefinitionNode;
|
use GraphQL\Language\AST\ObjectTypeDefinitionNode;
|
||||||
use GraphQL\Language\Parser;
|
use GraphQL\Language\Parser;
|
||||||
use GraphQL\Language\Printer;
|
use GraphQL\Language\Printer;
|
||||||
|
use GraphQL\Type\Definition\Directive;
|
||||||
use GraphQL\Type\Definition\EnumType;
|
use GraphQL\Type\Definition\EnumType;
|
||||||
use GraphQL\Type\Definition\ObjectType;
|
use GraphQL\Type\Definition\ObjectType;
|
||||||
use GraphQL\Utils\BuildSchema;
|
use GraphQL\Utils\BuildSchema;
|
||||||
use GraphQL\Utils\SchemaPrinter;
|
use GraphQL\Utils\SchemaPrinter;
|
||||||
use GraphQL\Type\Definition\Directive;
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use function array_keys;
|
||||||
|
use function count;
|
||||||
|
|
||||||
class BuildSchemaTest extends TestCase
|
class BuildSchemaTest extends TestCase
|
||||||
{
|
{
|
||||||
// Describe: Schema Builder
|
// Describe: Schema Builder
|
||||||
|
|
||||||
private function cycleOutput($body, $options = [])
|
|
||||||
{
|
|
||||||
$ast = Parser::parse($body);
|
|
||||||
$schema = BuildSchema::buildAST($ast, null, $options);
|
|
||||||
return "\n" . SchemaPrinter::doPrint($schema, $options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('can use built schema for limited execution')
|
* @see it('can use built schema for limited execution')
|
||||||
*/
|
*/
|
||||||
@ -46,16 +44,16 @@ class BuildSchemaTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testBuildSchemaDirectlyFromSource() : void
|
public function testBuildSchemaDirectlyFromSource() : void
|
||||||
{
|
{
|
||||||
$schema = BuildSchema::build("
|
$schema = BuildSchema::build('
|
||||||
type Query {
|
type Query {
|
||||||
add(x: Int, y: Int): Int
|
add(x: Int, y: Int): Int
|
||||||
}
|
}
|
||||||
");
|
');
|
||||||
|
|
||||||
$root = [
|
$root = [
|
||||||
'add' => function ($root, $args) {
|
'add' => function ($root, $args) {
|
||||||
return $args['x'] + $args['y'];
|
return $args['x'] + $args['y'];
|
||||||
}
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
$result = GraphQL::executeQuery(
|
$result = GraphQL::executeQuery(
|
||||||
@ -71,7 +69,7 @@ class BuildSchemaTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testSimpleType() : void
|
public function testSimpleType() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
type HelloScalars {
|
type HelloScalars {
|
||||||
str: String
|
str: String
|
||||||
int: Int
|
int: Int
|
||||||
@ -84,12 +82,20 @@ type HelloScalars {
|
|||||||
$this->assertEquals($output, $body);
|
$this->assertEquals($output, $body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function cycleOutput($body, $options = [])
|
||||||
|
{
|
||||||
|
$ast = Parser::parse($body);
|
||||||
|
$schema = BuildSchema::buildAST($ast, null, $options);
|
||||||
|
|
||||||
|
return "\n" . SchemaPrinter::doPrint($schema, $options);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('With directives')
|
* @see it('With directives')
|
||||||
*/
|
*/
|
||||||
public function testWithDirectives() : void
|
public function testWithDirectives() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
directive @foo(arg: Int) on FIELD
|
directive @foo(arg: Int) on FIELD
|
||||||
|
|
||||||
type Query {
|
type Query {
|
||||||
@ -105,7 +111,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testSupportsDescriptions() : void
|
public function testSupportsDescriptions() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
"""This is a directive"""
|
"""This is a directive"""
|
||||||
directive @foo(
|
directive @foo(
|
||||||
"""It has an argument"""
|
"""It has an argument"""
|
||||||
@ -137,7 +143,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testSupportsOptionForCommentDescriptions() : void
|
public function testSupportsOptionForCommentDescriptions() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
# This is a directive
|
# This is a directive
|
||||||
directive @foo(
|
directive @foo(
|
||||||
# It has an argument
|
# It has an argument
|
||||||
@ -159,7 +165,7 @@ type Query {
|
|||||||
str: String
|
str: String
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$output = $this->cycleOutput($body, [ 'commentDescriptions' => true ]);
|
$output = $this->cycleOutput($body, ['commentDescriptions' => true]);
|
||||||
$this->assertEquals($body, $output);
|
$this->assertEquals($body, $output);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,7 +174,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testMaintainsSkipAndInclude() : void
|
public function testMaintainsSkipAndInclude() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
type Query {
|
type Query {
|
||||||
str: String
|
str: String
|
||||||
}
|
}
|
||||||
@ -185,7 +191,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testOverridingDirectivesExcludesSpecified() : void
|
public function testOverridingDirectivesExcludesSpecified() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
directive @skip on FIELD
|
directive @skip on FIELD
|
||||||
directive @include on FIELD
|
directive @include on FIELD
|
||||||
directive @deprecated on FIELD_DEFINITION
|
directive @deprecated on FIELD_DEFINITION
|
||||||
@ -206,7 +212,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testAddingDirectivesMaintainsSkipAndInclude() : void
|
public function testAddingDirectivesMaintainsSkipAndInclude() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
directive @foo(arg: Int) on FIELD
|
directive @foo(arg: Int) on FIELD
|
||||||
|
|
||||||
type Query {
|
type Query {
|
||||||
@ -225,7 +231,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testTypeModifiers() : void
|
public function testTypeModifiers() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
type HelloScalars {
|
type HelloScalars {
|
||||||
nonNullStr: String!
|
nonNullStr: String!
|
||||||
listOfStrs: [String]
|
listOfStrs: [String]
|
||||||
@ -243,7 +249,7 @@ type HelloScalars {
|
|||||||
*/
|
*/
|
||||||
public function testRecursiveType() : void
|
public function testRecursiveType() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
type Query {
|
type Query {
|
||||||
str: String
|
str: String
|
||||||
recurse: Query
|
recurse: Query
|
||||||
@ -258,7 +264,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testTwoTypesCircular() : void
|
public function testTwoTypesCircular() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
schema {
|
schema {
|
||||||
query: TypeOne
|
query: TypeOne
|
||||||
}
|
}
|
||||||
@ -282,7 +288,7 @@ type TypeTwo {
|
|||||||
*/
|
*/
|
||||||
public function testSingleArgumentField() : void
|
public function testSingleArgumentField() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
type Query {
|
type Query {
|
||||||
str(int: Int): String
|
str(int: Int): String
|
||||||
floatToStr(float: Float): String
|
floatToStr(float: Float): String
|
||||||
@ -300,7 +306,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testSimpleTypeWithMultipleArguments() : void
|
public function testSimpleTypeWithMultipleArguments() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
type Query {
|
type Query {
|
||||||
str(int: Int, bool: Boolean): String
|
str(int: Int, bool: Boolean): String
|
||||||
}
|
}
|
||||||
@ -314,7 +320,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testSimpleTypeWithInterface() : void
|
public function testSimpleTypeWithInterface() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
type Query implements WorldInterface {
|
type Query implements WorldInterface {
|
||||||
str: String
|
str: String
|
||||||
}
|
}
|
||||||
@ -332,7 +338,7 @@ interface WorldInterface {
|
|||||||
*/
|
*/
|
||||||
public function testSimpleOutputEnum() : void
|
public function testSimpleOutputEnum() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
enum Hello {
|
enum Hello {
|
||||||
WORLD
|
WORLD
|
||||||
}
|
}
|
||||||
@ -350,7 +356,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testSimpleInputEnum() : void
|
public function testSimpleInputEnum() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
enum Hello {
|
enum Hello {
|
||||||
WORLD
|
WORLD
|
||||||
}
|
}
|
||||||
@ -368,7 +374,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testMultipleValueEnum() : void
|
public function testMultipleValueEnum() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
enum Hello {
|
enum Hello {
|
||||||
WO
|
WO
|
||||||
RLD
|
RLD
|
||||||
@ -387,7 +393,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testSimpleUnion() : void
|
public function testSimpleUnion() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
union Hello = World
|
union Hello = World
|
||||||
|
|
||||||
type Query {
|
type Query {
|
||||||
@ -407,7 +413,7 @@ type World {
|
|||||||
*/
|
*/
|
||||||
public function testMultipleUnion() : void
|
public function testMultipleUnion() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
union Hello = WorldOne | WorldTwo
|
union Hello = WorldOne | WorldTwo
|
||||||
|
|
||||||
type Query {
|
type Query {
|
||||||
@ -431,7 +437,7 @@ type WorldTwo {
|
|||||||
*/
|
*/
|
||||||
public function testSpecifyingUnionTypeUsingTypename() : void
|
public function testSpecifyingUnionTypeUsingTypename() : void
|
||||||
{
|
{
|
||||||
$schema = BuildSchema::buildAST(Parser::parse('
|
$schema = BuildSchema::buildAST(Parser::parse('
|
||||||
type Query {
|
type Query {
|
||||||
fruits: [Fruit]
|
fruits: [Fruit]
|
||||||
}
|
}
|
||||||
@ -446,7 +452,7 @@ type WorldTwo {
|
|||||||
length: Int
|
length: Int
|
||||||
}
|
}
|
||||||
'));
|
'));
|
||||||
$query = '
|
$query = '
|
||||||
{
|
{
|
||||||
fruits {
|
fruits {
|
||||||
... on Apple {
|
... on Apple {
|
||||||
@ -458,25 +464,25 @@ type WorldTwo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$root = [
|
$root = [
|
||||||
'fruits' => [
|
'fruits' => [
|
||||||
[
|
[
|
||||||
'color' => 'green',
|
'color' => 'green',
|
||||||
'__typename' => 'Apple',
|
'__typename' => 'Apple',
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'length' => 5,
|
'length' => 5,
|
||||||
'__typename' => 'Banana',
|
'__typename' => 'Banana',
|
||||||
]
|
],
|
||||||
]
|
],
|
||||||
];
|
];
|
||||||
$expected = [
|
$expected = [
|
||||||
'data' => [
|
'data' => [
|
||||||
'fruits' => [
|
'fruits' => [
|
||||||
['color' => 'green'],
|
['color' => 'green'],
|
||||||
['length' => 5],
|
['length' => 5],
|
||||||
]
|
],
|
||||||
]
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
$result = GraphQL::executeQuery($schema, $query, $root);
|
$result = GraphQL::executeQuery($schema, $query, $root);
|
||||||
@ -488,7 +494,7 @@ type WorldTwo {
|
|||||||
*/
|
*/
|
||||||
public function testSpecifyingInterfaceUsingTypename() : void
|
public function testSpecifyingInterfaceUsingTypename() : void
|
||||||
{
|
{
|
||||||
$schema = BuildSchema::buildAST(Parser::parse('
|
$schema = BuildSchema::buildAST(Parser::parse('
|
||||||
type Query {
|
type Query {
|
||||||
characters: [Character]
|
characters: [Character]
|
||||||
}
|
}
|
||||||
@ -507,7 +513,7 @@ type WorldTwo {
|
|||||||
primaryFunction: String
|
primaryFunction: String
|
||||||
}
|
}
|
||||||
'));
|
'));
|
||||||
$query = '
|
$query = '
|
||||||
{
|
{
|
||||||
characters {
|
characters {
|
||||||
name
|
name
|
||||||
@ -520,27 +526,27 @@ type WorldTwo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$root = [
|
$root = [
|
||||||
'characters' => [
|
'characters' => [
|
||||||
[
|
[
|
||||||
'name' => 'Han Solo',
|
'name' => 'Han Solo',
|
||||||
'totalCredits' => 10,
|
'totalCredits' => 10,
|
||||||
'__typename' => 'Human',
|
'__typename' => 'Human',
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'name' => 'R2-D2',
|
'name' => 'R2-D2',
|
||||||
'primaryFunction' => 'Astromech',
|
'primaryFunction' => 'Astromech',
|
||||||
'__typename' => 'Droid',
|
'__typename' => 'Droid',
|
||||||
]
|
],
|
||||||
]
|
],
|
||||||
];
|
];
|
||||||
$expected = [
|
$expected = [
|
||||||
'data' => [
|
'data' => [
|
||||||
'characters' => [
|
'characters' => [
|
||||||
['name' => 'Han Solo', 'totalCredits' => 10],
|
['name' => 'Han Solo', 'totalCredits' => 10],
|
||||||
['name' => 'R2-D2', 'primaryFunction' => 'Astromech'],
|
['name' => 'R2-D2', 'primaryFunction' => 'Astromech'],
|
||||||
]
|
],
|
||||||
]
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
$result = GraphQL::executeQuery($schema, $query, $root);
|
$result = GraphQL::executeQuery($schema, $query, $root);
|
||||||
@ -552,7 +558,7 @@ type WorldTwo {
|
|||||||
*/
|
*/
|
||||||
public function testCustomScalar() : void
|
public function testCustomScalar() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
scalar CustomScalar
|
scalar CustomScalar
|
||||||
|
|
||||||
type Query {
|
type Query {
|
||||||
@ -568,7 +574,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testInputObject() : void
|
public function testInputObject() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
input Input {
|
input Input {
|
||||||
int: Int
|
int: Int
|
||||||
}
|
}
|
||||||
@ -586,7 +592,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testSimpleArgumentFieldWithDefault() : void
|
public function testSimpleArgumentFieldWithDefault() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
type Query {
|
type Query {
|
||||||
str(int: Int = 2): String
|
str(int: Int = 2): String
|
||||||
}
|
}
|
||||||
@ -600,7 +606,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testCustomScalarArgumentFieldWithDefault() : void
|
public function testCustomScalarArgumentFieldWithDefault() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
scalar CustomScalar
|
scalar CustomScalar
|
||||||
|
|
||||||
type Query {
|
type Query {
|
||||||
@ -616,7 +622,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testSimpleTypeWithMutation() : void
|
public function testSimpleTypeWithMutation() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
schema {
|
schema {
|
||||||
query: HelloScalars
|
query: HelloScalars
|
||||||
mutation: Mutation
|
mutation: Mutation
|
||||||
@ -641,7 +647,7 @@ type Mutation {
|
|||||||
*/
|
*/
|
||||||
public function testSimpleTypeWithSubscription() : void
|
public function testSimpleTypeWithSubscription() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
schema {
|
schema {
|
||||||
query: HelloScalars
|
query: HelloScalars
|
||||||
subscription: Subscription
|
subscription: Subscription
|
||||||
@ -666,7 +672,7 @@ type Subscription {
|
|||||||
*/
|
*/
|
||||||
public function testUnreferencedTypeImplementingReferencedInterface() : void
|
public function testUnreferencedTypeImplementingReferencedInterface() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
type Concrete implements Iface {
|
type Concrete implements Iface {
|
||||||
key: String
|
key: String
|
||||||
}
|
}
|
||||||
@ -688,7 +694,7 @@ type Query {
|
|||||||
*/
|
*/
|
||||||
public function testUnreferencedTypeImplementingReferencedUnion() : void
|
public function testUnreferencedTypeImplementingReferencedUnion() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
type Concrete {
|
type Concrete {
|
||||||
key: String
|
key: String
|
||||||
}
|
}
|
||||||
@ -708,7 +714,7 @@ union Union = Concrete
|
|||||||
*/
|
*/
|
||||||
public function testSupportsDeprecated() : void
|
public function testSupportsDeprecated() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
enum MyEnum {
|
enum MyEnum {
|
||||||
VALUE
|
VALUE
|
||||||
OLD_VALUE @deprecated
|
OLD_VALUE @deprecated
|
||||||
@ -724,7 +730,7 @@ type Query {
|
|||||||
$output = $this->cycleOutput($body);
|
$output = $this->cycleOutput($body);
|
||||||
$this->assertEquals($output, $body);
|
$this->assertEquals($output, $body);
|
||||||
|
|
||||||
$ast = Parser::parse($body);
|
$ast = Parser::parse($body);
|
||||||
$schema = BuildSchema::buildAST($ast);
|
$schema = BuildSchema::buildAST($ast);
|
||||||
|
|
||||||
/** @var EnumType $myEnum */
|
/** @var EnumType $myEnum */
|
||||||
@ -785,15 +791,15 @@ type Query {
|
|||||||
|
|
||||||
directive @test(arg: TestScalar) on FIELD
|
directive @test(arg: TestScalar) on FIELD
|
||||||
');
|
');
|
||||||
$schema = BuildSchema::buildAST($schemaAST);
|
$schema = BuildSchema::buildAST($schemaAST);
|
||||||
/** @var ObjectType $query */
|
/** @var ObjectType $query */
|
||||||
$query = $schema->getType('Query');
|
$query = $schema->getType('Query');
|
||||||
$testInput = $schema->getType('TestInput');
|
$testInput = $schema->getType('TestInput');
|
||||||
$testEnum = $schema->getType('TestEnum');
|
$testEnum = $schema->getType('TestEnum');
|
||||||
$testUnion = $schema->getType('TestUnion');
|
$testUnion = $schema->getType('TestUnion');
|
||||||
$testInterface = $schema->getType('TestInterface');
|
$testInterface = $schema->getType('TestInterface');
|
||||||
$testType = $schema->getType('TestType');
|
$testType = $schema->getType('TestType');
|
||||||
$testScalar = $schema->getType('TestScalar');
|
$testScalar = $schema->getType('TestScalar');
|
||||||
$testDirective = $schema->getDirective('test');
|
$testDirective = $schema->getDirective('test');
|
||||||
|
|
||||||
$restoredIDL = SchemaPrinter::doPrint(BuildSchema::build(
|
$restoredIDL = SchemaPrinter::doPrint(BuildSchema::build(
|
||||||
@ -813,9 +819,15 @@ type Query {
|
|||||||
$testField = $query->getField('testField');
|
$testField = $query->getField('testField');
|
||||||
$this->assertEquals('testField(testArg: TestInput): TestUnion', Printer::doPrint($testField->astNode));
|
$this->assertEquals('testField(testArg: TestInput): TestUnion', Printer::doPrint($testField->astNode));
|
||||||
$this->assertEquals('testArg: TestInput', Printer::doPrint($testField->args[0]->astNode));
|
$this->assertEquals('testArg: TestInput', Printer::doPrint($testField->args[0]->astNode));
|
||||||
$this->assertEquals('testInputField: TestEnum', Printer::doPrint($testInput->getField('testInputField')->astNode));
|
$this->assertEquals(
|
||||||
|
'testInputField: TestEnum',
|
||||||
|
Printer::doPrint($testInput->getField('testInputField')->astNode)
|
||||||
|
);
|
||||||
$this->assertEquals('TEST_VALUE', Printer::doPrint($testEnum->getValue('TEST_VALUE')->astNode));
|
$this->assertEquals('TEST_VALUE', Printer::doPrint($testEnum->getValue('TEST_VALUE')->astNode));
|
||||||
$this->assertEquals('interfaceField: String', Printer::doPrint($testInterface->getField('interfaceField')->astNode));
|
$this->assertEquals(
|
||||||
|
'interfaceField: String',
|
||||||
|
Printer::doPrint($testInterface->getField('interfaceField')->astNode)
|
||||||
|
);
|
||||||
$this->assertEquals('interfaceField: String', Printer::doPrint($testType->getField('interfaceField')->astNode));
|
$this->assertEquals('interfaceField: String', Printer::doPrint($testType->getField('interfaceField')->astNode));
|
||||||
$this->assertEquals('arg: TestScalar', Printer::doPrint($testDirective->args[0]->astNode));
|
$this->assertEquals('arg: TestScalar', Printer::doPrint($testDirective->args[0]->astNode));
|
||||||
}
|
}
|
||||||
@ -893,7 +905,7 @@ type Hello {
|
|||||||
bar: Bar
|
bar: Bar
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
BuildSchema::buildAST($doc);
|
BuildSchema::buildAST($doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -918,7 +930,7 @@ type Yellow {
|
|||||||
isColor: Boolean
|
isColor: Boolean
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
BuildSchema::buildAST($doc);
|
BuildSchema::buildAST($doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -944,7 +956,7 @@ type Yellow {
|
|||||||
isColor: Boolean
|
isColor: Boolean
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
BuildSchema::buildAST($doc);
|
BuildSchema::buildAST($doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -970,7 +982,7 @@ type Yellow {
|
|||||||
isColor: Boolean
|
isColor: Boolean
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
BuildSchema::buildAST($doc);
|
BuildSchema::buildAST($doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -981,7 +993,7 @@ type Yellow {
|
|||||||
{
|
{
|
||||||
$this->expectException(Error::class);
|
$this->expectException(Error::class);
|
||||||
$this->expectExceptionMessage('Type "Bar" not found in document.');
|
$this->expectExceptionMessage('Type "Bar" not found in document.');
|
||||||
$body = '
|
$body = '
|
||||||
schema {
|
schema {
|
||||||
query: Hello
|
query: Hello
|
||||||
}
|
}
|
||||||
@ -990,7 +1002,7 @@ type Hello {
|
|||||||
bar: Bar
|
bar: Bar
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
$schema = BuildSchema::buildAST($doc);
|
$schema = BuildSchema::buildAST($doc);
|
||||||
$schema->getTypeMap();
|
$schema->getTypeMap();
|
||||||
}
|
}
|
||||||
@ -1002,12 +1014,12 @@ type Hello {
|
|||||||
{
|
{
|
||||||
$this->expectException(Error::class);
|
$this->expectException(Error::class);
|
||||||
$this->expectExceptionMessage('Type "Bar" not found in document.');
|
$this->expectExceptionMessage('Type "Bar" not found in document.');
|
||||||
$body = '
|
$body = '
|
||||||
type Query implements Bar {
|
type Query implements Bar {
|
||||||
field: String
|
field: String
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
$schema = BuildSchema::buildAST($doc);
|
$schema = BuildSchema::buildAST($doc);
|
||||||
$schema->getTypeMap();
|
$schema->getTypeMap();
|
||||||
}
|
}
|
||||||
@ -1019,11 +1031,11 @@ type Query implements Bar {
|
|||||||
{
|
{
|
||||||
$this->expectException(Error::class);
|
$this->expectException(Error::class);
|
||||||
$this->expectExceptionMessage('Type "Bar" not found in document.');
|
$this->expectExceptionMessage('Type "Bar" not found in document.');
|
||||||
$body = '
|
$body = '
|
||||||
union TestUnion = Bar
|
union TestUnion = Bar
|
||||||
type Query { testUnion: TestUnion }
|
type Query { testUnion: TestUnion }
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
$schema = BuildSchema::buildAST($doc);
|
$schema = BuildSchema::buildAST($doc);
|
||||||
$schema->getTypeMap();
|
$schema->getTypeMap();
|
||||||
}
|
}
|
||||||
@ -1044,7 +1056,7 @@ type Hello {
|
|||||||
str: String
|
str: String
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
BuildSchema::buildAST($doc);
|
BuildSchema::buildAST($doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1065,7 +1077,7 @@ type Hello {
|
|||||||
str: String
|
str: String
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
BuildSchema::buildAST($doc);
|
BuildSchema::buildAST($doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1091,7 +1103,7 @@ type Wat {
|
|||||||
str: String
|
str: String
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
BuildSchema::buildAST($doc);
|
BuildSchema::buildAST($doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1109,7 +1121,7 @@ schema {
|
|||||||
|
|
||||||
query Foo { field }
|
query Foo { field }
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
BuildSchema::buildAST($doc);
|
BuildSchema::buildAST($doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1127,7 +1139,7 @@ schema {
|
|||||||
|
|
||||||
fragment Foo on Type { field }
|
fragment Foo on Type { field }
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
BuildSchema::buildAST($doc);
|
BuildSchema::buildAST($doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1149,7 +1161,7 @@ type Repeated {
|
|||||||
id: String
|
id: String
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
|
|
||||||
$this->expectException(Error::class);
|
$this->expectException(Error::class);
|
||||||
$this->expectExceptionMessage('Type "Repeated" was defined more than once.');
|
$this->expectExceptionMessage('Type "Repeated" was defined more than once.');
|
||||||
@ -1179,14 +1191,15 @@ interface Hello {
|
|||||||
world: String
|
world: String
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
|
|
||||||
$decorated = [];
|
$decorated = [];
|
||||||
$calls = [];
|
$calls = [];
|
||||||
|
|
||||||
$typeConfigDecorator = function($defaultConfig, $node, $allNodesMap) use (&$decorated, &$calls) {
|
$typeConfigDecorator = function ($defaultConfig, $node, $allNodesMap) use (&$decorated, &$calls) {
|
||||||
$decorated[] = $defaultConfig['name'];
|
$decorated[] = $defaultConfig['name'];
|
||||||
$calls[] = [$defaultConfig, $node, $allNodesMap];
|
$calls[] = [$defaultConfig, $node, $allNodesMap];
|
||||||
|
|
||||||
return ['description' => 'My description of ' . $node->name->value] + $defaultConfig;
|
return ['description' => 'My description of ' . $node->name->value] + $defaultConfig;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1204,19 +1217,21 @@ interface Hello {
|
|||||||
$this->assertEquals(array_keys($allNodesMap), ['Query', 'Color', 'Hello']);
|
$this->assertEquals(array_keys($allNodesMap), ['Query', 'Color', 'Hello']);
|
||||||
$this->assertEquals('My description of Query', $schema->getType('Query')->description);
|
$this->assertEquals('My description of Query', $schema->getType('Query')->description);
|
||||||
|
|
||||||
|
|
||||||
list($defaultConfig, $node, $allNodesMap) = $calls[1];
|
list($defaultConfig, $node, $allNodesMap) = $calls[1];
|
||||||
$this->assertInstanceOf(EnumTypeDefinitionNode::class, $node);
|
$this->assertInstanceOf(EnumTypeDefinitionNode::class, $node);
|
||||||
$this->assertEquals('Color', $defaultConfig['name']);
|
$this->assertEquals('Color', $defaultConfig['name']);
|
||||||
$enumValue = [
|
$enumValue = [
|
||||||
'description' => '',
|
'description' => '',
|
||||||
'deprecationReason' => ''
|
'deprecationReason' => '',
|
||||||
];
|
];
|
||||||
$this->assertArraySubset([
|
$this->assertArraySubset(
|
||||||
'RED' => $enumValue,
|
[
|
||||||
'GREEN' => $enumValue,
|
'RED' => $enumValue,
|
||||||
'BLUE' => $enumValue,
|
'GREEN' => $enumValue,
|
||||||
], $defaultConfig['values']);
|
'BLUE' => $enumValue,
|
||||||
|
],
|
||||||
|
$defaultConfig['values']
|
||||||
|
);
|
||||||
$this->assertCount(4, $defaultConfig); // 3 + astNode
|
$this->assertCount(4, $defaultConfig); // 3 + astNode
|
||||||
$this->assertEquals(array_keys($allNodesMap), ['Query', 'Color', 'Hello']);
|
$this->assertEquals(array_keys($allNodesMap), ['Query', 'Color', 'Hello']);
|
||||||
$this->assertEquals('My description of Color', $schema->getType('Color')->description);
|
$this->assertEquals('My description of Color', $schema->getType('Color')->description);
|
||||||
@ -1233,7 +1248,7 @@ interface Hello {
|
|||||||
|
|
||||||
public function testCreatesTypesLazily() : void
|
public function testCreatesTypesLazily() : void
|
||||||
{
|
{
|
||||||
$body = '
|
$body = '
|
||||||
schema {
|
schema {
|
||||||
query: Query
|
query: Query
|
||||||
}
|
}
|
||||||
@ -1258,11 +1273,12 @@ type World implements Hello {
|
|||||||
world: String
|
world: String
|
||||||
}
|
}
|
||||||
';
|
';
|
||||||
$doc = Parser::parse($body);
|
$doc = Parser::parse($body);
|
||||||
$created = [];
|
$created = [];
|
||||||
|
|
||||||
$typeConfigDecorator = function($config, $node) use (&$created) {
|
$typeConfigDecorator = function ($config, $node) use (&$created) {
|
||||||
$created[] = $node->name->value;
|
$created[] = $node->name->value;
|
||||||
|
|
||||||
return $config;
|
return $config;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1282,5 +1298,4 @@ type World implements Hello {
|
|||||||
$this->assertArrayHasKey('Hello', $types);
|
$this->assertArrayHasKey('Hello', $types);
|
||||||
$this->assertArrayHasKey('World', $types);
|
$this->assertArrayHasKey('World', $types);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace GraphQL\Tests\Utils;
|
namespace GraphQL\Tests\Utils;
|
||||||
|
|
||||||
use GraphQL\Error\Error;
|
|
||||||
use GraphQL\Executor\Values;
|
|
||||||
use GraphQL\Type\Definition\EnumType;
|
use GraphQL\Type\Definition\EnumType;
|
||||||
use GraphQL\Type\Definition\InputObjectType;
|
use GraphQL\Type\Definition\InputObjectType;
|
||||||
use GraphQL\Type\Definition\Type;
|
use GraphQL\Type\Definition\Type;
|
||||||
@ -12,13 +13,16 @@ use PHPUnit\Framework\TestCase;
|
|||||||
|
|
||||||
class CoerceValueTest extends TestCase
|
class CoerceValueTest extends TestCase
|
||||||
{
|
{
|
||||||
|
/** @var EnumType */
|
||||||
private $testEnum;
|
private $testEnum;
|
||||||
|
|
||||||
|
/** @var InputObjectType */
|
||||||
private $testInputObject;
|
private $testInputObject;
|
||||||
|
|
||||||
public function setUp()
|
public function setUp()
|
||||||
{
|
{
|
||||||
$this->testEnum = new EnumType([
|
$this->testEnum = new EnumType([
|
||||||
'name' => 'TestEnum',
|
'name' => 'TestEnum',
|
||||||
'values' => [
|
'values' => [
|
||||||
'FOO' => 'InternalFoo',
|
'FOO' => 'InternalFoo',
|
||||||
'BAR' => 123456789,
|
'BAR' => 123456789,
|
||||||
@ -26,7 +30,7 @@ class CoerceValueTest extends TestCase
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
$this->testInputObject = new InputObjectType([
|
$this->testInputObject = new InputObjectType([
|
||||||
'name' => 'TestInputObject',
|
'name' => 'TestInputObject',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'foo' => Type::nonNull(Type::int()),
|
'foo' => Type::nonNull(Type::int()),
|
||||||
'bar' => Type::int(),
|
'bar' => Type::int(),
|
||||||
@ -34,9 +38,9 @@ class CoerceValueTest extends TestCase
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Describe: coerceValue
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Describe: coerceValue
|
||||||
|
*
|
||||||
* @see it('coercing an array to GraphQLString produces an error')
|
* @see it('coercing an array to GraphQLString produces an error')
|
||||||
*/
|
*/
|
||||||
public function testCoercingAnArrayToGraphQLStringProducesAnError() : void
|
public function testCoercingAnArrayToGraphQLStringProducesAnError() : void
|
||||||
@ -53,7 +57,17 @@ class CoerceValueTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Describe: for GraphQLInt
|
/**
|
||||||
|
* Describe: for GraphQLInt
|
||||||
|
*/
|
||||||
|
private function expectError($result, $expected)
|
||||||
|
{
|
||||||
|
$this->assertInternalType('array', $result);
|
||||||
|
$this->assertInternalType('array', $result['errors']);
|
||||||
|
$this->assertCount(1, $result['errors']);
|
||||||
|
$this->assertEquals($expected, $result['errors'][0]->getMessage());
|
||||||
|
$this->assertEquals(Utils::undefined(), $result['value']);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('returns no error for int input')
|
* @see it('returns no error for int input')
|
||||||
@ -64,6 +78,13 @@ class CoerceValueTest extends TestCase
|
|||||||
$this->expectNoErrors($result);
|
$this->expectNoErrors($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function expectNoErrors($result)
|
||||||
|
{
|
||||||
|
$this->assertInternalType('array', $result);
|
||||||
|
$this->assertNull($result['errors']);
|
||||||
|
$this->assertNotEquals(Utils::undefined(), $result['value']);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('returns no error for negative int input')
|
* @see it('returns no error for negative int input')
|
||||||
*/
|
*/
|
||||||
@ -115,6 +136,8 @@ class CoerceValueTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Describe: for GraphQLFloat
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('returns a single error for char input')
|
* @see it('returns a single error for char input')
|
||||||
*/
|
*/
|
||||||
@ -139,8 +162,6 @@ class CoerceValueTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Describe: for GraphQLFloat
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('returns no error for int input')
|
* @see it('returns no error for int input')
|
||||||
*/
|
*/
|
||||||
@ -189,6 +210,8 @@ class CoerceValueTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DESCRIBE: for GraphQLEnum
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('returns a single error for char input')
|
* @see it('returns a single error for char input')
|
||||||
*/
|
*/
|
||||||
@ -213,8 +236,6 @@ class CoerceValueTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// DESCRIBE: for GraphQLEnum
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('returns no error for a known enum name')
|
* @see it('returns no error for a known enum name')
|
||||||
*/
|
*/
|
||||||
@ -229,6 +250,8 @@ class CoerceValueTest extends TestCase
|
|||||||
$this->assertEquals(123456789, $barResult['value']);
|
$this->assertEquals(123456789, $barResult['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DESCRIBE: for GraphQLInputObject
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('results error for misspelled enum value')
|
* @see it('results error for misspelled enum value')
|
||||||
*/
|
*/
|
||||||
@ -250,8 +273,6 @@ class CoerceValueTest extends TestCase
|
|||||||
$this->expectError($result2, 'Expected type TestEnum.');
|
$this->expectError($result2, 'Expected type TestEnum.');
|
||||||
}
|
}
|
||||||
|
|
||||||
// DESCRIBE: for GraphQLInputObject
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('returns no error for a valid input')
|
* @see it('returns no error for a valid input')
|
||||||
*/
|
*/
|
||||||
@ -277,7 +298,10 @@ class CoerceValueTest extends TestCase
|
|||||||
public function testReturnErrorForAnInvalidField() : void
|
public function testReturnErrorForAnInvalidField() : void
|
||||||
{
|
{
|
||||||
$result = Value::coerceValue(['foo' => 'abc'], $this->testInputObject);
|
$result = Value::coerceValue(['foo' => 'abc'], $this->testInputObject);
|
||||||
$this->expectError($result, 'Expected type Int at value.foo; Int cannot represent non 32-bit signed integer value: abc');
|
$this->expectError(
|
||||||
|
$result,
|
||||||
|
'Expected type Int at value.foo; Int cannot represent non 32-bit signed integer value: abc'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -286,10 +310,13 @@ class CoerceValueTest extends TestCase
|
|||||||
public function testReturnsMultipleErrorsForMultipleInvalidFields() : void
|
public function testReturnsMultipleErrorsForMultipleInvalidFields() : void
|
||||||
{
|
{
|
||||||
$result = Value::coerceValue(['foo' => 'abc', 'bar' => 'def'], $this->testInputObject);
|
$result = Value::coerceValue(['foo' => 'abc', 'bar' => 'def'], $this->testInputObject);
|
||||||
$this->assertEquals([
|
$this->assertEquals(
|
||||||
'Expected type Int at value.foo; Int cannot represent non 32-bit signed integer value: abc',
|
[
|
||||||
'Expected type Int at value.bar; Int cannot represent non 32-bit signed integer value: def',
|
'Expected type Int at value.foo; Int cannot represent non 32-bit signed integer value: abc',
|
||||||
], $result['errors']);
|
'Expected type Int at value.bar; Int cannot represent non 32-bit signed integer value: def',
|
||||||
|
],
|
||||||
|
$result['errors']
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -318,20 +345,4 @@ class CoerceValueTest extends TestCase
|
|||||||
$result = Value::coerceValue(['foo' => 123, 'bart' => 123], $this->testInputObject);
|
$result = Value::coerceValue(['foo' => 123, 'bart' => 123], $this->testInputObject);
|
||||||
$this->expectError($result, 'Field "bart" is not defined by type TestInputObject; did you mean bar?');
|
$this->expectError($result, 'Field "bart" is not defined by type TestInputObject; did you mean bar?');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function expectNoErrors($result)
|
|
||||||
{
|
|
||||||
$this->assertInternalType('array', $result);
|
|
||||||
$this->assertNull($result['errors']);
|
|
||||||
$this->assertNotEquals(Utils::undefined(), $result['value']);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private function expectError($result, $expected) {
|
|
||||||
$this->assertInternalType('array', $result);
|
|
||||||
$this->assertInternalType('array', $result['errors']);
|
|
||||||
$this->assertCount(1, $result['errors']);
|
|
||||||
$this->assertEquals($expected, $result['errors'][0]->getMessage());
|
|
||||||
$this->assertEquals(Utils::undefined(), $result['value']);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Utils;
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace GraphQL\Tests\Utils;
|
||||||
|
|
||||||
use GraphQL\Error\InvariantViolation;
|
use GraphQL\Error\InvariantViolation;
|
||||||
use GraphQL\Type\Definition\InputObjectType;
|
use GraphQL\Type\Definition\InputObjectType;
|
||||||
@ -12,121 +15,74 @@ use PHPUnit\Framework\TestCase;
|
|||||||
|
|
||||||
class ExtractTypesTest extends TestCase
|
class ExtractTypesTest extends TestCase
|
||||||
{
|
{
|
||||||
/**
|
/** @var ObjectType */
|
||||||
* @var ObjectType
|
|
||||||
*/
|
|
||||||
private $query;
|
private $query;
|
||||||
|
|
||||||
/**
|
/** @var ObjectType */
|
||||||
* @var ObjectType
|
|
||||||
*/
|
|
||||||
private $mutation;
|
private $mutation;
|
||||||
|
|
||||||
/**
|
/** @var InterfaceType */
|
||||||
* @var InterfaceType
|
|
||||||
*/
|
|
||||||
private $node;
|
private $node;
|
||||||
|
|
||||||
/**
|
/** @var InterfaceType */
|
||||||
* @var InterfaceType
|
|
||||||
*/
|
|
||||||
private $content;
|
private $content;
|
||||||
|
|
||||||
/**
|
/** @var ObjectType */
|
||||||
* @var ObjectType
|
|
||||||
*/
|
|
||||||
private $blogStory;
|
private $blogStory;
|
||||||
|
|
||||||
/**
|
/** @var ObjectType */
|
||||||
* @var ObjectType
|
|
||||||
*/
|
|
||||||
private $link;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var ObjectType
|
|
||||||
*/
|
|
||||||
private $video;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var ObjectType
|
|
||||||
*/
|
|
||||||
private $videoMetadata;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var ObjectType
|
|
||||||
*/
|
|
||||||
private $comment;
|
private $comment;
|
||||||
|
|
||||||
/**
|
/** @var ObjectType */
|
||||||
* @var ObjectType
|
|
||||||
*/
|
|
||||||
private $user;
|
private $user;
|
||||||
|
|
||||||
/**
|
/** @var ObjectType */
|
||||||
* @var ObjectType
|
|
||||||
*/
|
|
||||||
private $category;
|
private $category;
|
||||||
|
|
||||||
/**
|
/** @var UnionType */
|
||||||
* @var UnionType
|
|
||||||
*/
|
|
||||||
private $mention;
|
private $mention;
|
||||||
|
|
||||||
|
/** @var ObjectType */
|
||||||
private $postStoryMutation;
|
private $postStoryMutation;
|
||||||
|
|
||||||
|
/** @var InputObjectType */
|
||||||
private $postStoryMutationInput;
|
private $postStoryMutationInput;
|
||||||
|
|
||||||
|
/** @var ObjectType */
|
||||||
private $postCommentMutation;
|
private $postCommentMutation;
|
||||||
|
|
||||||
|
/** @var InputObjectType */
|
||||||
private $postCommentMutationInput;
|
private $postCommentMutationInput;
|
||||||
|
|
||||||
public function setUp()
|
public function setUp()
|
||||||
{
|
{
|
||||||
$this->node = new InterfaceType([
|
$this->node = new InterfaceType([
|
||||||
'name' => 'Node',
|
'name' => 'Node',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'id' => Type::string()
|
'id' => Type::string(),
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->content = new InterfaceType([
|
$this->content = new InterfaceType([
|
||||||
'name' => 'Content',
|
'name' => 'Content',
|
||||||
'fields' => function() {
|
'fields' => function () {
|
||||||
return [
|
return [
|
||||||
'title' => Type::string(),
|
'title' => Type::string(),
|
||||||
'body' => Type::string(),
|
'body' => Type::string(),
|
||||||
'author' => $this->user,
|
'author' => $this->user,
|
||||||
'comments' => Type::listOf($this->comment),
|
'comments' => Type::listOf($this->comment),
|
||||||
'categories' => Type::listOf($this->category)
|
'categories' => Type::listOf($this->category),
|
||||||
];
|
];
|
||||||
}
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->blogStory = new ObjectType([
|
$this->blogStory = new ObjectType([
|
||||||
'name' => 'BlogStory',
|
'name' => 'BlogStory',
|
||||||
'interfaces' => [
|
'interfaces' => [
|
||||||
$this->node,
|
$this->node,
|
||||||
$this->content
|
$this->content,
|
||||||
],
|
],
|
||||||
'fields' => function() {
|
'fields' => function () {
|
||||||
return [
|
|
||||||
$this->node->getField('id'),
|
|
||||||
$this->content->getField('title'),
|
|
||||||
$this->content->getField('body'),
|
|
||||||
$this->content->getField('author'),
|
|
||||||
$this->content->getField('comments'),
|
|
||||||
$this->content->getField('categories')
|
|
||||||
];
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this->link = new ObjectType([
|
|
||||||
'name' => 'Link',
|
|
||||||
'interfaces' => [
|
|
||||||
$this->node,
|
|
||||||
$this->content
|
|
||||||
],
|
|
||||||
'fields' => function() {
|
|
||||||
return [
|
return [
|
||||||
$this->node->getField('id'),
|
$this->node->getField('id'),
|
||||||
$this->content->getField('title'),
|
$this->content->getField('title'),
|
||||||
@ -134,156 +90,176 @@ class ExtractTypesTest extends TestCase
|
|||||||
$this->content->getField('author'),
|
$this->content->getField('author'),
|
||||||
$this->content->getField('comments'),
|
$this->content->getField('comments'),
|
||||||
$this->content->getField('categories'),
|
$this->content->getField('categories'),
|
||||||
'url' => Type::string()
|
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->video = new ObjectType([
|
new ObjectType([
|
||||||
'name' => 'Video',
|
'name' => 'Link',
|
||||||
'interfaces' => [
|
'interfaces' => [
|
||||||
$this->node,
|
$this->node,
|
||||||
$this->content
|
$this->content,
|
||||||
],
|
],
|
||||||
'fields' => function() {
|
'fields' => function () {
|
||||||
return [
|
return [
|
||||||
$this->node->getField('id'),
|
'id' => $this->node->getField('id'),
|
||||||
$this->content->getField('title'),
|
'title' => $this->content->getField('title'),
|
||||||
$this->content->getField('body'),
|
'body' => $this->content->getField('body'),
|
||||||
$this->content->getField('author'),
|
'author' => $this->content->getField('author'),
|
||||||
$this->content->getField('comments'),
|
'comments' => $this->content->getField('comments'),
|
||||||
$this->content->getField('categories'),
|
'categories' => $this->content->getField('categories'),
|
||||||
'streamUrl' => Type::string(),
|
'url' => Type::string(),
|
||||||
|
];
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
new ObjectType([
|
||||||
|
'name' => 'Video',
|
||||||
|
'interfaces' => [
|
||||||
|
$this->node,
|
||||||
|
$this->content,
|
||||||
|
],
|
||||||
|
'fields' => function () {
|
||||||
|
return [
|
||||||
|
'id' => $this->node->getField('id'),
|
||||||
|
'title' => $this->content->getField('title'),
|
||||||
|
'body' => $this->content->getField('body'),
|
||||||
|
'author' => $this->content->getField('author'),
|
||||||
|
'comments' => $this->content->getField('comments'),
|
||||||
|
'categories' => $this->content->getField('categories'),
|
||||||
|
'streamUrl' => Type::string(),
|
||||||
'downloadUrl' => Type::string(),
|
'downloadUrl' => Type::string(),
|
||||||
'metadata' => $this->videoMetadata = new ObjectType([
|
'metadata' => new ObjectType([
|
||||||
'name' => 'VideoMetadata',
|
'name' => 'VideoMetadata',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'lat' => Type::float(),
|
'lat' => Type::float(),
|
||||||
'lng' => Type::float()
|
'lng' => Type::float(),
|
||||||
]
|
],
|
||||||
])
|
]),
|
||||||
];
|
];
|
||||||
}
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->comment = new ObjectType([
|
$this->comment = new ObjectType([
|
||||||
'name' => 'Comment',
|
'name' => 'Comment',
|
||||||
'interfaces' => [
|
'interfaces' => [
|
||||||
$this->node
|
$this->node,
|
||||||
],
|
],
|
||||||
'fields' => function() {
|
'fields' => function () {
|
||||||
return [
|
return [
|
||||||
$this->node->getField('id'),
|
'id' => $this->node->getField('id'),
|
||||||
'author' => $this->user,
|
'author' => $this->user,
|
||||||
'text' => Type::string(),
|
'text' => Type::string(),
|
||||||
'replies' => Type::listOf($this->comment),
|
'replies' => Type::listOf($this->comment),
|
||||||
'parent' => $this->comment,
|
'parent' => $this->comment,
|
||||||
'content' => $this->content
|
'content' => $this->content,
|
||||||
];
|
];
|
||||||
}
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->user = new ObjectType([
|
$this->user = new ObjectType([
|
||||||
'name' => 'User',
|
'name' => 'User',
|
||||||
'interfaces' => [
|
'interfaces' => [
|
||||||
$this->node
|
$this->node,
|
||||||
],
|
],
|
||||||
'fields' => function() {
|
'fields' => function () {
|
||||||
return [
|
return [
|
||||||
$this->node->getField('id'),
|
'id' => $this->node->getField('id'),
|
||||||
'name' => Type::string(),
|
'name' => Type::string(),
|
||||||
];
|
];
|
||||||
}
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->category = new ObjectType([
|
$this->category = new ObjectType([
|
||||||
'name' => 'Category',
|
'name' => 'Category',
|
||||||
'interfaces' => [
|
'interfaces' => [
|
||||||
$this->node
|
$this->node,
|
||||||
],
|
],
|
||||||
'fields' => function() {
|
'fields' => function () {
|
||||||
return [
|
return [
|
||||||
$this->node->getField('id'),
|
'id' => $this->node->getField('id'),
|
||||||
'name' => Type::string()
|
'name' => Type::string(),
|
||||||
];
|
];
|
||||||
}
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->mention = new UnionType([
|
$this->mention = new UnionType([
|
||||||
'name' => 'Mention',
|
'name' => 'Mention',
|
||||||
'types' => [
|
'types' => [
|
||||||
$this->user,
|
$this->user,
|
||||||
$this->category
|
$this->category,
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->query = new ObjectType([
|
$this->query = new ObjectType([
|
||||||
'name' => 'Query',
|
'name' => 'Query',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'viewer' => $this->user,
|
'viewer' => $this->user,
|
||||||
'latestContent' => $this->content,
|
'latestContent' => $this->content,
|
||||||
'node' => $this->node,
|
'node' => $this->node,
|
||||||
'mentions' => Type::listOf($this->mention)
|
'mentions' => Type::listOf($this->mention),
|
||||||
]
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->postStoryMutationInput = new InputObjectType([
|
||||||
|
'name' => 'PostStoryMutationInput',
|
||||||
|
'fields' => [
|
||||||
|
'title' => Type::string(),
|
||||||
|
'body' => Type::string(),
|
||||||
|
'author' => Type::id(),
|
||||||
|
'category' => Type::id(),
|
||||||
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->mutation = new ObjectType([
|
$this->mutation = new ObjectType([
|
||||||
'name' => 'Mutation',
|
'name' => 'Mutation',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'postStory' => [
|
'postStory' => [
|
||||||
'type' => $this->postStoryMutation = new ObjectType([
|
'type' => $this->postStoryMutation = new ObjectType([
|
||||||
'name' => 'PostStoryMutation',
|
'name' => 'PostStoryMutation',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'story' => $this->blogStory
|
'story' => $this->blogStory,
|
||||||
]
|
],
|
||||||
]),
|
]),
|
||||||
'args' => [
|
'args' => [
|
||||||
'input' => Type::nonNull($this->postStoryMutationInput = new InputObjectType([
|
'input' => Type::nonNull($this->postStoryMutationInput),
|
||||||
'name' => 'PostStoryMutationInput',
|
'clientRequestId' => Type::string(),
|
||||||
'fields' => [
|
],
|
||||||
'title' => Type::string(),
|
|
||||||
'body' => Type::string(),
|
|
||||||
'author' => Type::id(),
|
|
||||||
'category' => Type::id()
|
|
||||||
]
|
|
||||||
])),
|
|
||||||
'clientRequestId' => Type::string()
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
'postComment' => [
|
'postComment' => [
|
||||||
'type' => $this->postCommentMutation = new ObjectType([
|
'type' => $this->postCommentMutation = new ObjectType([
|
||||||
'name' => 'PostCommentMutation',
|
'name' => 'PostCommentMutation',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'comment' => $this->comment
|
'comment' => $this->comment,
|
||||||
]
|
],
|
||||||
]),
|
]),
|
||||||
'args' => [
|
'args' => [
|
||||||
'input' => Type::nonNull($this->postCommentMutationInput = new InputObjectType([
|
'input' => Type::nonNull($this->postCommentMutationInput = new InputObjectType([
|
||||||
'name' => 'PostCommentMutationInput',
|
'name' => 'PostCommentMutationInput',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'text' => Type::nonNull(Type::string()),
|
'text' => Type::nonNull(Type::string()),
|
||||||
'author' => Type::nonNull(Type::id()),
|
'author' => Type::nonNull(Type::id()),
|
||||||
'content' => Type::id(),
|
'content' => Type::id(),
|
||||||
'parent' => Type::id()
|
'parent' => Type::id(),
|
||||||
]
|
],
|
||||||
])),
|
])),
|
||||||
'clientRequestId' => Type::string()
|
'clientRequestId' => Type::string(),
|
||||||
]
|
],
|
||||||
]
|
],
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testExtractTypesFromQuery() : void
|
public function testExtractTypesFromQuery() : void
|
||||||
{
|
{
|
||||||
$expectedTypeMap = [
|
$expectedTypeMap = [
|
||||||
'Query' => $this->query,
|
'Query' => $this->query,
|
||||||
'User' => $this->user,
|
'User' => $this->user,
|
||||||
'Node' => $this->node,
|
'Node' => $this->node,
|
||||||
'String' => Type::string(),
|
'String' => Type::string(),
|
||||||
'Content' => $this->content,
|
'Content' => $this->content,
|
||||||
'Comment' => $this->comment,
|
'Comment' => $this->comment,
|
||||||
'Mention' => $this->mention,
|
'Mention' => $this->mention,
|
||||||
'Category' => $this->category,
|
'Category' => $this->category,
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -294,19 +270,19 @@ class ExtractTypesTest extends TestCase
|
|||||||
public function testExtractTypesFromMutation() : void
|
public function testExtractTypesFromMutation() : void
|
||||||
{
|
{
|
||||||
$expectedTypeMap = [
|
$expectedTypeMap = [
|
||||||
'Mutation' => $this->mutation,
|
'Mutation' => $this->mutation,
|
||||||
'User' => $this->user,
|
'User' => $this->user,
|
||||||
'Node' => $this->node,
|
'Node' => $this->node,
|
||||||
'String' => Type::string(),
|
'String' => Type::string(),
|
||||||
'Content' => $this->content,
|
'Content' => $this->content,
|
||||||
'Comment' => $this->comment,
|
'Comment' => $this->comment,
|
||||||
'BlogStory' => $this->blogStory,
|
'BlogStory' => $this->blogStory,
|
||||||
'Category' => $this->category,
|
'Category' => $this->category,
|
||||||
'PostStoryMutationInput' => $this->postStoryMutationInput,
|
'PostStoryMutationInput' => $this->postStoryMutationInput,
|
||||||
'ID' => Type::id(),
|
'ID' => Type::id(),
|
||||||
'PostStoryMutation' => $this->postStoryMutation,
|
'PostStoryMutation' => $this->postStoryMutation,
|
||||||
'PostCommentMutationInput' => $this->postCommentMutationInput,
|
'PostCommentMutationInput' => $this->postCommentMutationInput,
|
||||||
'PostCommentMutation' => $this->postCommentMutation,
|
'PostCommentMutation' => $this->postCommentMutation,
|
||||||
];
|
];
|
||||||
|
|
||||||
$actualTypeMap = TypeInfo::extractTypes($this->mutation);
|
$actualTypeMap = TypeInfo::extractTypes($this->mutation);
|
||||||
@ -316,16 +292,16 @@ class ExtractTypesTest extends TestCase
|
|||||||
public function testThrowsOnMultipleTypesWithSameName() : void
|
public function testThrowsOnMultipleTypesWithSameName() : void
|
||||||
{
|
{
|
||||||
$otherUserType = new ObjectType([
|
$otherUserType = new ObjectType([
|
||||||
'name' => 'User',
|
'name' => 'User',
|
||||||
'fields' => ['a' => Type::string()]
|
'fields' => ['a' => Type::string()],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$queryType = new ObjectType([
|
$queryType = new ObjectType([
|
||||||
'name' => 'Test',
|
'name' => 'Test',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'otherUser' => $otherUserType,
|
'otherUser' => $otherUserType,
|
||||||
'user' => $this->user
|
'user' => $this->user,
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->expectException(InvariantViolation::class);
|
$this->expectException(InvariantViolation::class);
|
||||||
|
@ -1,17 +1,18 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace GraphQL\Tests\Utils;
|
namespace GraphQL\Tests\Utils;
|
||||||
|
|
||||||
use GraphQL\Language\Parser;
|
use GraphQL\Language\Parser;
|
||||||
use GraphQL\Language\SourceLocation;
|
use GraphQL\Language\SourceLocation;
|
||||||
use GraphQL\Type\Definition\Type;
|
use GraphQL\Type\Definition\Type;
|
||||||
use GraphQL\Utils\Utils;
|
|
||||||
use GraphQL\Validator\DocumentValidator;
|
use GraphQL\Validator\DocumentValidator;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
class IsValidLiteralValueTest extends TestCase
|
class IsValidLiteralValueTest extends TestCase
|
||||||
{
|
{
|
||||||
// DESCRIBE: isValidLiteralValue
|
// DESCRIBE: isValidLiteralValue
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('Returns no errors for a valid value')
|
* @see it('Returns no errors for a valid value')
|
||||||
*/
|
*/
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace GraphQL\Tests\Utils;
|
namespace GraphQL\Tests\Utils;
|
||||||
|
|
||||||
|
|
||||||
use GraphQL\Utils\Utils;
|
|
||||||
use GraphQL\Utils\MixedStore;
|
use GraphQL\Utils\MixedStore;
|
||||||
|
use GraphQL\Utils\Utils;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
class MixedStoreTest extends TestCase
|
class MixedStoreTest extends TestCase
|
||||||
{
|
{
|
||||||
/**
|
/** @var MixedStore */
|
||||||
* @var MixedStore
|
|
||||||
*/
|
|
||||||
private $mixedStore;
|
private $mixedStore;
|
||||||
|
|
||||||
public function setUp()
|
public function setUp()
|
||||||
@ -18,6 +18,13 @@ class MixedStoreTest extends TestCase
|
|||||||
$this->mixedStore = new MixedStore();
|
$this->mixedStore = new MixedStore();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testAcceptsNullKeys() : void
|
||||||
|
{
|
||||||
|
foreach ($this->getPossibleValues() as $value) {
|
||||||
|
$this->assertAcceptsKeyValue(null, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function getPossibleValues()
|
public function getPossibleValues()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
@ -30,16 +37,38 @@ class MixedStoreTest extends TestCase
|
|||||||
'a',
|
'a',
|
||||||
[],
|
[],
|
||||||
new \stdClass(),
|
new \stdClass(),
|
||||||
function() {},
|
function () {
|
||||||
new MixedStore()
|
},
|
||||||
|
new MixedStore(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testAcceptsNullKeys() : void
|
private function assertAcceptsKeyValue($key, $value)
|
||||||
{
|
{
|
||||||
foreach ($this->getPossibleValues() as $value) {
|
$err = 'Failed assertion that MixedStore accepts key ' .
|
||||||
$this->assertAcceptsKeyValue(null, $value);
|
Utils::printSafe($key) . ' with value ' . Utils::printSafe($value);
|
||||||
}
|
|
||||||
|
$this->assertFalse($this->mixedStore->offsetExists($key), $err);
|
||||||
|
$this->mixedStore->offsetSet($key, $value);
|
||||||
|
$this->assertTrue($this->mixedStore->offsetExists($key), $err);
|
||||||
|
$this->assertSame($value, $this->mixedStore->offsetGet($key), $err);
|
||||||
|
$this->mixedStore->offsetUnset($key);
|
||||||
|
$this->assertFalse($this->mixedStore->offsetExists($key), $err);
|
||||||
|
$this->assertProvidesArrayAccess($key, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function assertProvidesArrayAccess($key, $value)
|
||||||
|
{
|
||||||
|
$err = 'Failed assertion that MixedStore provides array access for key ' .
|
||||||
|
Utils::printSafe($key) . ' with value ' . Utils::printSafe($value);
|
||||||
|
|
||||||
|
$this->assertFalse(isset($this->mixedStore[$key]), $err);
|
||||||
|
$this->mixedStore[$key] = $value;
|
||||||
|
$this->assertTrue(isset($this->mixedStore[$key]), $err);
|
||||||
|
$this->assertEquals(! empty($value), ! empty($this->mixedStore[$key]), $err);
|
||||||
|
$this->assertSame($value, $this->mixedStore[$key], $err);
|
||||||
|
unset($this->mixedStore[$key]);
|
||||||
|
$this->assertFalse(isset($this->mixedStore[$key]), $err);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testAcceptsBoolKeys() : void
|
public function testAcceptsBoolKeys() : void
|
||||||
@ -93,35 +122,11 @@ class MixedStoreTest extends TestCase
|
|||||||
foreach ($this->getPossibleValues() as $value) {
|
foreach ($this->getPossibleValues() as $value) {
|
||||||
$this->assertAcceptsKeyValue(new \stdClass(), $value);
|
$this->assertAcceptsKeyValue(new \stdClass(), $value);
|
||||||
$this->assertAcceptsKeyValue(new MixedStore(), $value);
|
$this->assertAcceptsKeyValue(new MixedStore(), $value);
|
||||||
$this->assertAcceptsKeyValue(function() {}, $value);
|
$this->assertAcceptsKeyValue(
|
||||||
|
function () {
|
||||||
|
},
|
||||||
|
$value
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function assertAcceptsKeyValue($key, $value)
|
|
||||||
{
|
|
||||||
$err = 'Failed assertion that MixedStore accepts key ' .
|
|
||||||
Utils::printSafe($key) . ' with value ' . Utils::printSafe($value);
|
|
||||||
|
|
||||||
$this->assertFalse($this->mixedStore->offsetExists($key), $err);
|
|
||||||
$this->mixedStore->offsetSet($key, $value);
|
|
||||||
$this->assertTrue($this->mixedStore->offsetExists($key), $err);
|
|
||||||
$this->assertSame($value, $this->mixedStore->offsetGet($key), $err);
|
|
||||||
$this->mixedStore->offsetUnset($key);
|
|
||||||
$this->assertFalse($this->mixedStore->offsetExists($key), $err);
|
|
||||||
$this->assertProvidesArrayAccess($key, $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function assertProvidesArrayAccess($key, $value)
|
|
||||||
{
|
|
||||||
$err = 'Failed assertion that MixedStore provides array access for key ' .
|
|
||||||
Utils::printSafe($key) . ' with value ' . Utils::printSafe($value);
|
|
||||||
|
|
||||||
$this->assertFalse(isset($this->mixedStore[$key]), $err);
|
|
||||||
$this->mixedStore[$key] = $value;
|
|
||||||
$this->assertTrue(isset($this->mixedStore[$key]), $err);
|
|
||||||
$this->assertEquals(!empty($value), !empty($this->mixedStore[$key]), $err);
|
|
||||||
$this->assertSame($value, $this->mixedStore[$key], $err);
|
|
||||||
unset($this->mixedStore[$key]);
|
|
||||||
$this->assertFalse(isset($this->mixedStore[$key]), $err);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace GraphQL\Tests\Utils;
|
namespace GraphQL\Tests\Utils;
|
||||||
|
|
||||||
use GraphQL\Executor\Values;
|
|
||||||
use GraphQL\Type\Definition\Type;
|
|
||||||
use GraphQL\Utils\Utils;
|
use GraphQL\Utils\Utils;
|
||||||
use GraphQL\Utils\Value;
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
class QuotedOrListTest extends TestCase
|
class QuotedOrListTest extends TestCase
|
||||||
{
|
{
|
||||||
// DESCRIBE: quotedOrList
|
// DESCRIBE: quotedOrList
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('Does not accept an empty list')
|
* @see it('Does not accept an empty list')
|
||||||
*/
|
*/
|
||||||
|
@ -1,16 +1,19 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace GraphQL\Tests\Utils;
|
namespace GraphQL\Tests\Utils;
|
||||||
|
|
||||||
use GraphQL\Language\DirectiveLocation;
|
use GraphQL\Language\DirectiveLocation;
|
||||||
use GraphQL\Type\Schema;
|
|
||||||
use GraphQL\Type\Definition\CustomScalarType;
|
use GraphQL\Type\Definition\CustomScalarType;
|
||||||
use GraphQL\Type\Definition\Directive;
|
use GraphQL\Type\Definition\Directive;
|
||||||
|
use GraphQL\Type\Definition\EnumType;
|
||||||
use GraphQL\Type\Definition\InputObjectType;
|
use GraphQL\Type\Definition\InputObjectType;
|
||||||
use GraphQL\Type\Definition\InterfaceType;
|
use GraphQL\Type\Definition\InterfaceType;
|
||||||
use GraphQL\Type\Definition\ObjectType;
|
use GraphQL\Type\Definition\ObjectType;
|
||||||
use GraphQL\Type\Definition\Type;
|
use GraphQL\Type\Definition\Type;
|
||||||
use GraphQL\Type\Definition\EnumType;
|
|
||||||
use GraphQL\Type\Definition\UnionType;
|
use GraphQL\Type\Definition\UnionType;
|
||||||
|
use GraphQL\Type\Schema;
|
||||||
use GraphQL\Utils\BuildSchema;
|
use GraphQL\Utils\BuildSchema;
|
||||||
use GraphQL\Utils\SchemaPrinter;
|
use GraphQL\Utils\SchemaPrinter;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
@ -19,37 +22,40 @@ class SchemaPrinterTest extends TestCase
|
|||||||
{
|
{
|
||||||
// Describe: Type System Printer
|
// Describe: Type System Printer
|
||||||
|
|
||||||
private function printForTest($schema)
|
|
||||||
{
|
|
||||||
$schemaText = SchemaPrinter::doPrint($schema);
|
|
||||||
$this->assertEquals($schemaText, SchemaPrinter::doPrint(BuildSchema::build($schemaText)));
|
|
||||||
return "\n" . $schemaText;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function printSingleFieldSchema($fieldConfig)
|
|
||||||
{
|
|
||||||
$query = new ObjectType([
|
|
||||||
'name' => 'Query',
|
|
||||||
'fields' => [
|
|
||||||
'singleField' => $fieldConfig
|
|
||||||
]
|
|
||||||
]);
|
|
||||||
return $this->printForTest(new Schema(['query' => $query]));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('Prints String Field')
|
* @see it('Prints String Field')
|
||||||
*/
|
*/
|
||||||
public function testPrintsStringField() : void
|
public function testPrintsStringField() : void
|
||||||
{
|
{
|
||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
'type' => Type::string()
|
'type' => Type::string(),
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField: String
|
singleField: String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function printSingleFieldSchema($fieldConfig)
|
||||||
|
{
|
||||||
|
$query = new ObjectType([
|
||||||
|
'name' => 'Query',
|
||||||
|
'fields' => ['singleField' => $fieldConfig],
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $this->printForTest(new Schema(['query' => $query]));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function printForTest($schema)
|
||||||
|
{
|
||||||
|
$schemaText = SchemaPrinter::doPrint($schema);
|
||||||
|
$this->assertEquals($schemaText, SchemaPrinter::doPrint(BuildSchema::build($schemaText)));
|
||||||
|
|
||||||
|
return "\n" . $schemaText;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -58,13 +64,16 @@ type Query {
|
|||||||
public function testPrintArrayStringField() : void
|
public function testPrintArrayStringField() : void
|
||||||
{
|
{
|
||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
'type' => Type::listOf(Type::string())
|
'type' => Type::listOf(Type::string()),
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField: [String]
|
singleField: [String]
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -73,13 +82,16 @@ type Query {
|
|||||||
public function testPrintNonNullStringField() : void
|
public function testPrintNonNullStringField() : void
|
||||||
{
|
{
|
||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
'type' => Type::nonNull(Type::string())
|
'type' => Type::nonNull(Type::string()),
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField: String!
|
singleField: String!
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -88,13 +100,16 @@ type Query {
|
|||||||
public function testPrintNonNullArrayStringField() : void
|
public function testPrintNonNullArrayStringField() : void
|
||||||
{
|
{
|
||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
'type' => Type::nonNull(Type::listOf(Type::string()))
|
'type' => Type::nonNull(Type::listOf(Type::string())),
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField: [String]!
|
singleField: [String]!
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -103,13 +118,16 @@ type Query {
|
|||||||
public function testPrintArrayNonNullStringField() : void
|
public function testPrintArrayNonNullStringField() : void
|
||||||
{
|
{
|
||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
'type' => Type::listOf(Type::nonNull(Type::string()))
|
'type' => Type::listOf(Type::nonNull(Type::string())),
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField: [String!]
|
singleField: [String!]
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -118,13 +136,16 @@ type Query {
|
|||||||
public function testPrintNonNullArrayNonNullStringField() : void
|
public function testPrintNonNullArrayNonNullStringField() : void
|
||||||
{
|
{
|
||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
'type' => Type::nonNull(Type::listOf(Type::nonNull(Type::string())))
|
'type' => Type::nonNull(Type::listOf(Type::nonNull(Type::string()))),
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField: [String!]!
|
singleField: [String!]!
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -133,18 +154,19 @@ type Query {
|
|||||||
public function testPrintObjectField() : void
|
public function testPrintObjectField() : void
|
||||||
{
|
{
|
||||||
$fooType = new ObjectType([
|
$fooType = new ObjectType([
|
||||||
'name' => 'Foo',
|
'name' => 'Foo',
|
||||||
'fields' => ['str' => ['type' => Type::string()]]
|
'fields' => ['str' => ['type' => Type::string()]],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$root = new ObjectType([
|
$root = new ObjectType([
|
||||||
'name' => 'Query',
|
'name' => 'Query',
|
||||||
'fields' => ['foo' => ['type' => $fooType]]
|
'fields' => ['foo' => ['type' => $fooType]],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$schema = new Schema(['query' => $root]);
|
$schema = new Schema(['query' => $root]);
|
||||||
$output = $this->printForTest($schema);
|
$output = $this->printForTest($schema);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Foo {
|
type Foo {
|
||||||
str: String
|
str: String
|
||||||
}
|
}
|
||||||
@ -152,7 +174,9 @@ type Foo {
|
|||||||
type Query {
|
type Query {
|
||||||
foo: Foo
|
foo: Foo
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -162,13 +186,16 @@ type Query {
|
|||||||
{
|
{
|
||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
'type' => Type::string(),
|
'type' => Type::string(),
|
||||||
'args' => ['argOne' => ['type' => Type::int()]]
|
'args' => ['argOne' => ['type' => Type::int()]],
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField(argOne: Int): String
|
singleField(argOne: Int): String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -178,13 +205,16 @@ type Query {
|
|||||||
{
|
{
|
||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
'type' => Type::string(),
|
'type' => Type::string(),
|
||||||
'args' => ['argOne' => ['type' => Type::int(), 'defaultValue' => 2]]
|
'args' => ['argOne' => ['type' => Type::int(), 'defaultValue' => 2]],
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField(argOne: Int = 2): String
|
singleField(argOne: Int = 2): String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -196,11 +226,14 @@ type Query {
|
|||||||
'type' => Type::string(),
|
'type' => Type::string(),
|
||||||
'args' => ['argOne' => ['type' => Type::string(), 'defaultValue' => "tes\t de\fault"]],
|
'args' => ['argOne' => ['type' => Type::string(), 'defaultValue' => "tes\t de\fault"]],
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField(argOne: String = "tes\t de\fault"): String
|
singleField(argOne: String = "tes\t de\fault"): String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -210,13 +243,16 @@ type Query {
|
|||||||
{
|
{
|
||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
'type' => Type::string(),
|
'type' => Type::string(),
|
||||||
'args' => ['argOne' => ['type' => Type::int(), 'defaultValue' => null]]
|
'args' => ['argOne' => ['type' => Type::int(), 'defaultValue' => null]],
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField(argOne: Int = null): String
|
singleField(argOne: Int = null): String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -226,13 +262,16 @@ type Query {
|
|||||||
{
|
{
|
||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
'type' => Type::string(),
|
'type' => Type::string(),
|
||||||
'args' => ['argOne' => ['type' => Type::nonNull(Type::int())]]
|
'args' => ['argOne' => ['type' => Type::nonNull(Type::int())]],
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField(argOne: Int!): String
|
singleField(argOne: Int!): String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -244,14 +283,17 @@ type Query {
|
|||||||
'type' => Type::string(),
|
'type' => Type::string(),
|
||||||
'args' => [
|
'args' => [
|
||||||
'argOne' => ['type' => Type::int()],
|
'argOne' => ['type' => Type::int()],
|
||||||
'argTwo' => ['type' => Type::string()]
|
'argTwo' => ['type' => Type::string()],
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField(argOne: Int, argTwo: String): String
|
singleField(argOne: Int, argTwo: String): String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -262,16 +304,19 @@ type Query {
|
|||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
'type' => Type::string(),
|
'type' => Type::string(),
|
||||||
'args' => [
|
'args' => [
|
||||||
'argOne' => ['type' => Type::int(), 'defaultValue' => 1],
|
'argOne' => ['type' => Type::int(), 'defaultValue' => 1],
|
||||||
'argTwo' => ['type' => Type::string()],
|
'argTwo' => ['type' => Type::string()],
|
||||||
'argThree' => ['type' => Type::boolean()]
|
'argThree' => ['type' => Type::boolean()],
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField(argOne: Int = 1, argTwo: String, argThree: Boolean): String
|
singleField(argOne: Int = 1, argTwo: String, argThree: Boolean): String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -282,16 +327,19 @@ type Query {
|
|||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
'type' => Type::string(),
|
'type' => Type::string(),
|
||||||
'args' => [
|
'args' => [
|
||||||
'argOne' => ['type' => Type::int()],
|
'argOne' => ['type' => Type::int()],
|
||||||
'argTwo' => ['type' => Type::string(), 'defaultValue' => 'foo'],
|
'argTwo' => ['type' => Type::string(), 'defaultValue' => 'foo'],
|
||||||
'argThree' => ['type' => Type::boolean()]
|
'argThree' => ['type' => Type::boolean()],
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField(argOne: Int, argTwo: String = "foo", argThree: Boolean): String
|
singleField(argOne: Int, argTwo: String = "foo", argThree: Boolean): String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -302,16 +350,19 @@ type Query {
|
|||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
'type' => Type::string(),
|
'type' => Type::string(),
|
||||||
'args' => [
|
'args' => [
|
||||||
'argOne' => ['type' => Type::int()],
|
'argOne' => ['type' => Type::int()],
|
||||||
'argTwo' => ['type' => Type::string()],
|
'argTwo' => ['type' => Type::string()],
|
||||||
'argThree' => ['type' => Type::boolean(), 'defaultValue' => false]
|
'argThree' => ['type' => Type::boolean(), 'defaultValue' => false],
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
singleField(argOne: Int, argTwo: String, argThree: Boolean = false): String
|
singleField(argOne: Int, argTwo: String, argThree: Boolean = false): String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -320,14 +371,12 @@ type Query {
|
|||||||
public function testPrintsCustomQueryRootType() : void
|
public function testPrintsCustomQueryRootType() : void
|
||||||
{
|
{
|
||||||
$customQueryType = new ObjectType([
|
$customQueryType = new ObjectType([
|
||||||
'name' => 'CustomQueryType',
|
'name' => 'CustomQueryType',
|
||||||
'fields' => ['bar' => ['type' => Type::string()]],
|
'fields' => ['bar' => ['type' => Type::string()]],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$schema = new Schema([
|
$schema = new Schema(['query' => $customQueryType]);
|
||||||
'query' => $customQueryType,
|
$output = $this->printForTest($schema);
|
||||||
]);
|
|
||||||
$output = $this->printForTest($schema);
|
|
||||||
$expected = '
|
$expected = '
|
||||||
schema {
|
schema {
|
||||||
query: CustomQueryType
|
query: CustomQueryType
|
||||||
@ -346,27 +395,28 @@ type CustomQueryType {
|
|||||||
public function testPrintInterface() : void
|
public function testPrintInterface() : void
|
||||||
{
|
{
|
||||||
$fooType = new InterfaceType([
|
$fooType = new InterfaceType([
|
||||||
'name' => 'Foo',
|
'name' => 'Foo',
|
||||||
'fields' => ['str' => ['type' => Type::string()]]
|
'fields' => ['str' => ['type' => Type::string()]],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$barType = new ObjectType([
|
$barType = new ObjectType([
|
||||||
'name' => 'Bar',
|
'name' => 'Bar',
|
||||||
'fields' => ['str' => ['type' => Type::string()]],
|
'fields' => ['str' => ['type' => Type::string()]],
|
||||||
'interfaces' => [$fooType]
|
'interfaces' => [$fooType],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$query = new ObjectType([
|
$query = new ObjectType([
|
||||||
'name' => 'Query',
|
'name' => 'Query',
|
||||||
'fields' => ['bar' => ['type' => $barType]]
|
'fields' => ['bar' => ['type' => $barType]],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$schema = new Schema([
|
$schema = new Schema([
|
||||||
'query' => $query,
|
'query' => $query,
|
||||||
'types' => [$barType]
|
'types' => [$barType],
|
||||||
]);
|
]);
|
||||||
$output = $this->printForTest($schema);
|
$output = $this->printForTest($schema);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Bar implements Foo {
|
type Bar implements Foo {
|
||||||
str: String
|
str: String
|
||||||
}
|
}
|
||||||
@ -378,7 +428,9 @@ interface Foo {
|
|||||||
type Query {
|
type Query {
|
||||||
bar: Bar
|
bar: Bar
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -387,35 +439,36 @@ type Query {
|
|||||||
public function testPrintMultipleInterface() : void
|
public function testPrintMultipleInterface() : void
|
||||||
{
|
{
|
||||||
$fooType = new InterfaceType([
|
$fooType = new InterfaceType([
|
||||||
'name' => 'Foo',
|
'name' => 'Foo',
|
||||||
'fields' => ['str' => ['type' => Type::string()]]
|
'fields' => ['str' => ['type' => Type::string()]],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$baazType = new InterfaceType([
|
$baazType = new InterfaceType([
|
||||||
'name' => 'Baaz',
|
'name' => 'Baaz',
|
||||||
'fields' => ['int' => ['type' => Type::int()]]
|
'fields' => ['int' => ['type' => Type::int()]],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$barType = new ObjectType([
|
$barType = new ObjectType([
|
||||||
'name' => 'Bar',
|
'name' => 'Bar',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'str' => ['type' => Type::string()],
|
'str' => ['type' => Type::string()],
|
||||||
'int' => ['type' => Type::int()]
|
'int' => ['type' => Type::int()],
|
||||||
],
|
],
|
||||||
'interfaces' => [$fooType, $baazType]
|
'interfaces' => [$fooType, $baazType],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$query = new ObjectType([
|
$query = new ObjectType([
|
||||||
'name' => 'Query',
|
'name' => 'Query',
|
||||||
'fields' => ['bar' => ['type' => $barType]]
|
'fields' => ['bar' => ['type' => $barType]],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$schema = new Schema([
|
$schema = new Schema([
|
||||||
'query' => $query,
|
'query' => $query,
|
||||||
'types' => [$barType]
|
'types' => [$barType],
|
||||||
]);
|
]);
|
||||||
$output = $this->printForTest($schema);
|
$output = $this->printForTest($schema);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
interface Baaz {
|
interface Baaz {
|
||||||
int: Int
|
int: Int
|
||||||
}
|
}
|
||||||
@ -432,7 +485,9 @@ interface Foo {
|
|||||||
type Query {
|
type Query {
|
||||||
bar: Bar
|
bar: Bar
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -441,36 +496,37 @@ type Query {
|
|||||||
public function testPrintUnions() : void
|
public function testPrintUnions() : void
|
||||||
{
|
{
|
||||||
$fooType = new ObjectType([
|
$fooType = new ObjectType([
|
||||||
'name' => 'Foo',
|
'name' => 'Foo',
|
||||||
'fields' => ['bool' => ['type' => Type::boolean()]]
|
'fields' => ['bool' => ['type' => Type::boolean()]],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$barType = new ObjectType([
|
$barType = new ObjectType([
|
||||||
'name' => 'Bar',
|
'name' => 'Bar',
|
||||||
'fields' => ['str' => ['type' => Type::string()]]
|
'fields' => ['str' => ['type' => Type::string()]],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$singleUnion = new UnionType([
|
$singleUnion = new UnionType([
|
||||||
'name' => 'SingleUnion',
|
'name' => 'SingleUnion',
|
||||||
'types' => [$fooType]
|
'types' => [$fooType],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$multipleUnion = new UnionType([
|
$multipleUnion = new UnionType([
|
||||||
'name' => 'MultipleUnion',
|
'name' => 'MultipleUnion',
|
||||||
'types' => [$fooType, $barType]
|
'types' => [$fooType, $barType],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$query = new ObjectType([
|
$query = new ObjectType([
|
||||||
'name' => 'Query',
|
'name' => 'Query',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'single' => ['type' => $singleUnion],
|
'single' => ['type' => $singleUnion],
|
||||||
'multiple' => ['type' => $multipleUnion]
|
'multiple' => ['type' => $multipleUnion],
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$schema = new Schema(['query' => $query]);
|
$schema = new Schema(['query' => $query]);
|
||||||
$output = $this->printForTest($schema);
|
$output = $this->printForTest($schema);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Bar {
|
type Bar {
|
||||||
str: String
|
str: String
|
||||||
}
|
}
|
||||||
@ -487,7 +543,9 @@ type Query {
|
|||||||
}
|
}
|
||||||
|
|
||||||
union SingleUnion = Foo
|
union SingleUnion = Foo
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -496,23 +554,24 @@ union SingleUnion = Foo
|
|||||||
public function testInputType() : void
|
public function testInputType() : void
|
||||||
{
|
{
|
||||||
$inputType = new InputObjectType([
|
$inputType = new InputObjectType([
|
||||||
'name' => 'InputType',
|
'name' => 'InputType',
|
||||||
'fields' => ['int' => ['type' => Type::int()]]
|
'fields' => ['int' => ['type' => Type::int()]],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$query = new ObjectType([
|
$query = new ObjectType([
|
||||||
'name' => 'Query',
|
'name' => 'Query',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'str' => [
|
'str' => [
|
||||||
'type' => Type::string(),
|
'type' => Type::string(),
|
||||||
'args' => ['argOne' => ['type' => $inputType]]
|
'args' => ['argOne' => ['type' => $inputType]],
|
||||||
]
|
],
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$schema = new Schema(['query' => $query]);
|
$schema = new Schema(['query' => $query]);
|
||||||
$output = $this->printForTest($schema);
|
$output = $this->printForTest($schema);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
input InputType {
|
input InputType {
|
||||||
int: Int
|
int: Int
|
||||||
}
|
}
|
||||||
@ -520,7 +579,9 @@ input InputType {
|
|||||||
type Query {
|
type Query {
|
||||||
str(argOne: InputType): String
|
str(argOne: InputType): String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -529,28 +590,31 @@ type Query {
|
|||||||
public function testCustomScalar() : void
|
public function testCustomScalar() : void
|
||||||
{
|
{
|
||||||
$oddType = new CustomScalarType([
|
$oddType = new CustomScalarType([
|
||||||
'name' => 'Odd',
|
'name' => 'Odd',
|
||||||
'serialize' => function($value) {
|
'serialize' => function ($value) {
|
||||||
return $value % 2 === 1 ? $value : null;
|
return $value % 2 === 1 ? $value : null;
|
||||||
}
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$query = new ObjectType([
|
$query = new ObjectType([
|
||||||
'name' => 'Query',
|
'name' => 'Query',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'odd' => ['type' => $oddType]
|
'odd' => ['type' => $oddType],
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$schema = new Schema(['query' => $query]);
|
$schema = new Schema(['query' => $query]);
|
||||||
$output = $this->printForTest($schema);
|
$output = $this->printForTest($schema);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
scalar Odd
|
scalar Odd
|
||||||
|
|
||||||
type Query {
|
type Query {
|
||||||
odd: Odd
|
odd: Odd
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -559,24 +623,25 @@ type Query {
|
|||||||
public function testEnum() : void
|
public function testEnum() : void
|
||||||
{
|
{
|
||||||
$RGBType = new EnumType([
|
$RGBType = new EnumType([
|
||||||
'name' => 'RGB',
|
'name' => 'RGB',
|
||||||
'values' => [
|
'values' => [
|
||||||
'RED' => ['value' => 0],
|
'RED' => ['value' => 0],
|
||||||
'GREEN' => ['value' => 1],
|
'GREEN' => ['value' => 1],
|
||||||
'BLUE' => ['value' => 2]
|
'BLUE' => ['value' => 2],
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$query = new ObjectType([
|
$query = new ObjectType([
|
||||||
'name' => 'Query',
|
'name' => 'Query',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'rgb' => ['type' => $RGBType]
|
'rgb' => ['type' => $RGBType],
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$schema = new Schema(['query' => $query]);
|
$schema = new Schema(['query' => $query]);
|
||||||
$output = $this->printForTest($schema);
|
$output = $this->printForTest($schema);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
rgb: RGB
|
rgb: RGB
|
||||||
}
|
}
|
||||||
@ -586,7 +651,9 @@ enum RGB {
|
|||||||
GREEN
|
GREEN
|
||||||
BLUE
|
BLUE
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -595,32 +662,35 @@ enum RGB {
|
|||||||
public function testPrintsCustomDirectives() : void
|
public function testPrintsCustomDirectives() : void
|
||||||
{
|
{
|
||||||
$query = new ObjectType([
|
$query = new ObjectType([
|
||||||
'name' => 'Query',
|
'name' => 'Query',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'field' => ['type' => Type::string()],
|
'field' => ['type' => Type::string()],
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$customDirectives = new Directive([
|
$customDirectives = new Directive([
|
||||||
'name' => 'customDirective',
|
'name' => 'customDirective',
|
||||||
'locations' => [
|
'locations' => [
|
||||||
DirectiveLocation::FIELD
|
DirectiveLocation::FIELD,
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$schema = new Schema([
|
$schema = new Schema([
|
||||||
'query' => $query,
|
'query' => $query,
|
||||||
'directives' => [$customDirectives],
|
'directives' => [$customDirectives],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$output = $this->printForTest($schema);
|
$output = $this->printForTest($schema);
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
directive @customDirective on FIELD
|
directive @customDirective on FIELD
|
||||||
|
|
||||||
type Query {
|
type Query {
|
||||||
field: String
|
field: String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -629,19 +699,22 @@ type Query {
|
|||||||
public function testOneLinePrintsAShortDescription() : void
|
public function testOneLinePrintsAShortDescription() : void
|
||||||
{
|
{
|
||||||
$description = 'This field is awesome';
|
$description = 'This field is awesome';
|
||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
"type" => Type::string(),
|
'type' => Type::string(),
|
||||||
"description" => $description
|
'description' => $description,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
"""This field is awesome"""
|
"""This field is awesome"""
|
||||||
singleField: String
|
singleField: String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
|
|
||||||
$recreatedRoot = BuildSchema::build($output)->getTypeMap()['Query'];
|
$recreatedRoot = BuildSchema::build($output)->getTypeMap()['Query'];
|
||||||
$recreatedField = $recreatedRoot->getFields()['singleField'];
|
$recreatedField = $recreatedRoot->getFields()['singleField'];
|
||||||
$this->assertEquals($description, $recreatedField->description);
|
$this->assertEquals($description, $recreatedField->description);
|
||||||
}
|
}
|
||||||
@ -652,21 +725,24 @@ type Query {
|
|||||||
public function testDoesNotOneLinePrintADescriptionThatEndsWithAQuote() : void
|
public function testDoesNotOneLinePrintADescriptionThatEndsWithAQuote() : void
|
||||||
{
|
{
|
||||||
$description = 'This field is "awesome"';
|
$description = 'This field is "awesome"';
|
||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
"type" => Type::string(),
|
'type' => Type::string(),
|
||||||
"description" => $description
|
'description' => $description,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
"""
|
"""
|
||||||
This field is "awesome"
|
This field is "awesome"
|
||||||
"""
|
"""
|
||||||
singleField: String
|
singleField: String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
|
|
||||||
$recreatedRoot = BuildSchema::build($output)->getTypeMap()['Query'];
|
$recreatedRoot = BuildSchema::build($output)->getTypeMap()['Query'];
|
||||||
$recreatedField = $recreatedRoot->getFields()['singleField'];
|
$recreatedField = $recreatedRoot->getFields()['singleField'];
|
||||||
$this->assertEquals($description, $recreatedField->description);
|
$this->assertEquals($description, $recreatedField->description);
|
||||||
}
|
}
|
||||||
@ -677,20 +753,23 @@ type Query {
|
|||||||
public function testPReservesLeadingSpacesWhenPrintingADescription() : void
|
public function testPReservesLeadingSpacesWhenPrintingADescription() : void
|
||||||
{
|
{
|
||||||
$description = ' This field is "awesome"';
|
$description = ' This field is "awesome"';
|
||||||
$output = $this->printSingleFieldSchema([
|
$output = $this->printSingleFieldSchema([
|
||||||
"type" => Type::string(),
|
'type' => Type::string(),
|
||||||
"description" => $description
|
'description' => $description,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->assertEquals('
|
$this->assertEquals(
|
||||||
|
'
|
||||||
type Query {
|
type Query {
|
||||||
""" This field is "awesome"
|
""" This field is "awesome"
|
||||||
"""
|
"""
|
||||||
singleField: String
|
singleField: String
|
||||||
}
|
}
|
||||||
', $output);
|
',
|
||||||
|
$output
|
||||||
|
);
|
||||||
|
|
||||||
$recreatedRoot = BuildSchema::build($output)->getTypeMap()['Query'];
|
$recreatedRoot = BuildSchema::build($output)->getTypeMap()['Query'];
|
||||||
$recreatedField = $recreatedRoot->getFields()['singleField'];
|
$recreatedField = $recreatedRoot->getFields()['singleField'];
|
||||||
$this->assertEquals($description, $recreatedField->description);
|
$this->assertEquals($description, $recreatedField->description);
|
||||||
}
|
}
|
||||||
@ -701,14 +780,14 @@ type Query {
|
|||||||
public function testPrintIntrospectionSchema() : void
|
public function testPrintIntrospectionSchema() : void
|
||||||
{
|
{
|
||||||
$query = new ObjectType([
|
$query = new ObjectType([
|
||||||
'name' => 'Query',
|
'name' => 'Query',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'onlyField' => ['type' => Type::string()]
|
'onlyField' => ['type' => Type::string()],
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$schema = new Schema(['query' => $query]);
|
$schema = new Schema(['query' => $query]);
|
||||||
$output = SchemaPrinter::printIntrosepctionSchema($schema);
|
$output = SchemaPrinter::printIntrosepctionSchema($schema);
|
||||||
$introspectionSchema = <<<'EOT'
|
$introspectionSchema = <<<'EOT'
|
||||||
"""
|
"""
|
||||||
Directs the executor to include this field or fragment only when the `if` argument is true.
|
Directs the executor to include this field or fragment only when the `if` argument is true.
|
||||||
@ -946,16 +1025,17 @@ EOT;
|
|||||||
public function testPrintIntrospectionSchemaWithCommentDescriptions() : void
|
public function testPrintIntrospectionSchemaWithCommentDescriptions() : void
|
||||||
{
|
{
|
||||||
$query = new ObjectType([
|
$query = new ObjectType([
|
||||||
'name' => 'Query',
|
'name' => 'Query',
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'onlyField' => ['type' => Type::string()]
|
'onlyField' => ['type' => Type::string()],
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$schema = new Schema(['query' => $query]);
|
$schema = new Schema(['query' => $query]);
|
||||||
$output = SchemaPrinter::printIntrosepctionSchema($schema, [
|
$output = SchemaPrinter::printIntrosepctionSchema(
|
||||||
'commentDescriptions' => true
|
$schema,
|
||||||
]);
|
['commentDescriptions' => true]
|
||||||
|
);
|
||||||
$introspectionSchema = <<<'EOT'
|
$introspectionSchema = <<<'EOT'
|
||||||
# Directs the executor to include this field or fragment only when the `if` argument is true.
|
# Directs the executor to include this field or fragment only when the `if` argument is true.
|
||||||
directive @include(
|
directive @include(
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace GraphQL\Tests\Utils;
|
namespace GraphQL\Tests\Utils;
|
||||||
|
|
||||||
use GraphQL\Executor\Values;
|
|
||||||
use GraphQL\Type\Definition\Type;
|
|
||||||
use GraphQL\Utils\Utils;
|
use GraphQL\Utils\Utils;
|
||||||
use GraphQL\Utils\Value;
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
class SuggestionListTest extends TestCase
|
class SuggestionListTest extends TestCase
|
||||||
{
|
{
|
||||||
// DESCRIBE: suggestionList
|
// DESCRIBE: suggestionList
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('Returns results when input is empty')
|
* @see it('Returns results when input is empty')
|
||||||
*/
|
*/
|
||||||
|
@ -1,26 +1,21 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace GraphQL\Tests\Utils;
|
namespace GraphQL\Tests\Utils;
|
||||||
|
|
||||||
use GraphQL\Language\AST\NullValueNode;
|
|
||||||
use GraphQL\Language\Parser;
|
use GraphQL\Language\Parser;
|
||||||
use GraphQL\Type\Definition\EnumType;
|
use GraphQL\Type\Definition\EnumType;
|
||||||
use GraphQL\Type\Definition\InputObjectType;
|
use GraphQL\Type\Definition\InputObjectType;
|
||||||
use GraphQL\Type\Definition\Type;
|
use GraphQL\Type\Definition\Type;
|
||||||
use GraphQL\Utils\Utils;
|
|
||||||
use GraphQL\Utils\AST;
|
use GraphQL\Utils\AST;
|
||||||
|
use GraphQL\Utils\Utils;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
class ValueFromAstTest extends TestCase
|
class ValueFromAstTest extends TestCase
|
||||||
{
|
{
|
||||||
private function runTestCase($type, $valueText, $expected)
|
/** @var InputObjectType */
|
||||||
{
|
private $inputObj;
|
||||||
$this->assertEquals($expected, AST::valueFromAST(Parser::parseValue($valueText), $type));
|
|
||||||
}
|
|
||||||
|
|
||||||
private function runTestCaseWithVars($variables, $type, $valueText, $expected)
|
|
||||||
{
|
|
||||||
$this->assertEquals($expected, AST::valueFromAST(Parser::parseValue($valueText), $type, $variables));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('rejects empty input')
|
* @see it('rejects empty input')
|
||||||
@ -45,6 +40,11 @@ class ValueFromAstTest extends TestCase
|
|||||||
$this->runTestCase(Type::id(), '"123456"', '123456');
|
$this->runTestCase(Type::id(), '"123456"', '123456');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function runTestCase($type, $valueText, $expected)
|
||||||
|
{
|
||||||
|
$this->assertEquals($expected, AST::valueFromAST(Parser::parseValue($valueText), $type));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('does not convert when input coercion rules reject a value')
|
* @see it('does not convert when input coercion rules reject a value')
|
||||||
*/
|
*/
|
||||||
@ -68,13 +68,13 @@ class ValueFromAstTest extends TestCase
|
|||||||
public function testConvertsEnumValuesAccordingToInputCoercionRules() : void
|
public function testConvertsEnumValuesAccordingToInputCoercionRules() : void
|
||||||
{
|
{
|
||||||
$testEnum = new EnumType([
|
$testEnum = new EnumType([
|
||||||
'name' => 'TestColor',
|
'name' => 'TestColor',
|
||||||
'values' => [
|
'values' => [
|
||||||
'RED' => ['value' => 1],
|
'RED' => ['value' => 1],
|
||||||
'GREEN' => ['value' => 2],
|
'GREEN' => ['value' => 2],
|
||||||
'BLUE' => ['value' => 3],
|
'BLUE' => ['value' => 3],
|
||||||
'NULL' => ['value' => null],
|
'NULL' => ['value' => null],
|
||||||
]
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->runTestCase($testEnum, 'RED', 1);
|
$this->runTestCase($testEnum, 'RED', 1);
|
||||||
@ -100,14 +100,14 @@ class ValueFromAstTest extends TestCase
|
|||||||
public function testCoercesListsOfValues() : void
|
public function testCoercesListsOfValues() : void
|
||||||
{
|
{
|
||||||
$listOfBool = Type::listOf(Type::boolean());
|
$listOfBool = Type::listOf(Type::boolean());
|
||||||
$undefined = Utils::undefined();
|
$undefined = Utils::undefined();
|
||||||
|
|
||||||
$this->runTestCase($listOfBool, 'true', [ true ]);
|
$this->runTestCase($listOfBool, 'true', [true]);
|
||||||
$this->runTestCase($listOfBool, '123', $undefined);
|
$this->runTestCase($listOfBool, '123', $undefined);
|
||||||
$this->runTestCase($listOfBool, 'null', null);
|
$this->runTestCase($listOfBool, 'null', null);
|
||||||
$this->runTestCase($listOfBool, '[true, false]', [ true, false ]);
|
$this->runTestCase($listOfBool, '[true, false]', [true, false]);
|
||||||
$this->runTestCase($listOfBool, '[true, 123]', $undefined);
|
$this->runTestCase($listOfBool, '[true, 123]', $undefined);
|
||||||
$this->runTestCase($listOfBool, '[true, null]', [ true, null ]);
|
$this->runTestCase($listOfBool, '[true, null]', [true, null]);
|
||||||
$this->runTestCase($listOfBool, '{ true: true }', $undefined);
|
$this->runTestCase($listOfBool, '{ true: true }', $undefined);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,14 +117,14 @@ class ValueFromAstTest extends TestCase
|
|||||||
public function testCoercesNonNullListsOfValues() : void
|
public function testCoercesNonNullListsOfValues() : void
|
||||||
{
|
{
|
||||||
$nonNullListOfBool = Type::nonNull(Type::listOf(Type::boolean()));
|
$nonNullListOfBool = Type::nonNull(Type::listOf(Type::boolean()));
|
||||||
$undefined = Utils::undefined();
|
$undefined = Utils::undefined();
|
||||||
|
|
||||||
$this->runTestCase($nonNullListOfBool, 'true', [ true ]);
|
$this->runTestCase($nonNullListOfBool, 'true', [true]);
|
||||||
$this->runTestCase($nonNullListOfBool, '123', $undefined);
|
$this->runTestCase($nonNullListOfBool, '123', $undefined);
|
||||||
$this->runTestCase($nonNullListOfBool, 'null', $undefined);
|
$this->runTestCase($nonNullListOfBool, 'null', $undefined);
|
||||||
$this->runTestCase($nonNullListOfBool, '[true, false]', [ true, false ]);
|
$this->runTestCase($nonNullListOfBool, '[true, false]', [true, false]);
|
||||||
$this->runTestCase($nonNullListOfBool, '[true, 123]', $undefined);
|
$this->runTestCase($nonNullListOfBool, '[true, 123]', $undefined);
|
||||||
$this->runTestCase($nonNullListOfBool, '[true, null]', [ true, null ]);
|
$this->runTestCase($nonNullListOfBool, '[true, null]', [true, null]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -133,12 +133,12 @@ class ValueFromAstTest extends TestCase
|
|||||||
public function testCoercesListsOfNonNullValues() : void
|
public function testCoercesListsOfNonNullValues() : void
|
||||||
{
|
{
|
||||||
$listOfNonNullBool = Type::listOf(Type::nonNull(Type::boolean()));
|
$listOfNonNullBool = Type::listOf(Type::nonNull(Type::boolean()));
|
||||||
$undefined = Utils::undefined();
|
$undefined = Utils::undefined();
|
||||||
|
|
||||||
$this->runTestCase($listOfNonNullBool, 'true', [ true ]);
|
$this->runTestCase($listOfNonNullBool, 'true', [true]);
|
||||||
$this->runTestCase($listOfNonNullBool, '123', $undefined);
|
$this->runTestCase($listOfNonNullBool, '123', $undefined);
|
||||||
$this->runTestCase($listOfNonNullBool, 'null', null);
|
$this->runTestCase($listOfNonNullBool, 'null', null);
|
||||||
$this->runTestCase($listOfNonNullBool, '[true, false]', [ true, false ]);
|
$this->runTestCase($listOfNonNullBool, '[true, false]', [true, false]);
|
||||||
$this->runTestCase($listOfNonNullBool, '[true, 123]', $undefined);
|
$this->runTestCase($listOfNonNullBool, '[true, 123]', $undefined);
|
||||||
$this->runTestCase($listOfNonNullBool, '[true, null]', $undefined);
|
$this->runTestCase($listOfNonNullBool, '[true, null]', $undefined);
|
||||||
}
|
}
|
||||||
@ -149,56 +149,63 @@ class ValueFromAstTest extends TestCase
|
|||||||
public function testCoercesNonNullListsOfNonNullValues() : void
|
public function testCoercesNonNullListsOfNonNullValues() : void
|
||||||
{
|
{
|
||||||
$nonNullListOfNonNullBool = Type::nonNull(Type::listOf(Type::nonNull(Type::boolean())));
|
$nonNullListOfNonNullBool = Type::nonNull(Type::listOf(Type::nonNull(Type::boolean())));
|
||||||
$undefined = Utils::undefined();
|
$undefined = Utils::undefined();
|
||||||
|
|
||||||
$this->runTestCase($nonNullListOfNonNullBool, 'true', [ true ]);
|
$this->runTestCase($nonNullListOfNonNullBool, 'true', [true]);
|
||||||
$this->runTestCase($nonNullListOfNonNullBool, '123', $undefined);
|
$this->runTestCase($nonNullListOfNonNullBool, '123', $undefined);
|
||||||
$this->runTestCase($nonNullListOfNonNullBool, 'null', $undefined);
|
$this->runTestCase($nonNullListOfNonNullBool, 'null', $undefined);
|
||||||
$this->runTestCase($nonNullListOfNonNullBool, '[true, false]', [ true, false ]);
|
$this->runTestCase($nonNullListOfNonNullBool, '[true, false]', [true, false]);
|
||||||
$this->runTestCase($nonNullListOfNonNullBool, '[true, 123]', $undefined);
|
$this->runTestCase($nonNullListOfNonNullBool, '[true, 123]', $undefined);
|
||||||
$this->runTestCase($nonNullListOfNonNullBool, '[true, null]', $undefined);
|
$this->runTestCase($nonNullListOfNonNullBool, '[true, null]', $undefined);
|
||||||
}
|
}
|
||||||
|
|
||||||
private $inputObj;
|
|
||||||
|
|
||||||
private function inputObj()
|
|
||||||
{
|
|
||||||
return $this->inputObj ?: $this->inputObj = new InputObjectType([
|
|
||||||
'name' => 'TestInput',
|
|
||||||
'fields' => [
|
|
||||||
'int' => [ 'type' => Type::int(), 'defaultValue' => 42 ],
|
|
||||||
'bool' => [ 'type' => Type::boolean() ],
|
|
||||||
'requiredBool' => [ 'type' => Type::nonNull(Type::boolean()) ],
|
|
||||||
]
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('coerces input objects according to input coercion rules')
|
* @see it('coerces input objects according to input coercion rules')
|
||||||
*/
|
*/
|
||||||
public function testCoercesInputObjectsAccordingToInputCoercionRules() : void
|
public function testCoercesInputObjectsAccordingToInputCoercionRules() : void
|
||||||
{
|
{
|
||||||
$testInputObj = $this->inputObj();
|
$testInputObj = $this->inputObj();
|
||||||
$undefined = Utils::undefined();
|
$undefined = Utils::undefined();
|
||||||
|
|
||||||
$this->runTestCase($testInputObj, 'null', null);
|
$this->runTestCase($testInputObj, 'null', null);
|
||||||
$this->runTestCase($testInputObj, '123', $undefined);
|
$this->runTestCase($testInputObj, '123', $undefined);
|
||||||
$this->runTestCase($testInputObj, '[]', $undefined);
|
$this->runTestCase($testInputObj, '[]', $undefined);
|
||||||
$this->runTestCase($testInputObj, '{ int: 123, requiredBool: false }', ['int' => 123, 'requiredBool' => false]);
|
$this->runTestCase($testInputObj, '{ int: 123, requiredBool: false }', ['int' => 123, 'requiredBool' => false]);
|
||||||
$this->runTestCase($testInputObj, '{ bool: true, requiredBool: false }', [ 'int' => 42, 'bool' => true, 'requiredBool' => false ]);
|
$this->runTestCase(
|
||||||
|
$testInputObj,
|
||||||
|
'{ bool: true, requiredBool: false }',
|
||||||
|
['int' => 42, 'bool' => true, 'requiredBool' => false]
|
||||||
|
);
|
||||||
$this->runTestCase($testInputObj, '{ int: true, requiredBool: true }', $undefined);
|
$this->runTestCase($testInputObj, '{ int: true, requiredBool: true }', $undefined);
|
||||||
$this->runTestCase($testInputObj, '{ requiredBool: null }', $undefined);
|
$this->runTestCase($testInputObj, '{ requiredBool: null }', $undefined);
|
||||||
$this->runTestCase($testInputObj, '{ bool: true }', $undefined);
|
$this->runTestCase($testInputObj, '{ bool: true }', $undefined);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function inputObj()
|
||||||
|
{
|
||||||
|
return $this->inputObj ?: $this->inputObj = new InputObjectType([
|
||||||
|
'name' => 'TestInput',
|
||||||
|
'fields' => [
|
||||||
|
'int' => ['type' => Type::int(), 'defaultValue' => 42],
|
||||||
|
'bool' => ['type' => Type::boolean()],
|
||||||
|
'requiredBool' => ['type' => Type::nonNull(Type::boolean())],
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see it('accepts variable values assuming already coerced')
|
* @see it('accepts variable values assuming already coerced')
|
||||||
*/
|
*/
|
||||||
public function testAcceptsVariableValuesAssumingAlreadyCoerced() : void
|
public function testAcceptsVariableValuesAssumingAlreadyCoerced() : void
|
||||||
{
|
{
|
||||||
$this->runTestCaseWithVars([], Type::boolean(), '$var', Utils::undefined());
|
$this->runTestCaseWithVars([], Type::boolean(), '$var', Utils::undefined());
|
||||||
$this->runTestCaseWithVars([ 'var' => true ], Type::boolean(), '$var', true);
|
$this->runTestCaseWithVars(['var' => true], Type::boolean(), '$var', true);
|
||||||
$this->runTestCaseWithVars([ 'var' => null ], Type::boolean(), '$var', null);
|
$this->runTestCaseWithVars(['var' => null], Type::boolean(), '$var', null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function runTestCaseWithVars($variables, $type, $valueText, $expected)
|
||||||
|
{
|
||||||
|
$this->assertEquals($expected, AST::valueFromAST(Parser::parseValue($valueText), $type, $variables));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -206,16 +213,16 @@ class ValueFromAstTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testAssertsVariablesAreProvidedAsItemsInLists() : void
|
public function testAssertsVariablesAreProvidedAsItemsInLists() : void
|
||||||
{
|
{
|
||||||
$listOfBool = Type::listOf(Type::boolean());
|
$listOfBool = Type::listOf(Type::boolean());
|
||||||
$listOfNonNullBool = Type::listOf(Type::nonNull(Type::boolean()));
|
$listOfNonNullBool = Type::listOf(Type::nonNull(Type::boolean()));
|
||||||
|
|
||||||
$this->runTestCaseWithVars([], $listOfBool, '[ $foo ]', [ null ]);
|
$this->runTestCaseWithVars([], $listOfBool, '[ $foo ]', [null]);
|
||||||
$this->runTestCaseWithVars([], $listOfNonNullBool, '[ $foo ]', Utils::undefined());
|
$this->runTestCaseWithVars([], $listOfNonNullBool, '[ $foo ]', Utils::undefined());
|
||||||
$this->runTestCaseWithVars([ 'foo' => true ], $listOfNonNullBool, '[ $foo ]', [ true ]);
|
$this->runTestCaseWithVars(['foo' => true], $listOfNonNullBool, '[ $foo ]', [true]);
|
||||||
// Note: variables are expected to have already been coerced, so we
|
// Note: variables are expected to have already been coerced, so we
|
||||||
// do not expect the singleton wrapping behavior for variables.
|
// do not expect the singleton wrapping behavior for variables.
|
||||||
$this->runTestCaseWithVars([ 'foo' => true ], $listOfNonNullBool, '$foo', true);
|
$this->runTestCaseWithVars(['foo' => true], $listOfNonNullBool, '$foo', true);
|
||||||
$this->runTestCaseWithVars([ 'foo' => [ true ] ], $listOfNonNullBool, '$foo', [ true ]);
|
$this->runTestCaseWithVars(['foo' => [true]], $listOfNonNullBool, '$foo', [true]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -229,7 +236,7 @@ class ValueFromAstTest extends TestCase
|
|||||||
[],
|
[],
|
||||||
$testInputObj,
|
$testInputObj,
|
||||||
'{ int: $foo, bool: $foo, requiredBool: true }',
|
'{ int: $foo, bool: $foo, requiredBool: true }',
|
||||||
[ 'int' => 42, 'requiredBool' => true ]
|
['int' => 42, 'requiredBool' => true]
|
||||||
);
|
);
|
||||||
$this->runTestCaseWithVars(
|
$this->runTestCaseWithVars(
|
||||||
[],
|
[],
|
||||||
@ -238,10 +245,10 @@ class ValueFromAstTest extends TestCase
|
|||||||
Utils::undefined()
|
Utils::undefined()
|
||||||
);
|
);
|
||||||
$this->runTestCaseWithVars(
|
$this->runTestCaseWithVars(
|
||||||
[ 'foo' => true ],
|
['foo' => true],
|
||||||
$testInputObj,
|
$testInputObj,
|
||||||
'{ requiredBool: $foo }',
|
'{ requiredBool: $foo }',
|
||||||
[ 'int' => 42, 'requiredBool' => true ]
|
['int' => 42, 'requiredBool' => true]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user