Skip to content

Commit 94e7315

Browse files
author
Serhiy Shkolyarenko
committed
MAGETWO-55850: PR support
Merge remote-tracking branch 'mainline/develop' into bugs
2 parents d9d232e + 308da7d commit 94e7315

File tree

175 files changed

+8187
-1396
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

175 files changed

+8187
-1396
lines changed
Lines changed: 288 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,288 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Backup\Test\Unit\Controller\Adminhtml\Index;
7+
8+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
9+
10+
/**
11+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
12+
* @SuppressWarnings(PHPMD.TooManyFields)
13+
*/
14+
class RollbackTest extends \PHPUnit_Framework_TestCase
15+
{
16+
/**
17+
* @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
18+
*/
19+
private $objectManager;
20+
21+
/**
22+
* @var \Magento\Framework\ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject
23+
*/
24+
private $objectManagerMock;
25+
26+
/**
27+
* @var \Magento\Backend\App\Action\Context
28+
*/
29+
private $context;
30+
31+
/**
32+
* @var \Magento\Backup\Controller\Adminhtml\Index\Rollback
33+
*/
34+
private $rollbackController;
35+
36+
/**
37+
* @var \Magento\Framework\App\RequestInterface|\PHPUnit_Framework_MockObject_MockObject
38+
*/
39+
private $requestMock;
40+
41+
/**
42+
* @var \Magento\Framework\App\ResponseInterface|\PHPUnit_Framework_MockObject_MockObject
43+
*/
44+
private $responseMock;
45+
46+
/**
47+
* @var \Magento\Backup\Model\BackupFactory|\PHPUnit_Framework_MockObject_MockObject
48+
*/
49+
private $backupModelFactoryMock;
50+
51+
/**
52+
* @var \Magento\Backup\Model\Backup|\PHPUnit_Framework_MockObject_MockObject
53+
*/
54+
private $backupModelMock;
55+
56+
/**
57+
* @var \Magento\Backup\Helper\Data|\PHPUnit_Framework_MockObject_MockObject
58+
*/
59+
private $dataHelperMock;
60+
61+
/**
62+
* @var \Magento\Framework\App\Response\Http\FileFactory|\PHPUnit_Framework_MockObject_MockObject
63+
*/
64+
private $fileFactoryMock;
65+
66+
/**
67+
* @var \Magento\Backend\Model\View\Result\RedirectFactory|\PHPUnit_Framework_MockObject_MockObject
68+
*/
69+
private $resultRedirectFactoryMock;
70+
71+
/**
72+
* @var \Magento\Backend\Model\View\Result\Redirect|\PHPUnit_Framework_MockObject_MockObject
73+
*/
74+
private $resultRedirectMock;
75+
76+
/**
77+
* @var \Magento\Backend\Model\View\Result\Forward|\PHPUnit_Framework_MockObject_MockObject
78+
*/
79+
private $resultForwardMock;
80+
81+
/**
82+
* @var \Magento\Framework\Backup\Factory|\PHPUnit_Framework_MockObject_MockObject
83+
*/
84+
private $backupFactoryMock;
85+
86+
/**
87+
* @var \Magento\Framework\Backup\BackupInterface|\PHPUnit_Framework_MockObject_MockObject
88+
*/
89+
private $backupManagerMock;
90+
91+
/**
92+
* @var \Magento\Backup\Model\ResourceModel\Db|\PHPUnit_Framework_MockObject_MockObject
93+
*/
94+
private $backupResourceModelMock;
95+
96+
protected function setUp()
97+
{
98+
$this->objectManagerMock = $this->getMockBuilder(\Magento\Framework\ObjectManagerInterface::class)
99+
->getMock();
100+
$this->requestMock = $this->getMockBuilder(\Magento\Framework\App\RequestInterface::class)
101+
->setMethods(['initForward', 'setDispatched', 'isAjax'])
102+
->getMockForAbstractClass();
103+
$this->responseMock = $this->getMockBuilder(\Magento\Framework\App\ResponseInterface::class)
104+
->setMethods(['setRedirect', 'representJson'])
105+
->getMockForAbstractClass();
106+
$this->backupModelFactoryMock = $this->getMockBuilder(\Magento\Backup\Model\BackupFactory::class)
107+
->disableOriginalConstructor()
108+
->setMethods(['create'])
109+
->getMock();
110+
$this->backupModelMock = $this->getMockBuilder(\Magento\Backup\Model\Backup::class)
111+
->disableOriginalConstructor()
112+
->setMethods(['getTime', 'exists', 'getSize', 'output', 'validateUserPassword'])
113+
->getMock();
114+
$this->backupResourceModelMock = $this->getMockBuilder(\Magento\Backup\Model\ResourceModel\Db::class)
115+
->disableOriginalConstructor()
116+
->getMock();
117+
$this->dataHelperMock = $this->getMockBuilder(\Magento\Backup\Helper\Data::class)
118+
->disableOriginalConstructor()
119+
->setMethods(['isRollbackAllowed', 'getBackupsDir', 'invalidateCache'])
120+
->getMock();
121+
$this->fileFactoryMock = $this->getMockBuilder(\Magento\Framework\App\Response\Http\FileFactory::class)
122+
->disableOriginalConstructor()
123+
->getMock();
124+
$this->resultRedirectFactoryMock =
125+
$this->getMockBuilder(\Magento\Backend\Model\View\Result\RedirectFactory::class)
126+
->disableOriginalConstructor()
127+
->setMethods(['create'])
128+
->getMock();
129+
$this->resultRedirectMock = $this->getMockBuilder(\Magento\Backend\Model\View\Result\Redirect::class)
130+
->disableOriginalConstructor()
131+
->getMock();
132+
$this->resultForwardMock = $this->getMockBuilder(\Magento\Backend\Model\View\Result\Forward::class)
133+
->disableOriginalConstructor()
134+
->getMock();
135+
$this->backupFactoryMock = $this->getMockBuilder(\Magento\Framework\Backup\Factory::class)
136+
->disableOriginalConstructor()
137+
->setMethods(['create'])
138+
->getMock();
139+
$this->backupManagerMock = $this->getMockBuilder(\Magento\Framework\Backup\BackupInterface::class)
140+
->setMethods(['setName'])
141+
->getMockForAbstractClass();
142+
$this->objectManager = new ObjectManager($this);
143+
$this->context = $this->objectManager->getObject(
144+
\Magento\Backend\App\Action\Context::class,
145+
[
146+
'objectManager' => $this->objectManagerMock,
147+
'request' => $this->requestMock,
148+
'response' => $this->responseMock,
149+
'resultRedirectFactory' => $this->resultRedirectFactoryMock,
150+
]
151+
);
152+
$this->rollbackController = $this->objectManager->getObject(
153+
\Magento\Backup\Controller\Adminhtml\Index\Rollback::class,
154+
[
155+
'context' => $this->context,
156+
'backupFactory' => $this->backupFactoryMock,
157+
'backupModelFactory' => $this->backupModelFactoryMock,
158+
'fileFactory' => $this->fileFactoryMock,
159+
]
160+
);
161+
}
162+
163+
public function testExecuteRollbackDisabled()
164+
{
165+
$rollbackAllowed = false;
166+
167+
$this->dataHelperMock->expects($this->once())
168+
->method('isRollbackAllowed')
169+
->willReturn($rollbackAllowed);
170+
$this->objectManagerMock->expects($this->once())
171+
->method('get')
172+
->with(\Magento\Backup\Helper\Data::class)
173+
->willReturn($this->dataHelperMock);
174+
175+
$this->assertSame($this->responseMock, $this->rollbackController->execute());
176+
}
177+
178+
public function testExecuteBackupNotFound()
179+
{
180+
$rollbackAllowed = true;
181+
$isAjax = true;
182+
$time = 0;
183+
$type = 'db';
184+
$exists = false;
185+
186+
$this->dataHelperMock->expects($this->once())
187+
->method('isRollbackAllowed')
188+
->willReturn($rollbackAllowed);
189+
$this->objectManagerMock->expects($this->atLeastOnce())
190+
->method('get')
191+
->with(\Magento\Backup\Helper\Data::class)
192+
->willReturn($this->dataHelperMock);
193+
$this->requestMock->expects($this->once())
194+
->method('isAjax')
195+
->willReturn($isAjax);
196+
$this->backupModelMock->expects($this->atLeastOnce())
197+
->method('getTime')
198+
->willReturn($time);
199+
$this->backupModelMock->expects($this->any())
200+
->method('exists')
201+
->willReturn($exists);
202+
$this->requestMock->expects($this->any())
203+
->method('getParam')
204+
->willReturnMap(
205+
[
206+
['time', null, $time],
207+
['type', null, $type],
208+
]
209+
);
210+
$this->backupModelFactoryMock->expects($this->once())
211+
->method('create')
212+
->with($time, $type)
213+
->willReturn($this->backupModelMock);
214+
215+
$this->assertSame($this->responseMock, $this->rollbackController->execute());
216+
}
217+
218+
public function testExecute()
219+
{
220+
$rollbackAllowed = true;
221+
$isAjax = true;
222+
$time = 1;
223+
$type = 'db';
224+
$exists = true;
225+
$passwordValid = true;
226+
227+
$this->dataHelperMock->expects($this->once())
228+
->method('isRollbackAllowed')
229+
->willReturn($rollbackAllowed);
230+
$this->objectManagerMock->expects($this->any())
231+
->method('get')
232+
->with(\Magento\Backup\Helper\Data::class)
233+
->willReturn($this->dataHelperMock);
234+
$this->requestMock->expects($this->once())
235+
->method('isAjax')
236+
->willReturn($isAjax);
237+
$this->backupModelMock->expects($this->atLeastOnce())
238+
->method('getTime')
239+
->willReturn($time);
240+
$this->backupModelMock->expects($this->any())
241+
->method('exists')
242+
->willReturn($exists);
243+
$this->requestMock->expects($this->any())
244+
->method('getParam')
245+
->willReturnMap(
246+
[
247+
['time', null, $time],
248+
['type', null, $type],
249+
]
250+
);
251+
$this->backupModelFactoryMock->expects($this->once())
252+
->method('create')
253+
->with($time, $type)
254+
->willReturn($this->backupModelMock);
255+
$this->backupManagerMock->expects($this->once())
256+
->method('setBackupExtension')
257+
->willReturn($this->backupManagerMock);
258+
$this->backupManagerMock->expects($this->once())
259+
->method('setTime')
260+
->willReturn($this->backupManagerMock);
261+
$this->backupManagerMock->expects($this->once())
262+
->method('setBackupsDir')
263+
->willReturn($this->backupManagerMock);
264+
$this->backupManagerMock->expects($this->once())
265+
->method('setName')
266+
->willReturn($this->backupManagerMock);
267+
$this->backupManagerMock->expects($this->once())
268+
->method('setResourceModel')
269+
->willReturn($this->backupManagerMock);
270+
$this->backupFactoryMock->expects($this->once())
271+
->method('create')
272+
->with($type)
273+
->willReturn($this->backupManagerMock);
274+
$this->objectManagerMock->expects($this->at(2))
275+
->method('create')
276+
->with(\Magento\Backup\Model\ResourceModel\Db::class, [])
277+
->willReturn($this->backupResourceModelMock);
278+
$this->objectManagerMock->expects($this->at(3))
279+
->method('create')
280+
->with(\Magento\Backup\Model\Backup::class, [])
281+
->willReturn($this->backupModelMock);
282+
$this->backupModelMock->expects($this->once())
283+
->method('validateUserPassword')
284+
->willReturn($passwordValid);
285+
286+
$this->rollbackController->execute();
287+
}
288+
}

