Failed Conditions
Pull Request — develop (#6936)
by Michael
62:55
created

testFullyQualifiedClassNameShouldBeGivenToNamingStrategyPropertyToColumnName()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 33
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 33
rs 8.8571
c 0
b 0
f 0
cc 1
eloc 18
nc 1
nop 0

1 Method

Rating   Name   Duplication   Size   Complexity  
A ClassMetadataTest::testInvalidEntityListenerClassException() 7 7 1
1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 35 and the first side effect is on line 33.

The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.

The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.

To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.

Loading history...
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Tests\ORM\Mapping;
6
7
use Doctrine\DBAL\Types\Type;
8
use Doctrine\ORM\EntityRepository;
9
use Doctrine\ORM\Events;
10
use Doctrine\ORM\Mapping;
11
use Doctrine\ORM\Mapping\ClassMetadata;
12
use Doctrine\ORM\Mapping\DiscriminatorColumnMetadata;
13
use Doctrine\ORM\Mapping\Factory\DefaultNamingStrategy;
14
use Doctrine\ORM\Mapping\Factory\UnderscoreNamingStrategy;
15
use Doctrine\ORM\Mapping\JoinColumnMetadata;
16
use Doctrine\ORM\Mapping\MappingException;
17
use Doctrine\ORM\Reflection\RuntimeReflectionService;
18
use Doctrine\ORM\Reflection\StaticReflectionService;
19
use Doctrine\Tests\Models\CMS;
20
use Doctrine\Tests\Models\Company\CompanyContract;
21
use Doctrine\Tests\Models\Company\CompanyContractListener;
22
use Doctrine\Tests\Models\CustomType\CustomTypeParent;
23
use Doctrine\Tests\Models\DDC117\DDC117Article;
24
use Doctrine\Tests\Models\DDC117\DDC117ArticleDetails;
25
use Doctrine\Tests\Models\DDC6412\DDC6412File;
26
use Doctrine\Tests\Models\DDC964\DDC964Address;
27
use Doctrine\Tests\Models\DDC964\DDC964Admin;
28
use Doctrine\Tests\Models\DDC964\DDC964Guest;
29
use Doctrine\Tests\Models\Routing\RoutingLeg;
30
use Doctrine\Tests\OrmTestCase;
31
use DoctrineGlobal_Article;
32
33
require_once __DIR__ . '/../../Models/Global/GlobalNamespaceModel.php';
34
35
class ClassMetadataTest extends OrmTestCase
36
{
37
    /**
38
     * @var Mapping\ClassMetadataBuildingContext|\PHPUnit_Framework_MockObject_MockObject
39
     */
40
    private $metadataBuildingContext;
41
42
    public function setUp()
43
    {
44
        parent::setUp();
45
46
        $this->metadataBuildingContext = new Mapping\ClassMetadataBuildingContext(
47
            $this->createMock(Mapping\ClassMetadataFactory::class),
0 ignored issues
show
Documentation introduced by
$this->createMock(\Doctr...MetadataFactory::class) is of type object<PHPUnit\Framework\MockObject\MockObject>, but the function expects a object<Doctrine\ORM\Mapp...ctClassMetadataFactory>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
48
            new RuntimeReflectionService()
49
        );
50
    }
51
52
    public function testClassMetadataInstanceSimpleState()
53
    {
54
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
55
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
56
57
        self::assertInstanceOf(\ReflectionClass::class, $cm->getReflectionClass());
58
        self::assertEquals(CMS\CmsUser::class, $cm->getClassName());
59
        self::assertEquals(CMS\CmsUser::class, $cm->getRootClassName());
60
        self::assertEquals([], $cm->getSubClasses());
61
        self::assertCount(0, $cm->getAncestorsIterator());
62
        self::assertEquals(Mapping\InheritanceType::NONE, $cm->inheritanceType);
63
    }
64
65
    public function testClassMetadataInstanceSerialization()
66
    {
67
        $parent = new ClassMetadata(CMS\CmsEmployee::class, $this->metadataBuildingContext);
68
        $parent->setTable(new Mapping\TableMetadata('cms_employee'));
69
70
        $cm     = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
71
        $cm->setTable($parent->table);
72
        $cm->setParent($parent);
73
74
        $discrColumn = new DiscriminatorColumnMetadata();
75
76
        $discrColumn->setColumnName('disc');
77
        $discrColumn->setType(Type::getType('integer'));
78
79
        $cm->setInheritanceType(Mapping\InheritanceType::SINGLE_TABLE);
80
        $cm->setSubclasses([
81
            'Doctrine\Tests\Models\CMS\One',
82
            'Doctrine\Tests\Models\CMS\Two',
83
            'Doctrine\Tests\Models\CMS\Three'
84
        ]);
85
        $cm->setCustomRepositoryClassName('Doctrine\Tests\Models\CMS\UserRepository');
86
        $cm->setDiscriminatorColumn($discrColumn);
87
        $cm->asReadOnly();
88
        $cm->addNamedQuery('dql', 'foo');
89
90
        $association = new Mapping\OneToOneAssociationMetadata('phonenumbers');
91
92
        $association->setTargetEntity(CMS\CmsAddress::class);
93
        $association->setMappedBy('foo');
94
95
        $cm->addProperty($association);
96
97
        self::assertCount(1, $cm->getDeclaredPropertiesIterator());
98
99
        $serialized = serialize($cm);
100
        $cm = unserialize($serialized);
101
102
        $cm->wakeupReflection(new RuntimeReflectionService());
103
104
        // Check state
105
        self::assertInstanceOf(\ReflectionClass::class, $cm->getReflectionClass());
106
        self::assertEquals(CMS\CmsUser::class, $cm->getClassName());
107
        self::assertEquals(CMS\CmsEmployee::class, $cm->getRootClassName());
108
        self::assertEquals('Doctrine\Tests\Models\CMS\UserRepository', $cm->getCustomRepositoryClassName());
109
        self::assertEquals(
110
            [
111
                'Doctrine\Tests\Models\CMS\One',
112
                'Doctrine\Tests\Models\CMS\Two',
113
                'Doctrine\Tests\Models\CMS\Three'
114
            ],
115
            $cm->getSubClasses()
116
        );
117
        self::assertCount(1, $cm->getAncestorsIterator());
118
        self::assertEquals(CMS\CmsEmployee::class, $cm->getAncestorsIterator()->current()->getClassName());
119
        self::assertEquals($discrColumn, $cm->discriminatorColumn);
120
        self::assertTrue($cm->isReadOnly());
121
        self::assertEquals(['dql' => 'foo'], $cm->getNamedQueries());
122
        self::assertCount(1, $cm->getDeclaredPropertiesIterator());
123
        self::assertInstanceOf(Mapping\OneToOneAssociationMetadata::class, $cm->getProperty('phonenumbers'));
124
125
        $oneOneMapping = $cm->getProperty('phonenumbers');
126
127
        self::assertEquals(Mapping\FetchMode::LAZY, $oneOneMapping->getFetchMode());
128
        self::assertEquals(CMS\CmsAddress::class, $oneOneMapping->getTargetEntity());
129
    }
130
131
    public function testFieldIsNullable()
132
    {
133
        $metadata = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
134
        $metadata->setTable(new Mapping\TableMetadata('cms_users'));
135
136
        // Explicit Nullable
137
        $fieldMetadata = new Mapping\FieldMetadata('status');
138
139
        $fieldMetadata->setType(Type::getType('string'));
140
        $fieldMetadata->setLength(50);
141
        $fieldMetadata->setNullable(true);
142
143
        $metadata->addProperty($fieldMetadata);
144
145
        $property = $metadata->getProperty('status');
146
147
        self::assertTrue($property->isNullable());
148
149
        // Explicit Not Nullable
150
        $fieldMetadata = new Mapping\FieldMetadata('username');
151
152
        $fieldMetadata->setType(Type::getType('string'));
153
        $fieldMetadata->setLength(50);
154
        $fieldMetadata->setNullable(false);
155
156
        $metadata->addProperty($fieldMetadata);
157
158
        $property = $metadata->getProperty('username');
159
160
        self::assertFalse($property->isNullable());
161
162
        // Implicit Not Nullable
163
        $fieldMetadata = new Mapping\FieldMetadata('name');
164
165
        $fieldMetadata->setType(Type::getType('string'));
166
        $fieldMetadata->setLength(50);
167
168
        $metadata->addProperty($fieldMetadata);
169
170
        $property = $metadata->getProperty('name');
171
172
        self::assertFalse($property->isNullable(), "By default a field should not be nullable.");
173
    }
174
175
    /**
176
     * @group DDC-115
177
     */
178
    public function testMapAssociationInGlobalNamespace()
179
    {
180
        require_once __DIR__."/../../Models/Global/GlobalNamespaceModel.php";
181
182
        $cm = new ClassMetadata(DoctrineGlobal_Article::class, $this->metadataBuildingContext);
183
        $cm->setTable(new Mapping\TableMetadata('doctrine_global_article'));
184
185
        $joinTable = new Mapping\JoinTableMetadata();
186
        $joinTable->setName('bar');
187
188
        $joinColumn = new Mapping\JoinColumnMetadata();
189
        $joinColumn->setColumnName("bar_id");
190
        $joinColumn->setReferencedColumnName("id");
191
192
        $joinTable->addJoinColumn($joinColumn);
193
194
        $joinColumn = new Mapping\JoinColumnMetadata();
195
        $joinColumn->setColumnName("baz_id");
196
        $joinColumn->setReferencedColumnName("id");
197
198
        $joinTable->addInverseJoinColumn($joinColumn);
199
200
        $association = new Mapping\ManyToManyAssociationMetadata('author');
201
202
        $association->setJoinTable($joinTable);
203
        $association->setTargetEntity('DoctrineGlobal_User');
204
205
        $cm->addProperty($association);
206
207
        self::assertEquals("DoctrineGlobal_User", $cm->getProperty('author')->getTargetEntity());
0 ignored issues
show
Bug introduced by
It seems like you code against a concrete implementation and not the interface Doctrine\ORM\Mapping\Property as the method getTargetEntity() does only exist in the following implementations of said interface: Doctrine\ORM\Mapping\AssociationMetadata, Doctrine\ORM\Mapping\ManyToManyAssociationMetadata, Doctrine\ORM\Mapping\ManyToOneAssociationMetadata, Doctrine\ORM\Mapping\OneToManyAssociationMetadata, Doctrine\ORM\Mapping\OneToOneAssociationMetadata, Doctrine\ORM\Mapping\ToManyAssociationMetadata, Doctrine\ORM\Mapping\ToOneAssociationMetadata.

Let’s take a look at an example:

interface User
{
    /** @return string */
    public function getPassword();
}

class MyUser implements User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the interface:

    interface User
    {
        /** @return string */
        public function getPassword();
    
        /** @return string */
        public function getDisplayName();
    }
    
Loading history...
208
    }
209
210 View Code Duplication
    public function testMapManyToManyJoinTableDefaults()
211
    {
212
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
213
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
214
215
        $association = new Mapping\ManyToManyAssociationMetadata('groups');
216
217
        $association->setTargetEntity(CMS\CmsGroup::class);
218
219
        $cm->addProperty($association);
220
221
        $association = $cm->getProperty('groups');
222
223
        $joinColumns = [];
224
225
        $joinColumn = new Mapping\JoinColumnMetadata();
226
227
        $joinColumn->setColumnName("cmsuser_id");
228
        $joinColumn->setReferencedColumnName("id");
229
        $joinColumn->setOnDelete("CASCADE");
230
231
        $joinColumns[] = $joinColumn;
232
233
        $inverseJoinColumns = [];
234
235
        $joinColumn = new Mapping\JoinColumnMetadata();
236
237
        $joinColumn->setColumnName("cmsgroup_id");
238
        $joinColumn->setReferencedColumnName("id");
239
        $joinColumn->setOnDelete("CASCADE");
240
241
        $inverseJoinColumns[] = $joinColumn;
242
243
        $joinTable = $association->getJoinTable();
244
245
        self::assertEquals('cmsuser_cmsgroup', $joinTable->getName());
246
        self::assertEquals($joinColumns, $joinTable->getJoinColumns());
247
        self::assertEquals($inverseJoinColumns, $joinTable->getInverseJoinColumns());
248
    }
249
250
    public function testSerializeManyToManyJoinTableCascade()
251
    {
252
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
253
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
254
255
        $association = new Mapping\ManyToManyAssociationMetadata('groups');
256
257
        $association->setTargetEntity(CMS\CmsGroup::class);
258
259
        $cm->addProperty($association);
260
261
        $association = $cm->getProperty('groups');
262
        $association = unserialize(serialize($association));
263
264
        $joinTable = $association->getJoinTable();
265
266
        foreach ($joinTable->getJoinColumns() as $joinColumn) {
267
            self::assertEquals('CASCADE', $joinColumn->getOnDelete());
268
        }
269
    }
270
271
    /**
272
     * @group DDC-115
273
     */
274
    public function testSetDiscriminatorMapInGlobalNamespace()
275
    {
276
        require_once __DIR__."/../../Models/Global/GlobalNamespaceModel.php";
277
278
        $cm = new ClassMetadata('DoctrineGlobal_User', $this->metadataBuildingContext);
279
        $cm->setTable(new Mapping\TableMetadata('doctrine_global_user'));
280
281
        $cm->setDiscriminatorMap(['descr' => 'DoctrineGlobal_Article', 'foo' => 'DoctrineGlobal_User']);
282
283
        self::assertEquals("DoctrineGlobal_Article", $cm->discriminatorMap['descr']);
284
        self::assertEquals("DoctrineGlobal_User", $cm->discriminatorMap['foo']);
285
    }
286
287
    /**
288
     * @group DDC-115
289
     */
290
    public function testSetSubClassesInGlobalNamespace()
291
    {
292
        require_once __DIR__."/../../Models/Global/GlobalNamespaceModel.php";
293
294
        $cm = new ClassMetadata('DoctrineGlobal_User', $this->metadataBuildingContext);
295
        $cm->setTable(new Mapping\TableMetadata('doctrine_global_user'));
296
297
        $cm->setSubclasses(['DoctrineGlobal_Article']);
298
299
        self::assertEquals("DoctrineGlobal_Article", $cm->getSubClasses()[0]);
300
    }
301
302
    /**
303
     * @group DDC-268
304
     */
305 View Code Duplication
    public function testSetInvalidVersionMapping_ThrowsException()
306
    {
307
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
308
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
309
310
        $property = new Mapping\VersionFieldMetadata('foo');
311
312
        $property->setDeclaringClass($cm);
313
        $property->setColumnName('foo');
314
        $property->setType(Type::getType('string'));
315
316
        $this->expectException(MappingException::class);
317
318
        $cm->addProperty($property);
319
    }
320
321
    public function testGetSingleIdentifierFieldName_MultipleIdentifierEntity_ThrowsException()
322
    {
323
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
324
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
325
326
        $fieldMetadata = new Mapping\FieldMetadata('name');
327
        $fieldMetadata->setType(Type::getType('string'));
328
329
        $cm->addProperty($fieldMetadata);
330
331
        $fieldMetadata = new Mapping\FieldMetadata('username');
332
        $fieldMetadata->setType(Type::getType('string'));
333
334
        $cm->addProperty($fieldMetadata);
335
336
        $cm->setIdentifier(['name', 'username']);
337
338
        $this->expectException(MappingException::class);
339
340
        $cm->getSingleIdentifierFieldName();
341
    }
342
343
    public function testGetSingleIdentifierFieldName_NoIdEntity_ThrowsException()
344
    {
345
        $cm = new ClassMetadata(DDC6412File::class, $this->metadataBuildingContext);
346
        $cm->setTable(new Mapping\TableMetadata('ddc6412_file'));
347
348
        $this->expectException(\Doctrine\ORM\Mapping\MappingException::class);
349
350
        $cm->getSingleIdentifierFieldName();
351
    }
352
353
    public function testDuplicateAssociationMappingException()
354
    {
355
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
356
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
357
358
        $association = new Mapping\OneToOneAssociationMetadata('foo');
359
360
        $association->setDeclaringClass($cm);
361
        $association->setSourceEntity(\stdClass::class);
362
        $association->setTargetEntity(\stdClass::class);
363
        $association->setMappedBy('foo');
364
365
        $cm->addInheritedProperty($association);
366
367
        $this->expectException(MappingException::class);
368
369
        $association = new Mapping\OneToOneAssociationMetadata('foo');
370
371
        $association->setDeclaringClass($cm);
372
        $association->setSourceEntity(\stdClass::class);
373
        $association->setTargetEntity(\stdClass::class);
374
        $association->setMappedBy('foo');
375
376
        $cm->addInheritedProperty($association);
377
    }
378
379
    public function testDuplicateColumnName_ThrowsMappingException()
380
    {
381
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
382
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
383
384
        $fieldMetadata = new Mapping\FieldMetadata('name');
385
386
        $fieldMetadata->setType(Type::getType('string'));
387
388
        $cm->addProperty($fieldMetadata);
389
390
        $this->expectException(MappingException::class);
391
392
        $fieldMetadata = new Mapping\FieldMetadata('username');
393
394
        $fieldMetadata->setType(Type::getType('string'));
395
        $fieldMetadata->setColumnName('name');
396
397
        $cm->addProperty($fieldMetadata);
398
    }
399
400
    public function testDuplicateColumnName_DiscriminatorColumn_ThrowsMappingException()
401
    {
402
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
403
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
404
405
        $fieldMetadata = new Mapping\FieldMetadata('name');
406
407
        $fieldMetadata->setType(Type::getType('string'));
408
409
        $cm->addProperty($fieldMetadata);
410
411
        $discrColumn = new DiscriminatorColumnMetadata();
412
413
        $discrColumn->setColumnName('name');
414
        $discrColumn->setType(Type::getType('string'));
415
        $discrColumn->setLength(255);
416
417
        $this->expectException(\Doctrine\ORM\Mapping\MappingException::class);
418
419
        $cm->setDiscriminatorColumn($discrColumn);
420
    }
421
422
    public function testDuplicateColumnName_DiscriminatorColumn2_ThrowsMappingException()
423
    {
424
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
425
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
426
427
        $discrColumn = new DiscriminatorColumnMetadata();
428
429
        $discrColumn->setColumnName('name');
430
        $discrColumn->setType(Type::getType('string'));
431
        $discrColumn->setLength(255);
432
433
        $cm->setDiscriminatorColumn($discrColumn);
434
435
        $this->expectException(\Doctrine\ORM\Mapping\MappingException::class);
436
437
        $fieldMetadata = new Mapping\FieldMetadata('name');
438
439
        $fieldMetadata->setType(Type::getType('string'));
440
441
        $cm->addProperty($fieldMetadata);
442
    }
443
444
    public function testDuplicateFieldAndAssociationMapping1_ThrowsException()
445
    {
446
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
447
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
448
449
        $fieldMetadata = new Mapping\FieldMetadata('name');
450
451
        $fieldMetadata->setType(Type::getType('string'));
452
453
        $cm->addProperty($fieldMetadata);
454
455
        $this->expectException(\Doctrine\ORM\Mapping\MappingException::class);
456
457
        $association = new Mapping\OneToOneAssociationMetadata('name');
458
459
        $association->setTargetEntity(CMS\CmsUser::class);
460
461
        $cm->addProperty($association);
462
    }
463
464
    public function testDuplicateFieldAndAssociationMapping2_ThrowsException()
465
    {
466
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
467
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
468
469
        $association = new Mapping\OneToOneAssociationMetadata('name');
470
471
        $association->setTargetEntity(CMS\CmsUser::class);
472
473
        $cm->addProperty($association);
474
475
        $this->expectException(\Doctrine\ORM\Mapping\MappingException::class);
476
477
        $fieldMetadata = new Mapping\FieldMetadata('name');
478
479
        $fieldMetadata->setType(Type::getType('string'));
480
481
        $cm->addProperty($fieldMetadata);
482
    }
483
484
    /**
485
     * @group DDC-1224
486
     */
487 View Code Duplication
    public function testGetTemporaryTableNameSchema()
488
    {
489
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
490
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
491
492
        $tableMetadata = new Mapping\TableMetadata();
493
494
        $tableMetadata->setSchema('foo');
495
        $tableMetadata->setName('bar');
496
497
        $cm->setTable($tableMetadata);
498
499
        self::assertEquals('foo_bar_id_tmp', $cm->getTemporaryIdTableName());
500
    }
501
502
    public function testDefaultTableName()
503
    {
504
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
505
        $cm->setTable(new Mapping\TableMetadata('CmsUser'));
506
507
        // When table's name is not given
508
        self::assertEquals('CmsUser', $cm->getTableName());
509
        self::assertEquals('CmsUser', $cm->table->getName());
510
511
        $cm = new ClassMetadata(CMS\CmsAddress::class, $this->metadataBuildingContext);
512
513
        // When joinTable's name is not given
514
        $joinTable = new Mapping\JoinTableMetadata();
515
516
        $joinColumn = new Mapping\JoinColumnMetadata();
517
        $joinColumn->setReferencedColumnName("id");
518
519
        $joinTable->addJoinColumn($joinColumn);
520
521
        $joinColumn = new Mapping\JoinColumnMetadata();
522
        $joinColumn->setReferencedColumnName("id");
523
524
        $joinTable->addInverseJoinColumn($joinColumn);
525
526
        $association = new Mapping\ManyToManyAssociationMetadata('user');
527
528
        $association->setJoinTable($joinTable);
529
        $association->setTargetEntity(CMS\CmsUser::class);
530
        $association->setInversedBy('users');
531
532
        $cm->addProperty($association);
533
534
        $association = $cm->getProperty('user');
535
536
        self::assertEquals('cmsaddress_cmsuser', $association->getJoinTable()->getName());
537
    }
538
539
    public function testDefaultJoinColumnName()
540
    {
541
        $cm = new ClassMetadata(CMS\CmsAddress::class, $this->metadataBuildingContext);
542
        $cm->setTable(new Mapping\TableMetadata('cms_address'));
543
544
        // this is really dirty, but it's the simplest way to test whether
545
        // joinColumn's name will be automatically set to user_id
546
        $joinColumns = [];
547
548
        $joinColumn = new JoinColumnMetadata();
549
550
        $joinColumn->setReferencedColumnName('id');
551
552
        $joinColumns[] = $joinColumn;
553
554
        $association = new Mapping\OneToOneAssociationMetadata('user');
555
556
        $association->setJoinColumns($joinColumns);
557
        $association->setTargetEntity(CMS\CmsUser::class);
558
559
        $cm->addProperty($association);
560
561
        $association = $cm->getProperty('user');
562
        $joinColumns = $association->getJoinColumns();
563
        $joinColumn  = reset($joinColumns);
564
565
        self::assertEquals('user_id', $joinColumn->getColumnName());
566
567
        $cm = new ClassMetadata(CMS\CmsAddress::class, $this->metadataBuildingContext);
568
        $cm->setTable(new Mapping\TableMetadata('cms_address'));
569
570
        $joinTable = new Mapping\JoinTableMetadata();
571
        $joinTable->setName('user_CmsUser');
572
573
        $joinColumn = new JoinColumnMetadata();
574
        $joinColumn->setReferencedColumnName('id');
575
576
        $joinTable->addJoinColumn($joinColumn);
577
578
        $joinColumn = new JoinColumnMetadata();
579
        $joinColumn->setReferencedColumnName('id');
580
581
        $joinTable->addInverseJoinColumn($joinColumn);
582
583
        $association = new Mapping\ManyToManyAssociationMetadata('user');
584
585
        $association->setJoinTable($joinTable);
586
        $association->setTargetEntity(CMS\CmsUser::class);
587
        $association->setInversedBy('users');
588
589
        $cm->addProperty($association);
590
591
        $association        = $cm->getProperty('user');
592
        $joinTable          = $association->getJoinTable();
593
        $joinColumns        = $joinTable->getJoinColumns();
594
        $joinColumn         = reset($joinColumns);
595
        $inverseJoinColumns = $joinTable->getInverseJoinColumns();
596
        $inverseJoinColumn  = reset($inverseJoinColumns);
597
598
        self::assertEquals('cmsaddress_id', $joinColumn->getColumnName());
599
        self::assertEquals('cmsuser_id', $inverseJoinColumn->getColumnName());
600
    }
601
602
    /**
603
     * @group DDC-559
604
     */
605
    public function testOneToOneUnderscoreNamingStrategyDefaults()
606
    {
607
        $namingStrategy = new UnderscoreNamingStrategy(CASE_UPPER);
608
609
        $this->metadataBuildingContext = new Mapping\ClassMetadataBuildingContext(
610
            $this->createMock(Mapping\ClassMetadataFactory::class),
0 ignored issues
show
Documentation introduced by
$this->createMock(\Doctr...MetadataFactory::class) is of type object<PHPUnit\Framework\MockObject\MockObject>, but the function expects a object<Doctrine\ORM\Mapp...ctClassMetadataFactory>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
611
            new RuntimeReflectionService(),
612
            $namingStrategy
613
        );
614
615
        $metadata = new ClassMetadata(CMS\CmsAddress::class, $this->metadataBuildingContext);
616
        $metadata->setTable(new Mapping\TableMetadata('cms_address'));
617
618
        $association = new Mapping\OneToOneAssociationMetadata('user');
619
620
        $association->setTargetEntity(CMS\CmsUser::class);
621
622
        $metadata->addProperty($association);
623
624
        $association = $metadata->getProperty('user');
625
        $joinColumns = $association->getJoinColumns();
626
        $joinColumn  = reset($joinColumns);
627
628
        self::assertEquals('USER_ID', $joinColumn->getColumnName());
629
        self::assertEquals('ID', $joinColumn->getReferencedColumnName());
630
    }
631
632
    /**
633
     * @group DDC-559
634
     */
635
    public function testManyToManyUnderscoreNamingStrategyDefaults()
636
    {
637
        $namingStrategy = new UnderscoreNamingStrategy(CASE_UPPER);
638
639
        $this->metadataBuildingContext = new Mapping\ClassMetadataBuildingContext(
640
            $this->createMock(Mapping\ClassMetadataFactory::class),
0 ignored issues
show
Documentation introduced by
$this->createMock(\Doctr...MetadataFactory::class) is of type object<PHPUnit\Framework\MockObject\MockObject>, but the function expects a object<Doctrine\ORM\Mapp...ctClassMetadataFactory>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
641
            new RuntimeReflectionService(),
642
            $namingStrategy
643
        );
644
645
        $metadata = new ClassMetadata(CMS\CmsAddress::class, $this->metadataBuildingContext);
646
        $metadata->setTable(new Mapping\TableMetadata('cms_address'));
647
648
        $association = new Mapping\ManyToManyAssociationMetadata('user');
649
650
        $association->setTargetEntity(CMS\CmsUser::class);
651
652
        $metadata->addProperty($association);
653
654
        $association        = $metadata->getProperty('user');
655
        $joinTable          = $association->getJoinTable();
656
        $joinColumns        = $joinTable->getJoinColumns();
657
        $joinColumn         = reset($joinColumns);
658
        $inverseJoinColumns = $joinTable->getInverseJoinColumns();
659
        $inverseJoinColumn  = reset($inverseJoinColumns);
660
661
        self::assertEquals('CMS_ADDRESS_CMS_USER', $joinTable->getName());
662
663
        self::assertEquals('CMS_ADDRESS_ID', $joinColumn->getColumnName());
664
        self::assertEquals('ID', $joinColumn->getReferencedColumnName());
665
666
        self::assertEquals('CMS_USER_ID', $inverseJoinColumn->getColumnName());
667
        self::assertEquals('ID', $inverseJoinColumn->getReferencedColumnName());
668
669
        $cm = new ClassMetadata('DoctrineGlobal_Article', $this->metadataBuildingContext);
670
671
        $association = new Mapping\ManyToManyAssociationMetadata('author');
672
673
        $association->setTargetEntity(CMS\CmsUser::class);
674
675
        $cm->addProperty($association);
676
677
        $association = $cm->getProperty('author');
678
679
        self::assertEquals('DOCTRINE_GLOBAL_ARTICLE_CMS_USER', $association->getJoinTable()->getName());
680
    }
681
682
    /**
683
     * @group DDC-886
684
     */
685
    public function testSetMultipleIdentifierSetsComposite()
686
    {
687
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
688
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
689
690
        $fieldMetadata = new Mapping\FieldMetadata('name');
691
        $fieldMetadata->setType(Type::getType('string'));
692
693
        $cm->addProperty($fieldMetadata);
694
695
        $fieldMetadata = new Mapping\FieldMetadata('username');
696
        $fieldMetadata->setType(Type::getType('string'));
697
698
        $cm->addProperty($fieldMetadata);
699
700
        $cm->setIdentifier(['name', 'username']);
701
702
        self::assertTrue($cm->isIdentifierComposite());
703
    }
704
705
    /**
706
     * @group DDC-961
707
     */
708
    public function testJoinTableMappingDefaults()
709
    {
710
        $cm = new ClassMetadata('DoctrineGlobal_Article', $this->metadataBuildingContext);
711
712
        $association = new Mapping\ManyToManyAssociationMetadata('author');
713
714
        $association->setTargetEntity(CMS\CmsUser::class);
715
716
        $cm->addProperty($association);
717
718
        $association = $cm->getProperty('author');
719
720
        self::assertEquals('doctrineglobal_article_cmsuser', $association->getJoinTable()->getName());
721
    }
722
723
    /**
724
     * @group DDC-117
725
     */
726
    public function testMapIdentifierAssociation()
727
    {
728
        $cm = new ClassMetadata(DDC117ArticleDetails::class, $this->metadataBuildingContext);
729
        $cm->setTable(new Mapping\TableMetadata("ddc117_article_details"));
730
731
        $association = new Mapping\OneToOneAssociationMetadata('article');
732
733
        $association->setTargetEntity(DDC117Article::class);
734
        $association->setPrimaryKey(true);
735
736
        $cm->addProperty($association);
737
738
        self::assertEquals(["article"], $cm->identifier);
739
    }
740
741
    /**
742
     * @group DDC-117
743
     */
744 View Code Duplication
    public function testOrphanRemovalIdentifierAssociation()
745
    {
746
        $cm = new ClassMetadata(DDC117ArticleDetails::class, $this->metadataBuildingContext);
747
        $cm->setTable(new Mapping\TableMetadata("ddc117_article_details"));
748
749
        $this->expectException(MappingException::class);
750
        $this->expectExceptionMessage('The orphan removal option is not allowed on an association that');
751
752
        $association = new Mapping\OneToOneAssociationMetadata('article');
753
754
        $association->setTargetEntity(DDC117Article::class);
755
        $association->setPrimaryKey(true);
756
        $association->setOrphanRemoval(true);
757
758
        $cm->addProperty($association);
759
    }
760
761
    /**
762
     * @group DDC-117
763
     */
764 View Code Duplication
    public function testInverseIdentifierAssociation()
765
    {
766
        $cm = new ClassMetadata(DDC117ArticleDetails::class, $this->metadataBuildingContext);
767
        $cm->setTable(new Mapping\TableMetadata("ddc117_article_details"));
768
769
        $this->expectException(MappingException::class);
770
        $this->expectExceptionMessage('An inverse association is not allowed to be identifier in');
771
772
        $association = new Mapping\OneToOneAssociationMetadata('article');
773
774
        $association->setTargetEntity(DDC117Article::class);
775
        $association->setPrimaryKey(true);
776
        $association->setMappedBy('details');
777
778
        $cm->addProperty($association);
779
    }
780
781
    /**
782
     * @group DDC-117
783
     */
784 View Code Duplication
    public function testIdentifierAssociationManyToMany()
785
    {
786
        $cm = new ClassMetadata(DDC117ArticleDetails::class, $this->metadataBuildingContext);
787
        $cm->setTable(new Mapping\TableMetadata("ddc117_article_details"));
788
789
        $this->expectException(MappingException::class);
790
        $this->expectExceptionMessage('Many-to-many or one-to-many associations are not allowed to be identifier in');
791
792
        $association = new Mapping\ManyToManyAssociationMetadata('article');
793
794
        $association->setTargetEntity(DDC117Article::class);
795
        $association->setPrimaryKey(true);
796
797
        $cm->addProperty($association);
798
    }
799
800
    /**
801
     * @group DDC-996
802
     */
803 View Code Duplication
    public function testEmptyFieldNameThrowsException()
804
    {
805
        $this->expectException(MappingException::class);
806
        $this->expectExceptionMessage("The field or association mapping misses the 'fieldName' attribute in entity '" . CMS\CmsUser::class . "'.");
807
808
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
809
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
810
811
        $fieldMetadata = new Mapping\FieldMetadata('');
812
813
        $fieldMetadata->setType(Type::getType('string'));
814
815
        $cm->addProperty($fieldMetadata);
816
    }
817
818
    public function testRetrievalOfNamedQueries()
819
    {
820
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
821
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
822
823
        self::assertCount(0, $cm->getNamedQueries());
824
825
        $cm->addNamedQuery('userById', 'SELECT u FROM __CLASS__ u WHERE u.id = ?1');
826
827
        self::assertCount(1, $cm->getNamedQueries());
828
    }
829
830
    /**
831
     * @group DDC-1663
832
     */
833 View Code Duplication
    public function testRetrievalOfResultSetMappings()
834
    {
835
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
836
837
        self::assertCount(0, $cm->getSqlResultSetMappings());
838
839
        $cm->addSqlResultSetMapping(
840
            [
841
            'name'      => 'find-all',
842
            'entities'  => [
843
                [
844
                    'entityClass'   => CMS\CmsUser::class,
845
                ],
846
            ],
847
            ]
848
        );
849
850
        self::assertCount(1, $cm->getSqlResultSetMappings());
851
    }
852
853
    public function testExistanceOfNamedQuery()
854
    {
855
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
856
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
857
858
        $cm->addNamedQuery('all', 'SELECT u FROM __CLASS__ u');
859
860
        self::assertTrue($cm->hasNamedQuery('all'));
861
        self::assertFalse($cm->hasNamedQuery('userById'));
862
    }
863
864
    /**
865
     * @group DDC-1663
866
     */
867
    public function testRetrieveOfNamedNativeQuery()
868
    {
869
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
870
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
871
872
        $cm->addNamedNativeQuery(
873
            'find-all',
874
            'SELECT * FROM cms_users',
875
            [
876
                'resultSetMapping' => 'result-mapping-name',
877
                'resultClass'      => CMS\CmsUser::class,
878
            ]
879
        );
880
881
        $cm->addNamedNativeQuery(
882
            'find-by-id',
883
            'SELECT * FROM cms_users WHERE id = ?',
884
            [
885
                'resultClass'      => '__CLASS__',
886
                'resultSetMapping' => 'result-mapping-name',
887
            ]
888
        );
889
890
        $mapping = $cm->getNamedNativeQuery('find-all');
891
892
        self::assertEquals('SELECT * FROM cms_users', $mapping['query']);
893
        self::assertEquals('result-mapping-name', $mapping['resultSetMapping']);
894
        self::assertEquals(CMS\CmsUser::class, $mapping['resultClass']);
895
896
        $mapping = $cm->getNamedNativeQuery('find-by-id');
897
898
        self::assertEquals('SELECT * FROM cms_users WHERE id = ?', $mapping['query']);
899
        self::assertEquals('result-mapping-name', $mapping['resultSetMapping']);
900
        self::assertEquals('__CLASS__', $mapping['resultClass']);
901
    }
902
903
    /**
904
     * @group DDC-1663
905
     */
906
    public function testRetrieveOfSqlResultSetMapping()
907
    {
908
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
909
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
910
911
        $cm->addSqlResultSetMapping(
912
            [
913
                'name'      => 'find-all',
914
                'entities'  => [
915
                    [
916
                        'entityClass'   => '__CLASS__',
917
                        'fields'        => [
918
                            [
919
                                'name'  => 'id',
920
                                'column'=> 'id'
921
                            ],
922
                            [
923
                                'name'  => 'name',
924
                                'column'=> 'name'
925
                            ]
926
                        ]
927
                    ],
928
                    [
929
                        'entityClass'   => CMS\CmsEmail::class,
930
                        'fields'        => [
931
                            [
932
                                'name'  => 'id',
933
                                'column'=> 'id'
934
                            ],
935
                            [
936
                                'name'  => 'email',
937
                                'column'=> 'email'
938
                            ]
939
                        ]
940
                    ]
941
                ],
942
                'columns'   => [['name' => 'scalarColumn']]
943
            ]
944
        );
945
946
        $mapping = $cm->getSqlResultSetMapping('find-all');
947
948
        self::assertEquals('__CLASS__', $mapping['entities'][0]['entityClass']);
949
        self::assertEquals(['name'=>'id','column'=>'id'], $mapping['entities'][0]['fields'][0]);
950
        self::assertEquals(['name'=>'name','column'=>'name'], $mapping['entities'][0]['fields'][1]);
951
952
        self::assertEquals(CMS\CmsEmail::class, $mapping['entities'][1]['entityClass']);
953
        self::assertEquals(['name'=>'id','column'=>'id'], $mapping['entities'][1]['fields'][0]);
954
        self::assertEquals(['name'=>'email','column'=>'email'], $mapping['entities'][1]['fields'][1]);
955
956
        self::assertEquals('scalarColumn', $mapping['columns'][0]['name']);
957
    }
958
959
    /**
960
     * @group DDC-1663
961
     */
962 View Code Duplication
    public function testExistanceOfSqlResultSetMapping()
963
    {
964
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
965
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
966
967
        $cm->addSqlResultSetMapping(
968
            [
969
                'name'      => 'find-all',
970
                'entities'  => [
971
                    [
972
                        'entityClass'   => CMS\CmsUser::class,
973
                    ],
974
                ],
975
            ]
976
        );
977
978
        self::assertTrue($cm->hasSqlResultSetMapping('find-all'));
979
        self::assertFalse($cm->hasSqlResultSetMapping('find-by-id'));
980
    }
981
982
    /**
983
     * @group DDC-1663
984
     */
985
    public function testExistanceOfNamedNativeQuery()
986
    {
987
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
988
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
989
990
        $cm->addNamedNativeQuery(
991
            'find-all',
992
            'SELECT * FROM cms_users',
993
            [
994
                'resultClass' => CMS\CmsUser::class,
995
            ]
996
        );
997
998
        self::assertTrue($cm->hasNamedNativeQuery('find-all'));
999
        self::assertFalse($cm->hasNamedNativeQuery('find-by-id'));
1000
    }
1001
1002
    public function testRetrieveOfNamedQuery()
1003
    {
1004
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
1005
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
1006
1007
        $cm->addNamedQuery('userById', 'SELECT u FROM __CLASS__ u WHERE u.id = ?1');
1008
1009
        self::assertEquals('SELECT u FROM __CLASS__ u WHERE u.id = ?1', $cm->getNamedQuery('userById'));
1010
1011
        // Named queries are only resolved when created
1012
        $repo = new EntityRepository($this->getTestEntityManager(), $cm);
1013
1014
        self::assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1', $repo->createNamedQuery('userById')->getDQL());
1015
    }
1016
1017
    /**
1018
     * @group DDC-1663
1019
     */
1020
    public function testRetrievalOfNamedNativeQueries()
1021
    {
1022
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
1023
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
1024
1025
        self::assertCount(0, $cm->getNamedNativeQueries());
1026
1027
        $cm->addNamedNativeQuery(
1028
            'find-all',
1029
            'SELECT * FROM cms_users',
1030
            [
1031
                'resultClass' => CMS\CmsUser::class,
1032
            ]
1033
        );
1034
1035
        self::assertCount(1, $cm->getNamedNativeQueries());
1036
    }
1037
1038
    /**
1039
     * @group DDC-2451
1040
     */
1041
    public function testSerializeEntityListeners()
1042
    {
1043
        $metadata = new ClassMetadata(CompanyContract::class, $this->metadataBuildingContext);
1044
1045
        $metadata->addEntityListener(Events::prePersist, CompanyContractListener::class, 'prePersistHandler');
1046
        $metadata->addEntityListener(Events::postPersist, CompanyContractListener::class, 'postPersistHandler');
1047
1048
        $serialize   = serialize($metadata);
1049
        $unserialize = unserialize($serialize);
1050
1051
        self::assertEquals($metadata->entityListeners, $unserialize->entityListeners);
1052
    }
1053
1054
    /**
1055
     * @expectedException \Doctrine\ORM\Mapping\MappingException
1056
     * @expectedExceptionMessage Query named "userById" in "Doctrine\Tests\Models\CMS\CmsUser" was already declared, but it must be declared only once
1057
     */
1058
    public function testNamingCollisionNamedQueryShouldThrowException()
1059
    {
1060
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
1061
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
1062
1063
        $cm->addNamedQuery('userById', 'SELECT u FROM __CLASS__ u WHERE u.id = ?1');
1064
        $cm->addNamedQuery('userById', 'SELECT u FROM __CLASS__ u WHERE u.id = ?1');
1065
    }
1066
1067
    /**
1068
     * @group DDC-1663
1069
     *
1070
     * @expectedException \Doctrine\ORM\Mapping\MappingException
1071
     * @expectedExceptionMessage Query named "find-all" in "Doctrine\Tests\Models\CMS\CmsUser" was already declared, but it must be declared only once
1072
     */
1073
    public function testNamingCollisionNamedNativeQueryShouldThrowException()
1074
    {
1075
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
1076
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
1077
1078
        $cm->addNamedNativeQuery(
1079
            'find-all',
1080
            'SELECT * FROM cms_users',
1081
            [
1082
                'resultClass' => CMS\CmsUser::class,
1083
            ]
1084
        );
1085
1086
        $cm->addNamedNativeQuery(
1087
            'find-all',
1088
            'SELECT * FROM cms_users',
1089
            [
1090
                'resultClass' => CMS\CmsUser::class,
1091
            ]
1092
        );
1093
    }
1094
1095
    /**
1096
     * @group DDC-1663
1097
     *
1098
     * @expectedException \Doctrine\ORM\Mapping\MappingException
1099
     * @expectedExceptionMessage Result set mapping named "find-all" in "Doctrine\Tests\Models\CMS\CmsUser" was already declared, but it must be declared only once
1100
     */
1101
    public function testNamingCollisionSqlResultSetMappingShouldThrowException()
1102
    {
1103
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
1104
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
1105
1106
        $cm->addSqlResultSetMapping(
1107
            [
1108
            'name'      => 'find-all',
1109
            'entities'  => [
1110
                [
1111
                    'entityClass'   => CMS\CmsUser::class,
1112
                ],
1113
            ],
1114
            ]
1115
        );
1116
1117
        $cm->addSqlResultSetMapping(
1118
            [
1119
            'name'      => 'find-all',
1120
            'entities'  => [
1121
                [
1122
                    'entityClass'   => CMS\CmsUser::class,
1123
                ],
1124
            ],
1125
            ]
1126
        );
1127
    }
1128
1129
    /**
1130
     * @group DDC-1068
1131
     */
1132
    public function testClassCaseSensitivity()
1133
    {
1134
        $cm = new ClassMetadata(strtoupper(CMS\CmsUser::class), $this->metadataBuildingContext);
1135
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
1136
1137
        self::assertEquals(CMS\CmsUser::class, $cm->getClassName());
1138
    }
1139
1140
    /**
1141
     * @group DDC-659
1142
     */
1143 View Code Duplication
    public function testLifecycleCallbackNotFound()
1144
    {
1145
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
1146
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
1147
1148
        $cm->addLifecycleCallback('notfound', 'postLoad');
1149
1150
        $this->expectException(MappingException::class);
1151
        $this->expectExceptionMessage("Entity '" . CMS\CmsUser::class . "' has no method 'notfound' to be registered as lifecycle callback.");
1152
1153
        $cm->validateLifecycleCallbacks(new RuntimeReflectionService());
1154
    }
1155
1156
    /**
1157
     * @group ImproveErrorMessages
1158
     */
1159 View Code Duplication
    public function testTargetEntityNotFound()
1160
    {
1161
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
1162
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
1163
1164
        $association = new Mapping\ManyToOneAssociationMetadata('address');
1165
1166
        $association->setTargetEntity('UnknownClass');
1167
1168
        $cm->addProperty($association);
1169
1170
        $this->expectException(MappingException::class);
1171
        $this->expectExceptionMessage("The target-entity 'UnknownClass' cannot be found in '" . CMS\CmsUser::class . "#address'.");
1172
1173
        $cm->validateAssociations();
1174
    }
1175
1176
    /**
1177
     * @group DDC-1663
1178
     *
1179
     * @expectedException \Doctrine\ORM\Mapping\MappingException
1180
     * @expectedExceptionMessage Result set mapping named "find-all" in "Doctrine\Tests\Models\CMS\CmsUser requires a entity class name.
1181
     */
1182
    public function testNameIsMandatoryForEntityNameSqlResultSetMappingException()
1183
    {
1184
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
1185
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
1186
1187
        $cm->addSqlResultSetMapping(
1188
            [
1189
            'name'      => 'find-all',
1190
            'entities'  => [
1191
                [
1192
                    'fields' => []
1193
                ]
1194
            ],
1195
            ]
1196
        );
1197
    }
1198
1199
    /**
1200
     * @group DDC-1746
1201
     * @expectedException        \Doctrine\ORM\Mapping\MappingException
1202
     * @expectedExceptionMessage You have specified invalid cascade options for Doctrine\Tests\Models\CMS\CmsUser::$address: 'invalid'; available options: 'remove', 'persist', and 'refresh'
1203
     */
1204 View Code Duplication
    public function testInvalidCascade()
1205
    {
1206
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
1207
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
1208
1209
        $association = new Mapping\ManyToOneAssociationMetadata('address');
1210
1211
        $association->setTargetEntity('UnknownClass');
1212
        $association->setCascade(['invalid']);
1213
1214
        $cm->addProperty($association);
1215
     }
1216
1217
    /**
1218
     * @group DDC-964
1219
     * @expectedException        \Doctrine\ORM\Mapping\MappingException
1220
     * @expectedExceptionMessage Invalid field override named 'invalidPropertyName' for class 'Doctrine\Tests\Models\DDC964\DDC964Admin'
1221
     */
1222 View Code Duplication
    public function testInvalidPropertyAssociationOverrideNameException()
1223
    {
1224
        $cm = new ClassMetadata(DDC964Admin::class, $this->metadataBuildingContext);
1225
        $cm->setTable(new Mapping\TableMetadata("ddc964_admin"));
1226
1227
        $association = new Mapping\ManyToOneAssociationMetadata('address');
1228
1229
        $association->setTargetEntity(DDC964Address::class);
1230
1231
        $cm->addProperty($association);
1232
1233
        $cm->setPropertyOverride(new Mapping\ManyToOneAssociationMetadata('invalidPropertyName'));
1234
    }
1235
1236
    /**
1237
     * @group DDC-964
1238
     * @expectedException        \Doctrine\ORM\Mapping\MappingException
1239
     * @expectedExceptionMessage Invalid field override named 'invalidPropertyName' for class 'Doctrine\Tests\Models\DDC964\DDC964Guest'.
1240
     */
1241
    public function testInvalidPropertyAttributeOverrideNameException()
1242
    {
1243
        $cm = new ClassMetadata(DDC964Guest::class, $this->metadataBuildingContext);
1244
        $cm->setTable(new Mapping\TableMetadata("ddc964_guest"));
1245
1246
        $fieldMetadata = new Mapping\FieldMetadata('name');
1247
        $fieldMetadata->setType(Type::getType('string'));
1248
1249
        $cm->addProperty($fieldMetadata);
1250
1251
        $fieldMetadata = new Mapping\FieldMetadata('invalidPropertyName');
1252
        $fieldMetadata->setType(Type::getType('string'));
1253
1254
        $cm->setPropertyOverride($fieldMetadata);
1255
    }
1256
1257
    /**
1258
     * @group DDC-1955
1259
     *
1260
     * @expectedException        \Doctrine\ORM\Mapping\MappingException
1261
     * @expectedExceptionMessage Entity Listener "\InvalidClassName" declared on "Doctrine\Tests\Models\CMS\CmsUser" not found.
1262
     */
1263 View Code Duplication
    public function testInvalidEntityListenerClassException()
1264
    {
1265
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
1266
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
1267
1268
        $cm->addEntityListener(Events::postLoad, '\InvalidClassName', 'postLoadHandler');
1269
    }
1270
1271
    /**
1272
     * @group DDC-1955
1273
     *
1274
     * @expectedException        \Doctrine\ORM\Mapping\MappingException
1275
     * @expectedExceptionMessage Entity Listener "Doctrine\Tests\Models\Company\CompanyContractListener" declared on "Doctrine\Tests\Models\CMS\CmsUser" has no method "invalidMethod".
1276
     */
1277 View Code Duplication
    public function testInvalidEntityListenerMethodException()
1278
    {
1279
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
1280
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
1281
1282
        $cm->addEntityListener(Events::postLoad, 'Doctrine\Tests\Models\Company\CompanyContractListener', 'invalidMethod');
1283
    }
1284
1285 View Code Duplication
    public function testManyToManySelfReferencingNamingStrategyDefaults()
1286
    {
1287
        $cm = new ClassMetadata(CustomTypeParent::class, $this->metadataBuildingContext);
1288
        $cm->setTable(new Mapping\TableMetadata("custom_type_parent"));
1289
1290
        $association = new Mapping\ManyToManyAssociationMetadata('friendsWithMe');
1291
1292
        $association->setTargetEntity(CustomTypeParent::class);
1293
1294
        $cm->addProperty($association);
1295
1296
        $association = $cm->getProperty('friendsWithMe');
1297
1298
        $joinColumns = [];
1299
1300
        $joinColumn = new Mapping\JoinColumnMetadata();
1301
1302
        $joinColumn->setColumnName("customtypeparent_source");
1303
        $joinColumn->setReferencedColumnName("id");
1304
        $joinColumn->setOnDelete("CASCADE");
1305
1306
        $joinColumns[] = $joinColumn;
1307
1308
        $inverseJoinColumns = [];
1309
1310
        $joinColumn = new Mapping\JoinColumnMetadata();
1311
1312
        $joinColumn->setColumnName("customtypeparent_target");
1313
        $joinColumn->setReferencedColumnName("id");
1314
        $joinColumn->setOnDelete("CASCADE");
1315
1316
        $inverseJoinColumns[] = $joinColumn;
1317
1318
        $joinTable = $association->getJoinTable();
1319
1320
        self::assertEquals('customtypeparent_customtypeparent', $joinTable->getName());
1321
        self::assertEquals($joinColumns, $joinTable->getJoinColumns());
1322
        self::assertEquals($inverseJoinColumns, $joinTable->getInverseJoinColumns());
1323
    }
1324
1325
    /**
1326
     * @group DDC-2662
1327
     */
1328
    public function testQuotedSequenceName()
1329
    {
1330
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
1331
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
1332
1333
        $id = new Mapping\FieldMetadata('id');
1334
        $id->setValueGenerator(new Mapping\ValueGeneratorMetadata(
1335
            Mapping\GeneratorType::SEQUENCE,
1336
            [
1337
                'sequenceName' => 'foo',
1338
                'allocationSize' => 1,
1339
            ]
1340
        ));
1341
        $cm->addProperty($id);
1342
1343
        self::assertEquals(
1344
            ['sequenceName' => 'foo', 'allocationSize' => 1],
1345
            $cm->getProperty('id')->getValueGenerator()->getDefinition()
0 ignored issues
show
Bug introduced by
The method getValueGenerator() does not exist on Doctrine\ORM\Mapping\Property. Did you maybe mean getValue()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
1346
        );
1347
    }
1348
1349
    /**
1350
     * @group DDC-2700
1351
     */
1352
    public function testIsIdentifierMappedSuperClass()
1353
    {
1354
        $class = new ClassMetadata(DDC2700MappedSuperClass::class, $this->metadataBuildingContext);
1355
1356
        self::assertFalse($class->isIdentifier('foo'));
1357
    }
1358
1359
    /**
1360
     * @group embedded
1361
     */
1362
    public function testWakeupReflectionWithEmbeddableAndStaticReflectionService()
1363
    {
1364
        $metadata = new ClassMetadata(TestEntity1::class, $this->metadataBuildingContext);
1365
        $cm->setTable(new Mapping\TableMetadata("test_entity1"));
0 ignored issues
show
Bug introduced by
The variable $cm does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
1366
1367
        $metadata->mapEmbedded(
1368
            [
1369
                'fieldName'    => 'test',
1370
                'class'        => TestEntity1::class,
1371
                'columnPrefix' => false,
1372
            ]
1373
        );
1374
1375
        $fieldMetadata = new Mapping\FieldMetadata('test.embeddedProperty');
1376
        $fieldMetadata->setType(Type::getType('string'));
1377
1378
        $metadata->addProperty($fieldMetadata);
1379
1380
        /*
0 ignored issues
show
Unused Code Comprehensibility introduced by
55% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
1381
        $mapping = [
1382
            'originalClass' => TestEntity1::class,
1383
            'declaredField' => 'test',
1384
            'originalField' => 'embeddedProperty'
1385
        ];
1386
1387
        $metadata->addProperty('test.embeddedProperty', Type::getType('string'), $mapping);
1388
        */
1389
1390
        $metadata->wakeupReflection(new StaticReflectionService());
1391
1392
        self::assertEquals(
1393
            [
1394
                'test'                  => null,
1395
                'test.embeddedProperty' => null
1396
            ],
1397
            $metadata->getReflectionProperties()
0 ignored issues
show
Bug introduced by
The method getReflectionProperties() does not seem to exist on object<Doctrine\ORM\Mapping\ClassMetadata>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
1398
        );
1399
    }
1400
}
1401
1402
/**
1403
 * @ORM\MappedSuperclass
1404
 */
1405
class DDC2700MappedSuperClass
1406
{
1407
    /** @ORM\Column */
1408
    private $foo;
0 ignored issues
show
Unused Code introduced by
The property $foo is not used and could be removed.

This check marks private properties in classes that are never used. Those properties can be removed.

Loading history...
1409
}
1410
1411
class MyNamespacedNamingStrategy extends DefaultNamingStrategy
1412
{
1413
    /**
1414
     * {@inheritdoc}
1415
     */
1416
    public function classToTableName($className)
1417
    {
1418
        if (strpos($className, '\\') !== false) {
1419
            $className = str_replace('\\', '_', str_replace('Doctrine\Tests\Models\\', '', $className));
1420
        }
1421
1422
        return strtolower($className);
1423
    }
1424
}
1425
1426
class MyPrefixNamingStrategy extends DefaultNamingStrategy
1427
{
1428
    /**
1429
     * {@inheritdoc}
1430
     */
1431
    public function propertyToColumnName($propertyName, $className = null)
1432
    {
1433
        return strtolower($this->classToTableName($className)) . '_' . $propertyName;
1434
    }
1435
}
1436