diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 6cedc78f98..3a59abe14b 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -11304,12 +11304,6 @@ parameters: count: 1 path: src/lib/FieldType/Image/ImageStorage/Gateway/DoctrineStorage.php - - - message: '#^Method Ibexa\\Core\\FieldType\\Image\\ImageThumbnailProxyStrategy\:\:getThumbnail\(\) never returns null so it can be removed from the return type\.$#' - identifier: return.unusedType - count: 1 - path: src/lib/FieldType/Image/ImageThumbnailProxyStrategy.php - - message: '#^Parameter \#3 \$pad_string of function str_pad expects string, int given\.$#' identifier: argument.type diff --git a/src/lib/FieldType/Image/ImageThumbnailProxyStrategy.php b/src/lib/FieldType/Image/ImageThumbnailProxyStrategy.php index eac301a992..ed363f34b4 100644 --- a/src/lib/FieldType/Image/ImageThumbnailProxyStrategy.php +++ b/src/lib/FieldType/Image/ImageThumbnailProxyStrategy.php @@ -14,14 +14,13 @@ use Ibexa\Contracts\Core\Repository\Values\Content\VersionInfo; use Ibexa\Core\Repository\ProxyFactory\ProxyGeneratorInterface; use ProxyManager\Proxy\LazyLoadingInterface; +use RuntimeException; final class ImageThumbnailProxyStrategy implements FieldTypeBasedThumbnailStrategy { - /** @var \Ibexa\Core\FieldType\Image\ImageThumbnailStrategy */ - private $imageThumbnailStrategy; + private ImageThumbnailStrategy $imageThumbnailStrategy; - /** @var \Ibexa\Core\Repository\ProxyFactory\ProxyGeneratorInterface */ - private $proxyGenerator; + private ProxyGeneratorInterface $proxyGenerator; public function __construct( ImageThumbnailStrategy $imageThumbnailStrategy, @@ -36,7 +35,7 @@ public function getFieldTypeIdentifier(): string return $this->imageThumbnailStrategy->getFieldTypeIdentifier(); } - public function getThumbnail(Field $field, ?VersionInfo $versionInfo = null): ?Thumbnail + public function getThumbnail(Field $field, ?VersionInfo $versionInfo = null): Thumbnail { $initializer = function ( &$wrappedObject, @@ -49,6 +48,15 @@ public function getThumbnail(Field $field, ?VersionInfo $versionInfo = null): ?T $wrappedObject = $this->imageThumbnailStrategy->getThumbnail($field, $versionInfo); + if ($wrappedObject === null) { + throw new RuntimeException(sprintf( + 'Failed to prepare thumbnail for field type "%s" (ID: %s) using "%s" strategy.', + $field->getId(), + $field->getFieldTypeIdentifier(), + get_debug_type($this->imageThumbnailStrategy), + )); + } + return true; }; diff --git a/tests/bundle/IO/FieldType/Image/ImageThumbnailProxyStrategyTest.php b/tests/bundle/IO/FieldType/Image/ImageThumbnailProxyStrategyTest.php new file mode 100644 index 0000000000..0a9a468a89 --- /dev/null +++ b/tests/bundle/IO/FieldType/Image/ImageThumbnailProxyStrategyTest.php @@ -0,0 +1,61 @@ +imageThumbnailStrategyMock = $this->createMock(ImageThumbnailStrategy::class); + $this->proxyGeneratorMock = new ProxyGenerator(__DIR__ . '/../../../../../var/proxy'); + + $this->strategy = new ImageThumbnailProxyStrategy( + $this->imageThumbnailStrategyMock, + $this->proxyGeneratorMock, + ); + } + + public function testGetThumbnailThrowsExceptionIfWrappedObjectIsNull(): void + { + $field = $this->createMock(Field::class); + $field->method('getId')->willReturn(123); + $field->method('getFieldTypeIdentifier')->willReturn('ezimage'); + + $versionInfo = $this->createMock(VersionInfo::class); + + $this->imageThumbnailStrategyMock + ->expects(self::once()) + ->method('getThumbnail') + ->with($field, $versionInfo) + ->willReturn(null); + + $thumbnail = $this->strategy->getThumbnail($field, $versionInfo); + + $this->expectException(RuntimeException::class); + $this->expectExceptionMessage('Failed to prepare thumbnail for field type "123" (ID: ezimage) using'); + + // Initialize proxy + // @phpstan-ignore expr.resultUnused + $thumbnail->mimeType; + } +}