Inheritance: extends AbstractSchema
Example #1
0
 public function testCustomTypes()
 {
     $authorType = null;
     $userInterface = new ObjectType(['name' => 'UserInterface', 'fields' => ['name' => new StringType()], 'resolveType' => function () use($authorType) {
         return $authorType;
     }]);
     $authorType = new ObjectType(['name' => 'Author', 'fields' => ['name' => new StringType()], 'interfaces' => [$userInterface]]);
     $schema = new Schema(['query' => new ObjectType(['name' => 'QueryType', 'fields' => ['user' => ['type' => $userInterface, 'resolve' => function () {
         return ['name' => 'Alex'];
     }]]])]);
     $schema->getTypesList()->addType($authorType);
     $processor = new Processor($schema);
     $processor->processPayload('{ user { name } }');
     $this->assertEquals(['data' => ['user' => ['name' => 'Alex']]], $processor->getResponseData());
     $processor->processPayload('{
                 __schema {
                     types {
                         name
                     }
                 }
             }');
     $data = $processor->getResponseData();
     $this->assertArraySubset([11 => ['name' => 'Author']], $data['data']['__schema']['types']);
     $processor->processPayload('{ user { name { } } }');
     $result = $processor->getResponseData();
     $this->assertEquals(['errors' => [['message' => 'Unexpected token "RBRACE"', 'locations' => [['line' => 1, 'column' => 19]]]]], $result);
     $processor->getExecutionContext()->clearErrors();
     $processor->processPayload('{ user { name { invalidSelection } } }');
     $result = $processor->getResponseData();
     $this->assertEquals(['data' => ['user' => null], 'errors' => [['message' => 'You can\'t specify fields for scalar type "String"', 'locations' => [['line' => 1, 'column' => 10]]]]], $result);
 }
