diff --git a/src/Domain/Value/Link.php b/src/Domain/Value/Link.php index 1ca0c2e..3d2c6e8 100644 --- a/src/Domain/Value/Link.php +++ b/src/Domain/Value/Link.php @@ -93,9 +93,14 @@ public function __construct(array $values) Assert::keyExists($values, 'published'); $this->isPublished = true === $values['published']; - Assert::keyExists($values, 'alternates'); - Assert::isArray($values['alternates'], 'The value of the "alternates" key must be an array. Got: %s'); - $this->alternates = array_map(static fn (array $values) => new LinkAlternate($values), $values['alternates']); + $alternates = []; + + if (\array_key_exists('alternates', $values) && null !== $values['alternates'] && [] !== $values['alternates']) { + Assert::isArray($values['alternates'], 'The value of the "alternates" key must be an array. Got: %s'); + $alternates = array_map(static fn (array $values): LinkAlternate => new LinkAlternate($values), $values['alternates']); + } + + $this->alternates = $alternates; } public function isFolder(): bool diff --git a/src/Resolver/StoryResolver.php b/src/Resolver/StoryResolver.php index 651241f..0586ffd 100644 --- a/src/Resolver/StoryResolver.php +++ b/src/Resolver/StoryResolver.php @@ -31,7 +31,6 @@ public function resolve(array $target, array $relations): array $relationMap[$relation['uuid']] = $relation; } - // Resolve relations within the relation map first $this->doResolve($relationMap, $relationMap); diff --git a/tests/Unit/Domain/Value/LinkTest.php b/tests/Unit/Domain/Value/LinkTest.php index e5fa444..b5e43aa 100644 --- a/tests/Unit/Domain/Value/LinkTest.php +++ b/tests/Unit/Domain/Value/LinkTest.php @@ -364,6 +364,41 @@ public function getNameWithLangAndAlternate(): void self::assertSame($name, (new Link($values))->getName($lang)); } + #[Test] + public function alternateIsOptional(): void + { + $faker = self::faker(); + + $values = $faker->linkResponse(); + unset($values['alternates']); + + self::assertEmpty((new Link($values))->alternates); + } + + #[Test] + public function alternateIsOptionalWithEmptyArray(): void + { + $faker = self::faker(); + + $values = $faker->linkResponse(); + unset($values['alternates']); + $values['alternates'] = []; + + self::assertEmpty((new Link($values))->alternates); + } + + #[Test] + public function alternateIsOptionalWithNull(): void + { + $faker = self::faker(); + + $values = $faker->linkResponse([ + 'alternates' => null, + ]); + + self::assertEmpty((new Link($values))->alternates); + } + #[Test] public function getNameWithNullReturnsDefaultName(): void {