app/code/Magento/Catalog/Model/Product/Gallery/ReadHandler.php

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
namespace Magento\Catalog\Model\Product\Gallery;
77

88
use Magento\Framework\EntityManager\Operation\ExtensionInterface;
9+
use Magento\Catalog\Model\Product;
910

1011
/**
1112
* Read handler for catalog product gallery.
@@ -40,7 +41,7 @@ public function __construct(
4041
}
4142

4243
/**
43-
* @param object $entity
44+
* @param Product $entity
4445
* @param array $arguments
4546
* @return object
4647
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
@@ -50,29 +51,57 @@ public function execute($entity, $arguments = [])
5051
$value = [];
5152
$value['images'] = [];
5253

53-
$localAttributes = ['label', 'position', 'disabled'];
54-
5554
$mediaEntries = $this->resourceModel->loadProductGalleryByAttributeId(
5655
$entity,
5756
$this->getAttribute()->getAttributeId()
5857
);
5958

60-
foreach ($mediaEntries as $mediaEntry) {
61-
foreach ($localAttributes as $localAttribute) {
62-
if ($mediaEntry[$localAttribute] === null) {
63-
$mediaEntry[$localAttribute] = $this->findDefaultValue($localAttribute, $mediaEntry);
64-
}
65-
}
59+
$this->addMediaDataToProduct(
60+
$entity,
61+
$mediaEntries
62+
);
63+
64+
return $entity;
65+
}
66+
67+
/**
68+
* @param Product $product
69+
* @param array $mediaEntries
70+
* @return void
71+
*/
72+
public function addMediaDataToProduct(Product $product, array $mediaEntries)
73+
{
74+
$attrCode = $this->getAttribute()->getAttributeCode();
75+
$value = [];
76+
$value['images'] = [];
77+
$value['values'] = [];
6678

67-
$value['images'][$mediaEntry['value_id']] = $mediaEntry;
79+
foreach ($mediaEntries as $mediaEntry) {
80+
$mediaEntry = $this->substituteNullsWithDefaultValues($mediaEntry);
81+
$value['images'][] = $mediaEntry;
6882
}
83+
$product->setData($attrCode, $value);
84+
}
6985

