Skip to content

Commit 23d5f36

Browse files
committed
Merge branch 'MC-42892' of https://github.com/magento-l3/magento2ce into L3-PR-20210830
2 parents 58ede28 + ac7e8c5 commit 23d5f36

File tree

3 files changed

+198
-3
lines changed

3 files changed

+198
-3
lines changed

app/code/Magento/Catalog/Observer/ImageResizeAfterProductSave.php

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Magento\Framework\Event\ObserverInterface;
1111
use Magento\Framework\App\State;
1212
use Magento\MediaStorage\Service\ImageResize;
13+
use Magento\MediaStorage\Service\ImageResizeScheduler;
1314
use Magento\Catalog\Model\Config\CatalogMediaConfig;
1415

1516
/**
@@ -32,21 +33,37 @@ class ImageResizeAfterProductSave implements ObserverInterface
3233
*/
3334
private $catalogMediaConfig;
3435

36+
/**
37+
* @var ImageResizeScheduler
38+
*/
39+
private $imageResizeScheduler;
40+
41+
/**
42+
* @var bool
43+
*/
44+
private $imageResizeSchedulerFlag = false;
45+
3546
/**
3647
* Product constructor.
3748
*
3849
* @param ImageResize $imageResize
3950
* @param State $state
4051
* @param CatalogMediaConfig $catalogMediaConfig
52+
* @param ImageResizeScheduler $imageResizeScheduler
53+
* @param bool $imageResizeSchedulerFlag
4154
*/
4255
public function __construct(
4356
ImageResize $imageResize,
4457
State $state,
45-
CatalogMediaConfig $catalogMediaConfig
58+
CatalogMediaConfig $catalogMediaConfig,
59+
ImageResizeScheduler $imageResizeScheduler,
60+
bool $imageResizeSchedulerFlag = false
4661
) {
4762
$this->imageResize = $imageResize;
4863
$this->state = $state;
4964
$this->catalogMediaConfig = $catalogMediaConfig;
65+
$this->imageResizeScheduler = $imageResizeScheduler;
66+
$this->imageResizeSchedulerFlag = $imageResizeSchedulerFlag;
5067
}
5168

