|
23 | 23 | use ApiPlatform\Serializer\AbstractItemNormalizer;
|
24 | 24 | use ApiPlatform\Symfony\Security\ResourceAccessCheckerInterface;
|
25 | 25 | use ApiPlatform\Tests\Fixtures\TestBundle\Entity\Dummy;
|
| 26 | +use ApiPlatform\Tests\Fixtures\TestBundle\Entity\DummyTableInheritance; |
| 27 | +use ApiPlatform\Tests\Fixtures\TestBundle\Entity\DummyTableInheritanceChild; |
| 28 | +use ApiPlatform\Tests\Fixtures\TestBundle\Entity\DummyTableInheritanceRelated; |
26 | 29 | use ApiPlatform\Tests\Fixtures\TestBundle\Entity\RelatedDummy;
|
27 | 30 | use ApiPlatform\Tests\Fixtures\TestBundle\Entity\SecuredDummy;
|
28 | 31 | use Doctrine\Common\Collections\ArrayCollection;
|
@@ -576,6 +579,70 @@ public function testNormalizeReadableLinks(): void
|
576 | 579 | ]));
|
577 | 580 | }
|
578 | 581 |
|
| 582 | + public function testNormalizePolymorphicRelations(): void |
| 583 | + { |
| 584 | + $concreteDummy = new DummyTableInheritanceChild(); |
| 585 | + |
| 586 | + $dummy = new DummyTableInheritanceRelated(); |
| 587 | + $dummy->addChild($concreteDummy); |
| 588 | + |
| 589 | + $abstractDummies = new ArrayCollection([$concreteDummy]); |
| 590 | + |
| 591 | + $propertyNameCollectionFactoryProphecy = $this->prophesize(PropertyNameCollectionFactoryInterface::class); |
| 592 | + $propertyNameCollectionFactoryProphecy->create(DummyTableInheritanceRelated::class, [])->willReturn(new PropertyNameCollection(['children'])); |
| 593 | + |
| 594 | + $abstractDummyType = new Type(Type::BUILTIN_TYPE_OBJECT, false, DummyTableInheritance::class); |
| 595 | + $abstractDummiesType = new Type(Type::BUILTIN_TYPE_OBJECT, false, ArrayCollection::class, true, new Type(Type::BUILTIN_TYPE_INT), $abstractDummyType); |
| 596 | + |
| 597 | + $propertyMetadataFactoryProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class); |
| 598 | + $propertyMetadataFactoryProphecy->create(DummyTableInheritanceRelated::class, 'children', [])->willReturn((new ApiProperty())->withBuiltinTypes([$abstractDummiesType])->withReadable(true)->withWritable(false)->withReadableLink(true)); |
| 599 | + |
| 600 | + $iriConverterProphecy = $this->prophesize(IriConverterInterface::class); |
| 601 | + $iriConverterProphecy->getIriFromResource($dummy, Argument::cetera())->willReturn('/dummies/1'); |
| 602 | + |
| 603 | + $propertyAccessorProphecy = $this->prophesize(PropertyAccessorInterface::class); |
| 604 | + $propertyAccessorProphecy->getValue($dummy, 'children')->willReturn($abstractDummies); |
| 605 | + |
| 606 | + $resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class); |
| 607 | + $resourceClassResolverProphecy->getResourceClass($dummy, null)->willReturn(DummyTableInheritanceRelated::class); |
| 608 | + $resourceClassResolverProphecy->getResourceClass(null, DummyTableInheritanceRelated::class)->willReturn(DummyTableInheritanceRelated::class); |
| 609 | + $resourceClassResolverProphecy->getResourceClass($concreteDummy, DummyTableInheritance::class)->willReturn(DummyTableInheritanceChild::class); |
| 610 | + $resourceClassResolverProphecy->getResourceClass($abstractDummies, DummyTableInheritance::class)->willReturn(DummyTableInheritance::class); |
| 611 | + $resourceClassResolverProphecy->isResourceClass(DummyTableInheritanceRelated::class)->willReturn(true); |
| 612 | + $resourceClassResolverProphecy->isResourceClass(DummyTableInheritance::class)->willReturn(true); |
| 613 | + |
| 614 | + $serializerProphecy = $this->prophesize(SerializerInterface::class); |
| 615 | + $serializerProphecy->willImplement(NormalizerInterface::class); |
| 616 | + $concreteDummyChildContext = Argument::allOf( |
| 617 | + Argument::type('array'), |
| 618 | + Argument::withEntry('resource_class', DummyTableInheritanceChild::class), |
| 619 | + Argument::not(Argument::withKey('iri')) |
| 620 | + ); |
| 621 | + $serializerProphecy->normalize($concreteDummy, null, $concreteDummyChildContext)->willReturn(['foo' => 'concrete']); |
| 622 | + $serializerProphecy->normalize([['foo' => 'concrete']], null, Argument::type('array'))->willReturn([['foo' => 'concrete']]); |
| 623 | + |
| 624 | + $normalizer = $this->getMockForAbstractClass(AbstractItemNormalizer::class, [ |
| 625 | + $propertyNameCollectionFactoryProphecy->reveal(), |
| 626 | + $propertyMetadataFactoryProphecy->reveal(), |
| 627 | + $iriConverterProphecy->reveal(), |
| 628 | + $resourceClassResolverProphecy->reveal(), |
| 629 | + $propertyAccessorProphecy->reveal(), |
| 630 | + null, |
| 631 | + null, |
| 632 | + [], |
| 633 | + null, |
| 634 | + null, |
| 635 | + ]); |
| 636 | + $normalizer->setSerializer($serializerProphecy->reveal()); |
| 637 | + |
| 638 | + $expected = [ |
| 639 | + 'children' => [['foo' => 'concrete']], |
| 640 | + ]; |
| 641 | + $this->assertSame($expected, $normalizer->normalize($dummy, null, [ |
| 642 | + 'resources' => [], |
| 643 | + ])); |
| 644 | + } |
| 645 | + |
579 | 646 | public function testDenormalize(): void
|
580 | 647 | {
|
581 | 648 | $data = [
|
|
0 commit comments