Completed
Pull Request — master (#60)
by David
01:54
created

RecursiveTypeMapperTest::testMapNameToType()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 8
dl 0
loc 15
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace TheCodingMachine\GraphQL\Controllers\Mappers;
4
5
use Doctrine\Common\Annotations\AnnotationReader;
6
use GraphQL\Type\Definition\InputObjectType;
7
use GraphQL\Type\Definition\InterfaceType;
8
use GraphQL\Type\Definition\ObjectType;
9
use Mouf\Picotainer\Picotainer;
10
use Symfony\Component\Cache\Simple\ArrayCache;
11
use Symfony\Component\Cache\Simple\NullCache;
12
use TheCodingMachine\GraphQL\Controllers\AbstractQueryProviderTest;
13
use TheCodingMachine\GraphQL\Controllers\Fixtures\Interfaces\ClassA;
14
use TheCodingMachine\GraphQL\Controllers\Fixtures\Interfaces\ClassB;
15
use TheCodingMachine\GraphQL\Controllers\Fixtures\Interfaces\ClassC;
16
use TheCodingMachine\GraphQL\Controllers\Fixtures\Interfaces\Types\ClassAType;
17
use TheCodingMachine\GraphQL\Controllers\Fixtures\Interfaces\Types\ClassBType;
18
use TheCodingMachine\GraphQL\Controllers\Fixtures\TestObject;
19
use TheCodingMachine\GraphQL\Controllers\NamingStrategy;
20
use TheCodingMachine\GraphQL\Controllers\TypeGenerator;
21
22
class RecursiveTypeMapperTest extends AbstractQueryProviderTest
23
{
24
25
    public function testMapClassToType()
26
    {
27
        $objectType = new ObjectType([
28
            'name' => 'Foobar'
29
        ]);
30
31
        $typeMapper = new StaticTypeMapper();
32
        $typeMapper->setTypes([
33
            ClassB::class => $objectType
34
        ]);
35
36
        $recursiveTypeMapper = new RecursiveTypeMapper($typeMapper, new NamingStrategy(), new ArrayCache());
37
38
        $this->assertFalse($typeMapper->canMapClassToType(ClassC::class));
39
        $this->assertTrue($recursiveTypeMapper->canMapClassToType(ClassC::class));
40
        $this->assertSame($objectType, $recursiveTypeMapper->mapClassToType(ClassC::class));
41
42
        $this->assertFalse($recursiveTypeMapper->canMapClassToType(ClassA::class));
43
        $this->expectException(CannotMapTypeException::class);
44
        $recursiveTypeMapper->mapClassToType(ClassA::class);
45
    }
46
47
    public function testMapNameToType()
48
    {
49
        $objectType = new ObjectType([
50
            'name' => 'Foobar'
51
        ]);
52
53
        $typeMapper = new StaticTypeMapper();
54
        $typeMapper->setTypes([
55
            ClassB::class => $objectType
56
        ]);
57
58
        $recursiveTypeMapper = new RecursiveTypeMapper($typeMapper, new NamingStrategy(), new ArrayCache());
59
60
        $this->assertTrue($recursiveTypeMapper->canMapNameToType('Foobar'));
61
        $this->assertSame($objectType, $recursiveTypeMapper->mapNameToType('Foobar'));
62
    }
63
64
    public function testMapNameToType2()
65
    {
66
        $recursiveMapper = $this->getTypeMapper();
67
68
        $this->assertTrue($recursiveMapper->canMapNameToType('ClassA'));
69
        $this->assertTrue($recursiveMapper->canMapNameToType('ClassB'));
70
        $this->assertTrue($recursiveMapper->canMapNameToType('ClassAInterface'));
71
        $this->assertSame('ClassA', $recursiveMapper->mapNameToType('ClassA')->name);
72
        $this->assertSame('ClassAInterface', $recursiveMapper->mapNameToType('ClassAInterface')->name);
73
    }
74
75
76
    public function testMapClassToInputType()
77
    {
78
        $inputObjectType = new InputObjectType([
79
            'name' => 'Foobar'
80
        ]);
81
82
        $typeMapper = new StaticTypeMapper();
83
        $typeMapper->setInputTypes([
84
            ClassB::class => $inputObjectType
85
        ]);
86
87
        $recursiveTypeMapper = new RecursiveTypeMapper($typeMapper, new NamingStrategy(), new ArrayCache());
88
89
        $this->assertFalse($recursiveTypeMapper->canMapClassToInputType(ClassC::class));
90
91
        $this->expectException(CannotMapTypeException::class);
92
        $recursiveTypeMapper->mapClassToInputType(ClassC::class);
93
    }
94
95
    protected function getTypeMapper()
96
    {
97
        $container = new Picotainer([
98
            ClassAType::class => function() {
99
                return new ClassAType();
100
            },
101
            ClassBType::class => function() {
102
                return new ClassBType();
103
            }
104
        ]);
105
106
        $typeGenerator = new TypeGenerator($this->getAnnotationReader(), $this->getControllerQueryProviderFactory());
107
108
        $mapper = new GlobTypeMapper('TheCodingMachine\GraphQL\Controllers\Fixtures\Interfaces\Types', $typeGenerator, $container, new \TheCodingMachine\GraphQL\Controllers\AnnotationReader(new AnnotationReader()), new NullCache());
109
110
        return new RecursiveTypeMapper($mapper, new NamingStrategy(), new ArrayCache());
111
    }
112
113
    public function testMapClassToInterfaceOrType()
114
    {
115
        $recursiveMapper = $this->getTypeMapper();
116
117
        $type = $recursiveMapper->mapClassToInterfaceOrType(ClassA::class);
118
        $this->assertInstanceOf(InterfaceType::class, $type);
119
        $this->assertSame('ClassAInterface', $type->name);
0 ignored issues
show
Bug introduced by
Accessing name on the interface GraphQL\Type\Definition\OutputType suggest that you code against a concrete implementation. How about adding an instanceof check?
Loading history...
120
121
        $classAObjectType = $recursiveMapper->mapClassToType(ClassA::class);
122
        $this->assertInstanceOf(ObjectType::class, $classAObjectType);
123
        $this->assertCount(1, $classAObjectType->getInterfaces());
124
125
        $type = $recursiveMapper->mapClassToInterfaceOrType(ClassC::class);
126
        $this->assertInstanceOf(ObjectType::class, $type);
127
        $this->assertSame('ClassB', $type->name);
128
129
        $interfaces = $recursiveMapper->findInterfaces(ClassC::class);
130
        $this->assertCount(1, $interfaces);
131
        $this->assertSame('ClassAInterface', $interfaces[0]->name);
132
133
        $classBObjectType = $recursiveMapper->mapClassToType(ClassC::class);
134
        $this->assertInstanceOf(ObjectType::class, $classBObjectType);
135
        $this->assertCount(1, $classBObjectType->getInterfaces());
136
137
        $this->expectException(CannotMapTypeException::class);
138
        $recursiveMapper->mapClassToInterfaceOrType('Not exists');
139
    }
140
}
141