5269
/**
@@ -72,7 +89,7 @@ public function execute(\Magento\Framework\Event\Observer $observer)
7289

7390
if (!(bool) $product->getId()) {
7491
foreach ($product->getMediaGalleryImages() as $image) {
75-
$this->imageResize->resizeFromImageName($image->getFile());
92+
$this->resizeImage($image->getFile());
7693
}
7794
} else {
7895
$new = $product->getData('media_gallery');
@@ -81,8 +98,22 @@ public function execute(\Magento\Framework\Event\Observer $observer)
8198
$mediaOriginalGallery = !empty($original['images']) ? array_column($original['images'], 'file') : [];
8299

83100
foreach (array_diff($mediaGallery, $mediaOriginalGallery) as $image) {
84-
$this->imageResize->resizeFromImageName($image);
101+
$this->resizeImage($image);
85102
}
86103
}
87104
}
105+
106+
/**
107+
* Resize image in synchronous or asynchronous way
108+
*
109+
* @param string $image
110+
*/
111+
private function resizeImage(string $image): void
112+
{
113+
if ($this->imageResizeSchedulerFlag) {
114+
$this->imageResizeScheduler->schedule($image);
115+
} else {
116+
$this->imageResize->resizeFromImageName($image);
117+
}
118+
}
88119
}
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\Catalog\Test\Unit\Observer;
10+
11+
use Magento\Catalog\Observer\ImageResizeAfterProductSave;
12+
use Magento\Catalog\Model\Product;
13+
use Magento\Framework\Event;
14+
use Magento\Framework\Event\Observer;
15+
use PHPUnit\Framework\MockObject\MockObject;
16+
use PHPUnit\Framework\TestCase;
17+
use Magento\Framework\App\State;
18+
use Magento\MediaStorage\Service\ImageResize;
19+
use Magento\MediaStorage\Service\ImageResizeScheduler;
20+
use Magento\Catalog\Model\Config\CatalogMediaConfig;
21+
use Magento\Framework\DataObject;
22+
23+
class ImageResizeAfterProductSaveTest extends TestCase
24+
{
25+
/**
26+
* @var Observer|MockObject
27+
*/
28+
private $observerMock;
29+
30+
/**
31+
* @var Event|MockObject
32+
*/
33+
private $eventMock;
34+
35+
/**
36+
* @var Product|MockObject
37+
*/
38+
private $productMock;
39+
40+
/**
41+
* @var State|MockObject
42+
*/
43+
private $stateMock;
44+
45+
/**
46+
* @var CatalogMediaConfig|MockObject
47+
*/
48+
private $catalogMediaConfigMock;
49+
50+
/**
51+
* @var ImageResizeScheduler|MockObject
52+
*/
53+
private $imageResizeSchedulerMock;
54+
55+
/**
56+
* @var ImageResize|MockObject
57+
*/
58+
private $imageResizeMock;
59+
60+
/**
61+
* @var string
62+
*/
63+
private $imagePath;
64+
65+
/**
66+
* @inheritdoc
67+
*/
68+
protected function setUp(): void
69+
{
70+
$this->imagePath = 'path/to/image.jpg';
71+
$images = [new DataObject(['file' => $this->imagePath])];
72+
$this->observerMock = $this->createMock(Observer::class);
73+
$this->eventMock = $this->getMockBuilder(Event::class)
74+
->disableOriginalConstructor()
75+
->addMethods(['getProduct'])
76+
->getMock();
77+
$this->productMock = $this->getMockBuilder(Product::class)
78+
->disableOriginalConstructor()
79+
->onlyMethods(['getId', 'getMediaGalleryImages'])
80+
->getMock();
81+
$this->stateMock = $this->getMockBuilder(State::class)
82+
->disableOriginalConstructor()
83+
->onlyMethods(['isAreaCodeEmulated'])
84+
->getMock();
85+
$this->catalogMediaConfigMock = $this->getMockBuilder(CatalogMediaConfig::class)
86+
->disableOriginalConstructor()
87+
->onlyMethods(['getMediaUrlFormat'])
88+
->getMock();
89+
$this->imageResizeSchedulerMock = $this->getMockBuilder(ImageResizeScheduler::class)
90+
->disableOriginalConstructor()
91+
->onlyMethods(['schedule'])
92+
->getMock();
93+
$this->imageResizeMock = $this->getMockBuilder(ImageResize::class)
94+
->disableOriginalConstructor()
95+
->onlyMethods(['resizeFromImageName'])
96+
->getMock();
97+
98+
$this->observerMock
99+
->expects($this->once())
100+
->method('getEvent')
101+
->willReturn($this->eventMock);
102+
$this->eventMock
103+
->expects($this->once())
104+
->method('getProduct')
105+
->willReturn($this->productMock);
106+
$this->productMock
107+
->expects($this->any())
108+
->method('getId')
109+
->willReturn(null);
110+
$this->productMock
111+
->expects($this->once())
112+
->method('getMediaGalleryImages')
113+
->willReturn($images);
114+
}
115+
116+
/**
117+
* Test observer execute method when ImageResizeScheduler is called
118+
*/
119+
public function testExecuteImageResizeScheduler(): void
120+
{
121+
$observer = new ImageResizeAfterProductSave(
122+
$this->imageResizeMock,
123+
$this->stateMock,
124+
$this->catalogMediaConfigMock,
125+
$this->imageResizeSchedulerMock,
126+
true
127+
);
128+
$this->imageResizeMock
129+
->expects($this->never())
130+
->method('resizeFromImageName');
131+
$this->imageResizeSchedulerMock
132+
->expects($this->once())
133+
->method('schedule')
134+
->with($this->imagePath);
135+
$observer->execute($this->observerMock);
136+
}
137+
138+
/**
139+
* Test observer execute method when ImageResize is called
140+
*/
141+
public function testExecuteImageResize(): void
142+
{
143+
$observer = new ImageResizeAfterProductSave(
144+
$this->imageResizeMock,
145+
$this->stateMock,
146+
$this->catalogMediaConfigMock,
147+
$this->imageResizeSchedulerMock,
148+
false
149+
);
150+
$this->imageResizeMock
151+
->expects($this->once())
152+
->method('resizeFromImageName')
153+
->with($this->imagePath);
154+
$this->imageResizeSchedulerMock
155+
->expects($this->never())
156+
->method('schedule');
157+
$observer->execute($this->observerMock);
158+
}
159+
}

app/code/Magento/Catalog/etc/di.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,4 +1328,9 @@
13281328
<plugin name="remove_images_from_gallery_after_removing_product"
13291329
type="Magento\Catalog\Plugin\RemoveImagesFromGalleryAfterRemovingProduct"/>
13301330
</type>
1331+
<type name="Magento\Catalog\Observer\ImageResizeAfterProductSave">
1332+
<arguments>
1333+
<argument name="imageResizeScheduler" xsi:type="object">Magento\MediaStorage\Service\ImageResizeScheduler\Proxy</argument>
1334+
</arguments>
1335+
</type>
13311336
</config>

0 commit comments

Comments
 (0)