Skip to content

Commit 114f480

Browse files
committed
Merge branch 'MAGETWO-51658' into MPI-PR
2 parents c107794 + 2827777 commit 114f480

26 files changed

+1236
-89
lines changed

app/code/Magento/Braintree/Gateway/Response/RiskDataHandler.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ class RiskDataHandler implements HandlerInterface
2424
*/
2525
const RISK_DATA_DECISION = 'riskDataDecision';
2626

27+
/**
28+
* Risk data Review status
29+
*/
30+
private static $statusReview = 'Review';
31+
2732
/**
2833
* @var SubjectReader
2934
*/
@@ -62,5 +67,10 @@ public function handle(array $handlingSubject, array $response)
6267

6368
$payment->setAdditionalInformation(self::RISK_DATA_ID, $transaction->riskData->id);
6469
$payment->setAdditionalInformation(self::RISK_DATA_DECISION, $transaction->riskData->decision);
70+
71+
// mark payment as fraud
72+
if ($transaction->riskData->decision === self::$statusReview) {
73+
$payment->setIsFraudDetected(true);
74+
}
6575
}
6676
}

app/code/Magento/Braintree/Test/Unit/Gateway/Response/RiskDataHandlerTest.php

Lines changed: 57 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
*/
66
namespace Magento\Braintree\Test\Unit\Gateway\Response;
77

8-
use Braintree\RiskData;
98
use Braintree\Transaction;
10-
use Magento\Sales\Model\Order\Payment;
119
use Magento\Braintree\Gateway\Helper\SubjectReader;
1210
use Magento\Braintree\Gateway\Response\RiskDataHandler;
1311
use Magento\Payment\Gateway\Data\PaymentDataObjectInterface;
12+
use Magento\Sales\Model\Order\Payment;
13+
use PHPUnit_Framework_MockObject_MockObject as MockObject;
1414

1515
/**
1616
* Class RiskDataHandlerTest
@@ -25,99 +25,95 @@ class RiskDataHandlerTest extends \PHPUnit_Framework_TestCase
2525
private $riskDataHandler;
2626

2727
/**
28-
* @var SubjectReader|\PHPUnit_Framework_MockObject_MockObject
28+
* @var SubjectReader|MockObject
2929
*/
30-
private $subjectReaderMock;
30+
private $subjectReader;
3131

3232
/**
3333
* Set up
3434
*/
3535
protected function setUp()
3636
{
37-
$this->subjectReaderMock = $this->getMockBuilder(SubjectReader::class)
37+
$this->subjectReader = $this->getMockBuilder(SubjectReader::class)
3838
->disableOriginalConstructor()
39+
->setMethods(['readPayment', 'readTransaction'])
3940
->getMock();
4041

41-
$this->riskDataHandler = new RiskDataHandler($this->subjectReaderMock);
42+
$this->riskDataHandler = new RiskDataHandler($this->subjectReader);
4243
}
4344

