Failed Conditions
Push — master ( 9452f0...8be1e3 )
by Marco
10:03
created

ORM/Tools/ResolveTargetEntityListenerTest.php (1 issue)

Labels
Severity
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Tests\ORM\Tools;
6
7
use Doctrine\ORM\Annotation as ORM;
8
use Doctrine\ORM\Mapping\ClassMetadataFactory;
9
use Doctrine\ORM\Tools\ResolveTargetEntityListener;
10
use Doctrine\ORM\Events;
11
use Doctrine\Tests\OrmTestCase;
12
13
class ResolveTargetEntityListenerTest extends OrmTestCase
14
{
15
    /**
16
     * @var \Doctrine\ORM\EntityManagerInterface
17
     */
18
    private $em;
19
20
    /**
21
     * @var ResolveTargetEntityListener
22
     */
23
    private $listener;
24
25
    /**
26
     * @var ClassMetadataFactory
27
     */
28
    private $factory;
29
30
    public function setUp()
31
    {
32
        $annotationDriver = $this->createAnnotationDriver();
33
34
        $this->em = $this->getTestEntityManager();
35
        $this->em->getConfiguration()->setMetadataDriverImpl($annotationDriver);
36
        $this->factory = $this->em->getMetadataFactory();
37
        $this->listener = new ResolveTargetEntityListener();
38
    }
39
40
    /**
41
     * @group DDC-1544
42
     */
43
    public function testResolveTargetEntityListenerCanResolveTargetEntity()
44
    {
45
        $evm = $this->em->getEventManager();
46
47
        $this->listener->addResolveTargetEntity(ResolveTargetInterface::class, ResolveTargetEntity::class);
48
        $this->listener->addResolveTargetEntity(TargetInterface::class, TargetEntity::class);
49
50
        $evm->addEventSubscriber($this->listener);
51
52
        $cm   = $this->factory->getMetadataFor(ResolveTargetEntity::class);
53
        $meta = iterator_to_array($cm->getDeclaredPropertiesIterator());
54
55
        self::assertSame(TargetEntity::class, $meta['manyToMany']->getTargetEntity());
56
        self::assertSame(ResolveTargetEntity::class, $meta['manyToOne']->getTargetEntity());
57
        self::assertSame(ResolveTargetEntity::class, $meta['oneToMany']->getTargetEntity());
58
        self::assertSame(TargetEntity::class, $meta['oneToOne']->getTargetEntity());
59
60
        self::assertSame($cm, $this->factory->getMetadataFor(ResolveTargetInterface::class));
61
    }
62
63
    /**
64
     * @group DDC-3385
65
     * @group 1181
66
     * @group 385
67
     */
68
    public function testResolveTargetEntityListenerCanRetrieveTargetEntityByInterfaceName()
69
    {
70
        $this->listener->addResolveTargetEntity(ResolveTargetInterface::class, ResolveTargetEntity::class);
71
72
        $this->em->getEventManager()->addEventSubscriber($this->listener);
73
74
        $cm = $this->factory->getMetadataFor(ResolveTargetInterface::class);
75
76
        self::assertSame($this->factory->getMetadataFor(ResolveTargetEntity::class), $cm);
77
    }
78
79
    /**
80
     * @group DDC-2109
81
     */
82
    public function testAssertTableColumnsAreNotAddedInManyToMany()
83
    {
84
        $evm = $this->em->getEventManager();
85
        $this->listener->addResolveTargetEntity(ResolveTargetInterface::class, ResolveTargetEntity::class);
86
        $this->listener->addResolveTargetEntity(TargetInterface::class, TargetEntity::class);
87
88
        $evm->addEventListener(Events::loadClassMetadata, $this->listener);
89
        $cm = $this->factory->getMetadataFor(ResolveTargetEntity::class);
90
        $meta = $cm->getProperty('manyToMany');
91
92
        self::assertSame(TargetEntity::class, $meta->getTargetEntity());
0 ignored issues
show
The method getTargetEntity() does not exist on Doctrine\ORM\Mapping\Property. It seems like you code against a sub-type of Doctrine\ORM\Mapping\Property such as Doctrine\ORM\Mapping\AssociationMetadata. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

92
        self::assertSame(TargetEntity::class, $meta->/** @scrutinizer ignore-call */ getTargetEntity());
Loading history...
93
    }
94
95
    /**
96
     * @group 1572
97
     * @group functional
98
     *
99
     * @coversNothing
100
     */
101
    public function testDoesResolveTargetEntitiesInDQLAlsoWithInterfaces()
102
    {
103
        $evm = $this->em->getEventManager();
104
        $this->listener->addResolveTargetEntity(ResolveTargetInterface::class, ResolveTargetEntity::class);
105
106
        $evm->addEventSubscriber($this->listener);
107
108
        self::assertStringMatchesFormat(
109
            'SELECT %A FROM "ResolveTargetEntity" %A',
110
            $this
111
                ->em
112
                ->createQuery('SELECT f FROM Doctrine\Tests\ORM\Tools\ResolveTargetInterface f')
113
                ->getSQL()
114
        );
115
    }
116
}
117
118
interface ResolveTargetInterface
119
{
120
    public function getId();
121
}
122
123
interface TargetInterface extends ResolveTargetInterface
124
{
125
}
126
127
/**
128
 * @ORM\Entity
129
 */
130
class ResolveTargetEntity implements ResolveTargetInterface
131
{
132
    /**
133
     * @ORM\Id
134
     * @ORM\Column(type="integer")
135
     * @ORM\GeneratedValue(strategy="AUTO")
136
     */
137
    private $id;
138
139
    /**
140
     * @ORM\ManyToMany(targetEntity=TargetInterface::class)
141
     */
142
    private $manyToMany;
143
144
    /**
145
     * @ORM\ManyToOne(targetEntity=ResolveTargetInterface::class, inversedBy="oneToMany")
146
     */
147
    private $manyToOne;
148
149
    /**
150
     * @ORM\OneToMany(targetEntity=ResolveTargetInterface::class, mappedBy="manyToOne")
151
     */
152
    private $oneToMany;
153
154
    /**
155
     * @ORM\OneToOne(targetEntity=TargetInterface::class)
156
     * @ORM\JoinColumn(name="target_entity_id", referencedColumnName="id")
157
     */
158
    private $oneToOne;
159
160
    public function getId()
161
    {
162
        return $this->id;
163
    }
164
}
165
166
/**
167
 * @ORM\Entity
168
 */
169
class TargetEntity implements TargetInterface
170
{
171
    /**
172
     * @ORM\Id
173
     * @ORM\Column(type="integer")
174
     * @ORM\GeneratedValue(strategy="AUTO")
175
     */
176
    private $id;
177
178
    public function getId()
179
    {
180
        return $this->id;
181
    }
182
}
183