Skip to content

Commit

Permalink
fix(serializer): use iri from $context if defined (#5201)
Browse files Browse the repository at this point in the history
  • Loading branch information
gassan committed Nov 21, 2022
1 parent ebaad51 commit 2cb3b42
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 5 deletions.
8 changes: 3 additions & 5 deletions src/Serializer/AbstractItemNormalizer.php
Original file line number Diff line number Diff line change
Expand Up @@ -203,17 +203,15 @@ public function normalize($object, $format = null, array $context = [])
unset($context[self::IS_TRANSFORMED_TO_SAME_CLASS]);
}

$iri = null;
if ($this->resourceClassResolver->isResourceClass($resourceClass)) {
$context = $this->initContext($resourceClass, $context);

if ($this->iriConverter instanceof LegacyIriConverterInterface) {
$iri = $this->iriConverter->getIriFromItem($object);
}
}

$iri = null;
if (isset($context['iri'])) {
$iri = $context['iri'];
} elseif ($this->iriConverter instanceof LegacyIriConverterInterface) {
$iri = $this->iriConverter->getIriFromItem($object);
} elseif ($this->iriConverter instanceof IriConverterInterface) {
$iri = $this->iriConverter->getIriFromResource($object, UrlGeneratorInterface::ABS_URL, $context['operation'] ?? null, $context);
}
Expand Down
47 changes: 47 additions & 0 deletions tests/Serializer/ItemNormalizerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,53 @@ public function testDenormalizeWithIdAndUpdateNotAllowed()
$normalizer->denormalize(['id' => '12', 'name' => 'hello'], Dummy::class, null, $context);
}

public function testDenormalizeWithDefinedIri()
{
$dummy = new Dummy();
$dummy->setName('hello');

$propertyNameCollection = new PropertyNameCollection(['name']);
$propertyNameCollectionFactoryProphecy = $this->prophesize(PropertyNameCollectionFactoryInterface::class);
$propertyNameCollectionFactoryProphecy->create(Dummy::class, [])->willReturn($propertyNameCollection);

$resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class);
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);

$propertyMetadata = (new ApiProperty())->withReadable(true);
$propertyMetadataFactoryProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class);
$propertyMetadataFactoryProphecy->create(Dummy::class, 'name', [])->willReturn($propertyMetadata);

$iriConverterProphecy = $this->prophesize(IriConverterInterface::class);
$iriConverterProphecy->getIriFromItem($dummy)->shouldNotBeCalled();

$resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class);
$resourceClassResolverProphecy->getResourceClass($dummy, null)->willReturn(Dummy::class);
$resourceClassResolverProphecy->getResourceClass(null, Dummy::class)->willReturn(Dummy::class);
$resourceClassResolverProphecy->isResourceClass(Dummy::class)->willReturn(true);

$serializerProphecy = $this->prophesize(SerializerInterface::class);
$serializerProphecy->willImplement(NormalizerInterface::class);
$serializerProphecy->normalize('hello', null, Argument::type('array'))->willReturn('hello');

$normalizer = new ItemNormalizer(
$propertyNameCollectionFactoryProphecy->reveal(),
$propertyMetadataFactoryProphecy->reveal(),
$iriConverterProphecy->reveal(),
$resourceClassResolverProphecy->reveal(),
null,
null,
null,
null,
false,
null,
[],
null
);
$normalizer->setSerializer($serializerProphecy->reveal());

$this->assertEquals(['name' => 'hello'], $normalizer->normalize($dummy, null, ['resources' => [], 'iri' => '/custom']));
}

public function testDenormalizeWithIdAndNoResourceClass()
{
$context = [];
Expand Down

0 comments on commit 2cb3b42

Please sign in to comment.