We will be off from 27/1 (Monday) to 31/1 (Friday) (GMT +7) for our Tet Holiday (Lunar New Year) in our country

Commit 0efb78c7 authored by Rik ter Beek's avatar Rik ter Beek Committed by GitHub

PW-1190 add magento info into request (#605)

* PW-1190 add magento info into request

* PW-1190 add unit tests and fix current ones. Add codesniffer and magento/magento-coding-standard to easy validate code within the repo. Add paypal reference as we have a depencency to paypal module as we need it for billing agreements.

* [WIP] Feature/pw 1190 travis (#606)

* add travis file

* add credentials encrypted will only work for local branches

* fix commands

* add ruleset

* update travis to execute all plugin code

* remove params as it is declared into the ruleset. and update version codesniffer

* only fail and show errors not warnings

* added arguments p and n for better visibility and ignoring warning in ruleset xml

* use relative path to fix local check
parent f57578c5
language: php
sudo: false
php:
- 7.1
- 7.2
- 7.3
install:
- echo "{\"http-basic\":{\"repo.magento.com\":{\"username\":\"${MAGENTO_USERNAME}\",\"password\":\"${MAGENTO_PASSWORD}\"}}}" > auth.json
- composer install --prefer-dist
script:
- php vendor/bin/phpcs
- vendor/bin/phpunit -c Test/phpunit.xml
\ No newline at end of file
...@@ -56,23 +56,34 @@ class AdyenInitiateTerminalApi implements AdyenInitiateTerminalApiInterface ...@@ -56,23 +56,34 @@ class AdyenInitiateTerminalApi implements AdyenInitiateTerminalApiInterface
*/ */
protected $checkoutSession; protected $checkoutSession;
/**
* @var \Magento\Framework\App\ProductMetadataInterface
*/
protected $productMetadata;
/** /**
* AdyenInitiateTerminalApi constructor. * AdyenInitiateTerminalApi constructor.
* @param \Adyen\Payment\Helper\Data $adyenHelper * @param \Adyen\Payment\Helper\Data $adyenHelper
* @param \Adyen\Payment\Logger\AdyenLogger $adyenLogger * @param \Adyen\Payment\Logger\AdyenLogger $adyenLogger
* @param \Magento\Checkout\Model\Session $_checkoutSession * @param \Magento\Checkout\Model\Session $checkoutSession
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
* @param \Magento\Framework\App\ProductMetadataInterface $productMetadata
* @param array $data * @param array $data
* @throws \Adyen\AdyenException
*/ */
public function __construct( public function __construct(
\Adyen\Payment\Helper\Data $adyenHelper, \Adyen\Payment\Helper\Data $adyenHelper,
\Adyen\Payment\Logger\AdyenLogger $adyenLogger, \Adyen\Payment\Logger\AdyenLogger $adyenLogger,
\Magento\Checkout\Model\Session $checkoutSession, \Magento\Checkout\Model\Session $checkoutSession,
\Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\App\ProductMetadataInterface $productMetadata,
array $data = [] array $data = []
) { ) {
$this->adyenHelper = $adyenHelper; $this->adyenHelper = $adyenHelper;
$this->adyenLogger = $adyenLogger; $this->adyenLogger = $adyenLogger;
$this->checkoutSession = $checkoutSession; $this->checkoutSession = $checkoutSession;
$this->productMetadata = $productMetadata;
$this->storeId = $storeManager->getStore()->getId(); $this->storeId = $storeManager->getStore()->getId();
// initialize client // initialize client
...@@ -132,7 +143,7 @@ class AdyenInitiateTerminalApi implements AdyenInitiateTerminalApiInterface ...@@ -132,7 +143,7 @@ class AdyenInitiateTerminalApi implements AdyenInitiateTerminalApiInterface
'SaleID' => 'Magento2Cloud', 'SaleID' => 'Magento2Cloud',
'POIID' => $poiId, 'POIID' => $poiId,
'ProtocolVersion' => '3.0', 'ProtocolVersion' => '3.0',
'ServiceID' => $serviceID, 'ServiceID' => $serviceID
], ],
'PaymentRequest' => 'PaymentRequest' =>
[ [
...@@ -142,19 +153,19 @@ class AdyenInitiateTerminalApi implements AdyenInitiateTerminalApiInterface ...@@ -142,19 +153,19 @@ class AdyenInitiateTerminalApi implements AdyenInitiateTerminalApiInterface
'SaleTransactionID' => 'SaleTransactionID' =>
[ [
'TransactionID' => $reference, 'TransactionID' => $reference,
'TimeStamp' => $timeStamper, 'TimeStamp' => $timeStamper
], ]
], ],
'PaymentTransaction' => 'PaymentTransaction' =>
[ [
'AmountsReq' => 'AmountsReq' =>
[ [
'Currency' => $quote->getCurrency()->getQuoteCurrencyCode(), 'Currency' => $quote->getCurrency()->getQuoteCurrencyCode(),
'RequestedAmount' => doubleval($quote->getGrandTotal()), 'RequestedAmount' => doubleval($quote->getGrandTotal())
], ]
], ]
], ]
], ]
]; ];
if (!empty($payload['number_of_installments'])) { if (!empty($payload['number_of_installments'])) {
...@@ -179,22 +190,7 @@ class AdyenInitiateTerminalApi implements AdyenInitiateTerminalApiInterface ...@@ -179,22 +190,7 @@ class AdyenInitiateTerminalApi implements AdyenInitiateTerminalApiInterface
} }
$customerId = $this->getCustomerId($quote); $request = $this->addSaleToAquirerData($request, $quote);
// If customer exists add it into the request to store request
if (!empty($customerId)) {
$shopperEmail = $quote->getCustomerEmail();
$recurringContract = $this->adyenHelper->getAdyenPosCloudConfigData('recurring_type', $this->storeId);
if (!empty($recurringContract) && !empty($shopperEmail)) {
$recurringDetails = [
'shopperEmail' => $shopperEmail,
'shopperReference' => strval($customerId),
'recurringContract' => $recurringContract
];
$request['SaleToPOIRequest']['PaymentRequest']['SaleData']['SaleToAcquirerData'] = http_build_query($recurringDetails);
}
}
$quote->getPayment()->getMethodInstance()->getInfoInstance()->setAdditionalInformation( $quote->getPayment()->getMethodInstance()->getInfoInstance()->setAdditionalInformation(
'serviceID', 'serviceID',
...@@ -231,9 +227,9 @@ class AdyenInitiateTerminalApi implements AdyenInitiateTerminalApiInterface ...@@ -231,9 +227,9 @@ class AdyenInitiateTerminalApi implements AdyenInitiateTerminalApiInterface
} }
/** /**
* This getter makes it possible to overwrite the customer id from other plugins * This getter makes it possible to overwrite the customer id from other plugins
* Use this function to get the customer id so we can keep using this plugin in the UCD * Use this function to get the customer id so we can keep using this plugin in the UCD
* *
* @param Quote $quote * @param Quote $quote
* @return mixed * @return mixed
*/ */
...@@ -241,4 +237,38 @@ class AdyenInitiateTerminalApi implements AdyenInitiateTerminalApiInterface ...@@ -241,4 +237,38 @@ class AdyenInitiateTerminalApi implements AdyenInitiateTerminalApiInterface
{ {
return $quote->getCustomerId(); return $quote->getCustomerId();
} }
/**
* Add SaleToAquirerData for storing for recurring transactions and able to track platform and version
* When upgrading to new version of library we can use the client methods
* @param $request
* @param $quote
* @return mixed
*/
public function addSaleToAquirerData($request, $quote)
{
$customerId = $this->getCustomerId($quote);
$saleToAcquirerData = [];
// If customer exists add it into the request to store request
if (!empty($customerId)) {
$shopperEmail = $quote->getCustomerEmail();
$recurringContract = $this->adyenHelper->getAdyenPosCloudConfigData('recurring_type', $this->storeId);
if (!empty($recurringContract) && !empty($shopperEmail)) {
$saleToAcquirerData['shopperEmail'] = $shopperEmail;
$saleToAcquirerData['shopperReference'] = (string)$customerId;
$saleToAcquirerData['recurringContract'] = $recurringContract;
}
}
$saleToAcquirerData['applicationInfo']['merchantApplication']['version'] = $this->adyenHelper->getModuleVersion();
$saleToAcquirerData['applicationInfo']['merchantApplication']['name'] = $this->adyenHelper->getModuleName();
$saleToAcquirerData['applicationInfo']['externalPlatform']['version'] = $this->productMetadata->getVersion();
$saleToAcquirerData['applicationInfo']['externalPlatform']['name'] = $this->productMetadata->getName();
$saleToAcquirerDataBase64 = base64_encode(json_encode($saleToAcquirerData));
$request['SaleToPOIRequest']['PaymentRequest']['SaleData']['SaleToAcquirerData'] = $saleToAcquirerDataBase64;
return $request;
}
} }
...@@ -59,6 +59,8 @@ class DataTest extends \PHPUnit\Framework\TestCase ...@@ -59,6 +59,8 @@ class DataTest extends \PHPUnit\Framework\TestCase
$localeResolver = $this->getSimpleMock(\Magento\Framework\Locale\ResolverInterface::class); $localeResolver = $this->getSimpleMock(\Magento\Framework\Locale\ResolverInterface::class);
$config = $this->getSimpleMock(\Magento\Framework\App\Config\ScopeConfigInterface::class); $config = $this->getSimpleMock(\Magento\Framework\App\Config\ScopeConfigInterface::class);
$helperBackend = $this->getSimpleMock(\Magento\Backend\Helper\Data::class); $helperBackend = $this->getSimpleMock(\Magento\Backend\Helper\Data::class);
$serializer = $this->getSimpleMock( \Magento\Framework\Serialize\SerializerInterface::class);
$componentRegistrar = $this->getSimpleMock(\Magento\Framework\Component\ComponentRegistrarInterface::class);
$this->dataHelper = new \Adyen\Payment\Helper\Data( $this->dataHelper = new \Adyen\Payment\Helper\Data(
$context, $context,
...@@ -80,7 +82,9 @@ class DataTest extends \PHPUnit\Framework\TestCase ...@@ -80,7 +82,9 @@ class DataTest extends \PHPUnit\Framework\TestCase
$agreementResourceModel, $agreementResourceModel,
$localeResolver, $localeResolver,
$config, $config,
$helperBackend $helperBackend,
$serializer,
$componentRegistrar
); );
} }
......
<?php
/**
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
*
* Adyen Payment Module
*
* Copyright (c) 2019 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*
* Author: Adyen <magento@adyen.com>
*/
namespace Adyen\Payment\Model;
class AdyenInitiateTerminalApiTest extends \PHPUnit\Framework\TestCase
{
/**
* @var
*/
private $adyenInitiateTerminalApi;
private const MODULE_VERSION = '1.0.0';
private const MODULE_NAME = 'ModuleVersion';
private const PLATFORM_VERSION = '2.0.0';
private const PLATFORM_NAME = 'PlatformName';
private const CUSTOMER_ID = '1';
private const CUSTOMER_EMAIL = 'customer@example.com';
private const RECURRING_TYPE = 'ONECLICK,RECURRING';
private function getSimpleMock($originalClassName)
{
return $this->getMockBuilder($originalClassName)
->disableOriginalConstructor()
->getMock();
}
public function setUp()
{
$adyenHelper = $this->getSimpleMock(\Adyen\Payment\Helper\Data::class);
$adyenLogger = $this->getSimpleMock(\Adyen\Payment\Logger\AdyenLogger::class);
$checkoutSession = $this->getSimpleMock(\Magento\Checkout\Model\Session::class);
$storeManager = $this->getSimpleMock(\Magento\Store\Model\StoreManagerInterface::class);
$productMetadata = $this->getSimpleMock(\Magento\Framework\App\ProductMetadataInterface::class);
$store = $this->getSimpleMock(\Magento\Store\Api\Data\StoreInterface::class);
$storeManager->method('getStore')
->will($this->returnValue($store));
$adyenHelper->method('getModuleVersion')
->will($this->returnValue(self::MODULE_VERSION));
// Create a map of arguments to return values.
$map = [
['pos_timeout', null, ''],
['recurring_type', null, self::RECURRING_TYPE]
];
// Configure the stub.
$adyenHelper->method('getAdyenPosCloudConfigData')
->will($this->returnValueMap($map));
$adyenHelper->method('getModuleName')
->will($this->returnValue(self::MODULE_NAME));
$productMetadata->method('getVersion')
->will($this->returnValue(self::PLATFORM_VERSION));
$productMetadata->method('getName')
->will($this->returnValue(self::PLATFORM_NAME));
$this->adyenInitiateTerminalApi = new \Adyen\Payment\Model\AdyenInitiateTerminalApi(
$adyenHelper,
$adyenLogger,
$checkoutSession,
$storeManager,
$productMetadata
);
}
/** @throws \Exception */
public function testAddSaleToAquirerData()
{
$quote = $this->getSimpleMock(\Magento\Quote\Model\Quote::class);
$request = [];
$result = $this->adyenInitiateTerminalApi->addSaleToAquirerData($request, $quote);
$appInfo = [
'applicationInfo' => [
'merchantApplication' => [
'version' => self::MODULE_VERSION,
'name' => self::MODULE_NAME
],
'externalPlatform' => [
'version' => self::PLATFORM_VERSION,
'name' => self::PLATFORM_NAME
]
]
];
$saleToAcquirerData = base64_encode(json_encode($appInfo));
$resultArrayExpected = [
'SaleToPOIRequest' => [
'PaymentRequest' => [
'SaleData' => [
'SaleToAcquirerData' => $saleToAcquirerData
]
]
]
];
$this->assertEquals($resultArrayExpected, $result);
}
public function testAddSaleToAquirerDataLoggedInCustomer()
{
$quoteMock = $this->getMockBuilder('Magento\Quote\Model\Quote')
->disableOriginalConstructor()
->setMethods(
[
'getId',
'getCustomerEmail',
'getCustomerId'
]
)
->getMock();
$quoteMock->expects($this->any())
->method('getCustomerId')
->willReturn(self::CUSTOMER_ID);
$quoteMock->expects($this->atLeastOnce())
->method('getCustomerEmail')
->willReturn(self::CUSTOMER_EMAIL);
$request = [];
$result = $this->adyenInitiateTerminalApi->addSaleToAquirerData($request, $quoteMock);
$appInfo = [
'shopperEmail' => self::CUSTOMER_EMAIL,
'shopperReference' => self::CUSTOMER_ID,
'recurringContract' => self::RECURRING_TYPE,
'applicationInfo' => [
'merchantApplication' => [
'version' => self::MODULE_VERSION,
'name' => self::MODULE_NAME
],
'externalPlatform' => [
'version' => self::PLATFORM_VERSION,
'name' => self::PLATFORM_NAME
]
]
];
$saleToAcquirerData = base64_encode(json_encode($appInfo));
$resultArrayExpected = [
'SaleToPOIRequest' => [
'PaymentRequest' => [
'SaleData' => [
'SaleToAcquirerData' => $saleToAcquirerData
]
]
]
];
$this->assertEquals($resultArrayExpected, $result);
}
}
\ No newline at end of file
...@@ -23,4 +23,3 @@ ...@@ -23,4 +23,3 @@
*/ */
require __DIR__.'/../vendor/autoload.php'; require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../../../../vendor/autoload.php';
...@@ -16,10 +16,13 @@ ...@@ -16,10 +16,13 @@
"require": { "require": {
"adyen/php-api-library": "~4.1", "adyen/php-api-library": "~4.1",
"magento/framework": ">=101.0.8 <102 || >=102.0.1", "magento/framework": ">=101.0.8 <102 || >=102.0.1",
"magento/module-vault": "101.*" "magento/module-vault": "101.*",
"magento/module-paypal": "*"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "~6.5.0" "phpunit/phpunit": "~6.5.0",
"magento/magento-coding-standard": "*",
"squizlabs/php_codesniffer": "~3.5.3"
}, },
"autoload": { "autoload": {
"files": [ "files": [
...@@ -38,6 +41,12 @@ ...@@ -38,6 +41,12 @@
"test": [ "test": [
"Composer\\Config::disableProcessTimeout", "Composer\\Config::disableProcessTimeout",
"vendor/bin/phpunit -c Test/phpunit.xml" "vendor/bin/phpunit -c Test/phpunit.xml"
],
"post-install-cmd": [
"([ $COMPOSER_DEV_MODE -eq 0 ] || vendor/bin/phpcs --config-set installed_paths ../../magento/magento-coding-standard/)"
],
"post-update-cmd": [
"([ $COMPOSER_DEV_MODE -eq 0 ] || vendor/bin/phpcs --config-set installed_paths ../../magento/magento-coding-standard/)"
] ]
} }
} }
<?xml version="1.0"?>
<!--
/**
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
*
* Adyen Payment module (https://www.adyen.com/)
*
* Copyright (c) 2019 Adyen BV (https://www.adyen.com/)
* See LICENSE.txt for license details.
*
* Author: Adyen <magento@adyen.com>
*/
-->
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="PHP_CodeSniffer"
xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/squizlabs/PHP_CodeSniffer/master/phpcs.xsd">
<exclude-pattern type="relative">vendor/*</exclude-pattern>
<file>.</file>
<arg value="p"/>
<arg value="n"/>
<rule ref="Magento2"/>
</ruleset>
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment