cloneDeep(); $this->assertEquals($astCopy, $ast); $printer = new Printer(); $printer->doPrint($ast); $this->assertEquals($astCopy, $ast); } /** * @it prints minimal ast */ public function testPrintsMinimalAst() { $printer = new Printer(); $ast = new Field(['name' => new Name(['value' => 'foo'])]); $this->assertEquals('foo', $printer->doPrint($ast)); } /** * @it produces helpful error messages */ public function testProducesHelpfulErrorMessages() { $badAst1 = new \ArrayObject(array('random' => 'Data')); try { $printer = new Printer(); $printer->doPrint($badAst1); $this->fail('Expected exception not thrown'); } catch (\Exception $e) { $this->assertEquals('Invalid AST Node: {"random":"Data"}', $e->getMessage()); } } /** * @it correctly prints non-query operations without name */ public function testCorrectlyPrintsOpsWithoutName() { $queryAstShorthanded = Parser::parse('query { id, name }'); $printer = new Printer(); $expected = '{ id name } '; $this->assertEquals($expected, $printer->doPrint($queryAstShorthanded)); $mutationAst = Parser::parse('mutation { id, name }'); $expected = 'mutation { id name } '; $this->assertEquals($expected, $printer->doPrint($mutationAst)); $queryAstWithArtifacts = Parser::parse( 'query ($foo: TestType) @testDirective { id, name }' ); $expected = 'query ($foo: TestType) @testDirective { id name } '; $this->assertEquals($expected, $printer->doPrint($queryAstWithArtifacts)); $mutationAstWithArtifacts = Parser::parse( 'mutation ($foo: TestType) @testDirective { id, name }' ); $expected = 'mutation ($foo: TestType) @testDirective { id name } '; $this->assertEquals($expected, $printer->doPrint($mutationAstWithArtifacts)); } /** * @it prints kitchen sink */ public function testPrintsKitchenSink() { $kitchenSink = file_get_contents(__DIR__ . '/kitchen-sink.graphql'); $ast = Parser::parse($kitchenSink); $printer = new Printer(); $printed = $printer->doPrint($ast); $expected = <<<'EOT' query queryName($foo: ComplexType, $site: Site = MOBILE) { whoever123is: node(id: [123, 456]) { id ... on User @defer { field2 { id alias: field1(first: 10, after: $foo) @include(if: $foo) { id ...frag } } } ... @skip(unless: $foo) { id } ... { id } } } mutation likeStory { like(story: 123) @defer { story { id } } } subscription StoryLikeSubscription($input: StoryLikeSubscribeInput) { storyLikeSubscribe(input: $input) { story { likers { count } likeSentence { text } } } } fragment frag on Friend { foo(size: $size, bar: $b, obj: {key: "value"}) } { unnamed(truthy: true, falsey: false) query } EOT; $this->assertEquals($expected, $printed); } }