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