Skip to content

Commit e0d9191

Browse files
committed
MAGETWO-59074: Creditmemo return to stock only one unit of configurable product
1 parent 7652d02 commit e0d9191

File tree

3 files changed

+64
-51
lines changed

3 files changed

+64
-51
lines changed

app/code/Magento/SalesInventory/Model/Order/ReturnProcessor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public function execute(
8989
CreditmemoInterface $creditmemo,
9090
OrderInterface $order,
9191
array $returnToStockItems = [],
92-
$isAutoReturn = False
92+
$isAutoReturn = false
9393
) {
9494
$itemsToUpdate = [];
9595
foreach ($creditmemo->getItems() as $item) {

app/code/Magento/SalesInventory/Observer/RefundOrderInventoryObserver.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ public function execute(EventObserver $observer)
9999
*/
100100
private function getOrderRepository()
101101
{
102-
if (!($this->orderRepository instanceof OrderRepository)) {
103-
return \Magento\Framework\App\ObjectManager::getInstance()->get(OrderRepository::class);
104-
} else {
102+
if ($this->orderRepository instanceof OrderRepository) {
105103
return $this->orderRepository;
104+
} else {
105+
return \Magento\Framework\App\ObjectManager::getInstance()->get(OrderRepository::class);
106106
}
107107
}
108108

@@ -114,10 +114,10 @@ private function getOrderRepository()
114114
*/
115115
private function getReturnProcessor()
116116
{
117-
if (!($this->returnProcessor instanceof OrderRepository)) {
118-
return \Magento\Framework\App\ObjectManager::getInstance()->get(ReturnProcessor::class);
119-
} else {
117+
if ($this->returnProcessor instanceof ReturnProcessor) {
120118
return $this->returnProcessor;
119+
} else {
120+
return \Magento\Framework\App\ObjectManager::getInstance()->get(ReturnProcessor::class);
121121
}
122122
}
123123
}

app/code/Magento/SalesInventory/Test/Unit/Observer/RefundOrderInventoryObserverTest.php

Lines changed: 57 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
* Copyright © 2016 Magento. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6-
namespace Magento\CatalogInventory\Test\Unit\Observer;
6+
namespace Magento\SalesInventory\Test\Unit\Observer;
77

8-
use Magento\CatalogInventory\Observer\RefundOrderInventoryObserver;
8+
use Magento\Sales\Api\Data\OrderInterface;
9+
use Magento\Sales\Model\OrderRepository;
10+
use Magento\SalesInventory\Model\Order\ReturnProcessor;
11+
use Magento\SalesInventory\Observer\RefundOrderInventoryObserver;
912

1013
/**
1114
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -47,6 +50,26 @@ class RefundOrderInventoryObserverTest extends \PHPUnit_Framework_TestCase
4750
*/
4851
protected $eventObserver;
4952

53+
/**
54+
* @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
55+
*/
56+
protected $objectManagerHelper;
57+
58+
/**
59+
* @var OrderRepository|\PHPUnit_Framework_MockObject_MockObject
60+
*/
61+
protected $orderRepositoryMock;
62+
63+
/**
64+
* @var ReturnProcessor|\PHPUnit_Framework_MockObject_MockObject
65+
*/
66+
protected $returnProcessorMock;
67+
68+
/**
69+
* @var OrderInterface|\PHPUnit_Framework_MockObject_MockObject
70+
*/
71+
protected $orderMock;
72+
5073
protected function setUp()
5174
{
5275
$this->stockIndexerProcessor = $this->getMock(
@@ -93,92 +116,82 @@ protected function setUp()
93116
->method('getEvent')
94117
->will($this->returnValue($this->event));
95118

96-
$this->observer = (new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this))->getObject(
97-
\Magento\CatalogInventory\Observer\RefundOrderInventoryObserver::class,
119+
$this->orderRepositoryMock = $this->getMockBuilder(OrderRepository::class)
120+
->disableOriginalConstructor()
121+
->getMock();
122+
123+
$this->returnProcessorMock = $this->getMockBuilder(ReturnProcessor::class)
124+
->disableOriginalConstructor()
125+
->getMock();
126+
127+
$this->orderMock = $this->getMockBuilder(OrderInterface::class)
128+
->disableOriginalConstructor()
129+
->getMock();
130+
131+
$this->objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
132+
133+
$this->observer = $this->objectManagerHelper->getObject(
134+
\Magento\SalesInventory\Observer\RefundOrderInventoryObserver::class,
98135
[
99136
'stockConfiguration' => $this->stockConfiguration,
100137
'stockManagement' => $this->stockManagement,
101138
'stockIndexerProcessor' => $this->stockIndexerProcessor,
102139
'priceIndexer' => $this->priceIndexer,
103140
]
104141
);
142+
143+
$this->objectManagerHelper->setBackwardCompatibleProperty($this->observer, 'orderRepository', $this->orderRepositoryMock);
144+
$this->objectManagerHelper->setBackwardCompatibleProperty($this->observer, 'returnProcessor', $this->returnProcessorMock);
105145
}
106146

107147
public function testRefundOrderInventory()
108148
{
109-
$websiteId = 0;
110149
$ids = ['1', '14'];
111150
$items = [];
112151
$isAutoReturnEnabled = true;
113152

114-
$store = $this->getMock(
115-
\Magento\Store\Model\Store::class,
116-
['getWebsiteId'],
117-
[],
118-
'',
119-
false
120-
);
121-
$store->expects($this->once())->method('getWebsiteId')->will($this->returnValue($websiteId));
153+
$creditMemo = $this->getMock(\Magento\Sales\Model\Order\Creditmemo::class, [], [], '', false);
122154

123-
$itemsToUpdate = [];
124155
foreach ($ids as $id) {
125156
$item = $this->getCreditMemoItem($id);
126157
$items[] = $item;
127-
$itemsToUpdate[$item->getProductId()] = $item->getQty();
128158
}
129-
$creditMemo = $this->getMock(\Magento\Sales\Model\Order\Creditmemo::class, [], [], '', false);
159+
130160
$creditMemo->expects($this->once())
131-
->method('getAllItems')
161+
->method('getItems')
132162
->will($this->returnValue($items));
133-
$creditMemo->expects($this->once())->method('getStore')->will($this->returnValue($store));
134163

135164
$this->stockConfiguration->expects($this->any())
136165
->method('isAutoReturnEnabled')
137166
->will($this->returnValue($isAutoReturnEnabled));
138167

139-
$this->stockManagement->expects($this->once())
140-
->method('revertProductsSale')
141-
->with($itemsToUpdate, $websiteId);
142-
143-
$this->stockIndexerProcessor->expects($this->once())
144-
->method('reindexList')
145-
->with($ids);
146-
147-
$this->priceIndexer->expects($this->once())
148-
->method('reindexList')
149-
->with($ids);
150-
151168
$this->event->expects($this->once())
152169
->method('getCreditmemo')
153170
->will($this->returnValue($creditMemo));
154171

172+
$this->orderRepositoryMock->expects($this->once())
173+
->method('get')
174+
->willReturn($this->orderMock);
175+
176+
$this->returnProcessorMock->expects($this->once())
177+
->method('execute')
178+
->with($creditMemo, $this->orderMock, $ids, $isAutoReturnEnabled);
179+
155180
$this->observer->execute($this->eventObserver);
156181
}
157182

158183
private function getCreditMemoItem($productId)
159184
{
160-
$parentItemId = false;
161185
$backToStock = true;
162-
$qty = 1;
163186
$item = $this->getMock(
164187
\Magento\Sales\Model\Order\Creditmemo\Item::class,
165-
['getProductId', 'getOrderItem', 'getBackToStock', 'getQty', '__wakeup'],
166-
[],
167-
'',
168-
false
169-
);
170-
$orderItem = $this->getMock(
171-
\Magento\Sales\Model\Order\Item::class,
172-
['getParentItemId', '__wakeup'],
188+
['getOrderItemId', 'getBackToStock', 'getQty', '__wakeup'],
173189
[],
174190
'',
175191
false
176192
);
177-
$orderItem->expects($this->any())->method('getParentItemId')->willReturn($parentItemId);
178-
$item->expects($this->any())->method('getOrderItem')->willReturn($orderItem);
179-
$item->expects($this->any())->method('getProductId')->will($this->returnValue($productId));
180193
$item->expects($this->any())->method('getBackToStock')->willReturn($backToStock);
181-
$item->expects($this->any())->method('getQty')->willReturn($qty);
194+
$item->expects($this->any())->method('getOrderItemId')->willReturn($productId);
182195
return $item;
183196
}
184197
}

0 commit comments

Comments
 (0)