Completed
Push — master ( fc67b3...ad5014 )
by Luís
21s
created

invocationFlagProvider()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 11
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 8
nc 1
nop 0
1
<?php
2
/*
3
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14
 *
15
 * This software consists of voluntary contributions made by many individuals
16
 * and is licensed under the MIT license. For more information, see
17
 * <http://www.doctrine-project.org>.
18
 */
19
20
namespace Doctrine\Tests\ORM\Internal;
21
22
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
23
use Doctrine\ORM\EntityManagerInterface;
24
use Doctrine\ORM\Event\ListenersInvoker;
25
use Doctrine\ORM\Events;
26
use Doctrine\ORM\Internal\HydrationCompleteHandler;
27
use Doctrine\ORM\Mapping\ClassMetadata;
28
use PHPUnit\Framework\TestCase;
29
use stdClass;
30
31
/**
32
 * Tests for {@see \Doctrine\ORM\Internal\HydrationCompleteHandler}
33
 *
34
 * @covers \Doctrine\ORM\Internal\HydrationCompleteHandler
35
 */
36
class HydrationCompleteHandlerTest extends TestCase
37
{
38
    /**
39
     * @var \Doctrine\ORM\Event\ListenersInvoker|\PHPUnit_Framework_MockObject_MockObject
40
     */
41
    private $listenersInvoker;
42
43
    /**
44
     * @var \Doctrine\ORM\EntityManagerInterface|\PHPUnit_Framework_MockObject_MockObject
45
     */
46
    private $entityManager;
47
48
    /**
49
     * @var HydrationCompleteHandler
50
     */
51
    private $handler;
52
53
    /**
54
     * {@inheritDoc}
55
     */
56
    protected function setUp()
57
    {
58
        $this->listenersInvoker = $this->createMock(ListenersInvoker::class);
59
        $this->entityManager    = $this->createMock(EntityManagerInterface::class);
60
        $this->handler          = new HydrationCompleteHandler($this->listenersInvoker, $this->entityManager);
61
    }
62
63
    /**
64
     * @dataProvider invocationFlagProvider
65
     *
66
     * @param int $listenersFlag
67
     */
68
    public function testDefersPostLoadOfEntity($listenersFlag)
69
    {
70
        /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */
71
        $metadata      = $this->createMock(ClassMetadata::class);
72
        $entity        = new stdClass();
73
        $entityManager = $this->entityManager;
74
75
        $this
76
            ->listenersInvoker
77
            ->expects($this->any())
78
            ->method('getSubscribedSystems')
79
            ->with($metadata)
80
            ->will($this->returnValue($listenersFlag));
81
82
        $this->handler->deferPostLoadInvoking($metadata, $entity);
83
84
        $this
85
            ->listenersInvoker
86
            ->expects($this->once())
87
            ->method('invoke')
88
            ->with(
89
                $metadata,
90
                Events::postLoad,
91
                $entity,
92
                $this->callback(function (LifecycleEventArgs $args) use ($entityManager, $entity) {
93
                    return $entity === $args->getEntity() && $entityManager === $args->getObjectManager();
94
                }),
95
                $listenersFlag
96
            );
97
98
        $this->handler->hydrationComplete();
99
    }
100
101
    /**
102
     * @dataProvider invocationFlagProvider
103
     *
104
     * @param int $listenersFlag
105
     */
106
    public function testDefersPostLoadOfEntityOnlyOnce($listenersFlag)
107
    {
108
        /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */
109
        $metadata = $this->createMock(ClassMetadata::class);
110
        $entity   = new stdClass();
111
112
        $this
113
            ->listenersInvoker
114
            ->expects($this->any())
115
            ->method('getSubscribedSystems')
116
            ->with($metadata)
117
            ->will($this->returnValue($listenersFlag));
118
119
        $this->handler->deferPostLoadInvoking($metadata, $entity);
120
121
        $this->listenersInvoker->expects($this->once())->method('invoke');
122
123
        $this->handler->hydrationComplete();
124
        $this->handler->hydrationComplete();
125
    }
126
127
    /**
128
     * @dataProvider invocationFlagProvider
129
     *
130
     * @param int $listenersFlag
131
     */
132
    public function testDefersMultiplePostLoadOfEntity($listenersFlag)
133
    {
134
        /* @var $metadata1 \Doctrine\ORM\Mapping\ClassMetadata */
135
        /* @var $metadata2 \Doctrine\ORM\Mapping\ClassMetadata */
136
        $metadata1      = $this->createMock(ClassMetadata::class);
137
        $metadata2      = $this->createMock(ClassMetadata::class);
138
        $entity1        = new stdClass();
139
        $entity2        = new stdClass();
140
        $entityManager  = $this->entityManager;
141
142
        $this
143
            ->listenersInvoker
144
            ->expects($this->any())
145
            ->method('getSubscribedSystems')
146
            ->with($this->logicalOr($metadata1, $metadata2))
147
            ->will($this->returnValue($listenersFlag));
148
149
        $this->handler->deferPostLoadInvoking($metadata1, $entity1);
150
        $this->handler->deferPostLoadInvoking($metadata2, $entity2);
151
152
        $this
153
            ->listenersInvoker
154
            ->expects($this->exactly(2))
155
            ->method('invoke')
156
            ->with(
157
                $this->logicalOr($metadata1, $metadata2),
158
                Events::postLoad,
159
                $this->logicalOr($entity1, $entity2),
160
                $this->callback(function (LifecycleEventArgs $args) use ($entityManager, $entity1, $entity2) {
161
                    return in_array($args->getEntity(), [$entity1, $entity2], true)
162
                        && $entityManager === $args->getObjectManager();
163
                }),
164
                $listenersFlag
165
            );
166
167
        $this->handler->hydrationComplete();
168
    }
169
170
    public function testSkipsDeferredPostLoadOfMetadataWithNoInvokedListeners()
171
    {
172
        /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */
173
        $metadata = $this->createMock(ClassMetadata::class);
174
        $entity   = new stdClass();
175
176
        $this
177
            ->listenersInvoker
178
            ->expects($this->any())
179
            ->method('getSubscribedSystems')
180
            ->with($metadata)
181
            ->will($this->returnValue(ListenersInvoker::INVOKE_NONE));
182
183
        $this->handler->deferPostLoadInvoking($metadata, $entity);
184
185
        $this->listenersInvoker->expects($this->never())->method('invoke');
186
187
        $this->handler->hydrationComplete();
188
    }
189
190
    public function invocationFlagProvider()
191
    {
192
        return [
193
            [ListenersInvoker::INVOKE_LISTENERS],
194
            [ListenersInvoker::INVOKE_CALLBACKS],
195
            [ListenersInvoker::INVOKE_MANAGER],
196
            [ListenersInvoker::INVOKE_LISTENERS | ListenersInvoker::INVOKE_CALLBACKS],
197
            [ListenersInvoker::INVOKE_LISTENERS | ListenersInvoker::INVOKE_MANAGER],
198
            [ListenersInvoker::INVOKE_LISTENERS | ListenersInvoker::INVOKE_CALLBACKS | ListenersInvoker::INVOKE_MANAGER],
199
        ];
200
    }
201
}
202