Skip to content

Commit 900ecea

Browse files
author
Stanislav Idolov
authored
🔃 [EngCom] Public Pull Requests - 2.2-develop
Accepted Public Pull Requests: - #17633: Added unit test for newsletter problem model (by @rogyar) - #14393: Validate that the PO Number is set on the payment instance. (by @centerax) Fixed GitHub Issues: - #6585: Optional PO number (reported by @springimport) has been fixed in #14393 by @centerax in 2.2-develop branch Related commits: 1. 654f350 2. f5adaa3
2 parents ecebc42 + 3636f31 commit 900ecea

File tree

7 files changed

+267
-9
lines changed

7 files changed

+267
-9
lines changed
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Newsletter\Test\Unit\Model;
9+
10+
use Magento\Framework\Data\Collection\AbstractDb;
11+
use Magento\Framework\Model\Context;
12+
use Magento\Framework\Registry;
13+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
14+
use Magento\Newsletter\Model\Problem as ProblemModel;
15+
use Magento\Newsletter\Model\Queue;
16+
use Magento\Newsletter\Model\ResourceModel\Problem as ProblemResource;
17+
use Magento\Newsletter\Model\Subscriber;
18+
use Magento\Newsletter\Model\SubscriberFactory;
19+
20+
class ProblemTest extends \PHPUnit\Framework\TestCase
21+
{
22+
/**
23+
* @var Context|\PHPUnit_Framework_MockObject_MockObject
24+
*/
25+
private $contextMock;
26+
27+
/**
28+
* @var Registry|\PHPUnit_Framework_MockObject_MockObject
29+
*/
30+
private $registryMock;
31+
32+
/**
33+
* @var SubscriberFactory|\PHPUnit_Framework_MockObject_MockObject
34+
*/
35+
private $subscriberFactoryMock;
36+
37+
/**
38+
* @var Subscriber|\PHPUnit_Framework_MockObject_MockObject
39+
*/
40+
private $subscriberMock;
41+
42+
/**
43+
* @var ProblemResource|\PHPUnit_Framework_MockObject_MockObject
44+
*/
45+
private $resourceModelMock;
46+
47+
/**
48+
* @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject
49+
*/
50+
private $abstractDbMock;
51+
52+
/**
53+
* @var ObjectManager
54+
*/
55+
protected $objectManager;
56+
57+
/**
58+
* @var ProblemModel
59+
*/
60+
private $problemModel;
61+
62+
protected function setUp()
63+
{
64+
$this->contextMock = $this->getMockBuilder(Context::class)
65+
->disableOriginalConstructor()
66+
->getMock();
67+
$this->registryMock = $this->getMockBuilder(Registry::class)
68+
->disableOriginalConstructor()
69+
->getMock();
70+
$this->subscriberFactoryMock = $this->getMockBuilder(SubscriberFactory::class)
71+
->getMock();
72+
$this->subscriberMock = $this->getMockBuilder(Subscriber::class)
73+
->disableOriginalConstructor()
74+
->getMock();
75+
$this->resourceModelMock = $this->getMockBuilder(ProblemResource::class)
76+
->disableOriginalConstructor()
77+
->getMock();
78+
$this->abstractDbMock = $this->getMockBuilder(AbstractDb::class)
79+
->disableOriginalConstructor()
80+
->getMock();
81+
82+
$this->resourceModelMock->expects($this->any())
83+
->method('getIdFieldName')
84+
->willReturn('id');
85+
86+
$this->objectManager = new ObjectManager($this);
87+
88+
$this->problemModel = $this->objectManager->getObject(
89+
ProblemModel::class,
90+
[
91+
'context' => $this->contextMock,
92+
'registry' => $this->registryMock,
93+
'subscriberFactory' => $this->subscriberFactoryMock,
94+
'resource' => $this->resourceModelMock,
95+
'resourceCollection' => $this->abstractDbMock,
96+
'data' => [],
97+
]
98+
);
99+
}
100+
101+
public function testAddSubscriberData()
102+
{
103+
$subscriberId = 1;
104+
$this->subscriberMock->expects($this->once())
105+
->method('getId')
106+
->willReturn($subscriberId);
107+
108+
$result = $this->problemModel->addSubscriberData($this->subscriberMock);
109+
110+
self::assertEquals($result, $this->problemModel);
111+
self::assertEquals($subscriberId, $this->problemModel->getSubscriberId());
112+
}
113+
114+
public function testAddQueueData()
115+
{
116+
$queueId = 1;
117+
$queueMock = $this->getMockBuilder(Queue::class)
118+
->disableOriginalConstructor()
119+
->getMock();
120+
$queueMock->expects($this->once())
121+
->method('getId')
122+
->willReturn($queueId);
123+
124+
$result = $this->problemModel->addQueueData($queueMock);
125+
126+
self::assertEquals($result, $this->problemModel);
127+
self::assertEquals($queueId, $this->problemModel->getQueueId());
128+
}
129+
130+
public function testAddErrorData()
131+
{
132+
$exceptionMessage = 'Some message';
133+
$exceptionCode = 111;
134+
$exception = new \Exception($exceptionMessage, $exceptionCode);
135+
136+
$result = $this->problemModel->addErrorData($exception);
137+
138+
self::assertEquals($result, $this->problemModel);
139+
self::assertEquals($exceptionMessage, $this->problemModel->getProblemErrorText());
140+
self::assertEquals($exceptionCode, $this->problemModel->getProblemErrorCode());
141+
}
142+
143+
public function testGetSubscriberWithNoSubscriberId()
144+
{
145+
self::assertNull($this->problemModel->getSubscriber());
146+
}
147+
148+
public function testGetSubscriber()
149+
{
150+
$this->setSubscriber();
151+
self::assertEquals($this->subscriberMock, $this->problemModel->getSubscriber());
152+
}
153+
154+
public function testUnsubscribeWithNoSubscriber()
155+
{
156+
$this->subscriberMock->expects($this->never())
157+
->method('__call')
158+
->with($this->equalTo('setSubscriberStatus'));
159+
160+
$result = $this->problemModel->unsubscribe();
161+
162+
self::assertEquals($this->problemModel, $result);
163+
}
164+
165+
public function testUnsubscribe()
166+
{
167+
$this->setSubscriber();
168+
$this->subscriberMock->expects($this->at(1))
169+
->method('__call')
170+
->with($this->equalTo('setSubscriberStatus'), $this->equalTo([Subscriber::STATUS_UNSUBSCRIBED]))
171+
->willReturnSelf();
172+
$this->subscriberMock->expects($this->at(2))
173+
->method('__call')
174+
->with($this->equalTo('setIsStatusChanged'))
175+
->willReturnSelf();
176+
$this->subscriberMock->expects($this->once())
177+
->method('save');
178+
179+
$result = $this->problemModel->unsubscribe();
180+
181+
self::assertEquals($this->problemModel, $result);
182+
}
183+
184+
/**
185+
* Sets subscriber to the Problem model
186+
*/
187+
private function setSubscriber()
188+
{
189+
$subscriberId = 1;
190+
$this->problemModel->setSubscriberId($subscriberId);
191+
$this->subscriberFactoryMock->expects($this->once())
192+
->method('create')
193+
->willReturn($this->subscriberMock);
194+
$this->subscriberMock->expects($this->once())
195+
->method('load')
196+
->with($subscriberId)
197+
->willReturnSelf();
198+
}
199+
}

