Skip to content

Commit 3ea78ad

Browse files
committed
MAGETWO-63910: Create infrastructure for mapper in Payment module
- Updated payment verification interface - Updated Braintree avs/cvv mappers behaviour - Refactored payment verification default implementation
1 parent b22eb3c commit 3ea78ad

File tree

8 files changed

+170
-34
lines changed

8 files changed

+170
-34
lines changed

app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818
*/
1919
class AvsEmsCodeMapper implements PaymentVerificationInterface
2020
{
21+
/**
22+
* Default code for mismatching mapping.
23+
*
24+
* @var string
25+
*/
26+
private static $unavailableCode = 'U';
27+
2128
/**
2229
* List of mapping AVS codes
2330
*
@@ -37,19 +44,20 @@ class AvsEmsCodeMapper implements PaymentVerificationInterface
3744
* Gets payment AVS verification code.
3845
* Returns null if payment does not contain any AVS details.
3946
*
40-
* @return string|null
47+
* @param OrderPaymentInterface $orderPayment
48+
* @return string
4149
*/
4250
public function getCode(OrderPaymentInterface $orderPayment)
4351
{
4452
$additionalInfo = $orderPayment->getAdditionalInformation();
4553
if (empty($additionalInfo[PaymentDetailsHandler::AVS_POSTAL_RESPONSE_CODE]) ||
4654
empty($additionalInfo[PaymentDetailsHandler::AVS_STREET_ADDRESS_RESPONSE_CODE])
4755
) {
48-
return null;
56+
return self::$unavailableCode;
4957
}
5058
$streetCode = $additionalInfo[PaymentDetailsHandler::AVS_STREET_ADDRESS_RESPONSE_CODE];
5159
$zipCode = $additionalInfo[PaymentDetailsHandler::AVS_POSTAL_RESPONSE_CODE];
5260
$key = $zipCode . $streetCode;
53-
return isset(self::$avsMap[$key]) ? self::$avsMap[$key] : null;
61+
return isset(self::$avsMap[$key]) ? self::$avsMap[$key] : self::$unavailableCode;
5462
}
5563
}

