Failed Conditions
Pull Request — develop (#6935)
by Michael
167:08 queued 149:28
created

ClassMetadataTest::testRetrieveOfNamedQuery()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 6
nc 1
nop 0
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),
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);
0 ignored issues
show
Bug introduced by
Doctrine\ORM\Mapping\InheritanceType::SINGLE_TABLE of type string is incompatible with the type integer expected by parameter $type of Doctrine\ORM\Mapping\Cla...a::setInheritanceType(). ( Ignorable by Annotation )

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

79
        $cm->setInheritanceType(/** @scrutinizer ignore-type */ Mapping\InheritanceType::SINGLE_TABLE);
Loading history...
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());
0 ignored issues
show
Bug introduced by
The method current() does not exist on Traversable. It seems like you code against a sub-type of Traversable such as IntlCodePointBreakIterator or IntlRuleBasedBreakIterator or ZendTest\Code\Reflection...tAsset\TestSampleClass3 or Iterator or IntlBreakIterator or MongoGridFSCursor or Doctrine\Common\Collections\Collection or ZendTest\Code\Reflection...tAsset\TestSampleClass3 or SimpleXMLIterator. ( Ignorable by Annotation )

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

118
        self::assertEquals(CMS\CmsEmployee::class, $cm->getAncestorsIterator()->/** @scrutinizer ignore-call */ current()->getClassName());
Loading history...
Bug introduced by
The method current() does not exist on Countable. It seems like you code against a sub-type of Countable such as SplDoublyLinkedList or PHP_Token_Stream or HttpMessage or HttpRequestPool or Phar or Doctrine\Common\Collections\Collection or PHP_CodeSniffer\Files\FileList or SplFixedArray or SplObjectStorage or SQLiteResult or GlobIterator or Imagick or Doctrine\ORM\Tools\Console\MetadataFilter or TheSeer\Tokenizer\TokenCollection or SplPriorityQueue or CachingIterator or SplHeap or SimpleXMLIterator or ArrayIterator or SimpleXMLIterator or ZendTest\Code\Reflection...tAsset\TestSampleClass3. ( Ignorable by Annotation )

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

118
        self::assertEquals(CMS\CmsEmployee::class, $cm->getAncestorsIterator()->/** @scrutinizer ignore-call */ current()->getClassName());
Loading history...
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());
0 ignored issues
show
Bug introduced by
The method isNullable() 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\FieldMetadata. ( Ignorable by Annotation )

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

147
        self::assertTrue($property->/** @scrutinizer ignore-call */ isNullable());
Loading history...
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
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

207
        self::assertEquals("DoctrineGlobal_User", $cm->getProperty('author')->/** @scrutinizer ignore-call */ getTargetEntity());
Loading history...
208
    }
209
210
    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();
0 ignored issues
show
Bug introduced by
The method getJoinTable() 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\ManyToManyAssociationMetadata. ( Ignorable by Annotation )

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

243
        /** @scrutinizer ignore-call */ 
244
        $joinTable = $association->getJoinTable();
Loading history...
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
    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
    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();
0 ignored issues
show
Bug introduced by
The method getJoinColumns() 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\ToOneAssociationMetadata. ( Ignorable by Annotation )

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

562
        /** @scrutinizer ignore-call */ 
563
        $joinColumns = $association->getJoinColumns();
Loading history...
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),
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),
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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
     * @group 6682
1328
     */
1329
    public function testQuotedSequenceName() : void