app/code/Magento/OfflinePayments/Model/Purchaseorder.php

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
*/
66
namespace Magento\OfflinePayments\Model;
77

8+
use Magento\Framework\Exception\LocalizedException;
9+
810
/**
911
* Class Purchaseorder
1012
*
@@ -46,11 +48,29 @@ class Purchaseorder extends \Magento\Payment\Model\Method\AbstractMethod
4648
*
4749
* @param \Magento\Framework\DataObject|mixed $data
4850
* @return $this
49-
* @throws \Magento\Framework\Exception\LocalizedException
51+
* @throws LocalizedException
5052
*/
5153
public function assignData(\Magento\Framework\DataObject $data)
5254
{
5355
$this->getInfoInstance()->setPoNumber($data->getPoNumber());
5456
return $this;
5557
}
58+
59+
/**
60+
* Validate payment method information object
61+
*
62+
* @return $this
63+
* @throws LocalizedException
64+
* @api
65+
*/
66+
public function validate()
67+
{
68+
parent::validate();
69+
70+
if (empty($this->getInfoInstance()->getPoNumber())) {
71+
throw new LocalizedException(__('Purchase order number is a required field.'));
72+
}
73+
74+
return $this;
75+
}
5676
}

app/code/Magento/OfflinePayments/Test/Unit/Model/PurchaseorderTest.php

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,21 @@
55
*/
66
namespace Magento\OfflinePayments\Test\Unit\Model;
77

