diff --git a/core-bundle/src/Image/Studio/ImageResult.php b/core-bundle/src/Image/Studio/ImageResult.php index bda99c4e5a2..31ab9a247a5 100644 --- a/core-bundle/src/Image/Studio/ImageResult.php +++ b/core-bundle/src/Image/Studio/ImageResult.php @@ -154,12 +154,6 @@ public function getFilePath($absolute = false): string */ public function createIfDeferred(): void { - $resizer = $this->resizer(); - - if (!$resizer instanceof DeferredResizerInterface) { - throw new \RuntimeException('The "contao.image.resizer" service does not support deferred resizing.'); - } - $picture = $this->getPicture(); $array_flatten = static function (array $array): array { @@ -187,6 +181,16 @@ static function ($image): bool { $array_flatten(array_map($findDeferredImages, $picture->getSources())) ); + if (empty($deferredImages)) { + return; + } + + $resizer = $this->resizer(); + + if (!$resizer instanceof DeferredResizerInterface) { + throw new \RuntimeException('The "contao.image.resizer" service does not support deferred resizing.'); + } + $resizedPaths = []; /** @var DeferredImageInterface $deferredImage */ diff --git a/core-bundle/tests/Image/Studio/ImageResultTest.php b/core-bundle/tests/Image/Studio/ImageResultTest.php index 2f6008d299d..27c1891c54b 100644 --- a/core-bundle/tests/Image/Studio/ImageResultTest.php +++ b/core-bundle/tests/Image/Studio/ImageResultTest.php @@ -18,6 +18,7 @@ use Contao\CoreBundle\Image\Studio\ImageResult; use Contao\CoreBundle\Tests\TestCase; use Contao\Image\DeferredImage; +use Contao\Image\DeferredImageInterface; use Contao\Image\DeferredResizerInterface; use Contao\Image\Image; use Contao\Image\ImageDimensions; @@ -200,7 +201,6 @@ public function testGetFilePathFromImageResource(): void */ public function testCreateIfDeferred(array $img, array $sources, array $expectedDeferredImages): void { - /** @var PictureInterface&MockObject $picture */ $picture = $this->createMock(PictureInterface::class); $picture ->expects($this->once()) @@ -342,7 +342,26 @@ public function provideDeferredImages(): \Generator public function testCreateIfDeferredFailsWithoutDeferredResizer(): void { + $picture = $this->createMock(PictureInterface::class); + $picture + ->expects($this->once()) + ->method('getSources') + ->with() + ->willReturn([]) + ; + + $picture + ->expects($this->once()) + ->method('getImg') + ->with() + ->willReturn(['src' => $this->createMock(DeferredImageInterface::class)]) + ; + $pictureFactory = $this->createMock(PictureFactoryInterface::class); + $pictureFactory + ->method('create') + ->willReturn($picture) + ; $nonDeferredResizer = $this->createMock(Resizer::class); @@ -363,6 +382,45 @@ public function testCreateIfDeferredFailsWithoutDeferredResizer(): void $imageResult->createIfDeferred(); } + public function testCreateIfDeferredDoesNotFailWithoutDeferredResizerIfThereAreNoDeferredImages(): void + { + $picture = $this->createMock(PictureInterface::class); + $picture + ->expects($this->once()) + ->method('getSources') + ->with() + ->willReturn([]) + ; + + $picture + ->expects($this->once()) + ->method('getImg') + ->with() + ->willReturn([]) + ; + + $pictureFactory = $this->createMock(PictureFactoryInterface::class); + $pictureFactory + ->method('create') + ->willReturn($picture) + ; + + $nonDeferredResizer = $this->createMock(Resizer::class); + + $locator = $this->createMock(ContainerInterface::class); + $locator + ->method('get') + ->willReturnMap([ + ['contao.image.picture_factory', $pictureFactory], + ['contao.image.resizer', $nonDeferredResizer], + ]) + ; + + $imageResult = new ImageResult($locator, '/project/dir', '/project/dir/image.jpg'); + + $imageResult->createIfDeferred(); + } + /** * @return PictureFactoryInterface&MockObject */