4445
/**
45-
* Run test for handle method
46+
* Test for handle method
47+
* @covers \Magento\Braintree\Gateway\Response\RiskDataHandler::handle
48+
* @param string $riskDecision
49+
* @param boolean $isFraud
50+
* @dataProvider riskDataProvider
4651
*/
47-
public function testHandle()
52+
public function testHandle($riskDecision, $isFraud)
4853
{
49-
$paymentData = $this->getPaymentDataObjectMock();
50-
$transaction = $this->getBraintreeTransactionMock();
54+
/** @var Payment|MockObject $payment */
55+
$payment = $this->getMockBuilder(Payment::class)
56+
->disableOriginalConstructor()
57+
->setMethods(['setAdditionalInformation', 'setIsFraudDetected'])
58+
->getMock();
59+
/** @var PaymentDataObjectInterface|MockObject $paymentDO */
60+
$paymentDO = $this->getMock(PaymentDataObjectInterface::class);
61+
$paymentDO->expects(self::once())
62+
->method('getPayment')
63+
->willReturn($payment);
64+
65+
$transaction = Transaction::factory([
66+
'riskData' => [
67+
'id' => 'test-id',
68+
'decision' => $riskDecision
69+
]
70+
]);
5171

5272
$response = [
5373
'object' => $transaction
5474
];
5575
$handlingSubject = [
56-
'payment' =>$paymentData,
76+
'payment' => $paymentDO,
5777
];
5878

59-
$this->subjectReaderMock->expects(self::once())
79+
$this->subjectReader->expects(static::once())
6080
->method('readPayment')
6181
->with($handlingSubject)
62-
->willReturn($paymentData);
63-
$this->subjectReaderMock->expects(self::once())
82+
->willReturn($paymentDO);
83+
$this->subjectReader->expects(static::once())
6484
->method('readTransaction')
6585
->with($response)
6686
->willReturn($transaction);
6787

68-
$this->riskDataHandler->handle($handlingSubject, $response);
69-
}
70-
71-
/**
72-
* @return \PHPUnit_Framework_MockObject_MockObject
73-
*/
74-
private function getBraintreeTransactionMock()
75-
{
76-
$transaction = \Braintree\Transaction::factory([]);
77-
$transaction->_set(
78-
'riskData',
79-
RiskData::factory(
80-
[
81-
'id' => 'test-id',
82-
'decision' => 'test-decision',
83-
]
84-
)
85-
);
86-
87-
return $transaction;
88-
}
89-
90-
/**
91-
* @return \PHPUnit_Framework_MockObject_MockObject
92-
*/
93-
private function getPaymentDataObjectMock()
94-
{
95-
$mock = $this->getMockBuilder(PaymentDataObjectInterface::class)
96-
->getMockForAbstractClass();
88+
$payment->expects(static::at(0))
89+
->method('setAdditionalInformation')
90+
->with(RiskDataHandler::RISK_DATA_ID, 'test-id');
91+
$payment->expects(static::at(1))
92+
->method('setAdditionalInformation')
93+
->with(RiskDataHandler::RISK_DATA_DECISION, $riskDecision);
9794

98-
$mock->expects(static::once())
99-
->method('getPayment')
100-
->willReturn($this->getPaymentMock());
95+
if (!$isFraud) {
96+
$payment->expects(static::never())
97+
->method('setIsFraudDetected');
98+
} else {
99+
$payment->expects(static::once())
100+
->method('setIsFraudDetected')
101+
->with(true);
102+
}
101103

102-
return $mock;
104+
$this->riskDataHandler->handle($handlingSubject, $response);
103105
}
104106

105107
/**
106-
* @return \PHPUnit_Framework_MockObject_MockObject
108+
* Get list of variations to test fraud
109+
* @return array
107110
*/
108-
private function getPaymentMock()
111+
public function riskDataProvider()
109112
{
110-
$paymentMock = $this->getMockBuilder(Payment::class)
111-
->disableOriginalConstructor()
112-
->getMock();
113-
114-
$paymentMock->expects(self::at(0))
115-
->method('setAdditionalInformation')
116-
->with(RiskDataHandler::RISK_DATA_ID, 'test-id');
117-
$paymentMock->expects(self::at(1))
118-
->method('setAdditionalInformation')
119-
->with(RiskDataHandler::RISK_DATA_DECISION, 'test-decision');
120-
121-
return $paymentMock;
113+
return [
114+
['decision' => 'Not Evaluated', 'isFraud' => false],
115+
['decision' => 'Approve', 'isFraud' => false],
116+
['decision' => 'Review', 'isFraud' => true],
117+
];
122118
}
123119
}

app/code/Magento/Braintree/etc/config.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
<can_void>1</can_void>
2727
<can_cancel>1</can_cancel>
2828
<can_edit>1</can_edit>
29+
<can_review_payment>1</can_review_payment>
30+
<can_deny_payment>1</can_deny_payment>
2931
<cctypes>AE,VI,MC,DI,JCB,CUP,DN,MI</cctypes>
3032
<useccv>1</useccv>
3133
<cctypes_braintree_mapper><![CDATA[{"american-express":"AE","discover":"DI","jcb":"JCB","mastercard":"MC","master-card":"MC","visa":"VI","maestro":"MI","diners-club":"DN","unionpay":"CUP"}]]></cctypes_braintree_mapper>

