|
4 | 4 |
|
5 | 5 | namespace Doctrine\Tests\ORM\Mapping;
|
6 | 6 |
|
| 7 | +use Doctrine\Deprecations\PHPUnit\VerifyDeprecations; |
7 | 8 | use Doctrine\ORM\EntityRepository;
|
8 | 9 | use Doctrine\ORM\Id\SequenceGenerator as IdSequenceGenerator;
|
9 | 10 | use Doctrine\ORM\Mapping\ClassMetadata;
|
|
29 | 30 | use Doctrine\Tests\Models\DDC869\DDC869Payment;
|
30 | 31 | use Doctrine\Tests\Models\DDC869\DDC869PaymentRepository;
|
31 | 32 | use Doctrine\Tests\OrmTestCase;
|
| 33 | +use Generator; |
32 | 34 |
|
33 | 35 | use function assert;
|
34 | 36 | use function serialize;
|
35 | 37 | use function unserialize;
|
36 | 38 |
|
37 | 39 | class BasicInheritanceMappingTest extends OrmTestCase
|
38 | 40 | {
|
| 41 | + use VerifyDeprecations; |
| 42 | + |
39 | 43 | /** @var ClassMetadataFactory */
|
40 | 44 | private $cmf;
|
41 | 45 |
|
@@ -218,6 +222,42 @@ public function testMappedSuperclassIndex(): void
|
218 | 222 | self::assertArrayHasKey('IDX_MAPPED1_INDEX', $class->table['uniqueConstraints']);
|
219 | 223 | self::assertArrayHasKey('IDX_MAPPED2_INDEX', $class->table['indexes']);
|
220 | 224 | }
|
| 225 | + |
| 226 | + /** |
| 227 | + * @dataProvider invalidHierarchyDeclarationClasses |
| 228 | + */ |
| 229 | + public function testUndeclaredHierarchyRejection(string $rootEntity, string $childClass): void |
| 230 | + { |
| 231 | + $this->expectDeprecationWithIdentifier('https://github.com/doctrine/orm/pull/10431'); |
| 232 | + |
| 233 | + /* on 3.0, use this instead: */ |
| 234 | + // self::expectException(MappingException::class); |
| 235 | + // self::expectExceptionMessage(\sprintf( |
| 236 | + // "Entity class '%s' is a subclass of the root entity class '%s', but no inheritance mapping type was declared.", |
| 237 | + // $childClass, |
| 238 | + // $rootEntity |
| 239 | + // )); |
| 240 | + |
| 241 | + $this->cmf->getMetadataFor($childClass); |
| 242 | + } |
| 243 | + |
| 244 | + public function invalidHierarchyDeclarationClasses(): Generator |
| 245 | + { |
| 246 | + yield 'concrete Entity root and child class, direct inheritance' |
| 247 | + => [InvalidEntityRoot::class, InvalidEntityRootChild::class]; |
| 248 | + |
| 249 | + yield 'concrete Entity root and abstract child class, direct inheritance' |
| 250 | + => [InvalidEntityRoot::class, InvalidEntityRootAbstractChild::class]; |
| 251 | + |
| 252 | + yield 'abstract Entity root and concrete child class, direct inheritance' |
| 253 | + => [InvalidAbstractEntityRoot::class, InvalidAbstractEntityRootChild::class]; |
| 254 | + |
| 255 | + yield 'abstract Entity root and abstract child class, direct inheritance' |
| 256 | + => [InvalidAbstractEntityRoot::class, InvalidAbstractEntityRootAbstractChild::class]; |
| 257 | + |
| 258 | + yield 'complex example (Entity Root -> Mapped Superclass -> transient class -> Entity)' |
| 259 | + => [InvalidComplexRoot::class, InvalidComplexEntity::class]; |
| 260 | + } |
221 | 261 | }
|
222 | 262 |
|
223 | 263 | class TransientBaseClass
|
@@ -438,3 +478,85 @@ class MediumSuperclassEntity extends MediumSuperclassBase
|
438 | 478 | class SubclassWithRepository extends DDC869Payment
|
439 | 479 | {
|
440 | 480 | }
|
| 481 | + |
| 482 | +/** |
| 483 | + * @Entity |
| 484 | + * |
| 485 | + * This class misses the DiscriminatorMap declaration |
| 486 | + */ |
| 487 | +class InvalidEntityRoot |
| 488 | +{ |
| 489 | + /** |
| 490 | + * @Column(type="integer") |
| 491 | + * @Id |
| 492 | + * @GeneratedValue(strategy="AUTO") |
| 493 | + * @var int |
| 494 | + */ |
| 495 | + public $id; |
| 496 | +} |
| 497 | + |
| 498 | +/** @Entity */ |
| 499 | +class InvalidEntityRootChild extends InvalidEntityRoot |
| 500 | +{ |
| 501 | +} |
| 502 | + |
| 503 | +/** @Entity */ |
| 504 | +abstract class InvalidEntityRootAbstractChild extends InvalidEntityRoot |
| 505 | +{ |
| 506 | +} |
| 507 | + |
| 508 | +/** |
| 509 | + * @Entity |
| 510 | + * |
| 511 | + * This class misses the DiscriminatorMap declaration |
| 512 | + */ |
| 513 | +class InvalidAbstractEntityRoot |
| 514 | +{ |
| 515 | + /** |
| 516 | + * @Column(type="integer") |
| 517 | + * @Id |
| 518 | + * @GeneratedValue(strategy="AUTO") |
| 519 | + * @var int |
| 520 | + */ |
| 521 | + public $id; |
| 522 | +} |
| 523 | + |
| 524 | +/** @Entity */ |
| 525 | +class InvalidAbstractEntityRootChild extends InvalidAbstractEntityRoot |
| 526 | +{ |
| 527 | +} |
| 528 | + |
| 529 | +/** @Entity */ |
| 530 | +abstract class InvalidAbstractEntityRootAbstractChild extends InvalidAbstractEntityRoot |
| 531 | +{ |
| 532 | +} |
| 533 | + |
| 534 | +/** |
| 535 | + * @Entity |
| 536 | + * |
| 537 | + * This class misses the DiscriminatorMap declaration |
| 538 | + */ |
| 539 | +class InvalidComplexRoot |
| 540 | +{ |
| 541 | + /** |
| 542 | + * @Column(type="integer") |
| 543 | + * @Id |
| 544 | + * @GeneratedValue(strategy="AUTO") |
| 545 | + * @var int |
| 546 | + */ |
| 547 | + public $id; |
| 548 | +} |
| 549 | + |
| 550 | +/** @MappedSuperclass */ |
| 551 | +class InvalidComplexMappedSuperclass extends InvalidComplexRoot |
| 552 | +{ |
| 553 | +} |
| 554 | + |
| 555 | +class InvalidComplexTransientClass extends InvalidComplexMappedSuperclass |
| 556 | +{ |
| 557 | +} |
| 558 | + |
| 559 | +/** @Entity */ |
| 560 | +class InvalidComplexEntity extends InvalidComplexTransientClass |
| 561 | +{ |
| 562 | +} |
0 commit comments