8+
use Magento\Framework\App\Config\ScopeConfigInterface;
9+
use Magento\Framework\DataObject;
10+
use Magento\Framework\Event\ManagerInterface as EventManagerInterface;
11+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
12+
use Magento\OfflinePayments\Model\Purchaseorder;
13+
use Magento\Payment\Helper\Data as PaymentHelper;
14+
use Magento\Payment\Model\Info as PaymentInfo;
15+
use Magento\Sales\Api\Data\OrderAddressInterface;
16+
use Magento\Sales\Api\Data\OrderInterface;
17+
use Magento\Sales\Model\Order\Payment;
18+
819
class PurchaseorderTest extends \PHPUnit\Framework\TestCase
920
{
1021
/**
11-
* @var \Magento\OfflinePayments\Model\Purchaseorder
22+
* @var Purchaseorder
1223
*/
1324
protected $_object;
1425

@@ -19,15 +30,15 @@ class PurchaseorderTest extends \PHPUnit\Framework\TestCase
1930

2031
protected function setUp()
2132
{
22-
$objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
23-
$eventManager = $this->createMock(\Magento\Framework\Event\ManagerInterface::class);
24-
$paymentDataMock = $this->createMock(\Magento\Payment\Helper\Data::class);
33+
$objectManagerHelper = new ObjectManager($this);
34+
$eventManager = $this->createMock(EventManagerInterface::class);
35+
$paymentDataMock = $this->createMock(PaymentHelper::class);
2536
$this->_scopeConfig = $this->createPartialMock(
26-
\Magento\Framework\App\Config\ScopeConfigInterface::class,
37+
ScopeConfigInterface::class,
2738
['getValue', 'isSetFlag']
2839
);
2940
$this->_object = $objectManagerHelper->getObject(
30-
\Magento\OfflinePayments\Model\Purchaseorder::class,
41+
Purchaseorder::class,
3142
[
3243
'eventManager' => $eventManager,
3344
'paymentData' => $paymentDataMock,
@@ -38,13 +49,37 @@ protected function setUp()
3849

3950
public function testAssignData()
4051
{
41-
$data = new \Magento\Framework\DataObject([
52+
$data = new DataObject([
4253
'po_number' => '12345'
4354
]);
4455

45-
$instance = $this->createMock(\Magento\Payment\Model\Info::class);
56+
$instance = $this->createMock(PaymentInfo::class);
4657
$this->_object->setData('info_instance', $instance);
4758
$result = $this->_object->assignData($data);
4859
$this->assertEquals($result, $this->_object);
4960
}
61+
62+
/**
63+
* @expectedException \Magento\Framework\Exception\LocalizedException
64+
* @expectedExceptionMessage Purchase order number is a required field.
65+
*/
66+
public function testValidate()
67+
{
68+
$data = new DataObject([]);
69+
70+
$addressMock = $this->createMock(OrderAddressInterface::class);
71+
$addressMock->expects($this->once())->method('getCountryId')->willReturn('UY');
72+
73+
$orderMock = $this->createMock(OrderInterface::class);
74+
$orderMock->expects($this->once())->method('getBillingAddress')->willReturn($addressMock);
75+
76+
$instance = $this->createMock(Payment::class);
77+
78+
$instance->expects($this->once())->method('getOrder')->willReturn($orderMock);
79+
80+
$this->_object->setData('info_instance', $instance);
81+
$this->_object->assignData($data);
82+
83+
$this->_object->validate();
84+
}
5085
}

app/code/Magento/OfflinePayments/i18n/en_US.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Enabled,Enabled
1111
"New Order Status","New Order Status"
1212
"Sort Order","Sort Order"
1313
Title,Title
14+
"Purchase order number is a required field.","Purchase order number is a required field."
1415
"Payment from Applicable Countries","Payment from Applicable Countries"
1516
"Payment from Specific Countries","Payment from Specific Countries"
1617
"Make Check Payable to","Make Check Payable to"

dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CancelCreatedOrderTest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
<variation name="CancelCreatedOrderTestVariationWithPurchaseOrderPaymentMethod" summary="Cancel order with purchase order payment method and check status on storefront">
4949
<data name="order/dataset" xsi:type="string">default</data>
5050
<data name="order/data/payment_auth_expiration/method" xsi:type="string">purchaseorder</data>
51+
<data name="order/data/payment_auth_expiration/po_number" xsi:type="string">po_number</data>
5152
<data name="status" xsi:type="string">Canceled</data>
5253
<data name="configData" xsi:type="string">purchaseorder</data>
5354
<constraint name="Magento\Sales\Test\Constraint\AssertOrderCancelSuccessMessage" />

dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateCreditMemoEntityTest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
</data>
105105
<data name="order/dataset" xsi:type="string">default</data>
106106
<data name="order/data/payment_auth_expiration/method" xsi:type="string">purchaseorder</data>
107+
<data name="order/data/payment_auth_expiration/po_number" xsi:type="string">po_number</data>
107108
<data name="order/data/price/dataset" xsi:type="string">full_refund_with_zero_shipping_refund</data>
108109
<data name="configData" xsi:type="string">purchaseorder</data>
109110
<constraint name="Magento\Sales\Test\Constraint\AssertRefundSuccessCreateMessage" />

dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateInvoiceEntityTest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
<data name="order/data/entity_id/products" xsi:type="string">catalogProductSimple::product_100_dollar</data>
8989
<data name="order/data/total_qty_ordered/0" xsi:type="string">-</data>
9090
<data name="order/data/payment_auth_expiration/method" xsi:type="string">purchaseorder</data>
91+
<data name="order/data/payment_auth_expiration/po_number" xsi:type="string">po_number</data>
9192
<data name="order/data/invoice" xsi:type="array">
9293
<item name="0" xsi:type="array">
9394
<item name="items_data" xsi:type="array">

0 commit comments

Comments
 (0)