70-
$entity->setData(
71-
$this->getAttribute()->getAttributeCode(),
72-
$value
73-
);
86+
/**
87+
* @param array $rawData
88+
* @return array
89+
*/
90+
private function substituteNullsWithDefaultValues(array $rawData)
91+
{
92+
$processedData = [];
93+
foreach ($rawData as $key => $rawValue) {
94+
if (null !== $rawValue) {
95+
$processedValue = $rawValue;
96+
} elseif (isset($rawData[$key . '_default'])) {
97+
$processedValue = $rawData[$key . '_default'];
98+
} else {
99+
$processedValue = null;
100+
}
101+
$processedData[$key] = $processedValue;
102+
}
74103

75-
return $entity;
104+
return $processedData;
76105
}
77106

78107
/**
@@ -91,6 +120,7 @@ public function getAttribute()
91120
* @param string $key
92121
* @param string[] &$image
93122
* @return string
123+
* @deprecated
94124
*/
95125
protected function findDefaultValue($key, &$image)
96126
{

app/code/Magento/Catalog/Model/Product/Link.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class Link extends \Magento\Framework\Model\AbstractModel
5757

5858
/**
5959
* @var \Magento\CatalogInventory\Helper\Stock
60+
* @deprecated
6061
*/
6162
protected $stockHelper;
6263

0 commit comments

Comments
 (0)