From d9033b92d8d159e1b7c966db1e7bd31c91ff5245 Mon Sep 17 00:00:00 2001 From: Silas Joisten Date: Fri, 25 Jul 2025 08:51:11 +0200 Subject: [PATCH 1/4] feat(response): Add support for `rel_uuids` --- .../Faker/Provider/StoryblokProvider.php | 5 ++++ src/Response/StoriesResponse.php | 22 ++++++++++++++-- tests/Unit/Response/StoriesResponseTest.php | 26 ++++++++++++++++--- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/Bridge/Faker/Provider/StoryblokProvider.php b/src/Bridge/Faker/Provider/StoryblokProvider.php index 99c6a38..5150c65 100644 --- a/src/Bridge/Faker/Provider/StoryblokProvider.php +++ b/src/Bridge/Faker/Provider/StoryblokProvider.php @@ -46,6 +46,7 @@ public function storiesResponse(array $overrides = []): array 'stories' => [], 'cv' => $this->generator->randomNumber(), 'rels' => [], + 'rel_uuids' => [], 'links' => [], ]; @@ -59,6 +60,10 @@ public function storiesResponse(array $overrides = []): array $response['rels'][] = $this->generator->url(); } + for ($i = 0; $this->generator->numberBetween(1, 5) > $i; ++$i) { + $response['rel_uuids'][] = $this->generator->uuid(); + } + for ($i = 0; $this->generator->numberBetween(1, 5) > $i; ++$i) { $response['links'][] = $this->generator->url(); } diff --git a/src/Response/StoriesResponse.php b/src/Response/StoriesResponse.php index e0183b5..f54f9a9 100644 --- a/src/Response/StoriesResponse.php +++ b/src/Response/StoriesResponse.php @@ -34,6 +34,11 @@ */ public array $rels; + /** + * @var list + */ + public array $relUuids; + /** * @var list> */ @@ -54,8 +59,21 @@ public function __construct( Assert::integer($values['cv']); $this->cv = $values['cv']; - Assert::keyExists($values, 'rels'); - $this->rels = $values['rels']; + $rels = []; + + if (\array_key_exists('rels', $values)) { + $rels = $values['rels']; + } + + $this->rels = $rels; + + $relUuids = []; + + if (\array_key_exists('rel_uuids', $values)) { + $relUuids = $values['rel_uuids']; + } + + $this->relUuids = $relUuids; Assert::keyExists($values, 'links'); $this->links = $values['links']; diff --git a/tests/Unit/Response/StoriesResponseTest.php b/tests/Unit/Response/StoriesResponseTest.php index abde9d1..970a8aa 100644 --- a/tests/Unit/Response/StoriesResponseTest.php +++ b/tests/Unit/Response/StoriesResponseTest.php @@ -98,14 +98,12 @@ public function rels(): void } #[Test] - public function relsKeyMustExist(): void + public function relsKeyIsOptional(): void { $values = self::faker()->storiesResponse(); unset($values['rels']); - self::expectException(\InvalidArgumentException::class); - - new StoriesResponse(new Total(1), new Pagination(), $values); + self::assertEmpty((new StoriesResponse(new Total(1), new Pagination(), $values))->rels); } #[Test] @@ -129,4 +127,24 @@ public function linksKeyMustExist(): void new StoriesResponse(new Total(1), new Pagination(), $values); } + + #[Test] + public function relUuids(): void + { + $values = self::faker()->storiesResponse(); + + self::assertCount( + \count($values['rel_uuids']), + (new StoriesResponse(new Total(1), new Pagination(), $values))->relUuids, + ); + } + + #[Test] + public function relUuidsKeyIsOptional(): void + { + $values = self::faker()->storiesResponse(); + unset($values['rel_uuids']); + + self::assertEmpty((new StoriesResponse(new Total(1), new Pagination(), $values))->relUuids); + } } From 3be5d5b958b4aaebc4cda60d31690e9b01772b0b Mon Sep 17 00:00:00 2001 From: Silas Joisten Date: Sat, 26 Jul 2025 09:24:52 +0200 Subject: [PATCH 2/4] fix --- src/Response/StoryResponse.php | 22 ++++++++++++++++++++-- tests/Unit/Response/StoryResponseTest.php | 21 ++++++++++++++++++--- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/Response/StoryResponse.php b/src/Response/StoryResponse.php index d8d1ef6..3dee71d 100644 --- a/src/Response/StoryResponse.php +++ b/src/Response/StoryResponse.php @@ -32,6 +32,11 @@ */ public array $rels; + /** + * @var list + */ + public array $relUuids; + /** * @var list> */ @@ -49,8 +54,21 @@ public function __construct(array $values) Assert::integer($values['cv']); $this->cv = $values['cv']; - Assert::keyExists($values, 'rels'); - $this->rels = $values['rels']; + $rels = []; + + if (\array_key_exists('rels', $values)) { + $rels = $values['rels']; + } + + $this->rels = $rels; + + $relUuids = []; + + if (\array_key_exists('rel_uuids', $values)) { + $relUuids = $values['rel_uuids']; + } + + $this->relUuids = $relUuids; Assert::keyExists($values, 'links'); $this->links = $values['links']; diff --git a/tests/Unit/Response/StoryResponseTest.php b/tests/Unit/Response/StoryResponseTest.php index 7b25a2c..b00379f 100644 --- a/tests/Unit/Response/StoryResponseTest.php +++ b/tests/Unit/Response/StoryResponseTest.php @@ -79,14 +79,29 @@ public function rels(): void } #[Test] - public function relsKeyMustExist(): void + public function relsIsOptional(): void { $values = self::faker()->storyResponse(); unset($values['rels']); - self::expectException(\InvalidArgumentException::class); + self::assertEmpty((new StoryResponse($values))->rels); + } - new StoryResponse($values); + #[Test] + public function relUuids(): void + { + $values = self::faker()->storyResponse(); + + self::assertCount(\count($values['rel_uuids']), (new StoryResponse($values))->relUuids); + } + + #[Test] + public function relsUuidsIsOptional(): void + { + $values = self::faker()->storyResponse(); + unset($values['rel_uuids']); + + self::assertEmpty((new StoryResponse($values))->relUuids); } #[Test] From 0cc0506fb051a16071a9261eb06eb83f55e7b57d Mon Sep 17 00:00:00 2001 From: Silas Joisten Date: Sat, 26 Jul 2025 09:28:45 +0200 Subject: [PATCH 3/4] fix --- src/Bridge/Faker/Provider/StoryblokProvider.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Bridge/Faker/Provider/StoryblokProvider.php b/src/Bridge/Faker/Provider/StoryblokProvider.php index 5150c65..5a55a22 100644 --- a/src/Bridge/Faker/Provider/StoryblokProvider.php +++ b/src/Bridge/Faker/Provider/StoryblokProvider.php @@ -31,12 +31,14 @@ final class StoryblokProvider extends BaseProvider * stories?: list>, * links?: string[], * rels?: string[], + * rel_uuids?: string[], * } $overrides * * @return array{ * cv: integer, * stories: list>, * links: string[], + * rel_uuids: string[], * rels: string[], * } */ @@ -80,6 +82,7 @@ public function storiesResponse(array $overrides = []): array * story?: array, * links?: string[], * rels?: string[], + * rel_uuids?: string[], * } $overrides * * @return array{ @@ -87,6 +90,7 @@ public function storiesResponse(array $overrides = []): array * story: array, * links: string[], * rels: string[], + * rel_uuids: string[], * } */ public function storyResponse(array $overrides = []): array @@ -97,6 +101,7 @@ public function storyResponse(array $overrides = []): array ], 'cv' => $this->generator->randomNumber(), 'rels' => [], + 'rel_uuids' => [], 'links' => [], ]; From 4f4b330c7ba088d6a22f38b7637bf7f4cf7ef5c8 Mon Sep 17 00:00:00 2001 From: Silas Joisten Date: Sat, 26 Jul 2025 09:32:04 +0200 Subject: [PATCH 4/4] Fix --- phpstan-baseline.neon | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 0b3c5ca..0085d20 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -73,7 +73,7 @@ parameters: path: src/Bridge/Faker/Provider/StoryblokProvider.php - - message: '#^Method Storyblok\\Api\\Bridge\\Faker\\Provider\\StoryblokProvider\:\:storiesResponse\(\) should return array\{cv\: int, stories\: list\\>, links\: array\, rels\: array\\} but returns array\.$#' + message: '#^Method Storyblok\\Api\\Bridge\\Faker\\Provider\\StoryblokProvider\:\:storiesResponse\(\) should return array\{cv\: int, stories\: list\\>, links\: array\, rel_uuids\: array\, rels\: array\\} but returns array\.$#' identifier: return.type count: 1 path: src/Bridge/Faker/Provider/StoryblokProvider.php @@ -85,7 +85,7 @@ parameters: path: src/Bridge/Faker/Provider/StoryblokProvider.php - - message: '#^Method Storyblok\\Api\\Bridge\\Faker\\Provider\\StoryblokProvider\:\:storyResponse\(\) should return array\{cv\: int, story\: array\, links\: array\, rels\: array\\} but returns array\.$#' + message: '#^Method Storyblok\\Api\\Bridge\\Faker\\Provider\\StoryblokProvider\:\:storyResponse\(\) should return array\{cv\: int, story\: array\, links\: array\, rels\: array\, rel_uuids\: array\\} but returns array\.$#' identifier: return.type count: 1 path: src/Bridge/Faker/Provider/StoryblokProvider.php