graphql-php/tests/Language/SchemaPrinterTest.php

168 lines
3.4 KiB
PHP
Raw Normal View History

2016-04-24 14:01:04 +03:00
<?php
namespace GraphQL\Tests;
use GraphQL\Language\AST\NameNode;
use GraphQL\Language\AST\ScalarTypeDefinitionNode;
2016-04-24 14:01:04 +03:00
use GraphQL\Language\Parser;
use GraphQL\Language\Printer;
2018-07-29 18:43:10 +03:00
use PHPUnit\Framework\TestCase;
use Throwable;
2016-04-24 14:01:04 +03:00
2018-07-29 18:43:10 +03:00
class SchemaPrinterTest extends TestCase
2016-04-24 14:01:04 +03:00
{
/**
* @it prints minimal ast
*/
public function testPrintsMinimalAst()
{
$ast = new ScalarTypeDefinitionNode([
'name' => new NameNode(['value' => 'foo'])
2016-04-24 14:01:04 +03:00
]);
$this->assertEquals('scalar foo', Printer::doPrint($ast));
}
/**
* @it produces helpful error messages
*/
public function testProducesHelpfulErrorMessages()
{
2018-07-29 18:43:10 +03:00
$this->expectException(Throwable::class);
$this->expectExceptionMessage('Invalid AST Node: {"random":"Data"}');
2016-04-24 14:01:04 +03:00
// $badAst1 = { random: 'Data' };
$badAst = (object) ['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 & Baz {
2016-04-24 14:01:04 +03:00
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
2016-11-18 19:59:28 +03:00
seven(argument: Int = null): Type
2016-04-24 14:01:04 +03:00
}
type AnnotatedObject @onObject(arg: "value") {
annotatedField(arg: Type = "default" @onArg): Type @onField
}
type UndefinedType
extend type Foo {
seven(argument: [String]): Type
}
extend type Foo @onType
2016-04-24 14:01:04 +03:00
interface Bar {
one: Type
four(argument: String = "string"): String
}
interface AnnotatedInterface @onInterface {
annotatedField(arg: Type @onArg): Type @onField
}
interface UndefinedInterface
extend interface Bar {
two(argument: InputType!): Type
}
extend interface Bar @onInterface
2016-04-24 14:01:04 +03:00
union Feed = Story | Article | Advert
union AnnotatedUnion @onUnion = A | B
union AnnotatedUnionTwo @onUnion = A | B
union UndefinedUnion
extend union Feed = Photo | Video
extend union Feed @onUnion
2016-04-24 14:01:04 +03:00
scalar CustomScalar
scalar AnnotatedScalar @onScalar
extend scalar CustomScalar @onScalar
2016-04-24 14:01:04 +03:00
enum Site {
DESKTOP
MOBILE
}
enum AnnotatedEnum @onEnum {
ANNOTATED_VALUE @onEnumValue
OTHER_VALUE
}
enum UndefinedEnum
extend enum Site {
VR
}
extend enum Site @onEnum
2016-04-24 14:01:04 +03:00
input InputType {
key: String!
answer: Int = 42
}
input AnnotatedInput @onInputObject {
annotatedField: Type @onField
}
input UndefinedInput
extend input InputType {
other: Float = 1.23e4
2016-04-24 14:01:04 +03:00
}
extend input InputType @onInputObject
2016-04-24 14:01:04 +03:00
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
2016-04-24 14:01:04 +03:00
';
$this->assertEquals($expected, $printed);
}
}