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); }
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()); }