1330
    {
1331
        self::markTestIncomplete(
1332
            '@guilhermeblanco, in #6683 we added allocationSize/initialValue as to the sequence definition but with the'
1333
            . ' changes you have made I am not sure if the "initialValue" should still be verified here or if it should'
1334
            . ' part of the metadata drivers'
1335
        );
1336
1337
        $cm = new ClassMetadata(CMS\CmsUser::class, $this->metadataBuildingContext);
1338
        $cm->setTable(new Mapping\TableMetadata('cms_users'));
1339
1340
        $id = new Mapping\FieldMetadata('id');
1341
        $id->setValueGenerator(new Mapping\ValueGeneratorMetadata(
1342
            Mapping\GeneratorType::SEQUENCE,
1343
            [
1344
                'sequenceName' => 'foo',
1345
                'allocationSize' => 1,
1346
            ]
1347
        ));
1348
        $cm->addProperty($id);
1349
1350
        self::assertEquals(
1351
            ['sequenceName' => 'foo', 'allocationSize' => 1, 'initialValue' => '1'],
1352
            $cm->getProperty('id')->getValueGenerator()->getDefinition()
1353
        );
1354
    }
1355
1356
    /**
1357
     * @group DDC-2700
1358
     */
1359
    public function testIsIdentifierMappedSuperClass()
1360
    {
1361
        $class = new ClassMetadata(DDC2700MappedSuperClass::class, $this->metadataBuildingContext);
1362
1363
        self::assertFalse($class->isIdentifier('foo'));
1364
    }
1365
1366
    /**
1367
     * @group embedded
1368
     */
1369
    public function testWakeupReflectionWithEmbeddableAndStaticReflectionService()
1370
    {
1371
        $metadata = new ClassMetadata(TestEntity1::class, $this->metadataBuildingContext);
1372
        $cm->setTable(new Mapping\TableMetadata("test_entity1"));
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $cm seems to be never defined.
Loading history...
1373
1374
        $metadata->mapEmbedded(
1375
            [
1376
                'fieldName'    => 'test',
1377
                'class'        => TestEntity1::class,
1378
                'columnPrefix' => false,
1379
            ]
1380
        );
1381
1382
        $fieldMetadata = new Mapping\FieldMetadata('test.embeddedProperty');
1383
        $fieldMetadata->setType(Type::getType('string'));
1384
1385
        $metadata->addProperty($fieldMetadata);
1386
1387
        /*
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...
1388
        $mapping = [
1389
            'originalClass' => TestEntity1::class,
1390
            'declaredField' => 'test',
1391
            'originalField' => 'embeddedProperty'
1392
        ];
1393
1394
        $metadata->addProperty('test.embeddedProperty', Type::getType('string'), $mapping);
1395
        */
1396
1397
        $metadata->wakeupReflection(new StaticReflectionService());
1398
1399
        self::assertEquals(
1400
            [
1401
                'test'                  => null,
1402
                'test.embeddedProperty' => null
1403
            ],
1404
            $metadata->getReflectionProperties()
0 ignored issues
show
Bug introduced by
The method getReflectionProperties() does not exist on Doctrine\ORM\Mapping\ClassMetadata. Did you maybe mean getReflectionClass()? ( Ignorable by Annotation )

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

1404
            $metadata->/** @scrutinizer ignore-call */ 
1405
                       getReflectionProperties()

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...
1405
        );
1406
    }
1407
}
1408
1409
/**
1410
 * @ORM\MappedSuperclass
1411
 */
1412
class DDC2700MappedSuperClass
1413
{
1414
    /** @ORM\Column */
1415
    private $foo;
0 ignored issues
show
introduced by
The private property $foo is not used, and could be removed.
Loading history...
1416
}
1417
1418
class MyNamespacedNamingStrategy extends DefaultNamingStrategy
1419
{
1420
    /**
1421
     * {@inheritdoc}
1422
     */
1423
    public function classToTableName($className)
1424
    {
1425
        if (strpos($className, '\\') !== false) {
1426
            $className = str_replace('\\', '_', str_replace('Doctrine\Tests\Models\\', '', $className));
1427
        }
1428
1429
        return strtolower($className);
1430
    }
1431
}
1432
1433
class MyPrefixNamingStrategy extends DefaultNamingStrategy
1434
{
1435
    /**
1436
     * {@inheritdoc}
1437
     */
1438
    public function propertyToColumnName($propertyName, $className = null)
1439
    {
1440
        return strtolower($this->classToTableName($className)) . '_' . $propertyName;
1441
    }
1442
}
1443