app/code/Magento/Braintree/Model/CvvEmsMapper.php renamed to app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,15 @@
1616
* @see https://developers.braintreepayments.com/reference/response/transaction
1717
* @see http://www.emsecommerce.net/avs_cvv2_response_codes.htm
1818
*/
19-
class CvvEmsMapper implements PaymentVerificationInterface
19+
class CvvEmsCodeMapper implements PaymentVerificationInterface
2020
{
21+
/**
22+
* Default code for mismatch mapping
23+
*
24+
* @var string
25+
*/
26+
private static $notProvidedCode = 'P';
27+
2128
/**
2229
* List of mapping CVV codes
2330
*
@@ -36,16 +43,17 @@ class CvvEmsMapper implements PaymentVerificationInterface
3643
* Gets payment CVV verification code.
3744
* Returns null if payment does not contain any CVV details.
3845
*
39-
* @return string|null
46+
* @param OrderPaymentInterface $orderPayment
47+
* @return string
4048
*/
4149
public function getCode(OrderPaymentInterface $orderPayment)
4250
{
4351
$additionalInfo = $orderPayment->getAdditionalInformation();
4452
if (empty($additionalInfo[PaymentDetailsHandler::CVV_RESPONSE_CODE])) {
45-
return null;
53+
return self::$notProvidedCode;
4654
}
4755

4856
$cvv = $additionalInfo[PaymentDetailsHandler::CVV_RESPONSE_CODE];
49-
return isset(self::$cvvMap[$cvv]) ? self::$cvvMap[$cvv] : null;
57+
return isset(self::$cvvMap[$cvv]) ? self::$cvvMap[$cvv] : self::$notProvidedCode;
5058
}
5159
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<?php
2+
/**
3+
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Braintree\Test\Unit\Model;
7+
8+
use Magento\Braintree\Model\AvsEmsCodeMapper;
9+
use Magento\Sales\Api\Data\OrderPaymentInterface;
10+
use PHPUnit_Framework_MockObject_MockObject as MockObject;
11+
12+
class AvsEmsCodeMapperTest extends \PHPUnit_Framework_TestCase
13+
{
14+
/**
15+
* @var AvsEmsCodeMapper
16+
*/
17+
private $mapper;
18+
19+
/**
20+
* @inheritdoc
21+
*/
22+
protected function setUp()
23+
{
24+
$this->mapper = new AvsEmsCodeMapper();
25+
}
26+
27+
/**
28+
* Checks different variations for AVS codes mapping.
29+
*
30+
* @covers \Magento\Braintree\Model\AvsEmsCodeMapper::getCode
31+
* @param string $avsZip
32+
* @param string $avsStreet
33+
* @param string $expected
34+
* @dataProvider getCodeDataProvider
35+
*/
36+
public function testGetCode($avsZip, $avsStreet, $expected)
37+
{
38+
/** @var OrderPaymentInterface|MockObject $orderPayment */
39+
$orderPayment = $this->getMockBuilder(OrderPaymentInterface::class)
40+
->disableOriginalConstructor()
41+
->getMock();
42+
43+
$orderPayment->expects(self::once())
44+
->method('getAdditionalInformation')
45+
->willReturn([
46+
'avsPostalCodeResponseCode' => $avsZip,
47+
'avsStreetAddressResponseCode' => $avsStreet
48+
]);
49+
50+
self::assertEquals($expected, $this->mapper->getCode($orderPayment));
51+
}
52+
53+
/**
54+
* Gets list of AVS codes.
55+
*
56+
* @return array
57+
*/
58+
public function getCodeDataProvider()
59+
{
60+
return [
61+
['avsZip' => null, 'avsStreet' => null, 'expected' => 'U'],
62+
['avsZip' => null, 'avsStreet' => 'M', 'expected' => 'U'],
63+
['avsZip' => 'M', 'avsStreet' => null, 'expected' => 'U'],
64+
['avsZip' => 'M', 'avsStreet' => 'Unknown', 'expected' => 'U'],
65+
['avsZip' => 'I', 'avsStreet' => 'A', 'expected' => 'U'],
66+
['avsZip' => 'M', 'avsStreet' => 'M', 'expected' => 'Y'],
67+
['avsZip' => 'N', 'avsStreet' => 'M', 'expected' => 'A'],
68+
['avsZip' => 'M', 'avsStreet' => 'N', 'expected' => 'Z'],
69+
['avsZip' => 'N', 'avsStreet' => 'N', 'expected' => 'N'],
70+
['avsZip' => 'U', 'avsStreet' => 'U', 'expected' => 'U'],
71+
['avsZip' => 'I', 'avsStreet' => 'I', 'expected' => 'U'],
72+
['avsZip' => 'A', 'avsStreet' => 'A', 'expected' => 'E'],
73+
];
74+
}
75+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
/**
3+
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Braintree\Test\Unit\Model;
7+
8+
use Magento\Braintree\Model\CvvEmsCodeMapper;
9+
use Magento\Sales\Api\Data\OrderPaymentInterface;
10+
use PHPUnit_Framework_MockObject_MockObject as MockObject;
11+
12+
class CvvEmsCodeMapperTest extends \PHPUnit_Framework_TestCase
13+
{
14+
/**
15+
* @var CvvEmsCodeMapper
16+
*/
17+
private $mapper;
18+
19+
/**
20+
* @inheritdoc
21+
*/
22+
protected function setUp()
23+
{
24+
$this->mapper = new CvvEmsCodeMapper();
25+
}
26+
27+
/**
28+
* Checks different variations for cvv codes mapping.
29+
*
30+
* @covers \Magento\Braintree\Model\CvvEmsCodeMapper::getCode
31+
* @param string $cvvCode
32+
* @param string $expected
33+
* @dataProvider getCodeDataProvider
34+
*/
35+
public function testGetCode($cvvCode, $expected)
36+
{
37+
/** @var OrderPaymentInterface|MockObject $orderPayment */
38+
$orderPayment = $this->getMockBuilder(OrderPaymentInterface::class)
39+
->disableOriginalConstructor()
40+
->getMock();
41+
42+
$orderPayment->expects(self::once())
43+
->method('getAdditionalInformation')
44+
->willReturn(['cvvResponseCode' => $cvvCode]);
45+
46+
self::assertEquals($expected, $this->mapper->getCode($orderPayment));
47+
}
48+
49+
/**
50+
* Gets variations of cvv codes and expected mapping result.
51+
*
52+
* @return array
53+
*/
54+
public function getCodeDataProvider()
55+
{
56+
return [
57+
['cvvCode' => '', 'expected' => 'P'],
58+
['cvvCode' => null, 'expected' => 'P'],
59+
['cvvCode' => 'Unknown', 'expected' => 'P'],
60+
['cvvCode' => 'M', 'expected' => 'M'],
61+
['cvvCode' => 'N', 'expected' => 'N'],
62+
['cvvCode' => 'U', 'expected' => 'P'],
63+
['cvvCode' => 'I', 'expected' => 'P'],
64+
['cvvCode' => 'S', 'expected' => 'S'],
65+
['cvvCode' => 'A', 'expected' => ''],
66+
];
67+
}
68+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
<privateInfoKeys>avsPostalCodeResponseCode,avsStreetAddressResponseCode,cvvResponseCode,processorAuthorizationCode,processorResponseCode,processorResponseText,liabilityShifted,liabilityShiftPossible,riskDataId,riskDataDecision</privateInfoKeys>
4242
<paymentInfoKeys>cc_type,cc_number,avsPostalCodeResponseCode,avsStreetAddressResponseCode,cvvResponseCode,processorAuthorizationCode,processorResponseCode,processorResponseText,liabilityShifted,liabilityShiftPossible,riskDataId,riskDataDecision</paymentInfoKeys>
4343
<avs_ems_adapter>Magento\Braintree\Model\AvsEmsCodeMapper</avs_ems_adapter>
44-
<cvv_ems_adapter>Magento\Braintree\Model\CvvEmsMapper</cvv_ems_adapter>
44+
<cvv_ems_adapter>Magento\Braintree\Model\CvvEmsCodeMapper</cvv_ems_adapter>
4545
</braintree>
4646
<braintree_paypal>
4747
<model>BraintreePayPalFacade</model>

app/code/Magento/Payment/Api/PaymentVerificationInterface.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@
1515
* The payment methods can map payment method info from internal sources,
1616
* like additional information, to specific international codes.
1717
*
18+
* There are no default implementation of this interface, because code verification
19+
* depends on payment method integration specifics.
20+
*
1821
* @api
1922
*/
2023
interface PaymentVerificationInterface
2124
{
2225
/**
2326
* Gets payment provider verification code.
24-
* Returns null if verification cannot be obtained by payment method.
2527
*
2628
* @param OrderPaymentInterface $orderPayment
2729
* @return string

app/code/Magento/Payment/Model/NullPaymentVerification.php

Lines changed: 0 additions & 24 deletions
This file was deleted.

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
<preference for="Magento\Payment\Gateway\ConfigFactoryInterface" type="Magento\Payment\Gateway\Config\ConfigFactory" />
1313
<preference for="Magento\Payment\Gateway\Command\CommandManagerPoolInterface" type="Magento\Payment\Gateway\Command\CommandManagerPool" />
1414
<preference for="Magento\Payment\Gateway\Data\PaymentDataObjectFactoryInterface" type="Magento\Payment\Gateway\Data\PaymentDataObjectFactory" />
15-
<preference for="Magento\Payment\Api\PaymentVerificationInterface" type="Magento\Payment\Model\NullPaymentVerification" />
1615

1716
<type name="Magento\Payment\Model\Config\Reader">
1817
<arguments>

0 commit comments

Comments
 (0)