From 5d39ed01ce075a853c1f10ac9dd1d39c65c65ad4 Mon Sep 17 00:00:00 2001 From: Ievgen Sentiabov Date: Mon, 6 Feb 2017 14:02:31 +0200 Subject: [PATCH 01/23] MAGETWO-63910: Create infrastructure for mapper in Payment module - Added api interfaces and default mapper implementation - Added AVS, CVV codes mapper for Braintree payment method --- .../Braintree/Model/CodeVerification.php | 93 +++++++++++++++++++ app/code/Magento/Braintree/etc/config.xml | 1 + .../Payment/Api/CodeVerificationInterface.php | 30 ++++++ .../Data/CodeVerificationInterfaceFactory.php | 26 ++++++ .../Payment/Model/CodeVerificationFactory.php | 55 +++++++++++ .../Payment/Model/NullCodeVerification.php | 31 +++++++ app/code/Magento/Payment/etc/di.xml | 2 + 7 files changed, 238 insertions(+) create mode 100644 app/code/Magento/Braintree/Model/CodeVerification.php create mode 100644 app/code/Magento/Payment/Api/CodeVerificationInterface.php create mode 100644 app/code/Magento/Payment/Api/Data/CodeVerificationInterfaceFactory.php create mode 100644 app/code/Magento/Payment/Model/CodeVerificationFactory.php create mode 100644 app/code/Magento/Payment/Model/NullCodeVerification.php diff --git a/app/code/Magento/Braintree/Model/CodeVerification.php b/app/code/Magento/Braintree/Model/CodeVerification.php new file mode 100644 index 0000000000000..ffe373ac9ced6 --- /dev/null +++ b/app/code/Magento/Braintree/Model/CodeVerification.php @@ -0,0 +1,93 @@ + 'M', + 'N' => 'N', + 'U' => 'P', + 'I' => 'P', + 'S' => 'S', + 'A' => '' + ]; + + /** + * List of mapping AVS codes + * + * @var array + */ + private static $avsMap = [ + 'MM' => 'Y', + 'NM' => 'A', + 'MN' => 'Z', + 'NN' => 'N', + 'UU' => 'U', + 'II' => 'U', + 'AA' => 'E' + ]; + + /** + * @var OrderPaymentInterface + */ + private $orderPayment; + + /** + * @param OrderPaymentInterface $orderPayment + */ + public function __construct(OrderPaymentInterface $orderPayment) + { + $this->orderPayment = $orderPayment; + } + + /** + * @inheritdoc + */ + public function getAvsCode() + { + $additionalInfo = $this->orderPayment->getAdditionalInformation(); + if (empty($additionalInfo[PaymentDetailsHandler::AVS_POSTAL_RESPONSE_CODE]) || + empty($additionalInfo[PaymentDetailsHandler::AVS_STREET_ADDRESS_RESPONSE_CODE]) + ) { + return null; + } + $streetCode = $additionalInfo[PaymentDetailsHandler::AVS_STREET_ADDRESS_RESPONSE_CODE]; + $zipCode = $additionalInfo[PaymentDetailsHandler::AVS_POSTAL_RESPONSE_CODE]; + $key = $zipCode . $streetCode; + return isset(self::$avsMap[$key]) ? self::$avsMap[$key] : 'U'; + } + + /** + * @inheritdoc + */ + public function getCvvCode() + { + $additionalInfo = $this->orderPayment->getAdditionalInformation(); + if (empty($additionalInfo[PaymentDetailsHandler::CVV_RESPONSE_CODE])) { + return null; + } + + $cvv = $additionalInfo[PaymentDetailsHandler::CVV_RESPONSE_CODE]; + return self::$cvvMap[$cvv]; + } +} diff --git a/app/code/Magento/Braintree/etc/config.xml b/app/code/Magento/Braintree/etc/config.xml index eaa233da109ce..8bc22bead3a08 100644 --- a/app/code/Magento/Braintree/etc/config.xml +++ b/app/code/Magento/Braintree/etc/config.xml @@ -40,6 +40,7 @@ cvv,number avsPostalCodeResponseCode,avsStreetAddressResponseCode,cvvResponseCode,processorAuthorizationCode,processorResponseCode,processorResponseText,liabilityShifted,liabilityShiftPossible,riskDataId,riskDataDecision cc_type,cc_number,avsPostalCodeResponseCode,avsStreetAddressResponseCode,cvvResponseCode,processorAuthorizationCode,processorResponseCode,processorResponseText,liabilityShifted,liabilityShiftPossible,riskDataId,riskDataDecision + Magento\Braintree\Model\CodeVerification BraintreePayPalFacade diff --git a/app/code/Magento/Payment/Api/CodeVerificationInterface.php b/app/code/Magento/Payment/Api/CodeVerificationInterface.php new file mode 100644 index 0000000000000..8250ae18cabee --- /dev/null +++ b/app/code/Magento/Payment/Api/CodeVerificationInterface.php @@ -0,0 +1,30 @@ +config = $config; + $this->objectManager = $objectManager; + } + + /** + * @inheritdoc + */ + public function create(OrderPaymentInterface $orderPayment) + { + $this->config->setMethodCode($orderPayment->getMethod()); + $verificationClass = $this->config->getValue('code_verification'); + if ($verificationClass === null) { + return $this->objectManager->get(CodeVerificationInterface::class); + } + return $this->objectManager->create($verificationClass, [ + 'orderPayment' => $orderPayment + ]); + } +} diff --git a/app/code/Magento/Payment/Model/NullCodeVerification.php b/app/code/Magento/Payment/Model/NullCodeVerification.php new file mode 100644 index 0000000000000..8c2612edd8415 --- /dev/null +++ b/app/code/Magento/Payment/Model/NullCodeVerification.php @@ -0,0 +1,31 @@ + + + From 9f9cc315d3b0f74cd91992004becb9e9cc928b36 Mon Sep 17 00:00:00 2001 From: Iurii Ivashchenko Date: Mon, 6 Feb 2017 18:40:02 +0200 Subject: [PATCH 02/23] MAGETWO-64154: Rearrange Signifyd information table in order view template --- .../Magento_Signifyd/web/css/source/_module.less | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/design/adminhtml/Magento/backend/Magento_Signifyd/web/css/source/_module.less b/app/design/adminhtml/Magento/backend/Magento_Signifyd/web/css/source/_module.less index 7449dce5e2ebb..994a26c12095c 100644 --- a/app/design/adminhtml/Magento/backend/Magento_Signifyd/web/css/source/_module.less +++ b/app/design/adminhtml/Magento/backend/Magento_Signifyd/web/css/source/_module.less @@ -11,3 +11,13 @@ &:extend(.abs-order-tables all); &:extend(.abs-order-tbody-border all); } + +// +// Layout +// --------------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .case-information { + float: left; + #mix-grid .width(6,12); + } +} From d4223c53c3e7dfc4ba6d6b53634a24fec5f88784 Mon Sep 17 00:00:00 2001 From: Ievgen Sentiabov Date: Mon, 6 Feb 2017 18:57:55 +0200 Subject: [PATCH 03/23] MAGETWO-63910: Create infrastructure for mapper in Payment module - Reimplemented API interfaces - Updated purchase builder --- ...ication.php => AvsPaymentVerification.php} | 58 ++++--------------- .../Model/CvvPaymentVerification.php | 51 ++++++++++++++++ app/code/Magento/Braintree/etc/config.xml | 3 +- .../Payment/Api/CodeVerificationInterface.php | 30 ---------- .../Data/CodeVerificationInterfaceFactory.php | 26 --------- .../Api/PaymentVerificationInterface.php | 24 ++++++++ .../Payment/Model/CodeVerificationFactory.php | 55 ------------------ ...cation.php => NullPaymentVerification.php} | 17 ++---- app/code/Magento/Payment/etc/di.xml | 3 +- 9 files changed, 93 insertions(+), 174 deletions(-) rename app/code/Magento/Braintree/Model/{CodeVerification.php => AvsPaymentVerification.php} (51%) create mode 100644 app/code/Magento/Braintree/Model/CvvPaymentVerification.php delete mode 100644 app/code/Magento/Payment/Api/CodeVerificationInterface.php delete mode 100644 app/code/Magento/Payment/Api/Data/CodeVerificationInterfaceFactory.php create mode 100644 app/code/Magento/Payment/Api/PaymentVerificationInterface.php delete mode 100644 app/code/Magento/Payment/Model/CodeVerificationFactory.php rename app/code/Magento/Payment/Model/{NullCodeVerification.php => NullPaymentVerification.php} (51%) diff --git a/app/code/Magento/Braintree/Model/CodeVerification.php b/app/code/Magento/Braintree/Model/AvsPaymentVerification.php similarity index 51% rename from app/code/Magento/Braintree/Model/CodeVerification.php rename to app/code/Magento/Braintree/Model/AvsPaymentVerification.php index ffe373ac9ced6..58c41377ee706 100644 --- a/app/code/Magento/Braintree/Model/CodeVerification.php +++ b/app/code/Magento/Braintree/Model/AvsPaymentVerification.php @@ -6,32 +6,18 @@ namespace Magento\Braintree\Model; use Magento\Braintree\Gateway\Response\PaymentDetailsHandler; -use Magento\Payment\Api\CodeVerificationInterface; +use Magento\Payment\Api\PaymentVerificationInterface; use Magento\Sales\Api\Data\OrderPaymentInterface; /** - * Processes AVS and CVV codes mapping from Braintree transaction to + * Processes AVS codes mapping from Braintree transaction to * electronic merchant systems standard. * * @see https://developers.braintreepayments.com/reference/response/transaction * @see http://www.emsecommerce.net/avs_cvv2_response_codes.htm */ -class CodeVerification implements CodeVerificationInterface +class AvsPaymentVerification implements PaymentVerificationInterface { - /** - * List of mapping CVV codes - * - * @var array - */ - private static $cvvMap = [ - 'M' => 'M', - 'N' => 'N', - 'U' => 'P', - 'I' => 'P', - 'S' => 'S', - 'A' => '' - ]; - /** * List of mapping AVS codes * @@ -48,24 +34,14 @@ class CodeVerification implements CodeVerificationInterface ]; /** - * @var OrderPaymentInterface - */ - private $orderPayment; - - /** - * @param OrderPaymentInterface $orderPayment - */ - public function __construct(OrderPaymentInterface $orderPayment) - { - $this->orderPayment = $orderPayment; - } - - /** - * @inheritdoc + * Gets payment AVS verification code. + * Returns null if payment does not contain any AVS details. + * + * @return string|null */ - public function getAvsCode() + public function getCode(OrderPaymentInterface $orderPayment) { - $additionalInfo = $this->orderPayment->getAdditionalInformation(); + $additionalInfo = $orderPayment->getAdditionalInformation(); if (empty($additionalInfo[PaymentDetailsHandler::AVS_POSTAL_RESPONSE_CODE]) || empty($additionalInfo[PaymentDetailsHandler::AVS_STREET_ADDRESS_RESPONSE_CODE]) ) { @@ -74,20 +50,6 @@ public function getAvsCode() $streetCode = $additionalInfo[PaymentDetailsHandler::AVS_STREET_ADDRESS_RESPONSE_CODE]; $zipCode = $additionalInfo[PaymentDetailsHandler::AVS_POSTAL_RESPONSE_CODE]; $key = $zipCode . $streetCode; - return isset(self::$avsMap[$key]) ? self::$avsMap[$key] : 'U'; - } - - /** - * @inheritdoc - */ - public function getCvvCode() - { - $additionalInfo = $this->orderPayment->getAdditionalInformation(); - if (empty($additionalInfo[PaymentDetailsHandler::CVV_RESPONSE_CODE])) { - return null; - } - - $cvv = $additionalInfo[PaymentDetailsHandler::CVV_RESPONSE_CODE]; - return self::$cvvMap[$cvv]; + return isset(self::$avsMap[$key]) ? self::$avsMap[$key] : null; } } diff --git a/app/code/Magento/Braintree/Model/CvvPaymentVerification.php b/app/code/Magento/Braintree/Model/CvvPaymentVerification.php new file mode 100644 index 0000000000000..e572ffdef1e51 --- /dev/null +++ b/app/code/Magento/Braintree/Model/CvvPaymentVerification.php @@ -0,0 +1,51 @@ + 'M', + 'N' => 'N', + 'U' => 'P', + 'I' => 'P', + 'S' => 'S', + 'A' => '' + ]; + + /** + * Gets payment CVV verification code. + * Returns null if payment does not contain any CVV details. + * + * @return string|null + */ + public function getCode(OrderPaymentInterface $orderPayment) + { + $additionalInfo = $orderPayment->getAdditionalInformation(); + if (empty($additionalInfo[PaymentDetailsHandler::CVV_RESPONSE_CODE])) { + return null; + } + + $cvv = $additionalInfo[PaymentDetailsHandler::CVV_RESPONSE_CODE]; + return isset(self::$cvvMap[$cvv]) ? self::$cvvMap[$cvv] : null; + } +} diff --git a/app/code/Magento/Braintree/etc/config.xml b/app/code/Magento/Braintree/etc/config.xml index 8bc22bead3a08..60147499bb344 100644 --- a/app/code/Magento/Braintree/etc/config.xml +++ b/app/code/Magento/Braintree/etc/config.xml @@ -40,7 +40,8 @@ cvv,number avsPostalCodeResponseCode,avsStreetAddressResponseCode,cvvResponseCode,processorAuthorizationCode,processorResponseCode,processorResponseText,liabilityShifted,liabilityShiftPossible,riskDataId,riskDataDecision cc_type,cc_number,avsPostalCodeResponseCode,avsStreetAddressResponseCode,cvvResponseCode,processorAuthorizationCode,processorResponseCode,processorResponseText,liabilityShifted,liabilityShiftPossible,riskDataId,riskDataDecision - Magento\Braintree\Model\CodeVerification + Magento\Braintree\Model\AvsPaymentVerification + Magento\Braintree\Model\CvvPaymentVerification BraintreePayPalFacade diff --git a/app/code/Magento/Payment/Api/CodeVerificationInterface.php b/app/code/Magento/Payment/Api/CodeVerificationInterface.php deleted file mode 100644 index 8250ae18cabee..0000000000000 --- a/app/code/Magento/Payment/Api/CodeVerificationInterface.php +++ /dev/null @@ -1,30 +0,0 @@ -config = $config; - $this->objectManager = $objectManager; - } - - /** - * @inheritdoc - */ - public function create(OrderPaymentInterface $orderPayment) - { - $this->config->setMethodCode($orderPayment->getMethod()); - $verificationClass = $this->config->getValue('code_verification'); - if ($verificationClass === null) { - return $this->objectManager->get(CodeVerificationInterface::class); - } - return $this->objectManager->create($verificationClass, [ - 'orderPayment' => $orderPayment - ]); - } -} diff --git a/app/code/Magento/Payment/Model/NullCodeVerification.php b/app/code/Magento/Payment/Model/NullPaymentVerification.php similarity index 51% rename from app/code/Magento/Payment/Model/NullCodeVerification.php rename to app/code/Magento/Payment/Model/NullPaymentVerification.php index 8c2612edd8415..ce53e04f8c2dd 100644 --- a/app/code/Magento/Payment/Model/NullCodeVerification.php +++ b/app/code/Magento/Payment/Model/NullPaymentVerification.php @@ -5,26 +5,19 @@ */ namespace Magento\Payment\Model; -use Magento\Payment\Api\CodeVerificationInterface; +use Magento\Payment\Api\PaymentVerificationInterface; +use Magento\Sales\Api\Data\OrderPaymentInterface; /** - * Default implementation of code verification interface. + * Default implementation of codes verification interfaces. * Provides AVS, CVV codes matching for payment methods which are not support AVS, CVV verification. */ -class NullCodeVerification implements CodeVerificationInterface +class NullPaymentVerification implements PaymentVerificationInterface { /** * @inheritdoc */ - public function getAvsCode() - { - return null; - } - - /** - * @inheritdoc - */ - public function getCvvCode() + public function getCode(OrderPaymentInterface $orderPayment) { return null; } diff --git a/app/code/Magento/Payment/etc/di.xml b/app/code/Magento/Payment/etc/di.xml index b3c52d3605e57..fa857ff28ee71 100644 --- a/app/code/Magento/Payment/etc/di.xml +++ b/app/code/Magento/Payment/etc/di.xml @@ -12,8 +12,7 @@ - - + From 6159299b665654a635d38d53b3e9bb29e91fbc52 Mon Sep 17 00:00:00 2001 From: Viktor Tymchynskyi Date: Mon, 6 Feb 2017 19:15:36 +0200 Subject: [PATCH 04/23] MAGETWO-63945: Add extension point to sales grid indexer --- .../Model/ResourceModel/AbstractGrid.php | 2 + .../Sales/Model/ResourceModel/Grid.php | 18 +++- .../Provider/IdListProviderComposite.php | 48 +++++++++ .../Provider/IdListProviderInterface.php | 21 ++++ .../Provider/UpdatedIdListProvider.php | 67 +++++++++++++ .../Provider/IdListProviderCompositeTest.php | 99 +++++++++++++++++++ app/code/Magento/Sales/etc/di.xml | 8 ++ .../Sales/Model/ResourceModel/GridTest.php | 74 ++++++++++++++ .../Magento/Sales/_files/order_async.php | 71 +++++++++++++ 9 files changed, 405 insertions(+), 3 deletions(-) create mode 100644 app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderComposite.php create mode 100644 app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderInterface.php create mode 100644 app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php create mode 100644 app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/IdListProviderCompositeTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Sales/_files/order_async.php diff --git a/app/code/Magento/Sales/Model/ResourceModel/AbstractGrid.php b/app/code/Magento/Sales/Model/ResourceModel/AbstractGrid.php index 10cbb175c70bc..3cd6adecf30d7 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/AbstractGrid.php +++ b/app/code/Magento/Sales/Model/ResourceModel/AbstractGrid.php @@ -89,6 +89,8 @@ public function purge($value, $field = null) * * @param string $default * @return string + * @deprecated unused + * @see \Magento\Sales\Model\ResourceModel\Provider\UpdatedIdListProvider */ protected function getLastUpdatedAtValue($default = '0000-00-00 00:00:00') { diff --git a/app/code/Magento/Sales/Model/ResourceModel/Grid.php b/app/code/Magento/Sales/Model/ResourceModel/Grid.php index ba3419d0cd96e..19a3a9369d9d0 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/Grid.php +++ b/app/code/Magento/Sales/Model/ResourceModel/Grid.php @@ -5,9 +5,10 @@ */ namespace Magento\Sales\Model\ResourceModel; +use Magento\Framework\App\ObjectManager; use Magento\Framework\DB\Adapter\AdapterInterface; -use Magento\Sales\Model\ResourceModel\AbstractGrid; use Magento\Framework\Model\ResourceModel\Db\Context; +use Magento\Sales\Model\ResourceModel\Provider\IdListProviderInterface; /** * Class Grid @@ -39,6 +40,11 @@ class Grid extends AbstractGrid */ protected $columns; + /** + * @var IdListProviderInterface + */ + private $idListProvider; + /** * @param Context $context * @param string $mainTableName @@ -47,6 +53,7 @@ class Grid extends AbstractGrid * @param array $joins * @param array $columns * @param string $connectionName + * @param IdListProviderInterface $idListProvider */ public function __construct( Context $context, @@ -55,13 +62,15 @@ public function __construct( $orderIdField, array $joins = [], array $columns = [], - $connectionName = null + $connectionName = null, + IdListProviderInterface $idListProvider = null ) { $this->mainTableName = $mainTableName; $this->gridTableName = $gridTableName; $this->orderIdField = $orderIdField; $this->joins = $joins; $this->columns = $columns; + $this->idListProvider = $idListProvider ?: ObjectManager::getInstance()->get(IdListProviderInterface::class); parent::__construct($context, $connectionName); } @@ -99,7 +108,10 @@ public function refresh($value, $field = null) public function refreshBySchedule() { $select = $this->getGridOriginSelect() - ->where($this->mainTableName . '.updated_at >= ?', $this->getLastUpdatedAtValue()); + ->where( + $this->mainTableName . '.entity_id IN (?)', + $this->idListProvider->get($this->mainTableName, $this->gridTableName) + ); return $this->getConnection()->query( $this->getConnection() diff --git a/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderComposite.php b/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderComposite.php new file mode 100644 index 0000000000000..abbbd6f876613 --- /dev/null +++ b/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderComposite.php @@ -0,0 +1,48 @@ +providers = $tmapFactory->create( + [ + 'array' => $providers, + 'type' => IdListProviderInterface::class + ] + ); + } + + /** + * @inheritDoc + */ + public function get($mainTableName, $gridTableName) + { + $result = []; + foreach ($this->providers as $provider) { + $result = array_merge($result, $provider->get($mainTableName, $gridTableName)); + } + + return $result; + } +} diff --git a/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderInterface.php b/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderInterface.php new file mode 100644 index 0000000000000..1621e68d4310c --- /dev/null +++ b/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderInterface.php @@ -0,0 +1,21 @@ +resourceConnection = $resourceConnection; + } + + /** + * @inheritdoc + */ + public function get($mainTableName, $gridTableName) + { + $lastUpdatedAt = $this->getLastUpdatedAtValue($gridTableName); + $select = $this->getConnection()->select() + ->from($this->getConnection()->getTableName($mainTableName), ['entity_id']) + ->where('updated_at >= ?', $lastUpdatedAt); + + return $this->getConnection()->fetchAll($select, [], \Zend_Db::FETCH_COLUMN); + } + + /** + * Returns update time of the last row in the grid. + * + * @param string $gridTableName + * @return string + */ + private function getLastUpdatedAtValue($gridTableName) + { + $select = $this->getConnection()->select() + ->from($this->getConnection()->getTableName($gridTableName), ['updated_at']) + ->order('updated_at DESC') + ->limit(1); + $row = $this->getConnection()->fetchRow($select); + + return isset($row['updated_at']) ? $row['updated_at'] : '0000-00-00 00:00:00'; + } + + /** + * @return \Magento\Framework\DB\Adapter\AdapterInterface + */ + private function getConnection() + { + return $this->resourceConnection->getConnection('sales'); + } +} diff --git a/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/IdListProviderCompositeTest.php b/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/IdListProviderCompositeTest.php new file mode 100644 index 0000000000000..078d81724333b --- /dev/null +++ b/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/IdListProviderCompositeTest.php @@ -0,0 +1,99 @@ +getMockBuilder(TMapFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $tMap = $this->getMockBuilder(TMap::class) + ->disableOriginalConstructor() + ->getMock(); + + $tMapFactory->expects(static::once()) + ->method('create') + ->with( + [ + 'array' => [], + 'type' => IdListProviderInterface::class + ] + ) + ->willReturn($tMap); + $tMap->expects(static::once()) + ->method('getIterator') + ->willReturn(new \ArrayIterator([])); + + $provider = new IdListProviderComposite($tMapFactory, []); + static::assertEquals([], $provider->get('main_table', 'grid_table')); + } + + /** + * @covers \Magento\Sales\Model\ResourceModel\Provider\IdListProviderComposite::get + */ + public function testGet() + { + /** @var TMapFactory|MockObject $tMapFactory */ + $tMapFactory = $this->getMockBuilder(TMapFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $tMap = $this->getMockBuilder(TMap::class) + ->disableOriginalConstructor() + ->getMock(); + + $provider1 = $this->getMockBuilder(IdListProviderInterface::class) + ->getMockForAbstractClass(); + $provider1->expects(static::once()) + ->method('get') + ->willReturn([1, 2]); + + $provider2 = $this->getMockBuilder(IdListProviderInterface::class) + ->getMockForAbstractClass(); + $provider2->expects(static::once()) + ->method('get') + ->willReturn([3, 4]); + + $tMapFactory->expects(static::once()) + ->method('create') + ->with( + [ + 'array' => [ + 'provider1' => IdListProviderInterface::class, + 'provider2' => IdListProviderInterface::class + ], + 'type' => IdListProviderInterface::class + ] + ) + ->willReturn($tMap); + $tMap->expects(static::once()) + ->method('getIterator') + ->willReturn(new \ArrayIterator([$provider1, $provider2])); + + $provider = new IdListProviderComposite( + $tMapFactory, + [ + 'provider1' => IdListProviderInterface::class, + 'provider2' => IdListProviderInterface::class, + ] + ); + + static::assertEquals([1, 2, 3, 4], $provider->get('main_table', 'grid_table')); + } +} diff --git a/app/code/Magento/Sales/etc/di.xml b/app/code/Magento/Sales/etc/di.xml index 88e72e2b8a374..8538408914b71 100644 --- a/app/code/Magento/Sales/etc/di.xml +++ b/app/code/Magento/Sales/etc/di.xml @@ -113,6 +113,14 @@ + + + + + Magento\Sales\Model\ResourceModel\Provider\UpdatedIdListProvider + + + diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php new file mode 100644 index 0000000000000..784f856b9c94e --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php @@ -0,0 +1,74 @@ +objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $this->resourceModel = $this->objectManager->create('Magento\Sales\Model\ResourceModel\Order\Grid'); + } + + /** + * Tests asynchronous insertion of the new entity into order grid. + * + * @magentoDataFixture Magento/Sales/_files/order_async.php + */ + public function testRefreshByScheduleAsyncModeSuccess() + { + $this->resourceModel->refreshBySchedule(); + $this->assertNotEmpty($this->getOrderGridItemList()); + } + + /** + * Tests failing of asynchronous insertion new entity into order grid. + * + * @magentoDataFixture Magento/Sales/_files/order_async.php + */ + public function testRefreshByScheduleAsyncModeFail() + { + $this->assertEmpty($this->getOrderGridItemList()); + } + + /** + * Tests synchronous insertion of the new entity into order grid. + * + * @magentoDataFixture Magento/Sales/_files/order.php + */ + public function testRefreshByScheduleSyncModeSuccess() + { + $this->assertNotEmpty($this->getOrderGridItemList()); + } + + /** + * Returns value of signifyd_guarantee_status column from sales order grid + * + * @return string|null + */ + private function getOrderGridItemList() + { + /** @var \Magento\Sales\Model\ResourceModel\Order\Grid\Collection $orderGridCollection */ + $orderGridCollection = $this->objectManager->get( + \Magento\Sales\Model\ResourceModel\Order\Grid\Collection::class + ); + + return $orderGridCollection->addFilter('increment_id', '100000001')->getItems(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/order_async.php b/dev/tests/integration/testsuite/Magento/Sales/_files/order_async.php new file mode 100644 index 0000000000000..0a81973a0eb27 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/_files/order_async.php @@ -0,0 +1,71 @@ +get(MutableScopeConfigInterface::class); +$mutableConfig->setValue('dev/grid/async_indexing', '1'); + +$billingAddress = $objectManager->create(\Magento\Sales\Model\Order\Address::class, ['data' => $addressData]); +$billingAddress->setAddressType('billing'); + +$shippingAddress = clone $billingAddress; +$shippingAddress->setId(null)->setAddressType('shipping'); + +$payment = $objectManager->create(\Magento\Sales\Model\Order\Payment::class); +$payment->setMethod('checkmo'); + +/** @var \Magento\Sales\Model\Order\Item $orderItem */ +$orderItem = $objectManager->create(\Magento\Sales\Model\Order\Item::class); +$orderItem->setProductId($product->getId())->setQtyOrdered(2); +$orderItem->setBasePrice($product->getPrice()); +$orderItem->setPrice($product->getPrice()); +$orderItem->setRowTotal($product->getPrice()); +$orderItem->setProductType('simple'); + +/** @var \Magento\Sales\Model\Order $order */ +$order = $objectManager->create(\Magento\Sales\Model\Order::class); +$order->setIncrementId( + '100000001' +)->setState( + \Magento\Sales\Model\Order::STATE_PROCESSING +)->setStatus( + $order->getConfig()->getStateDefaultStatus(\Magento\Sales\Model\Order::STATE_PROCESSING) +)->setSubtotal( + 100 +)->setGrandTotal( + 100 +)->setBaseSubtotal( + 100 +)->setBaseGrandTotal( + 100 +)->setCustomerIsGuest( + true +)->setCustomerEmail( + 'customer@null.com' +)->setBillingAddress( + $billingAddress +)->setShippingAddress( + $shippingAddress +)->setStoreId( + $objectManager->get(\Magento\Store\Model\StoreManagerInterface::class)->getStore()->getId() +)->addItem( + $orderItem +)->setPayment( + $payment +); +$order->save(); From edb406d102c429c341f2cde8be9d653072eeabae Mon Sep 17 00:00:00 2001 From: Viktor Tymchynskyi Date: Tue, 7 Feb 2017 09:57:47 +0200 Subject: [PATCH 05/23] MAGETWO-63945: Add extension point to sales grid indexer - Rename IdListProviderComposite to IdListProvider - Fix static --- .../Sales/Model/ResourceModel/AbstractGrid.php | 1 + ...stProviderComposite.php => IdListProvider.php} | 2 +- .../Provider/IdListProviderInterface.php | 2 +- .../Provider/UpdatedIdListProvider.php | 2 +- ...erCompositeTest.php => IdListProviderTest.php} | 12 ++++++------ app/code/Magento/Sales/etc/di.xml | 4 ++-- .../Sales/Model/ResourceModel/GridTest.php | 15 ++++++++------- 7 files changed, 20 insertions(+), 18 deletions(-) rename app/code/Magento/Sales/Model/ResourceModel/Provider/{IdListProviderComposite.php => IdListProvider.php} (94%) rename app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/{IdListProviderCompositeTest.php => IdListProviderTest.php} (90%) diff --git a/app/code/Magento/Sales/Model/ResourceModel/AbstractGrid.php b/app/code/Magento/Sales/Model/ResourceModel/AbstractGrid.php index 3cd6adecf30d7..9fdb2874a3ffd 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/AbstractGrid.php +++ b/app/code/Magento/Sales/Model/ResourceModel/AbstractGrid.php @@ -67,6 +67,7 @@ public function getGridTable() { return $this->getTable($this->gridTableName); } + /** * Purge grid row * diff --git a/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderComposite.php b/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProvider.php similarity index 94% rename from app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderComposite.php rename to app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProvider.php index abbbd6f876613..b7162256bb1ac 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderComposite.php +++ b/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProvider.php @@ -10,7 +10,7 @@ /** * Implements IdListProviderInterface as composite */ -class IdListProviderComposite implements IdListProviderInterface +class IdListProvider implements IdListProviderInterface { /** * @var IdListProviderInterface[] diff --git a/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderInterface.php b/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderInterface.php index 1621e68d4310c..b139944a10395 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderInterface.php +++ b/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderInterface.php @@ -6,7 +6,7 @@ namespace Magento\Sales\Model\ResourceModel\Provider; /** - * Interface provides entities ids list that should be updated in grid + * Interface provides entities id list that should be updated in grid */ interface IdListProviderInterface { diff --git a/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php b/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php index 28ed43a020606..9509b372a49e4 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php +++ b/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php @@ -62,6 +62,6 @@ private function getLastUpdatedAtValue($gridTableName) */ private function getConnection() { - return $this->resourceConnection->getConnection('sales'); + return $this->resourceConnection->getConnection(); } } diff --git a/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/IdListProviderCompositeTest.php b/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/IdListProviderTest.php similarity index 90% rename from app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/IdListProviderCompositeTest.php rename to app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/IdListProviderTest.php index 078d81724333b..6c0a055320de2 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/IdListProviderCompositeTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/IdListProviderTest.php @@ -7,14 +7,14 @@ use Magento\Framework\ObjectManager\TMap; use Magento\Framework\ObjectManager\TMapFactory; -use Magento\Sales\Model\ResourceModel\Provider\IdListProviderComposite; +use Magento\Sales\Model\ResourceModel\Provider\IdListProvider; use Magento\Sales\Model\ResourceModel\Provider\IdListProviderInterface; use PHPUnit_Framework_MockObject_MockObject as MockObject; /** - * Class IdListProviderCompositeTest + * Class IdListProviderTest */ -class IdListProviderCompositeTest extends \PHPUnit_Framework_TestCase +class IdListProviderTest extends \PHPUnit_Framework_TestCase { public function testGetEmpty() { @@ -40,12 +40,12 @@ public function testGetEmpty() ->method('getIterator') ->willReturn(new \ArrayIterator([])); - $provider = new IdListProviderComposite($tMapFactory, []); + $provider = new IdListProvider($tMapFactory, []); static::assertEquals([], $provider->get('main_table', 'grid_table')); } /** - * @covers \Magento\Sales\Model\ResourceModel\Provider\IdListProviderComposite::get + * @covers \Magento\Sales\Model\ResourceModel\Provider\IdListProvider::get */ public function testGet() { @@ -86,7 +86,7 @@ public function testGet() ->method('getIterator') ->willReturn(new \ArrayIterator([$provider1, $provider2])); - $provider = new IdListProviderComposite( + $provider = new IdListProvider( $tMapFactory, [ 'provider1' => IdListProviderInterface::class, diff --git a/app/code/Magento/Sales/etc/di.xml b/app/code/Magento/Sales/etc/di.xml index 8538408914b71..0d602b2d9d398 100644 --- a/app/code/Magento/Sales/etc/di.xml +++ b/app/code/Magento/Sales/etc/di.xml @@ -113,8 +113,8 @@ - - + + Magento\Sales\Model\ResourceModel\Provider\UpdatedIdListProvider diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php index 784f856b9c94e..9bad5dd64a914 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php @@ -5,6 +5,9 @@ */ namespace Magento\Sales\Model\ResourceModel; +use Magento\Sales\Model\ResourceModel\Order\Grid\Collection; +use Magento\TestFramework\Helper\Bootstrap; + /** * Class GridTest */ @@ -22,7 +25,7 @@ class GridTest extends \PHPUnit_Framework_TestCase protected function setUp() { - $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $this->objectManager = Bootstrap::getObjectManager(); $this->resourceModel = $this->objectManager->create('Magento\Sales\Model\ResourceModel\Order\Grid'); } @@ -58,16 +61,14 @@ public function testRefreshByScheduleSyncModeSuccess() } /** - * Returns value of signifyd_guarantee_status column from sales order grid + * Returns sales order grid items * - * @return string|null + * @return \Magento\Framework\DataObject[] */ private function getOrderGridItemList() { - /** @var \Magento\Sales\Model\ResourceModel\Order\Grid\Collection $orderGridCollection */ - $orderGridCollection = $this->objectManager->get( - \Magento\Sales\Model\ResourceModel\Order\Grid\Collection::class - ); + /** @var Collection $orderGridCollection */ + $orderGridCollection = $this->objectManager->get(Collection::class); return $orderGridCollection->addFilter('increment_id', '100000001')->getItems(); } From c1b5c0e1563da2ea43ce91caab311b483d3b4d6f Mon Sep 17 00:00:00 2001 From: Viktor Tymchynskyi Date: Tue, 7 Feb 2017 11:04:36 +0200 Subject: [PATCH 06/23] MAGETWO-63945: Add extension point to sales grid indexer - Add constraints for sales_order_grid --- .../Provider/UpdatedIdListProvider.php | 16 ++++++++++++++-- .../Sales/Model/ResourceModel/GridTest.php | 2 ++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php b/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php index 9509b372a49e4..4a8db88c53c03 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php +++ b/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php @@ -6,6 +6,7 @@ namespace Magento\Sales\Model\ResourceModel\Provider; use Magento\Framework\App\ResourceConnection; +use Magento\Framework\DB\Adapter\AdapterInterface; /** * Provides latest updated entities ids list @@ -17,6 +18,11 @@ class UpdatedIdListProvider implements IdListProviderInterface */ private $resourceConnection; + /** + * @var AdapterInterface + */ + private $connection; + /** * IdListProvider constructor. * @param ResourceConnection $resourceConnection @@ -58,10 +64,16 @@ private function getLastUpdatedAtValue($gridTableName) } /** - * @return \Magento\Framework\DB\Adapter\AdapterInterface + * Returns connection. + * + * @return AdapterInterface */ private function getConnection() { - return $this->resourceConnection->getConnection(); + if (!$this->connection) { + $this->connection = $this->resourceConnection->getConnection('sales'); + } + + return $this->connection; } } diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php index 9bad5dd64a914..fc0169f2d7ae9 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php @@ -32,6 +32,8 @@ protected function setUp() /** * Tests asynchronous insertion of the new entity into order grid. * + * @magentoDbIsolation enabled + * @magentoAppIsolation enabled * @magentoDataFixture Magento/Sales/_files/order_async.php */ public function testRefreshByScheduleAsyncModeSuccess() From b22eb3cbcef2391a066440c570ee99a9b437cd9f Mon Sep 17 00:00:00 2001 From: Ievgen Sentiabov Date: Tue, 7 Feb 2017 13:26:54 +0200 Subject: [PATCH 07/23] MAGETWO-63910: Create infrastructure for mapper in Payment module - Refactored code according to code review. --- ...AvsPaymentVerification.php => AvsEmsCodeMapper.php} | 2 +- .../{CvvPaymentVerification.php => CvvEmsMapper.php} | 2 +- app/code/Magento/Braintree/etc/config.xml | 4 ++-- .../Payment/Api/PaymentVerificationInterface.php | 10 ++++++++-- 4 files changed, 12 insertions(+), 6 deletions(-) rename app/code/Magento/Braintree/Model/{AvsPaymentVerification.php => AvsEmsCodeMapper.php} (96%) rename app/code/Magento/Braintree/Model/{CvvPaymentVerification.php => CvvEmsMapper.php} (95%) diff --git a/app/code/Magento/Braintree/Model/AvsPaymentVerification.php b/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php similarity index 96% rename from app/code/Magento/Braintree/Model/AvsPaymentVerification.php rename to app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php index 58c41377ee706..d55cc41bd5832 100644 --- a/app/code/Magento/Braintree/Model/AvsPaymentVerification.php +++ b/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php @@ -16,7 +16,7 @@ * @see https://developers.braintreepayments.com/reference/response/transaction * @see http://www.emsecommerce.net/avs_cvv2_response_codes.htm */ -class AvsPaymentVerification implements PaymentVerificationInterface +class AvsEmsCodeMapper implements PaymentVerificationInterface { /** * List of mapping AVS codes diff --git a/app/code/Magento/Braintree/Model/CvvPaymentVerification.php b/app/code/Magento/Braintree/Model/CvvEmsMapper.php similarity index 95% rename from app/code/Magento/Braintree/Model/CvvPaymentVerification.php rename to app/code/Magento/Braintree/Model/CvvEmsMapper.php index e572ffdef1e51..6798b810e0182 100644 --- a/app/code/Magento/Braintree/Model/CvvPaymentVerification.php +++ b/app/code/Magento/Braintree/Model/CvvEmsMapper.php @@ -16,7 +16,7 @@ * @see https://developers.braintreepayments.com/reference/response/transaction * @see http://www.emsecommerce.net/avs_cvv2_response_codes.htm */ -class CvvPaymentVerification implements PaymentVerificationInterface +class CvvEmsMapper implements PaymentVerificationInterface { /** * List of mapping CVV codes diff --git a/app/code/Magento/Braintree/etc/config.xml b/app/code/Magento/Braintree/etc/config.xml index 60147499bb344..76983291aa67c 100644 --- a/app/code/Magento/Braintree/etc/config.xml +++ b/app/code/Magento/Braintree/etc/config.xml @@ -40,8 +40,8 @@ cvv,number avsPostalCodeResponseCode,avsStreetAddressResponseCode,cvvResponseCode,processorAuthorizationCode,processorResponseCode,processorResponseText,liabilityShifted,liabilityShiftPossible,riskDataId,riskDataDecision cc_type,cc_number,avsPostalCodeResponseCode,avsStreetAddressResponseCode,cvvResponseCode,processorAuthorizationCode,processorResponseCode,processorResponseText,liabilityShifted,liabilityShiftPossible,riskDataId,riskDataDecision - Magento\Braintree\Model\AvsPaymentVerification - Magento\Braintree\Model\CvvPaymentVerification + Magento\Braintree\Model\AvsEmsCodeMapper + Magento\Braintree\Model\CvvEmsMapper BraintreePayPalFacade diff --git a/app/code/Magento/Payment/Api/PaymentVerificationInterface.php b/app/code/Magento/Payment/Api/PaymentVerificationInterface.php index 17e53efefa2c9..60d2fdcaefeb4 100644 --- a/app/code/Magento/Payment/Api/PaymentVerificationInterface.php +++ b/app/code/Magento/Payment/Api/PaymentVerificationInterface.php @@ -10,15 +10,21 @@ /** * Payment provider codes verification interface. * + * Custom payment methods might implement this interface to provide + * specific mapping for payment methods, like AVS or CVV verification. + * The payment methods can map payment method info from internal sources, + * like additional information, to specific international codes. + * * @api */ interface PaymentVerificationInterface { /** * Gets payment provider verification code. - * Returns null if payment method does not support verification. + * Returns null if verification cannot be obtained by payment method. * - * @return string|null + * @param OrderPaymentInterface $orderPayment + * @return string */ public function getCode(OrderPaymentInterface $orderPayment); } From f4eb72fcd140bb4003e357018e4a3f81d354941e Mon Sep 17 00:00:00 2001 From: Viktor Tymchynskyi Date: Tue, 7 Feb 2017 14:09:14 +0200 Subject: [PATCH 08/23] MAGETWO-63945: Add extension point to sales grid indexer - Fix integration test --- .../Sales/Model/ResourceModel/GridTest.php | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php index fc0169f2d7ae9..a3229b7565089 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php @@ -8,9 +8,6 @@ use Magento\Sales\Model\ResourceModel\Order\Grid\Collection; use Magento\TestFramework\Helper\Bootstrap; -/** - * Class GridTest - */ class GridTest extends \PHPUnit_Framework_TestCase { /** @@ -26,7 +23,17 @@ class GridTest extends \PHPUnit_Framework_TestCase protected function setUp() { $this->objectManager = Bootstrap::getObjectManager(); - $this->resourceModel = $this->objectManager->create('Magento\Sales\Model\ResourceModel\Order\Grid'); + $this->resourceModel = $this->objectManager->get('Magento\Sales\Model\ResourceModel\Order\Grid'); + } + + /** + * Tests synchronous insertion of the new entity into order grid. + * + * @magentoDataFixture Magento/Sales/_files/order.php + */ + public function testRefreshByScheduleSyncModeSuccess() + { + $this->assertNotEmpty($this->getOrderGridItemList()); } /** @@ -53,17 +60,7 @@ public function testRefreshByScheduleAsyncModeFail() } /** - * Tests synchronous insertion of the new entity into order grid. - * - * @magentoDataFixture Magento/Sales/_files/order.php - */ - public function testRefreshByScheduleSyncModeSuccess() - { - $this->assertNotEmpty($this->getOrderGridItemList()); - } - - /** - * Returns sales order grid items + * Returns sales order grid items. * * @return \Magento\Framework\DataObject[] */ From c7f8fe5b5e080af7032fa4dac4da1a28bde5be8f Mon Sep 17 00:00:00 2001 From: Viktor Tymchynskyi Date: Tue, 7 Feb 2017 14:52:13 +0200 Subject: [PATCH 09/23] MAGETWO-63945: Add extension point to sales grid indexer - Refactoring according CR --- .../Model/ResourceModel/AbstractGrid.php | 3 +- .../Sales/Model/ResourceModel/Grid.php | 10 +-- ...Provider.php => NotSyncedDataProvider.php} | 12 +-- ...php => NotSyncedDataProviderInterface.php} | 4 +- .../Provider/UpdatedIdListProvider.php | 6 +- ...Test.php => NotSyncedDataProviderTest.php} | 36 ++++----- .../Sales/Model/ResourceModel/GridTest.php | 74 ------------------- .../Magento/Sales/_files/order_async.php | 71 ------------------ 8 files changed, 36 insertions(+), 180 deletions(-) rename app/code/Magento/Sales/Model/ResourceModel/Provider/{IdListProvider.php => NotSyncedDataProvider.php} (71%) rename app/code/Magento/Sales/Model/ResourceModel/Provider/{IdListProviderInterface.php => NotSyncedDataProviderInterface.php} (82%) rename app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/{IdListProviderTest.php => NotSyncedDataProviderTest.php} (63%) delete mode 100644 dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php delete mode 100644 dev/tests/integration/testsuite/Magento/Sales/_files/order_async.php diff --git a/app/code/Magento/Sales/Model/ResourceModel/AbstractGrid.php b/app/code/Magento/Sales/Model/ResourceModel/AbstractGrid.php index 9fdb2874a3ffd..9da95269ca418 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/AbstractGrid.php +++ b/app/code/Magento/Sales/Model/ResourceModel/AbstractGrid.php @@ -90,7 +90,8 @@ public function purge($value, $field = null) * * @param string $default * @return string - * @deprecated unused + * @deprecated this method is not used in abstract model but only in single child so + * this deprecation is a part of cleaning abstract classes. * @see \Magento\Sales\Model\ResourceModel\Provider\UpdatedIdListProvider */ protected function getLastUpdatedAtValue($default = '0000-00-00 00:00:00') diff --git a/app/code/Magento/Sales/Model/ResourceModel/Grid.php b/app/code/Magento/Sales/Model/ResourceModel/Grid.php index 19a3a9369d9d0..178f43ba0b0bd 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/Grid.php +++ b/app/code/Magento/Sales/Model/ResourceModel/Grid.php @@ -8,7 +8,7 @@ use Magento\Framework\App\ObjectManager; use Magento\Framework\DB\Adapter\AdapterInterface; use Magento\Framework\Model\ResourceModel\Db\Context; -use Magento\Sales\Model\ResourceModel\Provider\IdListProviderInterface; +use Magento\Sales\Model\ResourceModel\Provider\NotSyncedDataProviderInterface; /** * Class Grid @@ -41,7 +41,7 @@ class Grid extends AbstractGrid protected $columns; /** - * @var IdListProviderInterface + * @var NotSyncedDataProviderInterface */ private $idListProvider; @@ -53,7 +53,7 @@ class Grid extends AbstractGrid * @param array $joins * @param array $columns * @param string $connectionName - * @param IdListProviderInterface $idListProvider + * @param NotSyncedDataProviderInterface $idListProvider */ public function __construct( Context $context, @@ -63,14 +63,14 @@ public function __construct( array $joins = [], array $columns = [], $connectionName = null, - IdListProviderInterface $idListProvider = null + NotSyncedDataProviderInterface $idListProvider = null ) { $this->mainTableName = $mainTableName; $this->gridTableName = $gridTableName; $this->orderIdField = $orderIdField; $this->joins = $joins; $this->columns = $columns; - $this->idListProvider = $idListProvider ?: ObjectManager::getInstance()->get(IdListProviderInterface::class); + $this->idListProvider = $idListProvider ?: ObjectManager::getInstance()->get(NotSyncedDataProviderInterface::class); parent::__construct($context, $connectionName); } diff --git a/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProvider.php b/app/code/Magento/Sales/Model/ResourceModel/Provider/NotSyncedDataProvider.php similarity index 71% rename from app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProvider.php rename to app/code/Magento/Sales/Model/ResourceModel/Provider/NotSyncedDataProvider.php index b7162256bb1ac..fc7e767210a53 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProvider.php +++ b/app/code/Magento/Sales/Model/ResourceModel/Provider/NotSyncedDataProvider.php @@ -8,12 +8,12 @@ use Magento\Framework\ObjectManager\TMapFactory; /** - * Implements IdListProviderInterface as composite + * Implements NotSyncedDataProviderInterface as composite */ -class IdListProvider implements IdListProviderInterface +class NotSyncedDataProvider implements NotSyncedDataProviderInterface { /** - * @var IdListProviderInterface[] + * @var NotSyncedDataProviderInterface[] */ private $providers; @@ -28,7 +28,7 @@ public function __construct( $this->providers = $tmapFactory->create( [ 'array' => $providers, - 'type' => IdListProviderInterface::class + 'type' => NotSyncedDataProviderInterface::class ] ); } @@ -36,13 +36,13 @@ public function __construct( /** * @inheritDoc */ - public function get($mainTableName, $gridTableName) + public function getIds($mainTableName, $gridTableName) { $result = []; foreach ($this->providers as $provider) { $result = array_merge($result, $provider->get($mainTableName, $gridTableName)); } - return $result; + return array_unique($result); } } diff --git a/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderInterface.php b/app/code/Magento/Sales/Model/ResourceModel/Provider/NotSyncedDataProviderInterface.php similarity index 82% rename from app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderInterface.php rename to app/code/Magento/Sales/Model/ResourceModel/Provider/NotSyncedDataProviderInterface.php index b139944a10395..489e771d968b5 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/Provider/IdListProviderInterface.php +++ b/app/code/Magento/Sales/Model/ResourceModel/Provider/NotSyncedDataProviderInterface.php @@ -8,7 +8,7 @@ /** * Interface provides entities id list that should be updated in grid */ -interface IdListProviderInterface +interface NotSyncedDataProviderInterface { /** * Returns id list of entities for adding or updating in grid. @@ -17,5 +17,5 @@ interface IdListProviderInterface * @param string $gridTableName grid table name * @return array */ - public function get($mainTableName, $gridTableName); + public function getIds($mainTableName, $gridTableName); } diff --git a/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php b/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php index 4a8db88c53c03..66928bfe1f2ed 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php +++ b/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php @@ -11,7 +11,7 @@ /** * Provides latest updated entities ids list */ -class UpdatedIdListProvider implements IdListProviderInterface +class UpdatedIdListProvider implements NotSyncedDataProviderInterface { /** * @var ResourceConnection @@ -24,7 +24,7 @@ class UpdatedIdListProvider implements IdListProviderInterface private $connection; /** - * IdListProvider constructor. + * NotSyncedDataProvider constructor. * @param ResourceConnection $resourceConnection */ public function __construct( @@ -36,7 +36,7 @@ public function __construct( /** * @inheritdoc */ - public function get($mainTableName, $gridTableName) + public function getIds($mainTableName, $gridTableName) { $lastUpdatedAt = $this->getLastUpdatedAtValue($gridTableName); $select = $this->getConnection()->select() diff --git a/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/IdListProviderTest.php b/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/NotSyncedDataProviderTest.php similarity index 63% rename from app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/IdListProviderTest.php rename to app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/NotSyncedDataProviderTest.php index 6c0a055320de2..a5056bfc9236a 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/IdListProviderTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/NotSyncedDataProviderTest.php @@ -7,14 +7,14 @@ use Magento\Framework\ObjectManager\TMap; use Magento\Framework\ObjectManager\TMapFactory; -use Magento\Sales\Model\ResourceModel\Provider\IdListProvider; -use Magento\Sales\Model\ResourceModel\Provider\IdListProviderInterface; +use Magento\Sales\Model\ResourceModel\Provider\NotSyncedDataProvider; +use Magento\Sales\Model\ResourceModel\Provider\NotSyncedDataProviderInterface; use PHPUnit_Framework_MockObject_MockObject as MockObject; /** - * Class IdListProviderTest + * Class NotSyncedDataProviderTest */ -class IdListProviderTest extends \PHPUnit_Framework_TestCase +class NotSyncedDataProviderTest extends \PHPUnit_Framework_TestCase { public function testGetEmpty() { @@ -32,7 +32,7 @@ public function testGetEmpty() ->with( [ 'array' => [], - 'type' => IdListProviderInterface::class + 'type' => NotSyncedDataProviderInterface::class ] ) ->willReturn($tMap); @@ -40,12 +40,12 @@ public function testGetEmpty() ->method('getIterator') ->willReturn(new \ArrayIterator([])); - $provider = new IdListProvider($tMapFactory, []); - static::assertEquals([], $provider->get('main_table', 'grid_table')); + $provider = new NotSyncedDataProvider($tMapFactory, []); + static::assertEquals([], $provider->getIds('main_table', 'grid_table')); } /** - * @covers \Magento\Sales\Model\ResourceModel\Provider\IdListProvider::get + * @covers \Magento\Sales\Model\ResourceModel\Provider\NotSyncedDataProvider::get */ public function testGet() { @@ -58,27 +58,27 @@ public function testGet() ->disableOriginalConstructor() ->getMock(); - $provider1 = $this->getMockBuilder(IdListProviderInterface::class) + $provider1 = $this->getMockBuilder(NotSyncedDataProviderInterface::class) ->getMockForAbstractClass(); $provider1->expects(static::once()) ->method('get') ->willReturn([1, 2]); - $provider2 = $this->getMockBuilder(IdListProviderInterface::class) + $provider2 = $this->getMockBuilder(NotSyncedDataProviderInterface::class) ->getMockForAbstractClass(); $provider2->expects(static::once()) ->method('get') - ->willReturn([3, 4]); + ->willReturn([2, 3, 4]); $tMapFactory->expects(static::once()) ->method('create') ->with( [ 'array' => [ - 'provider1' => IdListProviderInterface::class, - 'provider2' => IdListProviderInterface::class + 'provider1' => NotSyncedDataProviderInterface::class, + 'provider2' => NotSyncedDataProviderInterface::class ], - 'type' => IdListProviderInterface::class + 'type' => NotSyncedDataProviderInterface::class ] ) ->willReturn($tMap); @@ -86,14 +86,14 @@ public function testGet() ->method('getIterator') ->willReturn(new \ArrayIterator([$provider1, $provider2])); - $provider = new IdListProvider( + $provider = new NotSyncedDataProvider( $tMapFactory, [ - 'provider1' => IdListProviderInterface::class, - 'provider2' => IdListProviderInterface::class, + 'provider1' => NotSyncedDataProviderInterface::class, + 'provider2' => NotSyncedDataProviderInterface::class, ] ); - static::assertEquals([1, 2, 3, 4], $provider->get('main_table', 'grid_table')); + static::assertEquals([1, 2, 3, 4], array_values($provider->getIds('main_table', 'grid_table'))); } } diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php deleted file mode 100644 index a3229b7565089..0000000000000 --- a/dev/tests/integration/testsuite/Magento/Sales/Model/ResourceModel/GridTest.php +++ /dev/null @@ -1,74 +0,0 @@ -objectManager = Bootstrap::getObjectManager(); - $this->resourceModel = $this->objectManager->get('Magento\Sales\Model\ResourceModel\Order\Grid'); - } - - /** - * Tests synchronous insertion of the new entity into order grid. - * - * @magentoDataFixture Magento/Sales/_files/order.php - */ - public function testRefreshByScheduleSyncModeSuccess() - { - $this->assertNotEmpty($this->getOrderGridItemList()); - } - - /** - * Tests asynchronous insertion of the new entity into order grid. - * - * @magentoDbIsolation enabled - * @magentoAppIsolation enabled - * @magentoDataFixture Magento/Sales/_files/order_async.php - */ - public function testRefreshByScheduleAsyncModeSuccess() - { - $this->resourceModel->refreshBySchedule(); - $this->assertNotEmpty($this->getOrderGridItemList()); - } - - /** - * Tests failing of asynchronous insertion new entity into order grid. - * - * @magentoDataFixture Magento/Sales/_files/order_async.php - */ - public function testRefreshByScheduleAsyncModeFail() - { - $this->assertEmpty($this->getOrderGridItemList()); - } - - /** - * Returns sales order grid items. - * - * @return \Magento\Framework\DataObject[] - */ - private function getOrderGridItemList() - { - /** @var Collection $orderGridCollection */ - $orderGridCollection = $this->objectManager->get(Collection::class); - - return $orderGridCollection->addFilter('increment_id', '100000001')->getItems(); - } -} diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/order_async.php b/dev/tests/integration/testsuite/Magento/Sales/_files/order_async.php deleted file mode 100644 index 0a81973a0eb27..0000000000000 --- a/dev/tests/integration/testsuite/Magento/Sales/_files/order_async.php +++ /dev/null @@ -1,71 +0,0 @@ -get(MutableScopeConfigInterface::class); -$mutableConfig->setValue('dev/grid/async_indexing', '1'); - -$billingAddress = $objectManager->create(\Magento\Sales\Model\Order\Address::class, ['data' => $addressData]); -$billingAddress->setAddressType('billing'); - -$shippingAddress = clone $billingAddress; -$shippingAddress->setId(null)->setAddressType('shipping'); - -$payment = $objectManager->create(\Magento\Sales\Model\Order\Payment::class); -$payment->setMethod('checkmo'); - -/** @var \Magento\Sales\Model\Order\Item $orderItem */ -$orderItem = $objectManager->create(\Magento\Sales\Model\Order\Item::class); -$orderItem->setProductId($product->getId())->setQtyOrdered(2); -$orderItem->setBasePrice($product->getPrice()); -$orderItem->setPrice($product->getPrice()); -$orderItem->setRowTotal($product->getPrice()); -$orderItem->setProductType('simple'); - -/** @var \Magento\Sales\Model\Order $order */ -$order = $objectManager->create(\Magento\Sales\Model\Order::class); -$order->setIncrementId( - '100000001' -)->setState( - \Magento\Sales\Model\Order::STATE_PROCESSING -)->setStatus( - $order->getConfig()->getStateDefaultStatus(\Magento\Sales\Model\Order::STATE_PROCESSING) -)->setSubtotal( - 100 -)->setGrandTotal( - 100 -)->setBaseSubtotal( - 100 -)->setBaseGrandTotal( - 100 -)->setCustomerIsGuest( - true -)->setCustomerEmail( - 'customer@null.com' -)->setBillingAddress( - $billingAddress -)->setShippingAddress( - $shippingAddress -)->setStoreId( - $objectManager->get(\Magento\Store\Model\StoreManagerInterface::class)->getStore()->getId() -)->addItem( - $orderItem -)->setPayment( - $payment -); -$order->save(); From 0024c50f230428089ae5b8160d06b37aa8308fea Mon Sep 17 00:00:00 2001 From: Viktor Tymchynskyi Date: Tue, 7 Feb 2017 15:44:32 +0200 Subject: [PATCH 10/23] MAGETWO-63945: Add extension point to sales grid indexer - Fix static --- app/code/Magento/Sales/Model/ResourceModel/Grid.php | 3 ++- .../Model/ResourceModel/Provider/NotSyncedDataProviderTest.php | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Sales/Model/ResourceModel/Grid.php b/app/code/Magento/Sales/Model/ResourceModel/Grid.php index 178f43ba0b0bd..feb589e226cdf 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/Grid.php +++ b/app/code/Magento/Sales/Model/ResourceModel/Grid.php @@ -70,7 +70,8 @@ public function __construct( $this->orderIdField = $orderIdField; $this->joins = $joins; $this->columns = $columns; - $this->idListProvider = $idListProvider ?: ObjectManager::getInstance()->get(NotSyncedDataProviderInterface::class); + $this->idListProvider = + $idListProvider ?: ObjectManager::getInstance()->get(NotSyncedDataProviderInterface::class); parent::__construct($context, $connectionName); } diff --git a/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/NotSyncedDataProviderTest.php b/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/NotSyncedDataProviderTest.php index a5056bfc9236a..f1218602082c8 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/NotSyncedDataProviderTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/NotSyncedDataProviderTest.php @@ -45,7 +45,7 @@ public function testGetEmpty() } /** - * @covers \Magento\Sales\Model\ResourceModel\Provider\NotSyncedDataProvider::get + * @covers \Magento\Sales\Model\ResourceModel\Provider\NotSyncedDataProvider::getIds */ public function testGet() { From 10bd19849722d71e3cb82e2a1fc634544d3a4b28 Mon Sep 17 00:00:00 2001 From: Viktor Tymchynskyi Date: Tue, 7 Feb 2017 15:55:07 +0200 Subject: [PATCH 11/23] MAGETWO-63945: Add extension point to sales grid indexer - Fix static --- app/code/Magento/Sales/etc/di.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Sales/etc/di.xml b/app/code/Magento/Sales/etc/di.xml index 0d602b2d9d398..3ff1b8beb2afc 100644 --- a/app/code/Magento/Sales/etc/di.xml +++ b/app/code/Magento/Sales/etc/di.xml @@ -113,8 +113,8 @@ - - + + Magento\Sales\Model\ResourceModel\Provider\UpdatedIdListProvider From 3ea78ad9a4401192b04b0c941460b5603b255aa3 Mon Sep 17 00:00:00 2001 From: Ievgen Sentiabov Date: Tue, 7 Feb 2017 15:56:18 +0200 Subject: [PATCH 12/23] MAGETWO-63910: Create infrastructure for mapper in Payment module - Updated payment verification interface - Updated Braintree avs/cvv mappers behaviour - Refactored payment verification default implementation --- .../Braintree/Model/AvsEmsCodeMapper.php | 14 +++- ...{CvvEmsMapper.php => CvvEmsCodeMapper.php} | 16 +++- .../Test/Unit/Model/AvsEmsCodeMapperTest.php | 75 +++++++++++++++++++ .../Test/Unit/Model/CvvEmsCodeMapperTest.php | 68 +++++++++++++++++ app/code/Magento/Braintree/etc/config.xml | 2 +- .../Api/PaymentVerificationInterface.php | 4 +- .../Payment/Model/NullPaymentVerification.php | 24 ------ app/code/Magento/Payment/etc/di.xml | 1 - 8 files changed, 170 insertions(+), 34 deletions(-) rename app/code/Magento/Braintree/Model/{CvvEmsMapper.php => CvvEmsCodeMapper.php} (79%) create mode 100644 app/code/Magento/Braintree/Test/Unit/Model/AvsEmsCodeMapperTest.php create mode 100644 app/code/Magento/Braintree/Test/Unit/Model/CvvEmsCodeMapperTest.php delete mode 100644 app/code/Magento/Payment/Model/NullPaymentVerification.php diff --git a/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php b/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php index d55cc41bd5832..70cab72331624 100644 --- a/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php +++ b/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php @@ -18,6 +18,13 @@ */ class AvsEmsCodeMapper implements PaymentVerificationInterface { + /** + * Default code for mismatching mapping. + * + * @var string + */ + private static $unavailableCode = 'U'; + /** * List of mapping AVS codes * @@ -37,7 +44,8 @@ class AvsEmsCodeMapper implements PaymentVerificationInterface * Gets payment AVS verification code. * Returns null if payment does not contain any AVS details. * - * @return string|null + * @param OrderPaymentInterface $orderPayment + * @return string */ public function getCode(OrderPaymentInterface $orderPayment) { @@ -45,11 +53,11 @@ public function getCode(OrderPaymentInterface $orderPayment) if (empty($additionalInfo[PaymentDetailsHandler::AVS_POSTAL_RESPONSE_CODE]) || empty($additionalInfo[PaymentDetailsHandler::AVS_STREET_ADDRESS_RESPONSE_CODE]) ) { - return null; + return self::$unavailableCode; } $streetCode = $additionalInfo[PaymentDetailsHandler::AVS_STREET_ADDRESS_RESPONSE_CODE]; $zipCode = $additionalInfo[PaymentDetailsHandler::AVS_POSTAL_RESPONSE_CODE]; $key = $zipCode . $streetCode; - return isset(self::$avsMap[$key]) ? self::$avsMap[$key] : null; + return isset(self::$avsMap[$key]) ? self::$avsMap[$key] : self::$unavailableCode; } } diff --git a/app/code/Magento/Braintree/Model/CvvEmsMapper.php b/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php similarity index 79% rename from app/code/Magento/Braintree/Model/CvvEmsMapper.php rename to app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php index 6798b810e0182..37a56746a7664 100644 --- a/app/code/Magento/Braintree/Model/CvvEmsMapper.php +++ b/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php @@ -16,8 +16,15 @@ * @see https://developers.braintreepayments.com/reference/response/transaction * @see http://www.emsecommerce.net/avs_cvv2_response_codes.htm */ -class CvvEmsMapper implements PaymentVerificationInterface +class CvvEmsCodeMapper implements PaymentVerificationInterface { + /** + * Default code for mismatch mapping + * + * @var string + */ + private static $notProvidedCode = 'P'; + /** * List of mapping CVV codes * @@ -36,16 +43,17 @@ class CvvEmsMapper implements PaymentVerificationInterface * Gets payment CVV verification code. * Returns null if payment does not contain any CVV details. * - * @return string|null + * @param OrderPaymentInterface $orderPayment + * @return string */ public function getCode(OrderPaymentInterface $orderPayment) { $additionalInfo = $orderPayment->getAdditionalInformation(); if (empty($additionalInfo[PaymentDetailsHandler::CVV_RESPONSE_CODE])) { - return null; + return self::$notProvidedCode; } $cvv = $additionalInfo[PaymentDetailsHandler::CVV_RESPONSE_CODE]; - return isset(self::$cvvMap[$cvv]) ? self::$cvvMap[$cvv] : null; + return isset(self::$cvvMap[$cvv]) ? self::$cvvMap[$cvv] : self::$notProvidedCode; } } diff --git a/app/code/Magento/Braintree/Test/Unit/Model/AvsEmsCodeMapperTest.php b/app/code/Magento/Braintree/Test/Unit/Model/AvsEmsCodeMapperTest.php new file mode 100644 index 0000000000000..33421e06859e5 --- /dev/null +++ b/app/code/Magento/Braintree/Test/Unit/Model/AvsEmsCodeMapperTest.php @@ -0,0 +1,75 @@ +mapper = new AvsEmsCodeMapper(); + } + + /** + * Checks different variations for AVS codes mapping. + * + * @covers \Magento\Braintree\Model\AvsEmsCodeMapper::getCode + * @param string $avsZip + * @param string $avsStreet + * @param string $expected + * @dataProvider getCodeDataProvider + */ + public function testGetCode($avsZip, $avsStreet, $expected) + { + /** @var OrderPaymentInterface|MockObject $orderPayment */ + $orderPayment = $this->getMockBuilder(OrderPaymentInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $orderPayment->expects(self::once()) + ->method('getAdditionalInformation') + ->willReturn([ + 'avsPostalCodeResponseCode' => $avsZip, + 'avsStreetAddressResponseCode' => $avsStreet + ]); + + self::assertEquals($expected, $this->mapper->getCode($orderPayment)); + } + + /** + * Gets list of AVS codes. + * + * @return array + */ + public function getCodeDataProvider() + { + return [ + ['avsZip' => null, 'avsStreet' => null, 'expected' => 'U'], + ['avsZip' => null, 'avsStreet' => 'M', 'expected' => 'U'], + ['avsZip' => 'M', 'avsStreet' => null, 'expected' => 'U'], + ['avsZip' => 'M', 'avsStreet' => 'Unknown', 'expected' => 'U'], + ['avsZip' => 'I', 'avsStreet' => 'A', 'expected' => 'U'], + ['avsZip' => 'M', 'avsStreet' => 'M', 'expected' => 'Y'], + ['avsZip' => 'N', 'avsStreet' => 'M', 'expected' => 'A'], + ['avsZip' => 'M', 'avsStreet' => 'N', 'expected' => 'Z'], + ['avsZip' => 'N', 'avsStreet' => 'N', 'expected' => 'N'], + ['avsZip' => 'U', 'avsStreet' => 'U', 'expected' => 'U'], + ['avsZip' => 'I', 'avsStreet' => 'I', 'expected' => 'U'], + ['avsZip' => 'A', 'avsStreet' => 'A', 'expected' => 'E'], + ]; + } +} diff --git a/app/code/Magento/Braintree/Test/Unit/Model/CvvEmsCodeMapperTest.php b/app/code/Magento/Braintree/Test/Unit/Model/CvvEmsCodeMapperTest.php new file mode 100644 index 0000000000000..c4e4838d37ead --- /dev/null +++ b/app/code/Magento/Braintree/Test/Unit/Model/CvvEmsCodeMapperTest.php @@ -0,0 +1,68 @@ +mapper = new CvvEmsCodeMapper(); + } + + /** + * Checks different variations for cvv codes mapping. + * + * @covers \Magento\Braintree\Model\CvvEmsCodeMapper::getCode + * @param string $cvvCode + * @param string $expected + * @dataProvider getCodeDataProvider + */ + public function testGetCode($cvvCode, $expected) + { + /** @var OrderPaymentInterface|MockObject $orderPayment */ + $orderPayment = $this->getMockBuilder(OrderPaymentInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $orderPayment->expects(self::once()) + ->method('getAdditionalInformation') + ->willReturn(['cvvResponseCode' => $cvvCode]); + + self::assertEquals($expected, $this->mapper->getCode($orderPayment)); + } + + /** + * Gets variations of cvv codes and expected mapping result. + * + * @return array + */ + public function getCodeDataProvider() + { + return [ + ['cvvCode' => '', 'expected' => 'P'], + ['cvvCode' => null, 'expected' => 'P'], + ['cvvCode' => 'Unknown', 'expected' => 'P'], + ['cvvCode' => 'M', 'expected' => 'M'], + ['cvvCode' => 'N', 'expected' => 'N'], + ['cvvCode' => 'U', 'expected' => 'P'], + ['cvvCode' => 'I', 'expected' => 'P'], + ['cvvCode' => 'S', 'expected' => 'S'], + ['cvvCode' => 'A', 'expected' => ''], + ]; + } +} diff --git a/app/code/Magento/Braintree/etc/config.xml b/app/code/Magento/Braintree/etc/config.xml index 76983291aa67c..43328406e2012 100644 --- a/app/code/Magento/Braintree/etc/config.xml +++ b/app/code/Magento/Braintree/etc/config.xml @@ -41,7 +41,7 @@ avsPostalCodeResponseCode,avsStreetAddressResponseCode,cvvResponseCode,processorAuthorizationCode,processorResponseCode,processorResponseText,liabilityShifted,liabilityShiftPossible,riskDataId,riskDataDecision cc_type,cc_number,avsPostalCodeResponseCode,avsStreetAddressResponseCode,cvvResponseCode,processorAuthorizationCode,processorResponseCode,processorResponseText,liabilityShifted,liabilityShiftPossible,riskDataId,riskDataDecision Magento\Braintree\Model\AvsEmsCodeMapper - Magento\Braintree\Model\CvvEmsMapper + Magento\Braintree\Model\CvvEmsCodeMapper BraintreePayPalFacade diff --git a/app/code/Magento/Payment/Api/PaymentVerificationInterface.php b/app/code/Magento/Payment/Api/PaymentVerificationInterface.php index 60d2fdcaefeb4..e68d307411096 100644 --- a/app/code/Magento/Payment/Api/PaymentVerificationInterface.php +++ b/app/code/Magento/Payment/Api/PaymentVerificationInterface.php @@ -15,13 +15,15 @@ * The payment methods can map payment method info from internal sources, * like additional information, to specific international codes. * + * There are no default implementation of this interface, because code verification + * depends on payment method integration specifics. + * * @api */ interface PaymentVerificationInterface { /** * Gets payment provider verification code. - * Returns null if verification cannot be obtained by payment method. * * @param OrderPaymentInterface $orderPayment * @return string diff --git a/app/code/Magento/Payment/Model/NullPaymentVerification.php b/app/code/Magento/Payment/Model/NullPaymentVerification.php deleted file mode 100644 index ce53e04f8c2dd..0000000000000 --- a/app/code/Magento/Payment/Model/NullPaymentVerification.php +++ /dev/null @@ -1,24 +0,0 @@ - - From 89f33cd333d4072bac49534e1e610d6b736fddc3 Mon Sep 17 00:00:00 2001 From: Viktor Tymchynskyi Date: Tue, 7 Feb 2017 16:21:53 +0200 Subject: [PATCH 13/23] MAGETWO-63945: Add extension point to sales grid indexer - Fix static --- .../ResourceModel/Provider/NotSyncedDataProvider.php | 2 +- .../ResourceModel/Provider/NotSyncedDataProviderTest.php | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/code/Magento/Sales/Model/ResourceModel/Provider/NotSyncedDataProvider.php b/app/code/Magento/Sales/Model/ResourceModel/Provider/NotSyncedDataProvider.php index fc7e767210a53..8215eaaf0ad2e 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/Provider/NotSyncedDataProvider.php +++ b/app/code/Magento/Sales/Model/ResourceModel/Provider/NotSyncedDataProvider.php @@ -40,7 +40,7 @@ public function getIds($mainTableName, $gridTableName) { $result = []; foreach ($this->providers as $provider) { - $result = array_merge($result, $provider->get($mainTableName, $gridTableName)); + $result = array_merge($result, $provider->getIds($mainTableName, $gridTableName)); } return array_unique($result); diff --git a/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/NotSyncedDataProviderTest.php b/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/NotSyncedDataProviderTest.php index f1218602082c8..92a40e2638fe8 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/NotSyncedDataProviderTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/NotSyncedDataProviderTest.php @@ -16,7 +16,7 @@ */ class NotSyncedDataProviderTest extends \PHPUnit_Framework_TestCase { - public function testGetEmpty() + public function testGetIdsEmpty() { /** @var TMapFactory|MockObject $tMapFactory */ $tMapFactory = $this->getMockBuilder(TMapFactory::class) @@ -47,7 +47,7 @@ public function testGetEmpty() /** * @covers \Magento\Sales\Model\ResourceModel\Provider\NotSyncedDataProvider::getIds */ - public function testGet() + public function testGetIds() { /** @var TMapFactory|MockObject $tMapFactory */ $tMapFactory = $this->getMockBuilder(TMapFactory::class) @@ -61,13 +61,13 @@ public function testGet() $provider1 = $this->getMockBuilder(NotSyncedDataProviderInterface::class) ->getMockForAbstractClass(); $provider1->expects(static::once()) - ->method('get') + ->method('getIds') ->willReturn([1, 2]); $provider2 = $this->getMockBuilder(NotSyncedDataProviderInterface::class) ->getMockForAbstractClass(); $provider2->expects(static::once()) - ->method('get') + ->method('getIds') ->willReturn([2, 3, 4]); $tMapFactory->expects(static::once()) From a738ddf7463b8ff12db80f59045d7af2c4c764de Mon Sep 17 00:00:00 2001 From: Viktor Tymchynskyi Date: Wed, 8 Feb 2017 10:48:51 +0200 Subject: [PATCH 14/23] MAGETWO-63945: Add extension point to sales grid indexer - Getting rid of redundant query in UpdatedIdList provider --- .../Sales/Model/ResourceModel/Grid.php | 12 +++---- .../Provider/UpdatedIdListProvider.php | 33 ++++++++----------- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/app/code/Magento/Sales/Model/ResourceModel/Grid.php b/app/code/Magento/Sales/Model/ResourceModel/Grid.php index feb589e226cdf..f537074ad66f1 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/Grid.php +++ b/app/code/Magento/Sales/Model/ResourceModel/Grid.php @@ -43,7 +43,7 @@ class Grid extends AbstractGrid /** * @var NotSyncedDataProviderInterface */ - private $idListProvider; + private $notSyncedDataProvider; /** * @param Context $context @@ -53,7 +53,7 @@ class Grid extends AbstractGrid * @param array $joins * @param array $columns * @param string $connectionName - * @param NotSyncedDataProviderInterface $idListProvider + * @param NotSyncedDataProviderInterface $notSyncedDataProvider */ public function __construct( Context $context, @@ -63,15 +63,15 @@ public function __construct( array $joins = [], array $columns = [], $connectionName = null, - NotSyncedDataProviderInterface $idListProvider = null + NotSyncedDataProviderInterface $notSyncedDataProvider = null ) { $this->mainTableName = $mainTableName; $this->gridTableName = $gridTableName; $this->orderIdField = $orderIdField; $this->joins = $joins; $this->columns = $columns; - $this->idListProvider = - $idListProvider ?: ObjectManager::getInstance()->get(NotSyncedDataProviderInterface::class); + $this->notSyncedDataProvider = + $notSyncedDataProvider ?: ObjectManager::getInstance()->get(NotSyncedDataProviderInterface::class); parent::__construct($context, $connectionName); } @@ -111,7 +111,7 @@ public function refreshBySchedule() $select = $this->getGridOriginSelect() ->where( $this->mainTableName . '.entity_id IN (?)', - $this->idListProvider->get($this->mainTableName, $this->gridTableName) + $this->notSyncedDataProvider->getIds($this->mainTableName, $this->gridTableName) ); return $this->getConnection()->query( diff --git a/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php b/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php index 66928bfe1f2ed..dd589ef9316cd 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php +++ b/app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php @@ -38,31 +38,24 @@ public function __construct( */ public function getIds($mainTableName, $gridTableName) { - $lastUpdatedAt = $this->getLastUpdatedAtValue($gridTableName); $select = $this->getConnection()->select() - ->from($this->getConnection()->getTableName($mainTableName), ['entity_id']) - ->where('updated_at >= ?', $lastUpdatedAt); + ->from($this->getConnection()->getTableName($mainTableName), [$mainTableName.'.entity_id']) + ->joinLeft( + [$gridTableName => $this->getConnection()->getTableName($gridTableName)], + sprintf( + '%s.%s = %s.%s', + $mainTableName, + 'entity_id', + $gridTableName, + 'entity_id' + ), + [] + ) + ->where($gridTableName.'.entity_id IS NULL'); return $this->getConnection()->fetchAll($select, [], \Zend_Db::FETCH_COLUMN); } - /** - * Returns update time of the last row in the grid. - * - * @param string $gridTableName - * @return string - */ - private function getLastUpdatedAtValue($gridTableName) - { - $select = $this->getConnection()->select() - ->from($this->getConnection()->getTableName($gridTableName), ['updated_at']) - ->order('updated_at DESC') - ->limit(1); - $row = $this->getConnection()->fetchRow($select); - - return isset($row['updated_at']) ? $row['updated_at'] : '0000-00-00 00:00:00'; - } - /** * Returns connection. * From f7b8fd16f0cb3153e2c4f9f544e990edf3b040c2 Mon Sep 17 00:00:00 2001 From: Ievgen Sentiabov Date: Wed, 8 Feb 2017 11:51:08 +0200 Subject: [PATCH 15/23] MAGETWO-63910: Create infrastructure for mapper in Payment module - Added payment method code validation to Braintree mappers - Updated default payment verification mapper and factory for creating mappers --- .../Braintree/Model/AvsEmsCodeMapper.php | 8 ++++++ .../Braintree/Model/CvvEmsCodeMapper.php | 7 +++++ .../Test/Unit/Model/AvsEmsCodeMapperTest.php | 26 +++++++++++++++++++ .../Test/Unit/Model/CvvEmsCodeMapperTest.php | 26 +++++++++++++++++++ 4 files changed, 67 insertions(+) diff --git a/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php b/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php index 70cab72331624..35a857dd86207 100644 --- a/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php +++ b/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php @@ -5,6 +5,7 @@ */ namespace Magento\Braintree\Model; +use Magento\Braintree\Model\Ui\ConfigProvider; use Magento\Braintree\Gateway\Response\PaymentDetailsHandler; use Magento\Payment\Api\PaymentVerificationInterface; use Magento\Sales\Api\Data\OrderPaymentInterface; @@ -43,18 +44,25 @@ class AvsEmsCodeMapper implements PaymentVerificationInterface /** * Gets payment AVS verification code. * Returns null if payment does not contain any AVS details. + * Throws an exception if specified order payment has different payment method code. * * @param OrderPaymentInterface $orderPayment * @return string + * @throws \Exception */ public function getCode(OrderPaymentInterface $orderPayment) { + if ($orderPayment->getMethod() !== ConfigProvider::CODE) { + throw new \Exception('"' . $orderPayment->getMethod() . '" does not supported by Braintree AVS mapper.'); + } + $additionalInfo = $orderPayment->getAdditionalInformation(); if (empty($additionalInfo[PaymentDetailsHandler::AVS_POSTAL_RESPONSE_CODE]) || empty($additionalInfo[PaymentDetailsHandler::AVS_STREET_ADDRESS_RESPONSE_CODE]) ) { return self::$unavailableCode; } + $streetCode = $additionalInfo[PaymentDetailsHandler::AVS_STREET_ADDRESS_RESPONSE_CODE]; $zipCode = $additionalInfo[PaymentDetailsHandler::AVS_POSTAL_RESPONSE_CODE]; $key = $zipCode . $streetCode; diff --git a/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php b/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php index 37a56746a7664..f30b0ca23d5d7 100644 --- a/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php +++ b/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php @@ -6,6 +6,7 @@ namespace Magento\Braintree\Model; use Magento\Braintree\Gateway\Response\PaymentDetailsHandler; +use Magento\Braintree\Model\Ui\ConfigProvider; use Magento\Payment\Api\PaymentVerificationInterface; use Magento\Sales\Api\Data\OrderPaymentInterface; @@ -42,12 +43,18 @@ class CvvEmsCodeMapper implements PaymentVerificationInterface /** * Gets payment CVV verification code. * Returns null if payment does not contain any CVV details. + * Throws an exception if specified order payment has different payment method code. * * @param OrderPaymentInterface $orderPayment * @return string + * @throws \Exception */ public function getCode(OrderPaymentInterface $orderPayment) { + if ($orderPayment->getMethod() !== ConfigProvider::CODE) { + throw new \Exception('"' . $orderPayment->getMethod() . '" does not supported by Braintree CVV mapper.'); + } + $additionalInfo = $orderPayment->getAdditionalInformation(); if (empty($additionalInfo[PaymentDetailsHandler::CVV_RESPONSE_CODE])) { return self::$notProvidedCode; diff --git a/app/code/Magento/Braintree/Test/Unit/Model/AvsEmsCodeMapperTest.php b/app/code/Magento/Braintree/Test/Unit/Model/AvsEmsCodeMapperTest.php index 33421e06859e5..23b731b89f0cf 100644 --- a/app/code/Magento/Braintree/Test/Unit/Model/AvsEmsCodeMapperTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Model/AvsEmsCodeMapperTest.php @@ -6,6 +6,7 @@ namespace Magento\Braintree\Test\Unit\Model; use Magento\Braintree\Model\AvsEmsCodeMapper; +use Magento\Braintree\Model\Ui\ConfigProvider; use Magento\Sales\Api\Data\OrderPaymentInterface; use PHPUnit_Framework_MockObject_MockObject as MockObject; @@ -40,6 +41,10 @@ public function testGetCode($avsZip, $avsStreet, $expected) ->disableOriginalConstructor() ->getMock(); + $orderPayment->expects(self::once()) + ->method('getMethod') + ->willReturn(ConfigProvider::CODE); + $orderPayment->expects(self::once()) ->method('getAdditionalInformation') ->willReturn([ @@ -50,6 +55,27 @@ public function testGetCode($avsZip, $avsStreet, $expected) self::assertEquals($expected, $this->mapper->getCode($orderPayment)); } + /** + * Checks a test case, when payment order is not Braintree payment method. + * + * @covers \Magento\Braintree\Model\AvsEmsCodeMapper::getCode + * @expectedException \Exception + * @expectedExceptionMessage "some_payment" does not supported by Braintree AVS mapper. + */ + public function testGetCodeWithException() + { + /** @var OrderPaymentInterface|MockObject $orderPayment */ + $orderPayment = $this->getMockBuilder(OrderPaymentInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $orderPayment->expects(self::exactly(2)) + ->method('getMethod') + ->willReturn('some_payment'); + + $this->mapper->getCode($orderPayment); + } + /** * Gets list of AVS codes. * diff --git a/app/code/Magento/Braintree/Test/Unit/Model/CvvEmsCodeMapperTest.php b/app/code/Magento/Braintree/Test/Unit/Model/CvvEmsCodeMapperTest.php index c4e4838d37ead..c8e667fa93736 100644 --- a/app/code/Magento/Braintree/Test/Unit/Model/CvvEmsCodeMapperTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Model/CvvEmsCodeMapperTest.php @@ -6,6 +6,7 @@ namespace Magento\Braintree\Test\Unit\Model; use Magento\Braintree\Model\CvvEmsCodeMapper; +use Magento\Braintree\Model\Ui\ConfigProvider; use Magento\Sales\Api\Data\OrderPaymentInterface; use PHPUnit_Framework_MockObject_MockObject as MockObject; @@ -39,6 +40,10 @@ public function testGetCode($cvvCode, $expected) ->disableOriginalConstructor() ->getMock(); + $orderPayment->expects(self::once()) + ->method('getMethod') + ->willReturn(ConfigProvider::CODE); + $orderPayment->expects(self::once()) ->method('getAdditionalInformation') ->willReturn(['cvvResponseCode' => $cvvCode]); @@ -46,6 +51,27 @@ public function testGetCode($cvvCode, $expected) self::assertEquals($expected, $this->mapper->getCode($orderPayment)); } + /** + * Checks a test case, when payment order is not Braintree payment method. + * + * @covers \Magento\Braintree\Model\CvvEmsCodeMapper::getCode + * @expectedException \Exception + * @expectedExceptionMessage "some_payment" does not supported by Braintree CVV mapper. + */ + public function testGetCodeWithException() + { + /** @var OrderPaymentInterface|MockObject $orderPayment */ + $orderPayment = $this->getMockBuilder(OrderPaymentInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $orderPayment->expects(self::exactly(2)) + ->method('getMethod') + ->willReturn('some_payment'); + + $this->mapper->getCode($orderPayment); + } + /** * Gets variations of cvv codes and expected mapping result. * From 7471197265e0342758f3277b55062975777a0156 Mon Sep 17 00:00:00 2001 From: Ievgen Sentiabov Date: Wed, 8 Feb 2017 15:59:06 +0200 Subject: [PATCH 16/23] MAGETWO-63910: Create infrastructure for mapper in Payment module - Refactored code - Added unit tests --- app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php | 6 ++++-- app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php | 4 +++- .../Braintree/Test/Unit/Model/AvsEmsCodeMapperTest.php | 4 ++-- .../Braintree/Test/Unit/Model/CvvEmsCodeMapperTest.php | 4 ++-- .../Magento/Payment/Api/PaymentVerificationInterface.php | 2 ++ 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php b/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php index 35a857dd86207..b062cc819ca7c 100644 --- a/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php +++ b/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php @@ -48,12 +48,14 @@ class AvsEmsCodeMapper implements PaymentVerificationInterface * * @param OrderPaymentInterface $orderPayment * @return string - * @throws \Exception + * @throws \InvalidArgumentException */ public function getCode(OrderPaymentInterface $orderPayment) { if ($orderPayment->getMethod() !== ConfigProvider::CODE) { - throw new \Exception('"' . $orderPayment->getMethod() . '" does not supported by Braintree AVS mapper.'); + throw new \InvalidArgumentException( + 'The "' . $orderPayment->getMethod() . '" does not supported by Braintree AVS mapper.' + ); } $additionalInfo = $orderPayment->getAdditionalInformation(); diff --git a/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php b/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php index f30b0ca23d5d7..67bc2df2321f3 100644 --- a/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php +++ b/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php @@ -52,7 +52,9 @@ class CvvEmsCodeMapper implements PaymentVerificationInterface public function getCode(OrderPaymentInterface $orderPayment) { if ($orderPayment->getMethod() !== ConfigProvider::CODE) { - throw new \Exception('"' . $orderPayment->getMethod() . '" does not supported by Braintree CVV mapper.'); + throw new \InvalidArgumentException( + 'The "' . $orderPayment->getMethod() . '" does not supported by Braintree CVV mapper.' + ); } $additionalInfo = $orderPayment->getAdditionalInformation(); diff --git a/app/code/Magento/Braintree/Test/Unit/Model/AvsEmsCodeMapperTest.php b/app/code/Magento/Braintree/Test/Unit/Model/AvsEmsCodeMapperTest.php index 23b731b89f0cf..586a60fe91f3b 100644 --- a/app/code/Magento/Braintree/Test/Unit/Model/AvsEmsCodeMapperTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Model/AvsEmsCodeMapperTest.php @@ -59,8 +59,8 @@ public function testGetCode($avsZip, $avsStreet, $expected) * Checks a test case, when payment order is not Braintree payment method. * * @covers \Magento\Braintree\Model\AvsEmsCodeMapper::getCode - * @expectedException \Exception - * @expectedExceptionMessage "some_payment" does not supported by Braintree AVS mapper. + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The "some_payment" does not supported by Braintree AVS mapper. */ public function testGetCodeWithException() { diff --git a/app/code/Magento/Braintree/Test/Unit/Model/CvvEmsCodeMapperTest.php b/app/code/Magento/Braintree/Test/Unit/Model/CvvEmsCodeMapperTest.php index c8e667fa93736..fd54f9e751012 100644 --- a/app/code/Magento/Braintree/Test/Unit/Model/CvvEmsCodeMapperTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Model/CvvEmsCodeMapperTest.php @@ -55,8 +55,8 @@ public function testGetCode($cvvCode, $expected) * Checks a test case, when payment order is not Braintree payment method. * * @covers \Magento\Braintree\Model\CvvEmsCodeMapper::getCode - * @expectedException \Exception - * @expectedExceptionMessage "some_payment" does not supported by Braintree CVV mapper. + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The "some_payment" does not supported by Braintree CVV mapper. */ public function testGetCodeWithException() { diff --git a/app/code/Magento/Payment/Api/PaymentVerificationInterface.php b/app/code/Magento/Payment/Api/PaymentVerificationInterface.php index e68d307411096..f5c05080cfe9c 100644 --- a/app/code/Magento/Payment/Api/PaymentVerificationInterface.php +++ b/app/code/Magento/Payment/Api/PaymentVerificationInterface.php @@ -24,9 +24,11 @@ interface PaymentVerificationInterface { /** * Gets payment provider verification code. + * Throws an exception if provided payment method is different to verification implementation. * * @param OrderPaymentInterface $orderPayment * @return string + * @throws \InvalidArgumentException */ public function getCode(OrderPaymentInterface $orderPayment); } From 3e7d29c18e7608cbd01dc0d6bc27b1a122346d7d Mon Sep 17 00:00:00 2001 From: Iurii Ivashchenko Date: Mon, 13 Feb 2017 13:36:38 +0200 Subject: [PATCH 17/23] MAGETWO-63917: Implement CVV and AVS mapping for PayPal Payflow Pro/ PayPal Payments Pro --- .../Paypal/Model/Payflow/AvsEmsCodeMapper.php | 71 ++++++++++++ .../Paypal/Model/Payflow/CvvEmsCodeMapper.php | 65 +++++++++++ .../Model/Payflow/AvsEmsCodeMapperTest.php | 101 ++++++++++++++++++ .../Model/Payflow/CvvEmsCodeMapperTest.php | 91 ++++++++++++++++ app/code/Magento/Paypal/etc/config.xml | 2 + 5 files changed, 330 insertions(+) create mode 100644 app/code/Magento/Paypal/Model/Payflow/AvsEmsCodeMapper.php create mode 100644 app/code/Magento/Paypal/Model/Payflow/CvvEmsCodeMapper.php create mode 100644 app/code/Magento/Paypal/Test/Unit/Model/Payflow/AvsEmsCodeMapperTest.php create mode 100644 app/code/Magento/Paypal/Test/Unit/Model/Payflow/CvvEmsCodeMapperTest.php diff --git a/app/code/Magento/Paypal/Model/Payflow/AvsEmsCodeMapper.php b/app/code/Magento/Paypal/Model/Payflow/AvsEmsCodeMapper.php new file mode 100644 index 0000000000000..7ac09ce7aa370 --- /dev/null +++ b/app/code/Magento/Paypal/Model/Payflow/AvsEmsCodeMapper.php @@ -0,0 +1,71 @@ + 'Y', + 'NY' => 'A', + 'YN' => 'Z', + 'NN' => 'N' + ]; + + /** + * Gets payment AVS verification code. + * Returns null if payment does not contain any AVS details. + * Throws an exception if specified order payment has different payment method code. + * + * @param OrderPaymentInterface $orderPayment + * @return string + * @throws \InvalidArgumentException + */ + public function getCode(OrderPaymentInterface $orderPayment) + { + if ($orderPayment->getMethod() !== Config::METHOD_PAYFLOWPRO) { + throw new \InvalidArgumentException( + 'The "' . $orderPayment->getMethod() . '" does not supported by Payflow AVS mapper.' + ); + } + + $additionalInfo = $orderPayment->getAdditionalInformation(); + if (empty($additionalInfo[Info::PAYPAL_AVSADDR]) || + empty($additionalInfo[Info::PAYPAL_AVSZIP]) + ) { + return self::$unavailableCode; + } + + $streetCode = $additionalInfo[Info::PAYPAL_AVSADDR]; + $zipCode = $additionalInfo[Info::PAYPAL_AVSZIP]; + $key = $zipCode . $streetCode; + + return isset(self::$avsMap[$key]) ? self::$avsMap[$key] : self::$unavailableCode; + } +} diff --git a/app/code/Magento/Paypal/Model/Payflow/CvvEmsCodeMapper.php b/app/code/Magento/Paypal/Model/Payflow/CvvEmsCodeMapper.php new file mode 100644 index 0000000000000..a88682ebfedea --- /dev/null +++ b/app/code/Magento/Paypal/Model/Payflow/CvvEmsCodeMapper.php @@ -0,0 +1,65 @@ + 'M', + 'N' => 'N' + ]; + + /** + * Gets payment CVV verification code. + * Returns null if payment does not contain any CVV details. + * Throws an exception if specified order payment has different payment method code. + * + * @param OrderPaymentInterface $orderPayment + * @return string + * @throws \Exception + */ + public function getCode(OrderPaymentInterface $orderPayment) + { + if ($orderPayment->getMethod() !== Config::METHOD_PAYFLOWPRO) { + throw new \InvalidArgumentException( + 'The "' . $orderPayment->getMethod() . '" does not supported by Payflow CVV mapper.' + ); + } + + $additionalInfo = $orderPayment->getAdditionalInformation(); + if (empty($additionalInfo[Info::PAYPAL_CVV2MATCH])) { + return self::$notProvidedCode; + } + + $cvv = $additionalInfo[Info::PAYPAL_CVV2MATCH]; + + return isset(self::$cvvMap[$cvv]) ? self::$cvvMap[$cvv] : self::$notProvidedCode; + } +} diff --git a/app/code/Magento/Paypal/Test/Unit/Model/Payflow/AvsEmsCodeMapperTest.php b/app/code/Magento/Paypal/Test/Unit/Model/Payflow/AvsEmsCodeMapperTest.php new file mode 100644 index 0000000000000..7051903150ba7 --- /dev/null +++ b/app/code/Magento/Paypal/Test/Unit/Model/Payflow/AvsEmsCodeMapperTest.php @@ -0,0 +1,101 @@ +mapper = new AvsEmsCodeMapper(); + } + + /** + * Checks different variations for AVS codes mapping. + * + * @covers \Magento\Paypal\Model\Payflow\AvsEmsCodeMapper::getCode + * @param string $avsZip + * @param string $avsStreet + * @param string $expected + * @dataProvider getCodeDataProvider + */ + public function testGetCode($avsZip, $avsStreet, $expected) + { + /** @var OrderPaymentInterface|MockObject $orderPayment */ + $orderPayment = $this->getMockBuilder(OrderPaymentInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $orderPayment->expects(self::once()) + ->method('getMethod') + ->willReturn(Config::METHOD_PAYFLOWPRO); + + $orderPayment->expects(self::once()) + ->method('getAdditionalInformation') + ->willReturn([ + Info::PAYPAL_AVSZIP => $avsZip, + Info::PAYPAL_AVSADDR => $avsStreet + ]); + + self::assertEquals($expected, $this->mapper->getCode($orderPayment)); + } + + /** + * Checks a test case, when payment order is not Payflow payment method. + * + * @covers \Magento\Paypal\Model\Payflow\AvsEmsCodeMapper::getCode + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The "some_payment" does not supported by Payflow AVS mapper. + */ + public function testGetCodeWithException() + { + /** @var OrderPaymentInterface|MockObject $orderPayment */ + $orderPayment = $this->getMockBuilder(OrderPaymentInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $orderPayment->expects(self::exactly(2)) + ->method('getMethod') + ->willReturn('some_payment'); + + $this->mapper->getCode($orderPayment); + } + + /** + * Gets list of AVS codes. + * + * @return array + */ + public function getCodeDataProvider() + { + return [ + ['avsZip' => null, 'avsStreet' => null, 'expected' => 'U'], + ['avsZip' => null, 'avsStreet' => 'Y', 'expected' => 'U'], + ['avsZip' => 'Y', 'avsStreet' => null, 'expected' => 'U'], + ['avsZip' => 'Y', 'avsStreet' => 'Y', 'expected' => 'Y'], + ['avsZip' => 'N', 'avsStreet' => 'Y', 'expected' => 'A'], + ['avsZip' => 'Y', 'avsStreet' => 'N', 'expected' => 'Z'], + ['avsZip' => 'N', 'avsStreet' => 'N', 'expected' => 'N'], + ['avsZip' => 'X', 'avsStreet' => 'Y', 'expected' => 'U'], + ['avsZip' => 'N', 'avsStreet' => 'X', 'expected' => 'U'], + ['avsZip' => '', 'avsStreet' => 'Y', 'expected' => 'U'], + ['avsZip' => 'N', 'avsStreet' => '', 'expected' => 'U'] + ]; + } +} diff --git a/app/code/Magento/Paypal/Test/Unit/Model/Payflow/CvvEmsCodeMapperTest.php b/app/code/Magento/Paypal/Test/Unit/Model/Payflow/CvvEmsCodeMapperTest.php new file mode 100644 index 0000000000000..b07c6b4e3f936 --- /dev/null +++ b/app/code/Magento/Paypal/Test/Unit/Model/Payflow/CvvEmsCodeMapperTest.php @@ -0,0 +1,91 @@ +mapper = new CvvEmsCodeMapper(); + } + + /** + * Checks different variations for cvv codes mapping. + * + * @covers \Magento\Paypal\Model\Payflow\CvvEmsCodeMapper::getCode + * @param string $cvvCode + * @param string $expected + * @dataProvider getCodeDataProvider + */ + public function testGetCode($cvvCode, $expected) + { + /** @var OrderPaymentInterface|MockObject $orderPayment */ + $orderPayment = $this->getMockBuilder(OrderPaymentInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $orderPayment->expects(self::once()) + ->method('getMethod') + ->willReturn(Config::METHOD_PAYFLOWPRO); + + $orderPayment->expects(self::once()) + ->method('getAdditionalInformation') + ->willReturn([Info::PAYPAL_CVV2MATCH => $cvvCode]); + + self::assertEquals($expected, $this->mapper->getCode($orderPayment)); + } + + /** + * Checks a test case, when payment order is not Payflow payment method. + * + * @covers \Magento\Paypal\Model\Payflow\CvvEmsCodeMapper::getCode + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The "some_payment" does not supported by Payflow CVV mapper. + */ + public function testGetCodeWithException() + { + /** @var OrderPaymentInterface|MockObject $orderPayment */ + $orderPayment = $this->getMockBuilder(OrderPaymentInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $orderPayment->expects(self::exactly(2)) + ->method('getMethod') + ->willReturn('some_payment'); + + $this->mapper->getCode($orderPayment); + } + + /** + * Gets variations of cvv codes and expected mapping result. + * + * @return array + */ + public function getCodeDataProvider() + { + return [ + ['cvvCode' => '', 'expected' => 'P'], + ['cvvCode' => null, 'expected' => 'P'], + ['cvvCode' => 'Y', 'expected' => 'M'], + ['cvvCode' => 'N', 'expected' => 'N'], + ['cvvCode' => 'X', 'expected' => 'P'] + ]; + } +} diff --git a/app/code/Magento/Paypal/etc/config.xml b/app/code/Magento/Paypal/etc/config.xml index f72b9324beeb5..442c87ad840ca 100644 --- a/app/code/Magento/Paypal/etc/config.xml +++ b/app/code/Magento/Paypal/etc/config.xml @@ -91,6 +91,8 @@ 2 1 1 + Magento\Paypal\Model\Payflow\AvsEmsCodeMapper + Magento\Paypal\Model\Payflow\CvvEmsCodeMapper PayflowProCreditCardVaultFacade From b575406524c448b189dced9a2217f7fac6001cc0 Mon Sep 17 00:00:00 2001 From: Iurii Ivashchenko Date: Mon, 13 Feb 2017 15:10:45 +0200 Subject: [PATCH 18/23] MAGETWO-63917: Implement CVV and AVS mapping for PayPal Payflow Pro/ PayPal Payments Pro --- app/code/Magento/Paypal/Model/Payflow/AvsEmsCodeMapper.php | 1 - app/code/Magento/Paypal/Model/Payflow/CvvEmsCodeMapper.php | 1 - 2 files changed, 2 deletions(-) diff --git a/app/code/Magento/Paypal/Model/Payflow/AvsEmsCodeMapper.php b/app/code/Magento/Paypal/Model/Payflow/AvsEmsCodeMapper.php index 7ac09ce7aa370..5b6cc2788bca4 100644 --- a/app/code/Magento/Paypal/Model/Payflow/AvsEmsCodeMapper.php +++ b/app/code/Magento/Paypal/Model/Payflow/AvsEmsCodeMapper.php @@ -40,7 +40,6 @@ class AvsEmsCodeMapper implements PaymentVerificationInterface /** * Gets payment AVS verification code. - * Returns null if payment does not contain any AVS details. * Throws an exception if specified order payment has different payment method code. * * @param OrderPaymentInterface $orderPayment diff --git a/app/code/Magento/Paypal/Model/Payflow/CvvEmsCodeMapper.php b/app/code/Magento/Paypal/Model/Payflow/CvvEmsCodeMapper.php index a88682ebfedea..82b9019adf06c 100644 --- a/app/code/Magento/Paypal/Model/Payflow/CvvEmsCodeMapper.php +++ b/app/code/Magento/Paypal/Model/Payflow/CvvEmsCodeMapper.php @@ -38,7 +38,6 @@ class CvvEmsCodeMapper implements PaymentVerificationInterface /** * Gets payment CVV verification code. - * Returns null if payment does not contain any CVV details. * Throws an exception if specified order payment has different payment method code. * * @param OrderPaymentInterface $orderPayment From e826366ed45f1108e737b4654e56b970fea9e63b Mon Sep 17 00:00:00 2001 From: Iurii Ivashchenko Date: Mon, 13 Feb 2017 15:14:47 +0200 Subject: [PATCH 19/23] MAGETWO-63915: Implement CVV and AVS mapping for Braintree (PayPal) --- app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php | 1 - app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php | 1 - 2 files changed, 2 deletions(-) diff --git a/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php b/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php index b062cc819ca7c..ad2c645edbc7a 100644 --- a/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php +++ b/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php @@ -43,7 +43,6 @@ class AvsEmsCodeMapper implements PaymentVerificationInterface /** * Gets payment AVS verification code. - * Returns null if payment does not contain any AVS details. * Throws an exception if specified order payment has different payment method code. * * @param OrderPaymentInterface $orderPayment diff --git a/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php b/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php index 67bc2df2321f3..ff7fdafd39157 100644 --- a/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php +++ b/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php @@ -42,7 +42,6 @@ class CvvEmsCodeMapper implements PaymentVerificationInterface /** * Gets payment CVV verification code. - * Returns null if payment does not contain any CVV details. * Throws an exception if specified order payment has different payment method code. * * @param OrderPaymentInterface $orderPayment From 5227ef25e28cc4cd1bd29fae67f89199295c4912 Mon Sep 17 00:00:00 2001 From: Ievgen Sentiabov Date: Tue, 14 Feb 2017 15:26:14 +0200 Subject: [PATCH 20/23] MAGETWO-63910: Create infrastructure for mapper in Payment module - Refactored code according to code review changes. --- app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php | 3 +-- app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php b/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php index ad2c645edbc7a..5832e5bf0a35b 100644 --- a/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php +++ b/app/code/Magento/Braintree/Model/AvsEmsCodeMapper.php @@ -43,11 +43,10 @@ class AvsEmsCodeMapper implements PaymentVerificationInterface /** * Gets payment AVS verification code. - * Throws an exception if specified order payment has different payment method code. * * @param OrderPaymentInterface $orderPayment * @return string - * @throws \InvalidArgumentException + * @throws \InvalidArgumentException If specified order payment has different payment method code. */ public function getCode(OrderPaymentInterface $orderPayment) { diff --git a/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php b/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php index ff7fdafd39157..5accc222c1fe5 100644 --- a/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php +++ b/app/code/Magento/Braintree/Model/CvvEmsCodeMapper.php @@ -42,11 +42,10 @@ class CvvEmsCodeMapper implements PaymentVerificationInterface /** * Gets payment CVV verification code. - * Throws an exception if specified order payment has different payment method code. * * @param OrderPaymentInterface $orderPayment * @return string - * @throws \Exception + * @throws \InvalidArgumentException If specified order payment has different payment method code. */ public function getCode(OrderPaymentInterface $orderPayment) { From a81251a1426e0dcaf265e4ff4ee27e0bdb5207dd Mon Sep 17 00:00:00 2001 From: Iurii Ivashchenko Date: Tue, 14 Feb 2017 15:31:17 +0200 Subject: [PATCH 21/23] MAGETWO-63917: Implement CVV and AVS mapping for PayPal Payflow Pro/ PayPal Payments Pro --- app/code/Magento/Paypal/Model/Payflow/AvsEmsCodeMapper.php | 3 +-- app/code/Magento/Paypal/Model/Payflow/CvvEmsCodeMapper.php | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/code/Magento/Paypal/Model/Payflow/AvsEmsCodeMapper.php b/app/code/Magento/Paypal/Model/Payflow/AvsEmsCodeMapper.php index 5b6cc2788bca4..7075deb5c0931 100644 --- a/app/code/Magento/Paypal/Model/Payflow/AvsEmsCodeMapper.php +++ b/app/code/Magento/Paypal/Model/Payflow/AvsEmsCodeMapper.php @@ -40,11 +40,10 @@ class AvsEmsCodeMapper implements PaymentVerificationInterface /** * Gets payment AVS verification code. - * Throws an exception if specified order payment has different payment method code. * * @param OrderPaymentInterface $orderPayment * @return string - * @throws \InvalidArgumentException + * @throws \InvalidArgumentException If specified order payment has different payment method code. */ public function getCode(OrderPaymentInterface $orderPayment) { diff --git a/app/code/Magento/Paypal/Model/Payflow/CvvEmsCodeMapper.php b/app/code/Magento/Paypal/Model/Payflow/CvvEmsCodeMapper.php index 82b9019adf06c..214881504b4c3 100644 --- a/app/code/Magento/Paypal/Model/Payflow/CvvEmsCodeMapper.php +++ b/app/code/Magento/Paypal/Model/Payflow/CvvEmsCodeMapper.php @@ -38,11 +38,10 @@ class CvvEmsCodeMapper implements PaymentVerificationInterface /** * Gets payment CVV verification code. - * Throws an exception if specified order payment has different payment method code. * * @param OrderPaymentInterface $orderPayment * @return string - * @throws \Exception + * @throws \InvalidArgumentException If specified order payment has different payment method code. */ public function getCode(OrderPaymentInterface $orderPayment) { From e10e50fefa9276fea86ef0c9c5db2f3feded98af Mon Sep 17 00:00:00 2001 From: Dmytro Yushkin Date: Fri, 24 Feb 2017 14:42:28 +0200 Subject: [PATCH 22/23] MAGETWO-63855: Create functional automated test for complete flow --- .../AssertAuthorizationInCommentsHistory.php | 5 +- .../AssertCancelInCommentsHistory.php | 60 +++++++++++++++++ .../Sales/Test/TestStep/CancelOrderStep.php | 65 +++++++++++++++++++ .../tests/app/Magento/Sales/Test/etc/di.xml | 5 ++ 4 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertCancelInCommentsHistory.php create mode 100644 dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/CancelOrderStep.php diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertAuthorizationInCommentsHistory.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertAuthorizationInCommentsHistory.php index 78e5a3b31c4cd..898fba0c32f6a 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertAuthorizationInCommentsHistory.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertAuthorizationInCommentsHistory.php @@ -40,11 +40,12 @@ public function processAssert( /** @var \Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Info $infoTab */ $infoTab = $salesOrderView->getOrderForm()->openTab('info')->getTab('info'); - $latestComment = $infoTab->getCommentsHistoryBlock()->getLatestComment(); + $orderComments = $infoTab->getCommentsHistoryBlock()->getComments(); + $commentsMessages = array_column($orderComments, 'comment'); \PHPUnit_Framework_Assert::assertRegExp( sprintf(self::AUTHORIZED_AMOUNT_PATTERN, $prices['grandTotal']), - $latestComment['comment'], + implode('. ', $commentsMessages), 'Incorrect authorized amount value for the order #' . $orderId ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertCancelInCommentsHistory.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertCancelInCommentsHistory.php new file mode 100644 index 0000000000000..56a9b02265da4 --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertCancelInCommentsHistory.php @@ -0,0 +1,60 @@ +open(); + $salesOrder->getSalesOrderGrid()->searchAndOpen(['id' => $orderId]); + + /** @var \Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Info $infoTab */ + $infoTab = $salesOrderView->getOrderForm()->openTab('info')->getTab('info'); + $comments = $infoTab->getCommentsHistoryBlock()->getComments(); + $commentsMessages = array_column($comments, 'comment'); + + \PHPUnit_Framework_Assert::assertRegExp( + sprintf($this->canceledAmountPattern, $prices['grandTotal']), + implode('. ', $commentsMessages), + 'Incorrect canceled amount value for the order #' . $orderId + ); + } + + /** + * Returns a string representation of the object. + * + * @return string + */ + public function toString() + { + return "Message about canceled amount is available in Comments History section."; + } +} diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/CancelOrderStep.php b/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/CancelOrderStep.php new file mode 100644 index 0000000000000..2123ce5a951cd --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/CancelOrderStep.php @@ -0,0 +1,65 @@ +orderIndex = $orderIndex; + $this->order = $order; + $this->salesOrderView = $salesOrderView; + } + + /** + * Run step flow + * + * @return void + */ + public function run() + { + $this->orderIndex->open(); + $this->orderIndex->getSalesOrderGrid()->searchAndOpen(['id' => $this->order->getId()]); + $this->salesOrderView->getPageActions()->cancel(); + } +} diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml index d77d737a2e9f9..aebfaac0b9acc 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml @@ -111,4 +111,9 @@ S0 + + + S0 + + From 4b5870826623910fb21c868afa26c22f73b198f5 Mon Sep 17 00:00:00 2001 From: Dmytro Yushkin Date: Fri, 24 Feb 2017 19:07:03 +0200 Subject: [PATCH 23/23] MAGETWO-63855: Create functional automated test for complete flow - Code review fixes --- .../tests/app/Magento/Sales/Test/TestStep/CancelOrderStep.php | 2 +- dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/CancelOrderStep.php b/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/CancelOrderStep.php index 2123ce5a951cd..deee46aa79a3e 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/CancelOrderStep.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/CancelOrderStep.php @@ -11,7 +11,7 @@ use Magento\Sales\Test\Page\Adminhtml\SalesOrderView; /** - * Click cancel from order on backend. + * Click cancel from order in Admin. */ class CancelOrderStep implements TestStepInterface { diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml index a826d628edb75..3b497fa10d654 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml @@ -118,7 +118,7 @@ - S0 + S1