Skip to content

Commit 372110d

Browse files
authored
ENGCOM-3156: [Forwardport] Added checks to see if the payment is available #18521
2 parents 9e51141 + f851ad5 commit 372110d

File tree

3 files changed

+38
-4
lines changed

3 files changed

+38
-4
lines changed

app/code/Magento/Payment/Observer/SalesOrderBeforeSaveObserver.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,19 @@ class SalesOrderBeforeSaveObserver implements ObserverInterface
1515
*
1616
* @param \Magento\Framework\Event\Observer $observer
1717
* @return $this
18+
* @throws \Magento\Framework\Exception\LocalizedException in case order has no payment specified.
1819
*/
1920
public function execute(\Magento\Framework\Event\Observer $observer)
2021
{
2122
/** @var \Magento\Sales\Model\Order $order */
2223
$order = $observer->getEvent()->getOrder();
2324

25+
if (!$order->getPayment()) {
26+
throw new \Magento\Framework\Exception\LocalizedException(
27+
__('Please provide payment for the order.')
28+
);
29+
}
30+
2431
if ($order->getPayment()->getMethodInstance()->getCode() != 'free') {
2532
return $this;
2633
}

app/code/Magento/Payment/Test/Unit/Observer/SalesOrderBeforeSaveObserverTest.php

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public function testSalesOrderBeforeSaveCantUnhold()
6161
$paymentMock = $this->getMockBuilder(
6262
\Magento\Sales\Model\Order\Payment::class
6363
)->disableOriginalConstructor()->setMethods([])->getMock();
64-
$order->expects($this->once())->method('getPayment')->will($this->returnValue($paymentMock));
64+
$order->method('getPayment')->will($this->returnValue($paymentMock));
6565
$methodInstance = $this->getMockBuilder(
6666
\Magento\Payment\Model\MethodInterface::class
6767
)->getMockForAbstractClass();
@@ -86,7 +86,7 @@ public function testSalesOrderBeforeSaveIsCanceled()
8686
$paymentMock = $this->getMockBuilder(
8787
\Magento\Sales\Model\Order\Payment::class
8888
)->disableOriginalConstructor()->setMethods([])->getMock();
89-
$order->expects($this->once())->method('getPayment')->will($this->returnValue($paymentMock));
89+
$order->method('getPayment')->will($this->returnValue($paymentMock));
9090
$methodInstance = $this->getMockBuilder(
9191
\Magento\Payment\Model\MethodInterface::class
9292
)->getMockForAbstractClass();
@@ -114,7 +114,7 @@ public function testSalesOrderBeforeSaveIsClosed()
114114
$paymentMock = $this->getMockBuilder(
115115
\Magento\Sales\Model\Order\Payment::class
116116
)->disableOriginalConstructor()->setMethods([])->getMock();
117-
$order->expects($this->once())->method('getPayment')->will($this->returnValue($paymentMock));
117+
$order->method('getPayment')->will($this->returnValue($paymentMock));
118118
$methodInstance = $this->getMockBuilder(
119119
\Magento\Payment\Model\MethodInterface::class
120120
)->getMockForAbstractClass();
@@ -156,6 +156,29 @@ public function testSalesOrderBeforeSaveSetForced()
156156
$this->salesOrderBeforeSaveObserver->execute($this->observerMock);
157157
}
158158

159+
/**
160+
* The method should check that the payment is available, as this is not always the case.
161+
*
162+
* @expectedException \Magento\Framework\Exception\LocalizedException
163+
* @exceptedExceptionMessage Please provide payment for the order.
164+
*/
165+
public function testDoesNothingWhenNoPaymentIsAvailable()
166+
{
167+
$this->_prepareEventMockWithMethods(['getOrder']);
168+
169+
$order = $this->getMockBuilder(\Magento\Sales\Model\Order::class)->disableOriginalConstructor()->setMethods(
170+
array_merge(['__wakeup', 'getPayment'])
171+
)->getMock();
172+
173+
$this->eventMock->expects($this->once())->method('getOrder')->will(
174+
$this->returnValue($order)
175+
);
176+
177+
$order->expects($this->exactly(1))->method('getPayment')->willReturn(null);
178+
179+
$this->salesOrderBeforeSaveObserver->execute($this->observerMock);
180+
}
181+
159182
/**
160183
* Prepares EventMock with set of methods
161184
*
@@ -184,7 +207,7 @@ private function _getPreparedOrderMethod($methodCode, $orderMethods = [])
184207
$paymentMock = $this->getMockBuilder(
185208
\Magento\Sales\Model\Order\Payment::class
186209
)->disableOriginalConstructor()->setMethods([])->getMock();
187-
$order->expects($this->once())->method('getPayment')->will($this->returnValue($paymentMock));
210+
$order->method('getPayment')->will($this->returnValue($paymentMock));
188211
$methodInstance = $this->getMockBuilder(
189212
\Magento\Payment\Model\MethodInterface::class
190213
)->getMockForAbstractClass();

app/code/Magento/Paypal/Plugin/OrderCanInvoice.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ public function __construct(Express $express)
4040
*/
4141
public function afterCanInvoice(Order $order, bool $result): bool
4242
{
43+
if (!$order->getPayment()) {
44+
return false;
45+
}
46+
4347
if ($this->express->isOrderAuthorizationAllowed($order->getPayment())) {
4448
return false;
4549
}

0 commit comments

Comments
 (0)