From 02dadf045ced5e84839186ae44126ee91296be17 Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Wed, 16 Oct 2024 16:56:49 +0200 Subject: [PATCH] Add Tag and add Category loader tests --- .../CategorySelectionPropertyResolver.php | 15 ++- .../ResourceLoader/CategoryResourceLoader.php | 2 +- .../CategorySelectionPropertyResolverTest.php | 114 ++++++++++++++++++ .../CategoryResourceLoaderTest.php | 72 +++++++++++ .../TagSelectionPropertyResolver.php | 8 +- .../ResourceLoader/TagResourceLoader.php | 4 +- .../TagSelectionPropertyResolverTest.php | 114 ++++++++++++++++++ .../ResourceLoader/TagResourceLoaderTest.php | 72 +++++++++++ 8 files changed, 389 insertions(+), 12 deletions(-) rename src/Sulu/Bundle/CategoryBundle/Infrastructure/Sulu/Content/PropertyResolver/{Resolver => }/CategorySelectionPropertyResolver.php (71%) create mode 100644 src/Sulu/Bundle/CategoryBundle/Tests/Unit/Infrastructure/Sulu/Content/PropertyResolver/CategorySelectionPropertyResolverTest.php create mode 100644 src/Sulu/Bundle/CategoryBundle/Tests/Unit/Infrastructure/Sulu/Content/ResourceLoader/CategoryResourceLoaderTest.php create mode 100644 src/Sulu/Bundle/TagBundle/Tests/Unit/Infrastructure/Sulu/Content/PropertyResolver/TagSelectionPropertyResolverTest.php create mode 100644 src/Sulu/Bundle/TagBundle/Tests/Unit/Infrastructure/Sulu/Content/ResourceLoader/TagResourceLoaderTest.php diff --git a/src/Sulu/Bundle/CategoryBundle/Infrastructure/Sulu/Content/PropertyResolver/Resolver/CategorySelectionPropertyResolver.php b/src/Sulu/Bundle/CategoryBundle/Infrastructure/Sulu/Content/PropertyResolver/CategorySelectionPropertyResolver.php similarity index 71% rename from src/Sulu/Bundle/CategoryBundle/Infrastructure/Sulu/Content/PropertyResolver/Resolver/CategorySelectionPropertyResolver.php rename to src/Sulu/Bundle/CategoryBundle/Infrastructure/Sulu/Content/PropertyResolver/CategorySelectionPropertyResolver.php index 9175895d623..6db07618963 100644 --- a/src/Sulu/Bundle/CategoryBundle/Infrastructure/Sulu/Content/PropertyResolver/Resolver/CategorySelectionPropertyResolver.php +++ b/src/Sulu/Bundle/CategoryBundle/Infrastructure/Sulu/Content/PropertyResolver/CategorySelectionPropertyResolver.php @@ -11,9 +11,9 @@ * with this source code in the file LICENSE. */ -namespace Sulu\Bundle\CategoryBundle\Infrastructure\Content\PropertyResolver\Resolver; +namespace Sulu\Bundle\CategoryBundle\Infrastructure\Sulu\Content\PropertyResolver; -use Sulu\Bundle\CategoryBundle\Infrastructure\Content\ResourceLoader\CategoryResourceLoader; +use Sulu\Bundle\CategoryBundle\Infrastructure\Sulu\Content\ResourceLoader\CategoryResourceLoader; use Sulu\Bundle\ContentBundle\Content\Application\ContentResolver\Value\ContentView; use Sulu\Bundle\ContentBundle\Content\Application\PropertyResolver\PropertyResolverInterface; @@ -26,17 +26,20 @@ class CategorySelectionPropertyResolver implements PropertyResolverInterface { public function resolve(mixed $data, string $locale, array $params = []): ContentView { - if (empty($data) || !\is_array($data) || !isset($data['ids'])) { - return ContentView::create([], ['ids' => []]); + if (!\is_array($data) + || 0 === \count($data) + || !\array_is_list($data) + ) { + return ContentView::create([], ['ids' => [], ...$params]); } /** @var string $resourceLoaderKey */ $resourceLoaderKey = $params['resourceLoader'] ?? CategoryResourceLoader::getKey(); return ContentView::createResolvables( - $data['ids'], + $data, $resourceLoaderKey, - ['ids' => $data['ids']], + ['ids' => $data, ...$params], ); } diff --git a/src/Sulu/Bundle/CategoryBundle/Infrastructure/Sulu/Content/ResourceLoader/CategoryResourceLoader.php b/src/Sulu/Bundle/CategoryBundle/Infrastructure/Sulu/Content/ResourceLoader/CategoryResourceLoader.php index b0679f585c7..3a296f1bbbd 100644 --- a/src/Sulu/Bundle/CategoryBundle/Infrastructure/Sulu/Content/ResourceLoader/CategoryResourceLoader.php +++ b/src/Sulu/Bundle/CategoryBundle/Infrastructure/Sulu/Content/ResourceLoader/CategoryResourceLoader.php @@ -11,7 +11,7 @@ * with this source code in the file LICENSE. */ -namespace Sulu\Bundle\CategoryBundle\Infrastructure\Content\ResourceLoader; +namespace Sulu\Bundle\CategoryBundle\Infrastructure\Sulu\Content\ResourceLoader; use Sulu\Bundle\CategoryBundle\Category\CategoryManagerInterface; use Sulu\Bundle\ContentBundle\Content\Application\ResourceLoader\ResourceLoaderInterface; diff --git a/src/Sulu/Bundle/CategoryBundle/Tests/Unit/Infrastructure/Sulu/Content/PropertyResolver/CategorySelectionPropertyResolverTest.php b/src/Sulu/Bundle/CategoryBundle/Tests/Unit/Infrastructure/Sulu/Content/PropertyResolver/CategorySelectionPropertyResolverTest.php new file mode 100644 index 00000000000..b4800c2284a --- /dev/null +++ b/src/Sulu/Bundle/CategoryBundle/Tests/Unit/Infrastructure/Sulu/Content/PropertyResolver/CategorySelectionPropertyResolverTest.php @@ -0,0 +1,114 @@ +resolver = new CategorySelectionPropertyResolver(); + } + + public function testResolveEmpty(): void + { + $contentView = $this->resolver->resolve([], 'en'); + + $this->assertSame([], $contentView->getContent()); + $this->assertSame(['ids' => []], $contentView->getView()); + } + + public function testResolveParams(): void + { + $contentView = $this->resolver->resolve([], 'en', ['custom' => 'params']); + + $this->assertSame([], $contentView->getContent()); + $this->assertSame([ + 'ids' => [], + 'custom' => 'params', + ], $contentView->getView()); + } + + #[DataProvider('provideUnresolvableData')] + public function testResolveUnresolvableData(mixed $data): void + { + $contentView = $this->resolver->resolve($data, 'en'); + + $this->assertSame([], $contentView->getContent()); + $this->assertSame(['ids' => []], $contentView->getView()); + } + + /** + * @return iterable + */ + public static function provideUnresolvableData(): iterable + { + yield 'null' => [null]; + yield 'smart_content' => [['source' => '123']]; + yield 'single_value' => [1]; + yield 'object' => [(object) [1, 2]]; + } + + /** + * @param array $data + */ + #[DataProvider('provideResolvableData')] + public function testResolveResolvableData(array $data): void + { + $contentView = $this->resolver->resolve($data, 'en'); + + $content = $contentView->getContent(); + $this->assertIsArray($content); + foreach ($data as $key => $value) { + $resolvable = $content[$key] ?? null; + $this->assertInstanceOf(ResolvableResource::class, $resolvable); + $this->assertSame($value, $resolvable->getId()); + $this->assertSame('category', $resolvable->getResourceLoaderKey()); + } + + $this->assertSame(['ids' => $data], $contentView->getView()); + } + + /** + * @return iterable, + * }> + */ + public static function provideResolvableData(): iterable + { + yield 'empty' => [[]]; + yield 'int_list' => [[1, 2]]; + yield 'string_list' => [['1', '2']]; + } + + public function testCustomResourceLoader(): void + { + $contentView = $this->resolver->resolve([1], 'en', ['resourceLoader' => 'custom_category']); + + $content = $contentView->getContent(); + $this->assertIsArray($content); + $resolvable = $content[0] ?? null; + $this->assertInstanceOf(ResolvableResource::class, $resolvable); + $this->assertSame(1, $resolvable->getId()); + $this->assertSame('custom_category', $resolvable->getResourceLoaderKey()); + } +} diff --git a/src/Sulu/Bundle/CategoryBundle/Tests/Unit/Infrastructure/Sulu/Content/ResourceLoader/CategoryResourceLoaderTest.php b/src/Sulu/Bundle/CategoryBundle/Tests/Unit/Infrastructure/Sulu/Content/ResourceLoader/CategoryResourceLoaderTest.php new file mode 100644 index 00000000000..6d3df870b23 --- /dev/null +++ b/src/Sulu/Bundle/CategoryBundle/Tests/Unit/Infrastructure/Sulu/Content/ResourceLoader/CategoryResourceLoaderTest.php @@ -0,0 +1,72 @@ + + */ + private ObjectProphecy $categoryManager; + + private CategoryResourceLoader $loader; + + public function setUp(): void + { + $this->categoryManager = $this->prophesize(CategoryManagerInterface::class); + $this->loader = new CategoryResourceLoader($this->categoryManager->reveal()); + } + + public function testGetKey(): void + { + $this->assertSame('category', $this->loader::getKey()); + } + + public function testLoad(): void + { + $category1 = $this->createCategory(1); + $category2 = $this->createCategory(3); + + $this->categoryManager->findByIds([1, 3])->willReturn([ + $category1, + $category2, + ]) + ->shouldBeCalled(); + + $result = $this->loader->load([1, 3], 'en', []); + + $this->assertSame([ + 1 => $category1, + 3 => $category2, + ], $result); + } + + private static function createCategory(int $id): Category + { + $category = new Category(); + static::setPrivateProperty($category, 'id', $id); + $category->setKey('category-' . $id); + + return $category; + } +} diff --git a/src/Sulu/Bundle/TagBundle/Infrastructure/Sulu/Content/PropertyResolver/TagSelectionPropertyResolver.php b/src/Sulu/Bundle/TagBundle/Infrastructure/Sulu/Content/PropertyResolver/TagSelectionPropertyResolver.php index f71d14d78d6..0c508502681 100644 --- a/src/Sulu/Bundle/TagBundle/Infrastructure/Sulu/Content/PropertyResolver/TagSelectionPropertyResolver.php +++ b/src/Sulu/Bundle/TagBundle/Infrastructure/Sulu/Content/PropertyResolver/TagSelectionPropertyResolver.php @@ -11,11 +11,11 @@ * with this source code in the file LICENSE. */ -namespace Sulu\Bundle\TagBundle\Infrastructure\Content\PropertyResolver; +namespace Sulu\Bundle\TagBundle\Infrastructure\Sulu\Content\PropertyResolver; use Sulu\Bundle\ContentBundle\Content\Application\ContentResolver\Value\ContentView; use Sulu\Bundle\ContentBundle\Content\Application\PropertyResolver\PropertyResolverInterface; -use Sulu\Bundle\TagBundle\Infrastructure\Content\ResourceLoader\TagResourceLoader; +use Sulu\Bundle\TagBundle\Infrastructure\Sulu\Content\ResourceLoader\TagResourceLoader; /** * @internal if you need to override this service, create a new service with based on ResourceLoaderInterface instead of extending this class @@ -30,7 +30,7 @@ public function resolve(mixed $data, string $locale, array $params = []): Conten || 0 === \count($data) || !\array_is_list($data) ) { - return ContentView::create([], ['ids' => []]); + return ContentView::create([], ['ids' => [], ...$params]); } /** @var string $resourceLoaderKey */ @@ -39,7 +39,7 @@ public function resolve(mixed $data, string $locale, array $params = []): Conten return ContentView::createResolvables( $data, $resourceLoaderKey, - ['ids' => $data], + ['ids' => $data, ...$params], ); } diff --git a/src/Sulu/Bundle/TagBundle/Infrastructure/Sulu/Content/ResourceLoader/TagResourceLoader.php b/src/Sulu/Bundle/TagBundle/Infrastructure/Sulu/Content/ResourceLoader/TagResourceLoader.php index d2dace6a4ea..ba16e6e639c 100644 --- a/src/Sulu/Bundle/TagBundle/Infrastructure/Sulu/Content/ResourceLoader/TagResourceLoader.php +++ b/src/Sulu/Bundle/TagBundle/Infrastructure/Sulu/Content/ResourceLoader/TagResourceLoader.php @@ -11,12 +11,14 @@ * with this source code in the file LICENSE. */ -namespace Sulu\Bundle\TagBundle\Infrastructure\Content\ResourceLoader; +namespace Sulu\Bundle\TagBundle\Infrastructure\Sulu\Content\ResourceLoader; use Sulu\Bundle\ContentBundle\Content\Application\ResourceLoader\ResourceLoaderInterface; use Sulu\Bundle\TagBundle\Tag\TagRepositoryInterface; /** + * @internal if you need to override this service, create a new service with based on ResourceLoaderInterface instead of extending this class + * * @final */ class TagResourceLoader implements ResourceLoaderInterface diff --git a/src/Sulu/Bundle/TagBundle/Tests/Unit/Infrastructure/Sulu/Content/PropertyResolver/TagSelectionPropertyResolverTest.php b/src/Sulu/Bundle/TagBundle/Tests/Unit/Infrastructure/Sulu/Content/PropertyResolver/TagSelectionPropertyResolverTest.php new file mode 100644 index 00000000000..b3485a92f07 --- /dev/null +++ b/src/Sulu/Bundle/TagBundle/Tests/Unit/Infrastructure/Sulu/Content/PropertyResolver/TagSelectionPropertyResolverTest.php @@ -0,0 +1,114 @@ +resolver = new TagSelectionPropertyResolver(); + } + + public function testResolveEmpty(): void + { + $contentView = $this->resolver->resolve([], 'en'); + + $this->assertSame([], $contentView->getContent()); + $this->assertSame(['ids' => []], $contentView->getView()); + } + + public function testResolveParams(): void + { + $contentView = $this->resolver->resolve([], 'en', ['custom' => 'params']); + + $this->assertSame([], $contentView->getContent()); + $this->assertSame([ + 'ids' => [], + 'custom' => 'params', + ], $contentView->getView()); + } + + #[DataProvider('provideUnresolvableData')] + public function testResolveUnresolvableData(mixed $data): void + { + $contentView = $this->resolver->resolve($data, 'en'); + + $this->assertSame([], $contentView->getContent()); + $this->assertSame(['ids' => []], $contentView->getView()); + } + + /** + * @return iterable + */ + public static function provideUnresolvableData(): iterable + { + yield 'null' => [null]; + yield 'smart_content' => [['source' => '123']]; + yield 'single_value' => [1]; + yield 'object' => [(object) [1, 2]]; + } + + /** + * @param array $data + */ + #[DataProvider('provideResolvableData')] + public function testResolveResolvableData(array $data): void + { + $contentView = $this->resolver->resolve($data, 'en'); + + $content = $contentView->getContent(); + $this->assertIsArray($content); + foreach ($data as $key => $value) { + $resolvable = $content[$key] ?? null; + $this->assertInstanceOf(ResolvableResource::class, $resolvable); + $this->assertSame($value, $resolvable->getId()); + $this->assertSame('tag', $resolvable->getResourceLoaderKey()); + } + + $this->assertSame(['ids' => $data], $contentView->getView()); + } + + /** + * @return iterable, + * }> + */ + public static function provideResolvableData(): iterable + { + yield 'empty' => [[]]; + yield 'int_list' => [[1, 2]]; + yield 'string_list' => [['1', '2']]; + } + + public function testCustomResourceLoader(): void + { + $contentView = $this->resolver->resolve([1], 'en', ['resourceLoader' => 'custom_tag']); + + $content = $contentView->getContent(); + $this->assertIsArray($content); + $resolvable = $content[0] ?? null; + $this->assertInstanceOf(ResolvableResource::class, $resolvable); + $this->assertSame(1, $resolvable->getId()); + $this->assertSame('custom_tag', $resolvable->getResourceLoaderKey()); + } +} diff --git a/src/Sulu/Bundle/TagBundle/Tests/Unit/Infrastructure/Sulu/Content/ResourceLoader/TagResourceLoaderTest.php b/src/Sulu/Bundle/TagBundle/Tests/Unit/Infrastructure/Sulu/Content/ResourceLoader/TagResourceLoaderTest.php new file mode 100644 index 00000000000..fd0c0341e76 --- /dev/null +++ b/src/Sulu/Bundle/TagBundle/Tests/Unit/Infrastructure/Sulu/Content/ResourceLoader/TagResourceLoaderTest.php @@ -0,0 +1,72 @@ + + */ + private ObjectProphecy $tagRepository; + + private TagResourceLoader $loader; + + public function setUp(): void + { + $this->tagRepository = $this->prophesize(TagRepositoryInterface::class); + $this->loader = new TagResourceLoader($this->tagRepository->reveal()); + } + + public function testGetKey(): void + { + $this->assertSame('tag', $this->loader::getKey()); + } + + public function testLoad(): void + { + $tag1 = $this->createTag(1); + $tag2 = $this->createTag(3); + + $this->tagRepository->findBy(['id' => [1, 3]])->willReturn([ + $tag1, + $tag2, + ]) + ->shouldBeCalled(); + + $result = $this->loader->load([1, 3], 'en', []); + + $this->assertSame([ + 1 => $tag1->getName(), + 3 => $tag2->getName(), + ], $result); + } + + private static function createTag(int $id): Tag + { + $tag = new Tag(); + static::setPrivateProperty($tag, 'id', $id); + $tag->setName('Tag ' . $id); + + return $tag; + } +}