From 5c838c66c6739d47f676de1c85196444678300e8 Mon Sep 17 00:00:00 2001 From: Silas Joisten Date: Thu, 18 Sep 2025 14:51:19 +0300 Subject: [PATCH 1/2] fix: alternate links are optional --- src/Domain/Value/Link.php | 10 +++++--- tests/Unit/Domain/Value/LinkTest.php | 35 ++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/Domain/Value/Link.php b/src/Domain/Value/Link.php index 1ca0c2e..812c4c3 100644 --- a/src/Domain/Value/Link.php +++ b/src/Domain/Value/Link.php @@ -93,9 +93,13 @@ 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/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 { From f4f30b4ebf4090e30f45231c3963719948743610 Mon Sep 17 00:00:00 2001 From: Silas Joisten Date: Thu, 18 Sep 2025 14:51:50 +0300 Subject: [PATCH 2/2] Fix --- src/Domain/Value/Link.php | 1 + src/Resolver/StoryResolver.php | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Domain/Value/Link.php b/src/Domain/Value/Link.php index 812c4c3..3d2c6e8 100644 --- a/src/Domain/Value/Link.php +++ b/src/Domain/Value/Link.php @@ -94,6 +94,7 @@ public function __construct(array $values) $this->isPublished = true === $values['published']; $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']); 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);