mirror of
https://github.com/retailcrm/graphql-php.git
synced 2024-11-25 14:26:08 +03:00
022c490011
As discussed in facebook/graphql#90 This proposes replacing leading comment blocks as descriptions in the schema definition language with leading strings (typically block strings). While I think there is some reduced ergonomics of using a string literal instead of a comment to write descriptions (unless perhaps you are accustomed to Python or Clojure), there are some compelling advantages: * Descriptions are first-class in the AST of the schema definition language. * Comments can remain "ignored" characters. * No ambiguity between commented out regions and descriptions. Specific to this reference implementation, since this is a breaking change and comment descriptions in the experimental SDL have fairly wide usage, I've left the comment description implementation intact and allow it to be enabled via an option. This should help with allowing upgrading with minimal impact on existing codebases and aid in automated transforms. BREAKING CHANGE: This does not parse descriptions from comments by default anymore and the value of description in Nodes changed from string to StringValueNode
132 lines
2.9 KiB
PHP
132 lines
2.9 KiB
PHP
<?php
|
|
namespace GraphQL\Tests;
|
|
|
|
use GraphQL\Language\AST\NameNode;
|
|
use GraphQL\Language\AST\ScalarTypeDefinitionNode;
|
|
use GraphQL\Language\Parser;
|
|
use GraphQL\Language\Printer;
|
|
|
|
class SchemaPrinterTest extends \PHPUnit_Framework_TestCase
|
|
{
|
|
/**
|
|
* @it prints minimal ast
|
|
*/
|
|
public function testPrintsMinimalAst()
|
|
{
|
|
$ast = new ScalarTypeDefinitionNode([
|
|
'name' => new NameNode(['value' => 'foo'])
|
|
]);
|
|
$this->assertEquals('scalar foo', Printer::doPrint($ast));
|
|
}
|
|
|
|
/**
|
|
* @it produces helpful error messages
|
|
*/
|
|
public function testProducesHelpfulErrorMessages()
|
|
{
|
|
// $badAst1 = { random: 'Data' };
|
|
$badAst = (object) ['random' => 'Data'];
|
|
$this->setExpectedException('Exception', 'Invalid AST Node: {"random":"Data"}');
|
|
Printer::doPrint($badAst);
|
|
}
|
|
|
|
/**
|
|
* @it does not alter ast
|
|
*/
|
|
public function testDoesNotAlterAst()
|
|
{
|
|
$kitchenSink = file_get_contents(__DIR__ . '/schema-kitchen-sink.graphql');
|
|
|
|
$ast = Parser::parse($kitchenSink);
|
|
$astCopy = $ast->cloneDeep();
|
|
Printer::doPrint($ast);
|
|
|
|
$this->assertEquals($astCopy, $ast);
|
|
}
|
|
|
|
public function testPrintsKitchenSink()
|
|
{
|
|
$kitchenSink = file_get_contents(__DIR__ . '/schema-kitchen-sink.graphql');
|
|
|
|
$ast = Parser::parse($kitchenSink);
|
|
$printed = Printer::doPrint($ast);
|
|
|
|
$expected = 'schema {
|
|
query: QueryType
|
|
mutation: MutationType
|
|
}
|
|
|
|
"""
|
|
This is a description
|
|
of the `Foo` type.
|
|
"""
|
|
type Foo implements Bar {
|
|
one: Type
|
|
two(argument: InputType!): Type
|
|
three(argument: InputType, other: String): Int
|
|
four(argument: String = "string"): String
|
|
five(argument: [String] = ["string", "string"]): String
|
|
six(argument: InputType = {key: "value"}): Type
|
|
seven(argument: Int = null): Type
|
|
}
|
|
|
|
type AnnotatedObject @onObject(arg: "value") {
|
|
annotatedField(arg: Type = "default" @onArg): Type @onField
|
|
}
|
|
|
|
interface Bar {
|
|
one: Type
|
|
four(argument: String = "string"): String
|
|
}
|
|
|
|
interface AnnotatedInterface @onInterface {
|
|
annotatedField(arg: Type @onArg): Type @onField
|
|
}
|
|
|
|
union Feed = Story | Article | Advert
|
|
|
|
union AnnotatedUnion @onUnion = A | B
|
|
|
|
union AnnotatedUnionTwo @onUnion = A | B
|
|
|
|
scalar CustomScalar
|
|
|
|
scalar AnnotatedScalar @onScalar
|
|
|
|
enum Site {
|
|
DESKTOP
|
|
MOBILE
|
|
}
|
|
|
|
enum AnnotatedEnum @onEnum {
|
|
ANNOTATED_VALUE @onEnumValue
|
|
OTHER_VALUE
|
|
}
|
|
|
|
input InputType {
|
|
key: String!
|
|
answer: Int = 42
|
|
}
|
|
|
|
input AnnotatedInput @onInputObjectType {
|
|
annotatedField: Type @onField
|
|
}
|
|
|
|
extend type Foo {
|
|
seven(argument: [String]): Type
|
|
}
|
|
|
|
extend type Foo @onType {}
|
|
|
|
type NoFields {}
|
|
|
|
directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
|
|
|
|
directive @include(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
|
|
|
|
directive @include2(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
|
|
';
|
|
$this->assertEquals($expected, $printed);
|
|
}
|
|
}
|