Youshido\Tests\Schema\ProcessorTest::testSchemaOperations PHP Метод

testSchemaOperations() публичный Метод

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