Example #2
0
 public function testSchemaOperations()
 {
     $schema = new Schema(['query' => new ObjectType(['name' => 'RootQuery', 'fields' => ['me' => ['type' => new ObjectType(['name' => 'User', 'fields' => ['firstName' => ['type' => new StringType(), 'args' => ['shorten' => new BooleanType()], 'resolve' => function ($value, $args) {
         return empty($args['shorten']) ? $value['firstName'] : $value['firstName'];
     }], 'id_alias' => ['type' => new IdType(), 'resolve' => function ($value) {
         return $value['id'];
     }], 'lastName' => new StringType(), 'code' => new StringType()]]), 'resolve' => function ($value, $args) {
         $data = ['id' => '123', 'firstName' => 'John', 'code' => '007'];
         if (!empty($args['upper'])) {
             foreach ($data as $key => $value) {
                 $data[$key] = strtoupper($value);
             }
         }
         return $data;
     }, 'args' => ['upper' => ['type' => new BooleanType(), 'default' => false]]], 'randomUser' => ['type' => new TestObjectType(), 'resolve' => function () {
         return ['invalidField' => 'John'];
     }], 'invalidValueQuery' => ['type' => new TestObjectType(), 'resolve' => function () {
         return 'stringValue';
     }], 'labels' => ['type' => new ListType(new StringType()), 'resolve' => function () {
         return ['one', 'two'];
     }]]])]);
     $processor = new Processor($schema);
     $processor->processPayload('mutation { __typename }');
     $this->assertEquals(['data' => ['__typename' => 'RootSchemaMutation']], $processor->getResponseData());
     $processor->processPayload('{ __typename }');
     $this->assertEquals(['data' => ['__typename' => 'RootQuery']], $processor->getResponseData());
     $processor->processPayload('{ me { firstName } }');
     $this->assertEquals(['data' => ['me' => ['firstName' => 'John']]], $processor->getResponseData());
     $processor->processPayload('{ me { id_alias } }');
     $this->assertEquals(['data' => ['me' => ['id_alias' => '123']]], $processor->getResponseData());
     $processor->processPayload('{ me { firstName, lastName } }');
     $this->assertEquals(['data' => ['me' => ['firstName' => 'John', 'lastName' => null]]], $processor->getResponseData());
     $processor->processPayload('{ me { code } }');
     $this->assertEquals(['data' => ['me' => ['code' => 7]]], $processor->getResponseData());
     $processor->processPayload('{ me(upper:true) { firstName } }');
     $this->assertEquals(['data' => ['me' => ['firstName' => 'JOHN']]], $processor->getResponseData());
     $processor->processPayload('{ labels }');
     $this->assertEquals(['data' => ['labels' => ['one', 'two']]], $processor->getResponseData());
     $schema->getMutationType()->addField(new Field(['name' => 'increaseCounter', 'type' => new IntType(), 'resolve' => function ($value, $args, ResolveInfo $info) {
         return $this->_counter += $args['amount'];
     }, 'args' => ['amount' => ['type' => new IntType(), 'default' => 1]]]))->addField(new Field(['name' => 'invalidResolveTypeMutation', 'type' => new NonNullType(new IntType()), 'resolve' => function () {
         return null;
     }]))->addField(new Field(['name' => 'interfacedMutation', 'type' => new TestInterfaceType(), 'resolve' => function () {
         return ['name' => 'John'];
     }]));
     $processor->processPayload('mutation { increaseCounter }');
     $this->assertEquals(['data' => ['increaseCounter' => 1]], $processor->getResponseData());
     $processor->processPayload('mutation { invalidMutation }');
     $this->assertEquals(['errors' => [['message' => 'Field "invalidMutation" not found in type "RootSchemaMutation"', 'locations' => [['line' => 1, 'column' => 12]]]]], $processor->getResponseData());
     $processor->getExecutionContext()->clearErrors();
     $processor->processPayload('mutation { increaseCounter(noArg: 2) }');
     $this->assertEquals(['data' => ['increaseCounter' => null], 'errors' => [['message' => 'Unknown argument "noArg" on field "increaseCounter"', 'locations' => [['line' => 1, 'column' => 28]]]]], $processor->getResponseData());
     $processor->getExecutionContext()->clearErrors();
     $processor->processPayload('mutation { increaseCounter(amount: 2) { invalidProp } }');
     $this->assertEquals(['errors' => [['message' => 'You can\'t specify fields for scalar type "Int"', 'locations' => [['line' => 1, 'column' => 12]]]], 'data' => ['increaseCounter' => null]], $processor->getResponseData());
     $processor->getExecutionContext()->clearErrors();
     $processor->processPayload('mutation { increaseCounter(amount: 2) }');
     $this->assertEquals(['data' => ['increaseCounter' => 3]], $processor->getResponseData());
     $processor->processPayload('{ invalidQuery }');
     $this->assertEquals(['errors' => [['message' => 'Field "invalidQuery" not found in type "RootQuery"', 'locations' => [['line' => 1, 'column' => 3]]]]], $processor->getResponseData());
     $processor->getExecutionContext()->clearErrors();
     $processor->processPayload('{ invalidValueQuery { id } }');
     $this->assertEquals(['errors' => [['message' => 'Not valid resolved type for field "invalidValueQuery"']], 'data' => ['invalidValueQuery' => null]], $processor->getResponseData());
     $processor->getExecutionContext()->clearErrors();
     $processor->processPayload('{ me { firstName(shorten: true), middle }}');
     $this->assertEquals(['data' => ['me' => null], 'errors' => [['message' => 'Field "middle" not found in type "User"', 'locations' => [['line' => 1, 'column' => 34]]]]], $processor->getResponseData());
     $processor->getExecutionContext()->clearErrors();
     $processor->processPayload('{ randomUser { region }}');
     $this->assertEquals(['data' => ['randomUser' => null], 'errors' => [['message' => 'You have to specify fields for "region"', 'locations' => [['line' => 1, 'column' => 16]]]]], $processor->getResponseData());
     $processor->getExecutionContext()->clearErrors();
     $processor->processPayload('mutation { invalidResolveTypeMutation }');
     $this->assertEquals(['data' => ['invalidResolveTypeMutation' => null], 'errors' => [['message' => 'Cannot return null for non-nullable field "invalidResolveTypeMutation"']]], $processor->getResponseData());
     $processor->getExecutionContext()->clearErrors();
     $processor->processPayload('mutation { user:interfacedMutation { name }  }');
     $this->assertEquals(['data' => ['user' => ['name' => 'John']]], $processor->getResponseData());
 }