app/code/Magento/Braintree/etc/di.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@
133133
<item name="void" xsi:type="string">BraintreeVoidCommand</item>
134134
<item name="refund" xsi:type="string">BraintreeRefundCommand</item>
135135
<item name="cancel" xsi:type="string">BraintreeVoidCommand</item>
136+
<item name="deny_payment" xsi:type="string">BraintreeVoidCommand</item>
136137
</argument>
137138
</arguments>
138139
</virtualType>

app/code/Magento/Sales/Model/Order/Payment/State/AuthorizeCommand.php

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
use Magento\Sales\Model\Order;
1111
use Magento\Sales\Model\Order\Payment;
1212

13+
/**
14+
* Class AuthorizeCommand
15+
*/
1316
class AuthorizeCommand implements CommandInterface
1417
{
1518
/**
@@ -23,29 +26,22 @@ public function execute(OrderPaymentInterface $payment, $amount, OrderInterface
2326
$state = Order::STATE_PROCESSING;
2427
$status = false;
2528
$formattedAmount = $order->getBaseCurrency()->formatTxt($amount);
29+
2630
if ($payment->getIsTransactionPending()) {
2731
$state = Order::STATE_PAYMENT_REVIEW;
28-
$message = __(
29-
'We will authorize %1 after the payment is approved at the payment gateway.',
30-
$formattedAmount
31-
);
32+
$message = 'We will authorize %1 after the payment is approved at the payment gateway.';
3233
} else {
33-
if ($payment->getIsFraudDetected()) {
34-
$state = Order::STATE_PROCESSING;
35-
$message = __(
36-
'Order is suspended as its authorizing amount %1 is suspected to be fraudulent.',
37-
$formattedAmount
38-
);
39-
} else {
40-
$message = __('Authorized amount of %1', $formattedAmount);
41-
}
34+
$message = 'Authorized amount of %1.';
4235
}
36+
4337
if ($payment->getIsFraudDetected()) {
38+
$state = Order::STATE_PAYMENT_REVIEW;
4439
$status = Order::STATUS_FRAUD;
40+
$message .= ' Order is suspended as its authorizing amount %1 is suspected to be fraudulent.';
4541
}
4642
$this->setOrderStateAndStatus($order, $status, $state);
4743

48-
return $message;
44+
return __($message, $formattedAmount);
4945
}
5046

5147
/**

app/code/Magento/Sales/Model/Order/Payment/State/CaptureCommand.php

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
use Magento\Sales\Api\Data\OrderPaymentInterface;
1010
use Magento\Sales\Model\Order as SalesOrder;
1111

12+
/**
13+
* Class CaptureCommand
14+
*/
1215
class CaptureCommand implements CommandInterface
1316
{
1417
/**
@@ -24,22 +27,23 @@ public function execute(OrderPaymentInterface $payment, $amount, OrderInterface
2427
$state = SalesOrder::STATE_PROCESSING;
2528
$status = false;
2629
$formattedAmount = $order->getBaseCurrency()->formatTxt($amount);
30+
2731
if ($payment->getIsTransactionPending()) {
28-
$message = __(
29-
'An amount of %1 will be captured after being approved at the payment gateway.',
30-
$formattedAmount
31-
);
3232
$state = SalesOrder::STATE_PAYMENT_REVIEW;
33-
if ($payment->getIsFraudDetected()) {
34-
$status = SalesOrder::STATUS_FRAUD;
35-
}
33+
$message = 'An amount of %1 will be captured after being approved at the payment gateway.';
3634
} else {
3735
// normal online capture: invoice is marked as "paid"
38-
$message = __('Captured amount of %1 online', $formattedAmount);
36+
$message = 'Captured amount of %1 online.';
37+
}
38+
39+
if ($payment->getIsFraudDetected()) {
40+
$state = SalesOrder::STATE_PAYMENT_REVIEW;
41+
$status = SalesOrder::STATUS_FRAUD;
42+
$message .= ' Order is suspended as its capturing amount %1 is suspected to be fraudulent.';
3943
}
4044
$this->setOrderStateAndStatus($order, $status, $state);
4145

42-
return $message;
46+
return __($message, $formattedAmount);
4347
}
4448

4549
/**

0 commit comments

Comments
 (0)