Skip to content

Commit 7c4be6a

Browse files
committed
Fix #17933 - Bank Transfer Payment instructions switch back to default
1 parent a1fad2b commit 7c4be6a

File tree

2 files changed

+96
-57
lines changed

2 files changed

+96
-57
lines changed

app/code/Magento/OfflinePayments/Observer/BeforeOrderPaymentSaveObserver.php

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
67

78
namespace Magento\OfflinePayments\Observer;
89

10+
use Magento\Framework\Event\Observer;
911
use Magento\Framework\Event\ObserverInterface;
1012
use Magento\OfflinePayments\Model\Banktransfer;
1113
use Magento\OfflinePayments\Model\Cashondelivery;
@@ -19,10 +21,10 @@ class BeforeOrderPaymentSaveObserver implements ObserverInterface
1921
/**
2022
* Sets current instructions for bank transfer account
2123
*
22-
* @param \Magento\Framework\Event\Observer $observer
24+
* @param Observer $observer
2325
* @return void
2426
*/
25-
public function execute(\Magento\Framework\Event\Observer $observer)
27+
public function execute(Observer $observer)
2628
{
2729
/** @var \Magento\Sales\Model\Order\Payment $payment */
2830
$payment = $observer->getEvent()->getPayment();
@@ -34,15 +36,22 @@ public function execute(\Magento\Framework\Event\Observer $observer)
3436
&& empty($payment->getAdditionalInformation('instructions'))) {
3537
$payment->setAdditionalInformation(
3638
'instructions',
37-
$payment->getMethodInstance()->getInstructions()
39+
$payment->getMethodInstance()->getConfigData(
40+
'instructions',
41+
$payment->getOrder()->getStoreId()
42+
)
3843
);
3944
} elseif ($payment->getMethod() === Checkmo::PAYMENT_METHOD_CHECKMO_CODE) {
4045
$methodInstance = $payment->getMethodInstance();
41-
if (!empty($methodInstance->getPayableTo())) {
42-
$payment->setAdditionalInformation('payable_to', $methodInstance->getPayableTo());
46+
$storeId = $payment->getOrder()->getStoreId();
47+
48+
$payableTo = $methodInstance->getConfigData('payable_to', $storeId);
49+
if (!empty($payableTo)) {
50+
$payment->setAdditionalInformation('payable_to', $payableTo);
4351
}
44-
if (!empty($methodInstance->getMailingAddress())) {
45-
$payment->setAdditionalInformation('mailing_address', $methodInstance->getMailingAddress());
52+
$mailingAddress = $methodInstance->getConfigData('mailing_address', $storeId);
53+
if (!empty($mailingAddress)) {
54+
$payment->setAdditionalInformation('mailing_address', $mailingAddress);
4655
}
4756
}
4857
}

app/code/Magento/OfflinePayments/Test/Unit/Observer/BeforeOrderPaymentSaveObserverTest.php

Lines changed: 80 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -10,87 +10,110 @@
1010
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
1111
use Magento\OfflinePayments\Model\Banktransfer;
1212
use Magento\OfflinePayments\Model\Cashondelivery;
13+
use Magento\OfflinePayments\Model\Checkmo;
1314
use Magento\OfflinePayments\Observer\BeforeOrderPaymentSaveObserver;
15+
use Magento\Sales\Model\Order;
1416
use Magento\Sales\Model\Order\Payment;
15-
use PHPUnit_Framework_MockObject_MockObject as MockObject;
16-
use Magento\OfflinePayments\Model\Checkmo;
17+
use PHPUnit\Framework\MockObject\MockObject;
18+
use PHPUnit\Framework\TestCase;
1719

18-
class BeforeOrderPaymentSaveObserverTest extends \PHPUnit\Framework\TestCase
20+
/**
21+
* Test class for \Magento\OfflinePayments\Observer\BeforeOrderPaymentSaveObserver
22+
*/
23+
class BeforeOrderPaymentSaveObserverTest extends TestCase
1924
{
25+
private const STORE_ID = 1;
26+
2027
/**
2128
* @var BeforeOrderPaymentSaveObserver
2229
*/
23-
protected $_model;
30+
private $model;
2431

2532
/**
2633
* @var Payment|MockObject
2734
*/
28-
private $payment;
35+
private $paymentMock;
2936

3037
/**
3138
* @var Event|MockObject
3239
*/
33-
private $event;
40+
private $eventMock;
3441

3542
/**
3643
* @var Observer|MockObject
3744
*/
38-
private $observer;
45+
private $observerMock;
46+
47+
/**
48+
* @var Order|MockObject
49+
*/
50+
private $orderMock;
3951

4052
/**
4153
* @inheritdoc
4254
*/
4355
protected function setUp()
4456
{
4557
$objectManagerHelper = new ObjectManager($this);
46-
$this->payment = $this->getMockBuilder(Payment::class)
58+
$this->paymentMock = $this->getMockBuilder(Payment::class)
4759
->disableOriginalConstructor()
4860
->getMock();
4961

50-
$this->event = $this->getMockBuilder(Event::class)
62+
$this->eventMock = $this->getMockBuilder(Event::class)
5163
->disableOriginalConstructor()
5264
->setMethods(['getPayment'])
5365
->getMock();
5466

55-
$this->event->expects(self::once())
67+
$this->eventMock->expects(self::once())
5668
->method('getPayment')
57-
->willReturn($this->payment);
69+
->willReturn($this->paymentMock);
5870

59-
$this->observer = $this->getMockBuilder(Observer::class)
71+
$this->observerMock = $this->getMockBuilder(Observer::class)
6072
->disableOriginalConstructor()
6173
->getMock();
6274

63-
$this->observer->expects(self::once())
75+
$this->observerMock->expects(self::once())
6476
->method('getEvent')
65-
->willReturn($this->event);
77+
->willReturn($this->eventMock);
78+
79+
$this->orderMock = $this->getMockBuilder(Order::class)
80+
->disableOriginalConstructor()
81+
->getMock();
82+
$this->orderMock->method('getStoreId')
83+
->willReturn(static::STORE_ID);
6684

67-
$this->_model = $objectManagerHelper->getObject(BeforeOrderPaymentSaveObserver::class);
85+
$this->paymentMock->method('getOrder')
86+
->willReturn($this->orderMock);
87+
88+
$this->model = $objectManagerHelper->getObject(BeforeOrderPaymentSaveObserver::class);
6889
}
6990

7091
/**
92+
* Checks a case when payment method is either bank transfer or cash on delivery
7193
* @param string $methodCode
7294
* @dataProvider dataProviderBeforeOrderPaymentSaveWithInstructions
7395
*/
7496
public function testBeforeOrderPaymentSaveWithInstructions($methodCode)
7597
{
76-
$this->payment->expects(self::once())
98+
$this->paymentMock->expects(self::once())
7799
->method('getMethod')
78100
->willReturn($methodCode);
79-
$this->payment->expects(self::once())
101+
$this->paymentMock->expects(self::once())
80102
->method('setAdditionalInformation')
81103
->with('instructions', 'payment configuration');
82104
$method = $this->getMockBuilder(Banktransfer::class)
83105
->disableOriginalConstructor()
84106
->getMock();
85107

86108
$method->expects(self::once())
87-
->method('getInstructions')
109+
->method('getConfigData')
110+
->with('instructions', static::STORE_ID)
88111
->willReturn('payment configuration');
89-
$this->payment->expects(self::once())
112+
$this->paymentMock->expects(self::once())
90113
->method('getMethodInstance')
91114
->willReturn($method);
92115

93-
$this->_model->execute($this->observer);
116+
$this->model->execute($this->observerMock);
94117
}
95118

96119
/**
@@ -106,33 +129,37 @@ public function dataProviderBeforeOrderPaymentSaveWithInstructions()
106129
];
107130
}
108131

132+
/**
133+
* Checks a case when payment method is Check Money
134+
*/
109135
public function testBeforeOrderPaymentSaveWithCheckmo()
110136
{
111-
$this->payment->expects(self::exactly(2))
137+
$this->paymentMock->expects(self::exactly(2))
112138
->method('getMethod')
113139
->willReturn(Checkmo::PAYMENT_METHOD_CHECKMO_CODE);
114-
$this->payment->expects(self::exactly(2))
140+
$this->paymentMock->expects(self::exactly(2))
115141
->method('setAdditionalInformation')
116142
->willReturnMap(
117143
[
118-
['payable_to', 'payable to', $this->payment],
119-
['mailing_address', 'mailing address', $this->payment],
144+
['payable_to', 'payable to', $this->paymentMock],
145+
['mailing_address', 'mailing address', $this->paymentMock],
120146
]
121147
);
122148

123149
$method = $this->getMockBuilder(Checkmo::class)
124150
->disableOriginalConstructor()
125151
->getMock();
126-
$method->expects(self::exactly(2))
127-
->method('getPayableTo')
128-
->willReturn('payable to');
129-
$method->expects(self::exactly(2))
130-
->method('getMailingAddress')
131-
->willReturn('mailing address');
132-
$this->payment->expects(self::once())
152+
$method->method('getConfigData')
153+
->willReturnMap(
154+
[
155+
['payable_to', static::STORE_ID, 'payable to'],
156+
['mailing_address', static::STORE_ID, 'mailing address']
157+
]
158+
);
159+
$this->paymentMock->expects(self::once())
133160
->method('getMethodInstance')
134161
->willReturn($method);
135-
$this->_model->execute($this->observer);
162+
$this->model->execute($this->observerMock);
136163
}
137164

138165
/**
@@ -141,36 +168,40 @@ public function testBeforeOrderPaymentSaveWithCheckmo()
141168
*/
142169
public function testBeforeOrderPaymentSaveWithCheckmoWithoutConfig()
143170
{
144-
$this->payment->expects(self::exactly(2))
171+
$this->paymentMock->expects(self::exactly(2))
145172
->method('getMethod')
146173
->willReturn(Checkmo::PAYMENT_METHOD_CHECKMO_CODE);
147-
$this->payment->expects(self::never())
174+
$this->paymentMock->expects(self::never())
148175
->method('setAdditionalInformation');
149176

150177
$method = $this->getMockBuilder(Checkmo::class)
151178
->disableOriginalConstructor()
152179
->getMock();
153-
$method->expects(self::once())
154-
->method('getPayableTo')
155-
->willReturn(null);
156-
$method->expects(self::once())
157-
->method('getMailingAddress')
158-
->willReturn(null);
159-
$this->payment->expects(self::once())
180+
$method->method('getConfigData')
181+
->willReturnMap(
182+
[
183+
['payable_to', static::STORE_ID, null],
184+
['mailing_address', static::STORE_ID, null]
185+
]
186+
);
187+
$this->paymentMock->expects(self::once())
160188
->method('getMethodInstance')
161189
->willReturn($method);
162-
$this->_model->execute($this->observer);
190+
$this->model->execute($this->observerMock);
163191
}
164192

193+
/**
194+
* Checks a case with payment method not handled by observer
195+
*/
165196
public function testBeforeOrderPaymentSaveWithOthers()
166197
{
167-
$this->payment->expects(self::exactly(2))
198+
$this->paymentMock->expects(self::exactly(2))
168199
->method('getMethod')
169200
->willReturn('somepaymentmethod');
170-
$this->payment->expects(self::never())
201+
$this->paymentMock->expects(self::never())
171202
->method('setAdditionalInformation');
172203

173-
$this->_model->execute($this->observer);
204+
$this->model->execute($this->observerMock);
174205
}
175206

176207
/**
@@ -179,17 +210,16 @@ public function testBeforeOrderPaymentSaveWithOthers()
179210
*/
180211
public function testBeforeOrderPaymentSaveWithInstructionsAlreadySet($methodCode)
181212
{
182-
$this->payment
183-
->method('getMethod')
213+
$this->paymentMock->method('getMethod')
184214
->willReturn($methodCode);
185215

186-
$this->payment->expects(self::once())
216+
$this->paymentMock->expects(self::once())
187217
->method('getAdditionalInformation')
188218
->willReturn('Test');
189219

190-
$this->payment->expects(self::never())
220+
$this->paymentMock->expects(self::never())
191221
->method('setAdditionalInformation');
192222

193-
$this->_model->execute($this->observer);
223+
$this->model->execute($this->observerMock);
194224
}
195225
}

0 commit comments

Comments
 (0)