Failed Conditions
Push — 2.7 ( c036c0...266f0d )
by Jonathan
57:23 queued 50:07
created

ORM/Tools/AttachEntityListenersListenerTest.php (2 issues)

Labels
Severity
1
<?php
2
3
namespace Doctrine\Tests\ORM\Tools;
4
5
use Doctrine\ORM\Events;
6
use Doctrine\Tests\OrmTestCase;
7
use Doctrine\ORM\Mapping\ClassMetadataFactory;
8
use Doctrine\ORM\Tools\AttachEntityListenersListener;
9
10
class AttachEntityListenersListenerTest extends OrmTestCase
11
{
12
    /**
13
     * @var \Doctrine\ORM\EntityManager
14
     */
15
    private $em;
16
17
    /**
18
     * @var \Doctrine\ORM\Tools\AttachEntityListenersListener
19
     */
20
    private $listener;
21
22
    /**
23
     * @var \Doctrine\ORM\Mapping\ClassMetadataFactory
24
     */
25
    private $factory;
26
27
    public function setUp()
28
    {
29
        $this->listener = new AttachEntityListenersListener();
30
        $driver         = $this->createAnnotationDriver();
31
        $this->em       = $this->_getTestEntityManager();
32
        $evm            = $this->em->getEventManager();
33
        $this->factory  = new ClassMetadataFactory;
34
35
        $evm->addEventListener(Events::loadClassMetadata, $this->listener);
36
        $this->em->getConfiguration()->setMetadataDriverImpl($driver);
37
        $this->factory->setEntityManager($this->em);
38
    }
39
40
    public function testAttachEntityListeners()
41
    {
42
        $this->listener->addEntityListener(
43
            AttachEntityListenersListenerTestFooEntity::class,
44
            AttachEntityListenersListenerTestListener::class,
45
            Events::postLoad,
46
            'postLoadHandler'
47
        );
48
49
        $metadata = $this->factory->getMetadataFor(AttachEntityListenersListenerTestFooEntity::class);
50
51
        $this->assertArrayHasKey('postLoad', $metadata->entityListeners);
0 ignored issues
show
Accessing entityListeners on the interface Doctrine\Common\Persistence\Mapping\ClassMetadata suggest that you code against a concrete implementation. How about adding an instanceof check?
Loading history...
52
        $this->assertCount(1, $metadata->entityListeners['postLoad']);
53
        $this->assertEquals('postLoadHandler', $metadata->entityListeners['postLoad'][0]['method']);
54
        $this->assertEquals(AttachEntityListenersListenerTestListener::class, $metadata->entityListeners['postLoad'][0]['class']);
55
    }
56
57
    public function testAttachToExistingEntityListeners()
58
    {
59
        $this->listener->addEntityListener(
60
            AttachEntityListenersListenerTestBarEntity::class,
61
            AttachEntityListenersListenerTestListener2::class,
62
            Events::prePersist
63
        );
64
65
        $this->listener->addEntityListener(
66
            AttachEntityListenersListenerTestBarEntity::class,
67
            AttachEntityListenersListenerTestListener2::class,
68
            Events::postPersist,
69
            'postPersistHandler'
70
        );
71
72
        $metadata = $this->factory->getMetadataFor(AttachEntityListenersListenerTestBarEntity::class);
73
74
        $this->assertArrayHasKey('postPersist', $metadata->entityListeners);
0 ignored issues
show
Accessing entityListeners on the interface Doctrine\Common\Persistence\Mapping\ClassMetadata suggest that you code against a concrete implementation. How about adding an instanceof check?
Loading history...
75
        $this->assertArrayHasKey('prePersist', $metadata->entityListeners);
76
77
        $this->assertCount(2, $metadata->entityListeners['prePersist']);
78
        $this->assertCount(2, $metadata->entityListeners['postPersist']);
79
80
        $this->assertEquals('prePersist', $metadata->entityListeners['prePersist'][0]['method']);
81
        $this->assertEquals(AttachEntityListenersListenerTestListener::class, $metadata->entityListeners['prePersist'][0]['class']);
82
83
        $this->assertEquals('prePersist', $metadata->entityListeners['prePersist'][1]['method']);
84
        $this->assertEquals(AttachEntityListenersListenerTestListener2::class, $metadata->entityListeners['prePersist'][1]['class']);
85
86
        $this->assertEquals('postPersist', $metadata->entityListeners['postPersist'][0]['method']);
87
        $this->assertEquals(AttachEntityListenersListenerTestListener::class, $metadata->entityListeners['postPersist'][0]['class']);
88
89
        $this->assertEquals('postPersistHandler', $metadata->entityListeners['postPersist'][1]['method']);
90
        $this->assertEquals(AttachEntityListenersListenerTestListener2::class, $metadata->entityListeners['postPersist'][1]['class']);
91
    }
92
93
    /**
94
     * @expectedException \Doctrine\ORM\Mapping\MappingException
95
     * @expectedExceptionMessage  Entity Listener "Doctrine\Tests\ORM\Tools\AttachEntityListenersListenerTestListener#postPersist()" in "Doctrine\Tests\ORM\Tools\AttachEntityListenersListenerTestFooEntity" was already declared, but it must be declared only once.
96
     */
97
    public function testDuplicateEntityListenerException()
98
    {
99
        $this->listener->addEntityListener(
100
            AttachEntityListenersListenerTestFooEntity::class,
101
            AttachEntityListenersListenerTestListener::class,
102
            Events::postPersist
103
        );
104
105
        $this->listener->addEntityListener(
106
            AttachEntityListenersListenerTestFooEntity::class,
107
            AttachEntityListenersListenerTestListener::class,
108
            Events::postPersist
109
        );
110
111
        $this->factory->getMetadataFor(AttachEntityListenersListenerTestFooEntity::class);
112
    }
113
}
114
115
/**
116
 * @Entity
117
 */
118
class AttachEntityListenersListenerTestFooEntity
119
{
120
    /**
121
     * @Id
122
     * @Column(type="integer")
123
     * @GeneratedValue(strategy="AUTO")
124
     */
125
    public $id;
126
}
127
128
/**
129
 * @Entity
130
 * @EntityListeners({"AttachEntityListenersListenerTestListener"})
131
 */
132
class AttachEntityListenersListenerTestBarEntity
133
{
134
    /**
135
     * @Id
136
     * @Column(type="integer")
137
     * @GeneratedValue(strategy="AUTO")
138
     */
139
    public $id;
140
}
141
142
class AttachEntityListenersListenerTestListener
143
{
144
    public $calls;
145
146
    public function prePersist()
147
    {
148
        $this->calls[__FUNCTION__][] = func_get_args();
149
    }
150
151
    public function postLoadHandler()
152
    {
153
        $this->calls[__FUNCTION__][] = func_get_args();
154
    }
155
156
    public function postPersist()
157
    {
158
        $this->calls[__FUNCTION__][] = func_get_args();
159
    }
160
}
161
162
class AttachEntityListenersListenerTestListener2
163
{
164
    public $calls;
165
166
    public function prePersist()
167
    {
168
        $this->calls[__FUNCTION__][] = func_get_args();
169
    }
170
171
    public function postPersistHandler()
172
    {
173
        $this->calls[__FUNCTION__][] = func_get_args();
174
    }
175
}
176