GraphQL\Tests\Type\DefinitionTest::testAllowsRecursiveDefinitions PHP Method

testAllowsRecursiveDefinitions() public method

    public function testAllowsRecursiveDefinitions()
    {
        // See https://github.com/webonyx/graphql-php/issues/16
        $node = new InterfaceType(['name' => 'Node', 'fields' => ['id' => ['type' => Type::nonNull(Type::id())]]]);
        $blog = null;
        $called = false;
        $user = new ObjectType(['name' => 'User', 'fields' => function () use(&$blog, &$called) {
            $this->assertNotNull($blog, 'Blog type is expected to be defined at this point, but it is null');
            $called = true;
            return ['id' => ['type' => Type::nonNull(Type::id())], 'blogs' => ['type' => Type::nonNull(Type::listOf(Type::nonNull($blog)))]];
        }, 'interfaces' => function () use($node) {
            return [$node];
        }]);
        $blog = new ObjectType(['name' => 'Blog', 'fields' => function () use($user) {
            return ['id' => ['type' => Type::nonNull(Type::id())], 'owner' => ['type' => Type::nonNull($user)]];
        }, 'interfaces' => function () use($node) {
            return [$node];
        }]);
        $schema = new Schema(['query' => new ObjectType(['name' => 'Query', 'fields' => ['node' => ['type' => $node]]]), 'types' => [$user, $blog]]);
        $this->assertTrue($called);
        $this->assertEquals([$node], $blog->getInterfaces());
        $this->assertEquals([$node], $user->getInterfaces());
        $this->assertNotNull($user->getField('blogs'));
        $this->assertSame($blog, $user->getField('blogs')->getType()->getWrappedType(true));
        $this->assertNotNull($blog->getField('owner'));
        $this->assertSame($user, $blog->getField('owner')->getType()->getWrappedType(true));
    }