diff --git a/src/Controller/Api/TestController.php b/src/Controller/Api/TestController.php index abb6e08..88332a6 100644 --- a/src/Controller/Api/TestController.php +++ b/src/Controller/Api/TestController.php @@ -136,7 +136,7 @@ private function getSampleMedia(string $testFile): MediaEntity private function getMediaById(string $fileName, Context $context): ?MediaEntity { $criteria = new Criteria(); - //we use the fileName filter to add backward compatibility + // we use the fileName filter to add backward compatibility $criteria->addFilter(new EqualsFilter('fileName', $fileName)); /** @var MediaCollection $entities */ diff --git a/src/Core/Media/MediaUrlLoader.php b/src/Core/Media/MediaUrlLoader.php index ea9fc8a..327a55d 100644 --- a/src/Core/Media/MediaUrlLoader.php +++ b/src/Core/Media/MediaUrlLoader.php @@ -96,7 +96,7 @@ private function map(iterable $entities): array } if (!$thumbnail->has('width')) { - //TODO: load it! it might be empty due to PartialDataLoading, maybe subscribe to partial.thumbnail.loaded + // TODO: load it! it might be empty due to PartialDataLoading, maybe subscribe to partial.thumbnail.loaded continue; } diff --git a/tests/unit/Core/Media/MediaUrlLoaderTest.php b/tests/unit/Core/Media/MediaUrlLoaderTest.php new file mode 100644 index 0000000..56d49bd --- /dev/null +++ b/tests/unit/Core/Media/MediaUrlLoaderTest.php @@ -0,0 +1,236 @@ +createMock(MediaUrlGenerator::class); + $mediaUrlGenerator->expects(static::once()) + ->method('generate') + ->willReturn([$id => 'https://example.com/a0/image.jpg']); + + $mediaUrlLoader = new MediaUrlLoader($mediaUrlGenerator); + $entity = new PartialEntity(); + $entity->assign([ + 'id' => $id, + 'path' => 'a0/image.txt', + 'private' => false, + ]); + + static::assertFalse($entity->has('url')); + + $mediaUrlLoader->loaded([$entity]); + + static::assertTrue($entity->has('url')); + static::assertSame('https://example.com/a0/image.jpg', $entity->get('url')); + } + + public function testLoadedWithMissingPrivate() { + $id = Uuid::randomHex(); + + $mediaUrlGenerator = $this->createMock(MediaUrlGenerator::class); + $mediaUrlGenerator->expects(static::never()) + ->method('generate') + ->willReturn([$id => 'https://example.com/a0/image.jpg']); + + $mediaUrlLoader = new MediaUrlLoader($mediaUrlGenerator); + $entity = new PartialEntity(); + $entity->assign([ + 'id' => $id, + 'path' => 'a0/image.txt', + ]); + + static::assertFalse($entity->has('url')); + + $mediaUrlLoader->loaded([$entity]); + + static::assertFalse($entity->has('url')); + } + + public function testLoadedWithMissingUrlResult() { + $id = Uuid::randomHex(); + + $mediaUrlGenerator = $this->createMock(MediaUrlGenerator::class); + $mediaUrlGenerator->expects(static::once()) + ->method('generate') + ->willReturn([]); + + $mediaUrlLoader = new MediaUrlLoader($mediaUrlGenerator); + $entity = new PartialEntity(); + $entity->assign([ + 'id' => $id, + 'path' => 'a0/image.txt', + 'private' => false, + ]); + + static::assertFalse($entity->has('url')); + + $mediaUrlLoader->loaded([$entity]); + + static::assertFalse($entity->has('url')); + } + + public function testLoadedWithMissingPathResult() { + $id = Uuid::randomHex(); + + $mediaUrlGenerator = $this->createMock(MediaUrlGenerator::class); + $mediaUrlGenerator->expects(static::never()) + ->method('generate'); + + $mediaUrlLoader = new MediaUrlLoader($mediaUrlGenerator); + $entity = new PartialEntity(); + $entity->assign([ + 'id' => $id, + 'private' => false, + ]); + + static::assertFalse($entity->has('url')); + + $mediaUrlLoader->loaded([$entity]); + + static::assertFalse($entity->has('url')); + } + + public function testLoadedWithThumbnailHavingUrls() { + $mediaUrlGenerator = $this->createMock(MediaUrlGenerator::class); + $mediaUrlGenerator->expects(static::once()) + ->method('generate') + ->willReturn([ + '1' => 'https://example.com/a0/image.jpg?width=100', + '2' => 'https://example.com/a0/thumbnailimage.jpg?width=100', + ]); + + $mediaUrlLoader = new MediaUrlLoader($mediaUrlGenerator); + $entity = new PartialEntity(); + $entity->assign([ + 'id' => '1', + 'path' => 'a0/image.txt', + 'private' => false, + 'width' => 100, + 'thumbnails' => [ + (new PartialEntity())->assign([ + 'id' => '2', + 'path' => 'a0/thumbnailimage.jpg', + 'width' => 100, + ]), + ], + ]); + + static::assertFalse($entity->has('url')); + static::assertFalse($entity->get('thumbnails')[0]->has('url')); + + $mediaUrlLoader->loaded([$entity]); + + static::assertTrue($entity->has('url')); + static::assertTrue($entity->get('thumbnails')[0]->has('url')); + static::assertSame('https://example.com/a0/thumbnailimage.jpg?width=100', $entity->get('thumbnails')[0]->get('url')); + } + + public function testLoadedWithThumbnailHavingNoUrlsWithMissingWidth() { + $mediaUrlGenerator = $this->createMock(MediaUrlGenerator::class); + $mediaUrlGenerator->expects(static::once()) + ->method('generate') + ->willReturn([ + '1' => 'https://example.com/a0/image.jpg?width=100', + ]); + + $mediaUrlLoader = new MediaUrlLoader($mediaUrlGenerator); + $entity = new PartialEntity(); + $entity->assign([ + 'id' => '1', + 'path' => 'a0/image.txt', + 'private' => false, + 'thumbnails' => [ + (new PartialEntity())->assign([ + 'id' => '2', + 'path' => 'a0/thumbnailimage.jpg', + ]), + ], + ]); + + static::assertFalse($entity->has('url')); + static::assertFalse($entity->get('thumbnails')[0]->has('url')); + + $mediaUrlLoader->loaded([$entity]); + + static::assertTrue($entity->has('url')); + static::assertFalse($entity->get('thumbnails')[0]->has('url')); + } + + public function testLoadedWithThumbnailHavingNoUrl() { + $mediaUrlGenerator = $this->createMock(MediaUrlGenerator::class); + $mediaUrlGenerator->expects(static::once()) + ->method('generate') + ->willReturn([ + '1' => 'https://example.com/a0/image.jpg', + ]); + + $mediaUrlLoader = new MediaUrlLoader($mediaUrlGenerator); + $entity = new PartialEntity(); + $entity->assign([ + 'id' => '1', + 'path' => 'a0/image.txt', + 'private' => false, + 'width' => 100, + 'thumbnails' => [ + (new PartialEntity())->assign([ + 'id' => '2', + ]), + ], + ]); + + static::assertFalse($entity->has('url')); + static::assertFalse($entity->get('thumbnails')[0]->has('url')); + + $mediaUrlLoader->loaded([$entity]); + + static::assertTrue($entity->has('url')); + static::assertFalse($entity->get('thumbnails')[0]->has('url')); + } + + /** + * @dataProvider provideInvalidThumbnailData + */ + public function testLoadedWithNotIterableThumbnail(mixed $thumbnail) { + $mediaUrlGenerator = $this->createMock(MediaUrlGenerator::class); + $mediaUrlGenerator->expects(static::once()) + ->method('generate') + ->willReturn([ + '1' => 'https://example.com/a0/image.jpg', + ]); + + $mediaUrlLoader = new MediaUrlLoader($mediaUrlGenerator); + $entity = new PartialEntity(); + $entity->assign([ + 'id' => '1', + 'path' => 'a0/image.txt', + 'private' => false, + 'width' => 100, + 'thumbnails' => $thumbnail, + ]); + + static::assertFalse($entity->has('url')); + + $mediaUrlLoader->loaded([$entity]); + + static::assertTrue($entity->has('url')); + } + + public function provideInvalidThumbnailData(): iterable + { + yield [[]]; + yield [[null]]; + yield ['']; + yield [['']]; + yield [new PartialEntity()]; + } +} \ No newline at end of file