'MERCHANT1234567',
'access_key' => 'ABCDEFGHI1JKLMN2O7',
'secret_key' => "abc123Def456gHi789jKLmpQ987rstu6vWxyz",
'currency_code' => 'usd',
'client_id' => 'amzn1.application-oa2-client.45789c45a8f34927830be1d9e029f480',
'region' => 'us',
'sandbox' => true,
'platform_id' => 'test',
'application_name' => 'sdk testing',
'application_version' => '1.0',
'proxy_host' => null,
'proxy_port' => -1,
'proxy_username' => null,
'proxy_Password' => null
);
public function testConfigArray()
{
// Test that trimmimg isn't converting the Boolean to a string
$client = new Client($this->configParams);
$this->assertTrue((bool)$client->__get('sandbox'));
// Test four cases in which sandbox is in constructor with an array
$client = new Client(array('sandbox' => false));
$this->assertFalse((bool)$client->__get('sandbox'));
try {
$client = new Client(array('sandbox' => 'false'));
} catch (\Exception $expected) {
$this->assertRegExp('/should be a boolean value/i', strval($expected));
}
$client = new Client(array('sandbox' => true));
$this->assertTrue((bool)$client->__get('sandbox'));
try {
$client = new Client(array('sandbox' => 'true'));
} catch (\Exception $expected) {
$this->assertRegExp('/should be a boolean value/i', strval($expected));
}
// Test that string trimming is working as intended
$client = new Client(array(
'region' => 'us ', // two spaces at end
'currency_code' => ' usd', // two spaces at beginning
'client_id' => ' A113 ' // two spaces and beginning and end
));
$this->assertEquals('us', $client->__get('region'));
$this->assertEquals('usd', $client->__get('currency_code'));
$this->assertEquals('A113', $client->__get('client_id'));
$this->assertFalse((bool)$client->__get('sandbox'));
// Unclear what is is actually doing, exception doesn't get thrown, consider removing
try {
$client = new Client($this->configParams);
} catch (\Exception $expected) {
$this->assertRegExp('/is not a Json File or the Json File./i', strval($expected));
}
// Test passing in invalid keys to constructor
try {
$configParams = array(
'a' => 'A',
'b' => 'B'
);
$client = new Client($configParams);
} catch (\Exception $expected) {
$this->assertRegExp('/is either not part of the configuration or has incorrect Key name./i', strval($expected));
}
// Test passing in override service URL for MWS API endpoint
$client = new Client(array('override_service_url' => 'https://over.ride'));
$this->assertEquals('https://over.ride', $client->__get('override_service_url'));
// Test passing in an empty array to construtor
try {
$configParams = array();
$client = new Client($configParams);
} catch (\Exception $expected) {
$this->assertRegExp('/$config cannot be null./i', strval($expected));
}
}
public function testJsonFile()
{
$configParams = "tst/unit/config/sandbox_true_bool.json";
$client = new Client($configParams);
$this->assertTrue((bool)$client->__get('sandbox'));
$this->assertEquals('test_merchant_id', $client->__get('merchant_id'));
$this->assertEquals('test_access_key', $client->__get('access_key'));
$this->assertEquals('test_secret_key', $client->__get('secret_key'));
$this->assertEquals('USD', $client->__get('currency_code'));
$this->assertEquals('test_client_id', $client->__get('client_id'));
$this->assertEquals('us', $client->__get('region'));
$this->assertEquals('sdk testing', $client->__get('application_name'));
$this->assertEquals('1.0', $client->__get('application_version'));
try {
$configParams = "tst/unit/config/sandbox_true_string.json";
$client = new Client($configParams);
} catch (\Exception $expected) {
$this->assertRegExp('/should be a boolean value/i', strval($expected));
}
$configParams = "tst/unit/config/sandbox_false_bool.json";
$client = new Client($configParams);
$this->assertFalse((bool)$client->__get('sandbox'));
$configParams = "tst/unit/config/sandbox_none.json";
$client = new Client($configParams);
$this->assertFalse((bool)$client->__get('sandbox'));
try {
$configParams = "tst/unit/config/sandbox_false_string.json";
$client = new Client($configParams);
} catch (\Exception $expected) {
$this->assertRegExp('/should be a boolean value/i', strval($expected));
}
try {
$configParams = "abc.json";
$client = new Client($configParams);
} catch (\Exception $expected) {
$this->assertRegExp('/is not a Json File path or the Json File./i', strval($expected));
}
}
public function testSandboxSetter()
{
$client = new Client($this->configParams);
try {
$client->setSandbox(true);
} catch (\Exception $expected) {
$this->assertRegExp('/and should be a boolean value./i', strval($expected));
}
try {
$client->setSandbox('string value');
} catch (\Exception $expected) {
$this->assertRegExp('/and should be a boolean value./i', strval($expected));
}
}
public function testGetOrderReferenceDetails()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
'address_consent_token' => 'AddressConsentToken',
'access_token' => 'AccessToken',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'GetOrderReferenceDetails';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->getOrderReferenceDetails($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testListOrderReference()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'mws_auth_token' => 'MWSAuthToken',
'query_id' => 'QueryId',
'query_id_type' => 'QueryIdType',
'page_size' => 'PageSize',
'created_start_time' => 'CreatedTimeRange.StartTime',
'created_end_time' => 'CreatedTimeRange.EndTime',
'sort_order' => 'SortOrder',
'order_status_list' => array()
);
$action = 'ListOrderReference';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$expectedParameters['OrderReferenceStatusListFilter.OrderReferenceStatus.1'] = 'Open';
$expectedParameters['OrderReferenceStatusListFilter.OrderReferenceStatus.2'] = 'Closed';
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->listOrderReference($apiCallParams);
$apiParametersString = $client->getParameters();
// Hack to remove mismatched Signature (due to param mismatch), then remove Signature from both to eliminate mismatch
$apiParametersString = preg_replace("/&PaymentDomain=[^&]*/", "", $apiParametersString);
$apiParametersString = preg_replace("/&Signature=[^&]*/", "", $apiParametersString);
$expectedStringParams = preg_replace("/&Signature=[^&]*/", "", $expectedStringParams);
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testListOrderReferenceByNextToken()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'mws_auth_token' => 'MWSAuthToken',
'next_page_token' => 'NextPageToken'
);
$action = 'ListOrderReferenceByNextToken';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->listOrderReferenceByNextToken($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testSetOrderReferenceDetails()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'Merchant_Id' => 'SellerId',
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
'amount' => 'OrderReferenceAttributes.OrderTotal.Amount',
'currency_code' => 'OrderReferenceAttributes.OrderTotal.CurrencyCode',
'platform_id' => 'OrderReferenceAttributes.PlatformId',
'seller_note' => 'OrderReferenceAttributes.SellerNote',
'seller_order_id' => 'OrderReferenceAttributes.SellerOrderAttributes.SellerOrderId',
'store_name' => 'OrderReferenceAttributes.SellerOrderAttributes.StoreName',
'custom_information' => 'OrderReferenceAttributes.SellerOrderAttributes.CustomInformation',
'supplementary_data' => 'OrderReferenceAttributes.SellerOrderAttributes.SupplementaryData',
'request_payment_authorization' => 'OrderReferenceAttributes.RequestPaymentAuthorization',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'SetOrderReferenceDetails';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->setOrderReferenceDetails($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testSetOrderAttributesBeforeConfirm()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
'amount' => 'OrderAttributes.OrderTotal.Amount',
'currency_code' => 'OrderAttributes.OrderTotal.CurrencyCode',
'platform_id' => 'OrderAttributes.PlatformId',
'seller_note' => 'OrderAttributes.SellerNote',
'seller_order_id' => 'OrderAttributes.SellerOrderAttributes.SellerOrderId',
'store_name' => 'OrderAttributes.SellerOrderAttributes.StoreName',
'custom_information' => 'OrderAttributes.SellerOrderAttributes.CustomInformation',
'supplementary_data' => 'OrderAttributes.SellerOrderAttributes.SupplementaryData',
'request_payment_authorization' => 'OrderAttributes.RequestPaymentAuthorization',
'payment_service_provider_id' => 'OrderAttributes.PaymentServiceProviderAttributes.PaymentServiceProviderId',
'payment_service_provider_order_id' => 'OrderAttributes.PaymentServiceProviderAttributes.PaymentServiceProviderOrderId',
'order_item_categories' => array(),
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'SetOrderAttributes';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$expectedParameters['OrderAttributes.SellerOrderAttributes.OrderItemCategories.OrderItemCategory.1'] = 'Antiques';
$expectedParameters['OrderAttributes.SellerOrderAttributes.OrderItemCategories.OrderItemCategory.2'] = 'Electronics';
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->setOrderAttributes($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
/* Call is same as BeforeConfirm call except the amount and currency_code fields are omitted */
public function testSetOrderAttributesAfterConfirm()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
'platform_id' => 'OrderAttributes.PlatformId',
'seller_note' => 'OrderAttributes.SellerNote',
'seller_order_id' => 'OrderAttributes.SellerOrderAttributes.SellerOrderId',
'store_name' => 'OrderAttributes.SellerOrderAttributes.StoreName',
'custom_information' => 'OrderAttributes.SellerOrderAttributes.CustomInformation',
'request_payment_authorization' => 'OrderAttributes.RequestPaymentAuthorization',
'payment_service_provider_id' => 'OrderAttributes.PaymentServiceProviderAttributes.PaymentServiceProviderId',
'payment_service_provider_order_id' => 'OrderAttributes.PaymentServiceProviderAttributes.PaymentServiceProviderOrderId',
'order_item_categories' => array(),
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'SetOrderAttributes';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$expectedParameters['OrderAttributes.SellerOrderAttributes.OrderItemCategories.OrderItemCategory.1'] = 'Antiques';
$expectedParameters['OrderAttributes.SellerOrderAttributes.OrderItemCategories.OrderItemCategory.2'] = 'Electronics';
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->setOrderAttributes($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testConfirmOrderReferenceWithAllSCA()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
'mws_auth_token' => 'MWSAuthToken',
'success_url' => 'SuccessUrl',
'failure_url' => 'FailureUrl',
'authorization_amount' => 'AuthorizationAmount.Amount',
'currency_code' => 'AuthorizationAmount.CurrencyCode'
);
$action = 'ConfirmOrderReference';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->confirmOrderReference($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testConfirmOrderReferenceWithAllButCurrencyCodeSCA()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
'mws_auth_token' => 'MWSAuthToken',
'success_url' => 'SuccessUrl',
'failure_url' => 'FailureUrl',
'authorization_amount' => 'AuthorizationAmount.Amount'
);
$action = 'ConfirmOrderReference';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedParameters['AuthorizationAmount.CurrencyCode'] = 'USD'; # default from client
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->confirmOrderReference($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testConfirmOrderReferenceWithUrlSCA()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
'mws_auth_token' => 'MWSAuthToken',
'success_url' => 'SuccessUrl',
'failure_url' => 'FailureUrl'
);
$action = 'ConfirmOrderReference';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->confirmOrderReference($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testConfirmOrderReferenceWithoutSCA()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'ConfirmOrderReference';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->confirmOrderReference($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testCancelOrderReference()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
'cancelation_reason' => 'CancelationReason',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'CancelOrderReference';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->cancelOrderReference($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testCloseOrderReference()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
'closure_reason' => 'ClosureReason',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'CloseOrderReference';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->closeOrderReference($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testCloseAuthorization()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_authorization_id' => 'AmazonAuthorizationId',
'closure_reason' => 'ClosureReason',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'CloseAuthorization';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->closeAuthorization($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testAuthorize()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_order_reference_id' => 'AmazonOrderReferenceId',
'authorization_amount' => 'AuthorizationAmount.Amount',
'currency_code' => 'AuthorizationAmount.CurrencyCode',
'authorization_reference_id' => 'AuthorizationReferenceId',
'capture_now' => 'CaptureNow',
'seller_authorization_note' => 'SellerAuthorizationNote',
'transaction_timeout' => 'TransactionTimeout',
'soft_descriptor' => 'SoftDescriptor',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'Authorize';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->authorize($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testGetAuthorizationDetails()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_authorization_id' => 'AmazonAuthorizationId',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'GetAuthorizationDetails';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->getAuthorizationDetails($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testCapture()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_authorization_id' => 'AmazonAuthorizationId',
'capture_amount' => 'CaptureAmount.Amount',
'currency_code' => 'CaptureAmount.CurrencyCode',
'capture_reference_id' => 'CaptureReferenceId',
'seller_capture_note' => 'SellerCaptureNote',
'soft_descriptor' => 'SoftDescriptor',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'Capture';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->capture($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testGetCaptureDetails()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_capture_id' => 'AmazonCaptureId',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'GetCaptureDetails';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->getCaptureDetails($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testRefund()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_capture_id' => 'AmazonCaptureId',
'refund_reference_id' => 'RefundReferenceId',
'refund_amount' => 'RefundAmount.Amount',
'currency_code' => 'RefundAmount.CurrencyCode',
'seller_refund_note' => 'SellerRefundNote',
'soft_descriptor' => 'SoftDescriptor',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'Refund';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->refund($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testGetRefundDetails()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_refund_id' => 'AmazonRefundId',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'GetRefundDetails';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->getRefundDetails($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testGetMerchantAccountStatus()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'GetMerchantAccountStatus';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->getMerchantAccountStatus($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testGetServiceStatus()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'GetServiceStatus';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->getServiceStatus($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testCreateOrderReferenceForId()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'id' => 'Id',
'id_type' => 'IdType',
'inherit_shipping_address' => 'InheritShippingAddress',
'confirm_now' => 'ConfirmNow',
'amount' => 'OrderReferenceAttributes.OrderTotal.Amount',
'currency_code' => 'OrderReferenceAttributes.OrderTotal.CurrencyCode',
'platform_id' => 'OrderReferenceAttributes.PlatformId',
'seller_note' => 'OrderReferenceAttributes.SellerNote',
'seller_order_id' => 'OrderReferenceAttributes.SellerOrderAttributes.SellerOrderId',
'store_name' => 'OrderReferenceAttributes.SellerOrderAttributes.StoreName',
'custom_information' => 'OrderReferenceAttributes.SellerOrderAttributes.CustomInformation',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'CreateOrderReferenceForId';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->createOrderReferenceForId($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testGetBillingAgreementDetails()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
'address_consent_token' => 'AddressConsentToken',
'access_token' => 'AccessToken',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'GetBillingAgreementDetails';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->getBillingAgreementDetails($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testSetBillingAgreementDetailsWithoutSCA()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
'platform_id' => 'BillingAgreementAttributes.PlatformId',
'seller_note' => 'BillingAgreementAttributes.SellerNote',
'seller_billing_agreement_id' => 'BillingAgreementAttributes.SellerBillingAgreementAttributes.SellerBillingAgreementId',
'custom_information' => 'BillingAgreementAttributes.SellerBillingAgreementAttributes.CustomInformation',
'store_name' => 'BillingAgreementAttributes.SellerBillingAgreementAttributes.StoreName',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'SetBillingAgreementDetails';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->setBillingAgreementDetails($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testSetBillingAgreementDetailsWithSCA()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
'platform_id' => 'BillingAgreementAttributes.PlatformId',
'seller_note' => 'BillingAgreementAttributes.SellerNote',
'seller_billing_agreement_id' => 'BillingAgreementAttributes.SellerBillingAgreementAttributes.SellerBillingAgreementId',
'custom_information' => 'BillingAgreementAttributes.SellerBillingAgreementAttributes.CustomInformation',
'store_name' => 'BillingAgreementAttributes.SellerBillingAgreementAttributes.StoreName',
'billing_agreement_type' => 'BillingAgreementAttributes.BillingAgreementType',
'subscription_amount' => 'BillingAgreementAttributes.SubscriptionAmount.Amount',
'currency_code' => 'BillingAgreementAttributes.SubscriptionAmount.CurrencyCode',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'SetBillingAgreementDetails';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->setBillingAgreementDetails($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testSetBillingAgreementDetailsWithSCAExceptCurrencyCode()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
'platform_id' => 'BillingAgreementAttributes.PlatformId',
'seller_note' => 'BillingAgreementAttributes.SellerNote',
'seller_billing_agreement_id' => 'BillingAgreementAttributes.SellerBillingAgreementAttributes.SellerBillingAgreementId',
'custom_information' => 'BillingAgreementAttributes.SellerBillingAgreementAttributes.CustomInformation',
'store_name' => 'BillingAgreementAttributes.SellerBillingAgreementAttributes.StoreName',
'billing_agreement_type' => 'BillingAgreementAttributes.BillingAgreementType',
'subscription_amount' => 'BillingAgreementAttributes.SubscriptionAmount.Amount',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'SetBillingAgreementDetails';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedParameters['BillingAgreementAttributes.SubscriptionAmount.CurrencyCode'] = 'USD'; # default from client
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->setBillingAgreementDetails($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testConfirmBillingAgreementWithoutSCA()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'ConfirmBillingAgreement';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->confirmBillingAgreement($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testConfirmBillingAgreementWithSCA()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
'success_url' => 'SuccessUrl',
'failure_url' => 'FailureUrl',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'ConfirmBillingAgreement';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->confirmBillingAgreement($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testValidateBillingAgreement()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'ValidateBillingAgreement';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->validateBillingAgreement($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testAuthorizeOnBillingAgreement()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
'authorization_reference_id' => 'AuthorizationReferenceId',
'authorization_amount' => 'AuthorizationAmount.Amount',
'currency_code' => 'AuthorizationAmount.CurrencyCode',
'seller_authorization_note' => 'SellerAuthorizationNote',
'transaction_timeout' => 'TransactionTimeout',
'capture_now' => 'CaptureNow',
'soft_descriptor' => 'SoftDescriptor',
'seller_note' => 'SellerNote',
'platform_id' => 'PlatformId',
'custom_information' => 'SellerOrderAttributes.CustomInformation',
'seller_order_id' => 'SellerOrderAttributes.SellerOrderId',
'store_name' => 'SellerOrderAttributes.StoreName',
'inherit_shipping_address' => 'InheritShippingAddress',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'AuthorizeOnBillingAgreement';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->authorizeOnBillingAgreement($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testCloseBillingAgreement()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'amazon_billing_agreement_id' => 'AmazonBillingAgreementId',
'closure_reason' => 'ClosureReason',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'CloseBillingAgreement';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->closeBillingAgreement($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testGetMerchantNotificationConfiguration()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'GetMerchantNotificationConfiguration';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->getMerchantNotificationConfiguration($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testSetMerchantNotificationConfiguration()
{
$client = new Client($this->configParams);
$fieldMappings = array(
'merchant_id' => 'SellerId',
'notification_configuration_list' => array(),
'mws_auth_token' => 'MWSAuthToken'
);
$action = 'SetMerchantNotificationConfiguration';
$parameters = $this->setParametersAndPost($fieldMappings, $action);
$expectedParameters = $parameters['expectedParameters'];
$expectedParameters['NotificationConfigurationList.NotificationConfiguration.1.NotificationUrl'] = 'https://dev.null/one';
$expectedParameters['NotificationConfigurationList.NotificationConfiguration.2.NotificationUrl'] = 'https://dev.null/two';
$expectedParameters['NotificationConfigurationList.NotificationConfiguration.1.EventTypes.EventTypeList.1'] = 'ORDER_REFERENCE';
$expectedParameters['NotificationConfigurationList.NotificationConfiguration.1.EventTypes.EventTypeList.2'] = 'PAYMENT_AUTHORIZE';
$expectedParameters['NotificationConfigurationList.NotificationConfiguration.2.EventTypes.EventTypeList.1'] = 'ALL';
$apiCallParams = $parameters['apiCallParams'];
$expectedStringParams = $this->callPrivateMethod($client, 'calculateSignatureAndParametersToString', $expectedParameters);
$response = $client->setMerchantNotificationConfiguration($apiCallParams);
$apiParametersString = $client->getParameters();
$this->assertEquals($apiParametersString, $expectedStringParams);
}
public function testCharge()
{
$client = new Client($this->configParams);
$apiCallParams = array('amazon_reference_id' => 'S01-TEST');
try {
$client = new Client($this->configParams);
$apiCallParams = array('amazon_reference_id' => '');
$client->charge($apiCallParams);
} catch (\Exception $expected) {
$this->assertRegExp('/key amazon_order_reference_id or amazon_billing_agreement_id is null and is a required parameter./i', strval($expected));
}
try {
$client = new Client($this->configParams);
$apiCallParams = array('amazon_reference_id' => 'T01');
$client->charge($apiCallParams);
} catch (\Exception $expected) {
$this->assertRegExp('/Invalid Amazon Reference ID./i', strval($expected));
}
}
public function testGetUserInfo()
{
try {
$this->configParams['region'] = '';
$client = new Client($this->configParams);
$client->getUserInfo('Atza');
} catch (\Exception $expected) {
$this->assertRegExp('/is a required parameter./i', strval($expected));
}
try {
$this->configParams['region'] = 'us';
$client = new Client($this->configParams);
$client->getUserInfo(null);
} catch (\Exception $expected) {
$this->assertRegExp('/Access Token is a required parameter and is not set./i', strval($expected));
}
}
public function testSignature()
{
$client = new Client($this->configParams);
$parameters['SellerId'] = $this->configParams['merchant_id'];
$parameters['AWSAccessKeyId'] = $this->configParams['access_key'];
$parameters['Version'] = 'test';
$parameters['SignatureMethod'] = 'HmacSHA256';
$parameters['SignatureVersion'] = 2;
$parameters['Timestamp'] = $this->getFormattedTimestamp();
uksort($parameters, 'strcmp');
$signatureObj = new Signature($this->configParams,$parameters);
$expectedSignature = $signatureObj->getSignature();
$this->callPrivateMethod($client,'createServiceUrl', null);
$signature = $this->callPrivateMethod($client,'signParameters', $parameters);
$this->assertEquals($signature, $expectedSignature);
}
public function test500or503()
{
try {
$client = new Client($this->configParams);
$url = 'https://www.amazon.com/OffAmazonPayments_Sandbox/2013-01-01';
$client->setMwsServiceUrl($url);
$this->callPrivateMethod($client, 'invokePost', null);
} catch (\Exception $expected) {
$this->assertRegExp('/Maximum number of retry attempts./i', strval($expected));
}
}
public function testXmlResponse()
{
$response = array();
$response['ResponseBody'] =
'
S01-5806490-2147504
2015-09-27T02:18:33.408Z
This is testing API call
';
$responseObj = new ResponseParser($response);
$xmlResponse = $responseObj->toXml();
$this->assertEquals($xmlResponse, $response['ResponseBody']);
}
public function testJsonResponse()
{
$response = array('Status' => '200');
$response['ResponseBody'] =
'
S01-5806490-2147504
2015-09-27T02:18:33.408Z
This is testing API call
';
$json =
'{"AmazonOrderReferenceId":"S01-5806490-2147504","ExpirationTimestamp":"2015-09-27T02:18:33.408Z","SellerNote":"This is testing API call","ResponseStatus":"200"}';
$responseObj = new ResponseParser($response);
$jsonResponse = $responseObj->toJson();
$this->assertEquals($json, $jsonResponse);
}
public function testArrayResponse()
{
$response = array('Status' => '200');
$response['ResponseBody'] =
'
S01-5806490-2147504
2015-09-27T02:18:33.408Z
This is testing API call
';
$array = array('AmazonOrderReferenceId' => 'S01-5806490-2147504',
'ExpirationTimestamp' => '2015-09-27T02:18:33.408Z',
'SellerNote' => 'This is testing API call',
'ResponseStatus' => '200');
$responseObj = new ResponseParser($response);
$arrayResponse = $responseObj->toArray();
$this->assertEquals($array, $arrayResponse);
}
private function setParametersAndPost($fieldMappings, $action)
{
$expectedParameters = array();
$apiCallParams = array();
$parameters = $this->setDefaultValues($fieldMappings);
$expectedParameters = $parameters['expectedParameters'];
$apiCallParams = $parameters['apiCallParams'];
$expectedParameters['Action'] = $action;
foreach ($fieldMappings as $parm => $value) {
if ($parm === 'capture_now' || $parm === 'confirm_now' || $parm === 'inherit_shipping_address' || $parm === 'request_payment_authorization') {
$expectedParameters[$value] = true;
$apiCallParams[$parm] = true;
} elseif ($parm === 'order_item_categories') {
$apiCallParams[$parm] = array('Antiques', 'Electronics');
} elseif ($parm === 'order_status_list') {
$apiCallParams[$parm] = array('Open', 'Closed');
} elseif ($parm === 'notification_configuration_list') {
$notificationConfiguration['https://dev.null/one'] = array('ORDER_REFERENCE', 'PAYMENT_AUTHORIZE');
$notificationConfiguration['https://dev.null/two'] = array('ALL');
$apiCallParams[$parm] = $notificationConfiguration;
} elseif (!isset($expectedParameters[$value])) {
$unique_id = uniqid();
$expectedParameters[$value] = $unique_id;
$apiCallParams[$parm] = $unique_id;
}
}
return array('expectedParameters' => $expectedParameters,
'apiCallParams' => $apiCallParams);
}
private function setDefaultValues($fieldMappings)
{
$expectedParameters = array();
$apiCallParams = array();
if (array_key_exists('platform_id', $fieldMappings)) {
$expectedParameters[$fieldMappings['platform_id']] = $this->configParams['platform_id'];
$apiCallParams['platform_id'] = $this->configParams['platform_id'];
}
if (array_key_exists('currency_code', $fieldMappings)) {
$expectedParameters[$fieldMappings['currency_code']] = 'TEST';
$apiCallParams['currency_code'] = 'TEST';
}
return array('expectedParameters' => $expectedParameters,
'apiCallParams' => $apiCallParams);
}
/* Formats date as ISO 8601 timestamp */
private function getFormattedTimestamp()
{
return gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time());
}
private function callPrivateMethod($client, $methodName, $parameters)
{
$reflectionClass = new \ReflectionClass("AmazonPay\Client");
$reflectionMethod = $reflectionClass->getMethod($methodName);
$reflectionMethod->setAccessible(true);
$expectedStringParams = $reflectionMethod->invoke($client, $parameters);
return $expectedStringParams;
}
}