testDelegateToMatchingNamespaceDriver()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 32
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 20
dl 0
loc 32
rs 9.6
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Tests\Persistence\Mapping;
6
7
use Doctrine\Persistence\Mapping\ClassMetadata;
8
use Doctrine\Persistence\Mapping\Driver\MappingDriver;
9
use Doctrine\Persistence\Mapping\Driver\MappingDriverChain;
10
use Doctrine\Persistence\Mapping\MappingException;
11
use Doctrine\Tests\DoctrineTestCase;
12
use PHPUnit\Framework\MockObject\MockObject;
13
14
class DriverChainTest extends DoctrineTestCase
15
{
16
    public function testDelegateToMatchingNamespaceDriver() : void
17
    {
18
        $className = DriverChainEntity::class;
19
20
        /** @var ClassMetadata|MockObject $classMetadata */
21
        $classMetadata = $this->createMock(ClassMetadata::class);
22
23
        $chain = new MappingDriverChain();
24
25
        /** @var MappingDriver|MockObject $driver1 */
26
        $driver1 = $this->createMock(MappingDriver::class);
27
        $driver1->expects(self::never())
28
                ->method('loadMetadataForClass');
29
        $driver1->expects(self::never())
30
                ->method('isTransient');
31
32
        /** @var MappingDriver|MockObject $driver2 */
33
        $driver2 = $this->createMock(MappingDriver::class);
34
        $driver2->expects(self::at(0))
35
                ->method('loadMetadataForClass')
36
                ->with(self::equalTo($className), self::equalTo($classMetadata));
37
        $driver2->expects(self::at(1))
38
                ->method('isTransient')
39
                ->with(self::equalTo($className))
40
                ->will(self::returnValue(true));
41
42
        $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company');
43
        $chain->addDriver($driver2, 'Doctrine\Tests\Persistence\Mapping');
44
45
        $chain->loadMetadataForClass($className, $classMetadata);
46
47
        self::assertTrue($chain->isTransient($className));
48
    }
49
50
    public function testLoadMetadataShouldThrowMappingExceptionWhenNoDelegatorWasFound() : void
51
    {
52
        $className = DriverChainEntity::class;
53
        /** @var ClassMetadata|MockObject $classMetadata */
54
        $classMetadata = $this->createMock(ClassMetadata::class);
55
56
        $chain = new MappingDriverChain();
57
58
        $this->expectException(MappingException::class);
59
        $chain->loadMetadataForClass($className, $classMetadata);
60
    }
61
62
    public function testGatherAllClassNames() : void
63
    {
64
        $chain = new MappingDriverChain();
65
66
        /** @var MappingDriver|MockObject $driver1 */
67
        $driver1 = $this->createMock(MappingDriver::class);
68
        $driver1->expects(self::once())
69
                ->method('getAllClassNames')
70
                ->will(self::returnValue(['Doctrine\Tests\Models\Company\Foo']));
71
72
        /** @var MappingDriver|MockObject $driver2 */
73
        $driver2 = $this->createMock(MappingDriver::class);
74
        $driver2->expects(self::once())
75
                ->method('getAllClassNames')
76
                ->will(self::returnValue(['Doctrine\Tests\ORM\Mapping\Bar', 'Doctrine\Tests\ORM\Mapping\Baz', 'FooBarBaz']));
77
78
        $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company');
79
        $chain->addDriver($driver2, 'Doctrine\Tests\ORM\Mapping');
80
81
        self::assertSame([
82
            'Doctrine\Tests\Models\Company\Foo',
83
            'Doctrine\Tests\ORM\Mapping\Bar',
84
            'Doctrine\Tests\ORM\Mapping\Baz',
85
        ], $chain->getAllClassNames());
86
    }
87
88
    /**
89
     * @group DDC-706
90
     */
91
    public function testIsTransient() : void
92
    {
93
        /** @var MappingDriver|MockObject $driver1 */
94
        $driver1 = $this->createMock(MappingDriver::class);
95
        $chain   = new MappingDriverChain();
96
        $chain->addDriver($driver1, 'Doctrine\Tests\Models\CMS');
97
98
        self::assertTrue($chain->isTransient('stdClass'), 'stdClass isTransient');
99
    }
100
101
    /**
102
     * @group DDC-1412
103
     */
104
    public function testDefaultDriver() : void
105
    {
106
        $companyDriver    = $this->createMock(MappingDriver::class);
107
        $defaultDriver    = $this->createMock(MappingDriver::class);
108
        $entityClassName  = 'Doctrine\Tests\ORM\Mapping\DriverChainEntity';
109
        $managerClassName = 'Doctrine\Tests\Models\Company\CompanyManager';
110
        $chain            = new MappingDriverChain();
111
112
        $companyDriver->expects(self::never())
113
            ->method('loadMetadataForClass');
114
        $companyDriver->expects(self::once())
115
            ->method('isTransient')
116
            ->with(self::equalTo($managerClassName))
117
            ->will(self::returnValue(false));
118
119
        $defaultDriver->expects(self::never())
120
            ->method('loadMetadataForClass');
121
        $defaultDriver->expects(self::once())
122
            ->method('isTransient')
123
            ->with(self::equalTo($entityClassName))
124
            ->will(self::returnValue(true));
125
126
        self::assertNull($chain->getDefaultDriver());
127
128
        $chain->setDefaultDriver($defaultDriver);
129
        $chain->addDriver($companyDriver, 'Doctrine\Tests\Models\Company');
130
131
        /** @var MappingDriver|MockObject $driver */
132
        $driver = $chain->getDefaultDriver();
133
134
        self::assertSame($defaultDriver, $driver);
135
136
        self::assertTrue($chain->isTransient($entityClassName));
137
        self::assertFalse($chain->isTransient($managerClassName));
138
    }
139
140
    public function testDefaultDriverGetAllClassNames() : void
141
    {
142
        /** @var MappingDriver|MockObject $companyDriver */
143
        $companyDriver = $this->createMock(MappingDriver::class);
144
        /** @var MappingDriver|MockObject $defaultDriver */
145
        $defaultDriver = $this->createMock(MappingDriver::class);
146
        $chain         = new MappingDriverChain();
147
148
        $companyDriver->expects(self::once())
149
            ->method('getAllClassNames')
150
            ->will(self::returnValue(['Doctrine\Tests\Models\Company\Foo']));
151
152
        $defaultDriver->expects(self::once())
153
            ->method('getAllClassNames')
154
            ->will(self::returnValue(['Other\Class']));
155
156
        $chain->setDefaultDriver($defaultDriver);
157
        $chain->addDriver($companyDriver, 'Doctrine\Tests\Models\Company');
158
159
        $classNames = $chain->getAllClassNames();
160
161
        self::assertSame(['Doctrine\Tests\Models\Company\Foo', 'Other\Class'], $classNames);
162
    }
163
}
164
165
class DriverChainEntity
166
{
167
}
168