Skip to content

Commit fefec6c

Browse files
committed
AC-13414: Credit Card(Payflow Link) payment is not working
Test coverage for return url plugin to handle silent post
1 parent 65e6ac8 commit fefec6c

File tree

1 file changed

+185
-0
lines changed

1 file changed

+185
-0
lines changed
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
<?php
2+
/**
3+
* Copyright 2025 Adobe
4+
* All rights reserved.
5+
*/
6+
namespace integration\testsuite\Magento\Paypal\Plugin;
7+
8+
use Magento\Framework\Api\FilterBuilder;
9+
use Magento\Framework\Api\SearchCriteriaBuilder;
10+
use Magento\Framework\DataObject;
11+
use Magento\Paypal\Model\Config;
12+
use Magento\Paypal\Model\Payflow\Service\Gateway;
13+
use Magento\Paypal\Model\Payflowlink;
14+
use Magento\Sales\Api\Data\OrderInterface;
15+
use Magento\Sales\Api\OrderRepositoryInterface;
16+
use Magento\Sales\Model\Order;
17+
use Magento\Sales\Model\Order\Email\Sender\OrderSender;
18+
use Magento\Sales\Model\Order\Payment;
19+
use Magento\TestFramework\TestCase\AbstractController;
20+
use PHPUnit\Framework\MockObject\MockObject;
21+
22+
/**
23+
* @magentoAppIsolation enabled
24+
*/
25+
class PayflowSilentPostTest extends AbstractController
26+
{
27+
/**
28+
* @var Gateway|MockObject
29+
*/
30+
private $gateway;
31+
32+
/**
33+
* @var OrderSender|MockObject
34+
*/
35+
private $orderSender;
36+
37+
/**
38+
* @var string
39+
*/
40+
protected $orderIncrementId = '000000045';
41+
42+
/**
43+
* @inheritdoc
44+
*/
45+
protected function setUp(): void
46+
{
47+
parent::setUp();
48+
49+
$this->gateway = $this->getMockBuilder(Gateway::class)
50+
->disableOriginalConstructor()
51+
->getMock();
52+
53+
$this->orderSender = $this->getMockBuilder(OrderSender::class)
54+
->disableOriginalConstructor()
55+
->getMock();
56+
57+
$this->_objectManager->addSharedInstance($this->gateway, Gateway::class);
58+
$this->_objectManager->addSharedInstance($this->orderSender, OrderSender::class);
59+
60+
$order = $this->getOrder($this->orderIncrementId);
61+
$payment = $this->_objectManager->create(Payment::class);
62+
$payment->setMethod(Config::METHOD_PAYFLOWLINK)
63+
->setBaseAmountAuthorized(100)
64+
->setAdditionalInformation(
65+
[
66+
'secure_silent_post_hash' => 'cf7i85d01ed7c92223031afb4rdl2f1f'
67+
]
68+
);
69+
$order->setPayment($payment);
70+
$order->setState(Order::STATE_PENDING_PAYMENT)
71+
->setStatus(Order::STATE_PENDING_PAYMENT);
72+
$orderRepository = $this->_objectManager->get(OrderRepositoryInterface::class);
73+
$orderRepository->save($order);
74+
}
75+
76+
/**
77+
* @inheritdoc
78+
*/
79+
protected function tearDown(): void
80+
{
81+
$this->_objectManager->removeSharedInstance(Gateway::class);
82+
$this->_objectManager->removeSharedInstance(OrderSender::class);
83+
parent::tearDown();
84+
}
85+
86+
/**
87+
* Checks a test case when Payflow Link return url before plugin is executed with transaction details.
88+
*
89+
* @param int $resultCode
90+
* @param string $orderState
91+
* @param string $orderStatus
92+
* @magentoDataFixture Magento/Paypal/_files/order_payflow_link.php
93+
* @dataProvider responseCodeDataProvider
94+
*/
95+
public function testOrderStatusWithDifferentPaypalResponse($resultCode, $orderState, $orderStatus)
96+
{
97+
$this->withRequest($resultCode);
98+
$this->withGatewayResponse($resultCode);
99+
100+
$this->dispatch('paypal/payflow/returnUrl');
101+
self::assertEquals(200, $this->getResponse()->getStatusCode());
102+
103+
$order = $this->getOrder($this->orderIncrementId);
104+
self::assertEquals($orderState, $order->getState());
105+
self::assertEquals($orderStatus, $order->getStatus());
106+
}
107+
108+
/**
109+
* Get list of different variations for paypal response
110+
*
111+
* @return array
112+
*/
113+
public static function responseCodeDataProvider()
114+
{
115+
return [
116+
[Payflowlink::RESPONSE_CODE_APPROVED, Order::STATE_COMPLETE, Order::STATE_COMPLETE],
117+
[Payflowlink::RESPONSE_CODE_DECLINED, Order::STATE_PENDING_PAYMENT, Order::STATE_PENDING_PAYMENT]
118+
];
119+
}
120+
121+
/**
122+
* Imitates real request with test data.
123+
*
124+
* @param int $resultCode
125+
* @return void
126+
*/
127+
private function withRequest($resultCode)
128+
{
129+
$data = [
130+
'INVNUM' => $this->orderIncrementId,
131+
'AMT' => 100,
132+
'PNREF' => 'A21CP234KLB8',
133+
'USER2' => 'cf7i85d01ed7c92223031afb4rdl2f1f',
134+
'RESULT' => $resultCode,
135+
'TYPE' => 'A',
136+
'RESPMSG' => 'Approved'
137+
];
138+
$this->getRequest()->setParams($data);
139+
}
140+
141+
/**
142+
* Imitates response from PayPal gateway.
143+
*
144+
* @param int $resultCode
145+
* @return void
146+
*/
147+
private function withGatewayResponse($resultCode)
148+
{
149+
$response = new DataObject([
150+
'custref' => $this->orderIncrementId,
151+
'origresult' => $resultCode,
152+
'respmsg' => 'Response message from PayPal gateway'
153+
]);
154+
$this->gateway->method('postRequest')
155+
->willReturn($response);
156+
}
157+
158+
/**
159+
* Gets order stored by fixture.
160+
*
161+
* @return OrderInterface
162+
*/
163+
private function getOrder()
164+
{
165+
/** @var FilterBuilder $filterBuilder */
166+
$filterBuilder = $this->_objectManager->get(FilterBuilder::class);
167+
$filters = [
168+
$filterBuilder->setField(OrderInterface::INCREMENT_ID)
169+
->setValue($this->orderIncrementId)
170+
->create()
171+
];
172+
173+
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
174+
$searchCriteriaBuilder = $this->_objectManager->get(SearchCriteriaBuilder::class);
175+
$searchCriteria = $searchCriteriaBuilder->addFilters($filters)
176+
->create();
177+
178+
$orderRepository = $this->_objectManager->get(OrderRepositoryInterface::class);
179+
$orders = $orderRepository->getList($searchCriteria)
180+
->getItems();
181+
182+
/** @var OrderInterface $order */
183+
return array_pop($orders);
184+
}
185+
}

0 commit comments

Comments
 (0)