diff --git a/Makefile b/Makefile index 9d8df7f8..1c7276ed 100644 --- a/Makefile +++ b/Makefile @@ -2,10 +2,10 @@ install: @pip install requests pycurl mock coveralls pylint pycodestyle tests: - @python -m unittest discover -s test -p '*Test.py' + pytest coverage: - @coverage run -m unittest discover -s test -p '*Test.py' + pytest --cov=Adyen generator:=python diff --git a/test/BalancePlatformTest.py b/test/BalancePlatformTest.py deleted file mode 100644 index 5034f277..00000000 --- a/test/BalancePlatformTest.py +++ /dev/null @@ -1,204 +0,0 @@ -import unittest - -import Adyen -from Adyen import settings - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestBalancePlatform(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.xapikey = "YourXapikey" - client.platform = "test" - balance_platform_url = adyen.balancePlatform.platform_api.baseUrl - - def test_creating_balance_account(self): - request = { - "accountHolderId": "AH32272223222B59K6ZKBBFNQ", - "description": "S.Hopper - Main balance account" - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/configuration/" - "balance-account-created.json") - result = self.adyen.balancePlatform.balance_accounts_api.create_balance_account(request) - self.assertEqual('AH32272223222B59K6ZKBBFNQ', result.message['accountHolderId']) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.balance_platform_url}/balanceAccounts', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_creating_account_holder(self): - request = { - "description": "Liable account holder used for international payments and payouts", - "reference": "S.Eller-001", - "legalEntityId": "LE322JV223222D5GG42KN6869" - } - self.adyen.client = self.test.create_client_from_file(200, request, "test/mocks/configuration/" - "account-holder-created.json") - result = self.adyen.balancePlatform.account_holders_api.create_account_holder(request) - self.assertEqual("LE322JV223222D5GG42KN6869", result.message['legalEntityId']) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.balance_platform_url}/accountHolders', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_get_balance_platform(self): - platform_id = "YOUR_BALANCE_PLATFORM" - self.adyen.client = self.test.create_client_from_file(200, None, "test/mocks/configuration/" - "balance-platform-retrieved.json") - result = self.adyen.balancePlatform.platform_api.get_balance_platform(platform_id) - self.assertEqual(platform_id, result.message['id']) - self.adyen.client.http_client.request.assert_called_once_with( - 'GET', - f'{self.balance_platform_url}/balancePlatforms/{platform_id}', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=None, - xapikey="YourXapikey" - ) - - def test_creating_payment_instrument(self): - request = { - "type": "bankAccount", - "description": "YOUR_DESCRIPTION", - "balanceAccountId": "BA3227C223222B5CTBLR8BWJB", - "issuingCountryCode": "NL" - } - self.adyen.client = self.test.create_client_from_file(200, request, "test/mocks/configuration/" - "business-account-created.json") - result = self.adyen.balancePlatform.payment_instruments_api.create_payment_instrument(request) - self.assertEqual("BA3227C223222B5CTBLR8BWJB", result.message["balanceAccountId"]) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.balance_platform_url}/paymentInstruments', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_creating_transfer_limit(self): - request = { - "amount": { - "currency": "EUR", - "value": 10000 - }, - "reference": "Your reference for the transfer limit", - "scaInformation": { - "scaOnApproval": True - }, - "scope": "perTransaction", - "startsAt": "2025-08-15T06:36:20+01:00", - "endsAt": "2026-08-14T00:00:00+01:00", - "transferType": "all" - } - - balance_platform_id = 'YOUR_BALANCE_PLATFORM_ID' - - self.adyen.client = self.test.create_client_from_file(200, request, "test/mocks/configuration/" - "transfer-limit-created.json") - result = self.adyen.balancePlatform.transfer_limits_balance_platform_level_api.create_transfer_limit(request, - balance_platform_id) - self.assertEqual("TRLI00000000000000000000000001", result.message['id']) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.balance_platform_url}/balancePlatforms/{balance_platform_id}/transferLimits', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_creating_webhook(self): - request = { - "type": "balance", - "target": { - "type": "balanceAccount", - "id": "BA00000000000000000LIABLE" - }, - "currency": "USD", - "status": "active", - "conditions": [ - { - "balanceType": "available", - "conditionType": "lessThan", - "value": 500000 - } - ] - } - - balance_platform_id = 'YOUR_BALANCE_PLATFORM_ID' - webhook_id = 'YOUR_WEBHOOK_ID' - - self.adyen.client = self.test.create_client_from_file(200, request, "test/mocks/configuration/" - "webhook-setting-created.json") - result = self.adyen.balancePlatform.balances_api.create_webhook_setting(request, balance_platform_id, webhook_id) - self.assertEqual("active", result.message['status']) - self.assertEqual("BWHS00000000000000000000000001", result.message['id']) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.balance_platform_url}/balancePlatforms/{balance_platform_id}/webhooks/{webhook_id}/settings', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_creating_payment_instrument_group(self): - request = { - "balancePlatform": "YOUR_BALANCE_PLATFORM", - "txVariant": "mc" - } - self.adyen.client = self.test.create_client_from_file(200, request, "test/mocks/configuration/" - "payment-instrument-group-created.json") - result = self.adyen.balancePlatform.payment_instrument_groups_api.create_payment_instrument_group(request) - self.assertEqual("YOUR_BALANCE_PLATFORM", result.message['balancePlatform']) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.balance_platform_url}/paymentInstrumentGroups', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_get_transaction_rule(self): - transactionRuleId = "TR32272223222B5CMD3V73HXG" - self.adyen.client = self.test.create_client_from_file(200, {}, "test/mocks/configuration/" - "transaction-rule-retrieved.json") - result = self.adyen.balancePlatform.transaction_rules_api.get_transaction_rule(transactionRuleId) - self.assertEqual(transactionRuleId, result.message['transactionRule']['id']) - self.adyen.client.http_client.request.assert_called_once_with( - 'GET', - f'{self.balance_platform_url}/' - f'transactionRules/{transactionRuleId}', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=None, - xapikey="YourXapikey" - ) - - def test_update_network_token(self): - request = { - "status": "closed" - } - self.adyen.client = self.test.create_client_from_file(202, request) - - result = self.adyen.balancePlatform.network_tokens_api.update_network_token(request, 'TK123ABC') - - self.assertEqual(202, result.status_code) - self.assertEqual({}, result.message) - self.assertEqual("", result.raw_response) - self.adyen.client.http_client.request.assert_called_once_with( - 'PATCH', - f'{self.balance_platform_url}/networkTokens/TK123ABC', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) diff --git a/test/BaseTest.py b/test/BaseTest.py deleted file mode 100644 index 69495fa3..00000000 --- a/test/BaseTest.py +++ /dev/null @@ -1,36 +0,0 @@ - -try: - import mock -except Exception: - from unittest import mock -import json -from Adyen import httpclient - - -class BaseTest: - def __init__(self, adyen): - self.ady = adyen - - def create_client_from_file(self, status, request, filename=None): - if filename: - with open(filename) as data_file: - data = json.load(data_file) - st = open(filename) - strjson = st.read() - else: - data = {} - st = "" - strjson = "" - - # Ensure the actual http_client instance is initialized - if not self.ady.client.http_init: - self.ady.client._init_http_client() - - self.ady.client.http_init = True - self.ady.client.http_client.request = mock.MagicMock( - return_value=[strjson, request, status, data]) - - mockclient = self.ady.client - if st: - st.close() - return mockclient diff --git a/test/BinLookupTest.py b/test/BinLookupTest.py deleted file mode 100644 index 119e40e0..00000000 --- a/test/BinLookupTest.py +++ /dev/null @@ -1,94 +0,0 @@ -import unittest -import Adyen -from Adyen import settings - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - -REQUEST_KWARGS = { - 'merchantAccount': 'YourMerchantAccount', - 'amount': '1000' -} - - -class TestBinLookup(unittest.TestCase): - ady = Adyen.Adyen() - - client = ady.client - test = BaseTest(ady) - client.username = "YourWSUser" - client.password = "YourWSPassword" - client.platform = "test" - binLookup_version = ady.binlookup.bin_lookup_api.baseUrl.split('/')[-1] - - def test_get_cost_estimate_success(self): - self.ady.client.http_client.request.reset_mock() - expected = { - 'cardBin': { - 'bin': '458012', - 'commercial': False, - 'fundingSource': 'CHARGE', - 'fundsAvailability': 'N', - 'issuingBank': 'Bank Of America', - 'issuingCountry': 'US', 'issuingCurrency': 'USD', - 'paymentMethod': 'Y', - 'summary': '6789' - }, - 'costEstimateAmount': { - 'currency': 'USD', 'value': 1234 - }, - 'resultCode': 'Success', - 'surchargeType': 'PASSTHROUGH' - } - - self.ady.client = self.test.create_client_from_file( - status=200, - request=REQUEST_KWARGS, - filename='test/mocks/binlookup/getcostestimate-success.json' - ) - - result = self.ady.binlookup.bin_lookup_api.get_cost_estimate(REQUEST_KWARGS) - self.assertEqual(expected, result.message) - self.ady.client.http_client.request.assert_called_once_with( - 'POST', - 'https://pal-test.adyen.com/pal/servlet/' - f'BinLookup/{self.binLookup_version}/getCostEstimate', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json={ - 'merchantAccount': 'YourMerchantAccount', - 'amount': '1000', - }, - password='YourWSPassword', - username='YourWSUser' - ) - - def test_get_cost_estimate_error_mocked(self): - self.ady.client = self.test.create_client_from_file( - status=200, - request=REQUEST_KWARGS, - filename=( - "test/mocks/binlookup/" - "getcostestimate-error-invalid-data-422.json" - ) - ) - - result = self.ady.binlookup.bin_lookup_api.get_cost_estimate(REQUEST_KWARGS) - self.assertEqual(422, result.message['status']) - self.assertEqual("101", result.message['errorCode']) - self.assertEqual("Invalid card number", result.message['message']) - self.assertEqual("validation", result.message['errorType']) - - -TestBinLookup.client.http_force = "requests" -suite = unittest.TestLoader().loadTestsFromTestCase(TestBinLookup) -unittest.TextTestRunner(verbosity=2).run(suite) -TestBinLookup.client.http_force = "pycurl" -TestBinLookup.client.http_init = False -suite = unittest.TestLoader().loadTestsFromTestCase(TestBinLookup) -unittest.TextTestRunner(verbosity=2).run(suite) -TestBinLookup.client.http_force = "other" -TestBinLookup.client.http_init = False -suite = unittest.TestLoader().loadTestsFromTestCase(TestBinLookup) -unittest.TextTestRunner(verbosity=2).run(suite) diff --git a/test/CapitalTest.py b/test/CapitalTest.py deleted file mode 100644 index 23851940..00000000 --- a/test/CapitalTest.py +++ /dev/null @@ -1,114 +0,0 @@ -import Adyen -import unittest -from Adyen import settings - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestCapital(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.xapikey = "YourXapikey" - client.platform = "test" - lib_version = settings.LIB_VERSION - - def test_request_grant(self): - request = {} - self.adyen.client = self.test.create_client_from_file( - 200, - request, - "test/mocks/capital/grants-success.json" - ) - result = self.adyen.capital.grants_api.request_grant(request) - self.assertEqual(1, len(result.message['grants'])) - self.assertEqual("GR00000000000000000000001", result.message['grants'][0]['id']) - - def test_get_all_grant_offers(self): - request = {} - self.adyen.client = self.test.create_client_from_file( - 200, - request, - "test/mocks/capital/grant-offers-success.json" - ) - result = self.adyen.capital.grant_offers_api.get_all_grant_offers(request) - self.assertEqual(1, len(result.message['grantOffers'])) - self.assertEqual("GO00000000000000000000001", result.message['grantOffers'][0]['id']) - - def test_get_all_grants(self): - request = {} - self.adyen.client = self.test.create_client_from_file( - 200, - request, - "test/mocks/capital/grants-success.json" - ) - result = self.adyen.capital.grants_api.get_all_grants(counterparty_account_holder_id="AH00000000000000000000001") - self.assertEqual(1, len(result.message['grants'])) - self.assertEqual("GR00000000000000000000001", result.message['grants'][0]['id']) - - def test_get_grant(self): - request = {} - self.adyen.client = self.test.create_client_from_file( - 200, - request, - "test/mocks/capital/get-grant-success.json" - ) - result = self.adyen.capital.grants_api.get_grant(grantId="GR00000000000000000000001") - self.assertEqual("GR00000000000000000000001", result.message['id']) - - def test_get_all_grant_disbursements(self): - request = {} - self.adyen.client = self.test.create_client_from_file( - 200, - request, - "test/mocks/capital/get-grant-disbursements-success.json" - ) - result = self.adyen.capital.grants_api.get_all_grant_disbursements(grantId="GR00000000000000000000001") - self.assertEqual(1, len(result.message['disbursements'])) - self.assertEqual("DI00000000000000000000001", result.message['disbursements'][0]['id']) - - def test_get_grant_disbursement(self): - request = {} - self.adyen.client = self.test.create_client_from_file( - 200, - request, - "test/mocks/capital/get-grant-disbursement-success.json" - ) - result = self.adyen.capital.grants_api.get_grant_disbursement(grantId="GR00000000000000000000001", - disbursementId="DI00000000000000000000001") - self.assertEqual("DI00000000000000000000001", result.message['id']) - - def test_update_grant_disbursement(self): - request = {} - self.adyen.client = self.test.create_client_from_file( - 200, - request, - "test/mocks/capital/update-grant-disbursement-success.json" - ) - result = self.adyen.capital.grants_api.update_grant_disbursement(request, grantId="GR00000000000000000000001", - disbursementId="DI00000000000000000000001") - self.assertEqual(1500, result.message['repayment']['basisPoints']) - - def test_get_grant_account_information(self): - request = {} - self.adyen.client = self.test.create_client_from_file( - 200, - request, - "test/mocks/capital/get-grant-account-success.json" - ) - result = self.adyen.capital.grant_accounts_api.get_grant_account_information(id="CG00000000000000000000001") - self.assertEqual("CG00000000000000000000001", result.message['id']) - - def test_get_grant_offer(self): - request = {} - self.adyen.client = self.test.create_client_from_file( - 200, - request, - "test/mocks/capital/get-grant-offer-success.json" - ) - result = self.adyen.capital.grant_offers_api.get_grant_offer(id="GO00000000000000000000001") - self.assertEqual("GO00000000000000000000001", result.message['id']) diff --git a/test/CheckoutTest.py b/test/CheckoutTest.py deleted file mode 100644 index 0c2b1f9b..00000000 --- a/test/CheckoutTest.py +++ /dev/null @@ -1,552 +0,0 @@ -import Adyen -import unittest -from Adyen import settings - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestCheckout(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.xapikey = "YourXapikey" - client.platform = "test" - baseUrl = adyen.checkout.payments_api.baseUrl - lib_version = settings.LIB_VERSION - - def test_payment_methods_success_mocked(self): - request = {'merchantAccount': "YourMerchantAccount"} - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "paymentmethods" - "-success.json") - result = self.adyen.checkout.payments_api.payment_methods(request) - self.assertEqual("AliPay", result.message['paymentMethods'][0]['name']) - self.assertEqual("Credit Card", - result.message['paymentMethods'][2]['name']) - self.assertEqual("Credit Card via AsiaPay", - result.message['paymentMethods'][3]['name']) - - def test_payment_methods_error_mocked(self): - request = {'merchantAccount': "YourMerchantAccount"} - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "paymentmethods-" - "error-forbidden" - "-403.json") - result = self.adyen.checkout.payments_api.payment_methods(request) - self.assertEqual(403, result.message['status']) - self.assertEqual("901", result.message['errorCode']) - self.assertEqual("Invalid Merchant Account", result.message['message']) - self.assertEqual("security", result.message['errorType']) - - def test_payments_success_mocked(self): - request = {'amount': {"value": "100000", "currency": "EUR"}, - 'reference': "123456", 'paymentMethod': { - "type": "scheme", - "number": "4111111111111111", - "expiryMonth": "08", - "expiryYear": "2018", - "holderName": "John Smith", - "cvc": "737" - }, 'merchantAccount': "YourMerchantAccount", - 'returnUrl': "https://your-company.com/..."} - - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "payments" - "-success" - ".json") - result = self.adyen.checkout.payments_api.payments(request) - self.assertEqual("8535296650153317", result.message['pspReference']) - self.assertEqual("Authorised", result.message['resultCode']) - self.assertEqual("8/2018", - result.message["additionalData"]['expiryDate']) - self.assertEqual("GREEN", - result.message["additionalData"]['fraudResultType']) - - def test_payments_error_mocked(self): - request = {'amount': {"value": "100000", "currency": "EUR"}, - 'reference': "54431", 'paymentMethod': { - "type": "scheme", - "number": "4111111111111111", - "expiryMonth": "08", - "expiryYear": "2018", - "holderName": "John Smith", - "cvc": "737" - }, 'merchantAccount': "YourMerchantAccount", - 'returnUrl': "https://your-company.com/..."} - - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "payments-error" - "-invalid" - "-data-422" - ".json") - result = self.adyen.checkout.payments_api.payments(request) - - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.baseUrl}/payments', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json={ - 'returnUrl': 'https://your-company.com/...', - 'reference': '54431', - 'merchantAccount': 'YourMerchantAccount', - 'amount': {'currency': 'EUR', 'value': '100000'}, - 'paymentMethod': { - 'expiryYear': '2018', - 'holderName': 'John Smith', - 'number': '4111111111111111', - 'expiryMonth': '08', - 'type': 'scheme', - 'cvc': '737' - } - }, - xapikey='YourXapikey' - ) - self.assertEqual(422, result.message['status']) - self.assertEqual("130", result.message['errorCode']) - self.assertEqual("Reference Missing", result.message['message']) - self.assertEqual("validation", result.message['errorType']) - - def test_payments_details_success_mocked(self): - request = {'paymentData': "Hee57361f99....", 'details': { - "MD": "sdfsdfsdf...", - "PaRes": "sdkfhskdjfsdf..." - }} - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "paymentsdetails" - "-success.json") - - result = self.adyen.checkout.payments_api.payments_details(request) - - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.baseUrl}/payments/details', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json={ - 'paymentData': 'Hee57361f99....', - 'details': {'MD': 'sdfsdfsdf...', 'PaRes': 'sdkfhskdjfsdf...'} - }, - xapikey='YourXapikey' - ) - self.assertEqual("8515232733321252", result.message['pspReference']) - self.assertEqual("Authorised", result.message['resultCode']) - self.assertEqual("true", - result.message['additionalData']['liabilityShift']) - self.assertEqual("AUTHORISED", - result.message['additionalData']['refusalReasonRaw']) - - def test_payments_details_error_mocked(self): - request = {'paymentData': "Hee57361f99....", 'details': { - "MD": "sdfsdfsdf...", - "PaRes": "sdkfhskdjfsdf..." - }} - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "paymentsdetails" - "-error-invalid-" - "data-422.json") - result = self.adyen.checkout.payments_api.payments_details(request) - self.assertEqual(422, result.message['status']) - self.assertEqual("101", result.message['errorCode']) - self.assertEqual("Invalid card number", result.message['message']) - self.assertEqual("validation", result.message['errorType']) - - def test_payments_cancels_without_reference(self): - requests = { - "paymentReference": "Payment123", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "reference": "YourCancelReference", - } - self.adyen.client = self.test.create_client_from_file(200, requests, - "test/mocks/" - "checkout/" - "paymentscancel-" - "withoutreference-succes.json") - results = self.adyen.checkout.modifications_api.cancel_authorised_payment(requests) - self.assertIsNotNone(results.message['paymentReference']) - self.assertEqual("8412534564722331", results.message['pspReference']) - self.assertEqual("received", results.message['status']) - - def test_payments_cancels_without_reference_error_mocked(self): - requests = { - "paymentReference": "Payment123", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "reference": "YourCancelReference", - } - self.adyen.client = self.test.create_client_from_file(200, requests, - "test/mocks/" - "checkout/" - "paymentsresult" - "-error-invalid-" - "data-payload-" - "422.json") - - result = self.adyen.checkout.modifications_api.cancel_authorised_payment(requests) - self.assertEqual(422, result.message['status']) - self.assertEqual("14_018", result.message['errorCode']) - self.assertEqual("Invalid payload provided", result.message['message']) - self.assertEqual("validation", result.message['errorType']) - - def test_payments_cancels_success_mocked(self): - requests = {"reference": "Your wro order number", "merchantAccount": "YOUR_MERCHANT_ACCOUNT"} - - reference_id = "8836183819713023" - self.adyen.client = self.test.create_client_from_file(200, requests, - "test/mocks/" - "checkout/" - "paymentscancels" - "-success.json") - result = self.adyen.checkout.modifications_api.refund_or_cancel_payment(requests, reference_id) - self.assertEqual(reference_id, result.message["paymentPspReference"]) - self.assertEqual("received", result.message['status']) - - def test_payments_cancels_error_mocked(self): - request = {"reference": "Your wro order number"} - psp_reference = "8836183819713023" - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "paymentsresult-error-invalid-" - "data-payload-422.json") - result = self.adyen.checkout.modifications_api.refund_or_cancel_payment(request, psp_reference) - self.assertEqual(422, result.message['status']) - self.assertEqual("14_018", result.message['errorCode']) - self.assertEqual("Invalid payload provided", result.message['message']) - self.assertEqual("validation", result.message['errorType']) - - def test_payments_refunds_success_mocked(self): - requests = { - "paymentReference": "Payment123", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "reference": "YourCancelReference", - } - psp_reference = "Payment123" - self.adyen.client = self.test.create_client_from_file(200, requests, - "test/mocks/" - "checkout/" - "paymentscancel-" - "withoutreference-succes.json") - - result = self.adyen.checkout.modifications_api.refund_captured_payment(requests,psp_reference) - self.assertEqual(psp_reference, result.message["paymentReference"]) - self.assertIsNotNone(result.message["pspReference"]) - self.assertEqual("received", result.message['status']) - - def test_payments_refunds_error_mocked(self): - requests = { - "paymentReference": "Payment123", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "reference": "YourCancelReference", - } - reference_id = "Payment123" - self.adyen.client = self.test.create_client_from_file(200, requests, - "test/mocks/" - "checkout/" - "paymentsresult-error-invalid-" - "data-payload-422.json") - - result = self.adyen.checkout.modifications_api.refund_captured_payment(requests, reference_id) - self.assertEqual(422, result.message['status']) - self.assertEqual("14_018", result.message['errorCode']) - self.assertEqual("Invalid payload provided", result.message['message']) - self.assertEqual("validation", result.message['errorType']) - - def test_reversals_success_mocked(self): - requests = { - "reference": "YourReversalReference", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT" - } - psp_reference = "8836183819713023" - self.adyen.client = self.test.create_client_from_file(200, requests, - "test/mocks/" - "checkout/" - "paymentsreversals-" - "success.json") - - result = self.adyen.checkout.modifications_api.refund_or_cancel_payment(requests, psp_reference) - self.assertEqual(psp_reference, result.message["paymentPspReference"]) - self.assertIsNotNone(result.message["pspReference"]) - self.assertEqual("received", result.message['status']) - - def test_payments_reversals_failure_mocked(self): - requests = { - "reference": "YourReversalReference", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT" - } - psp_reference = "8836183819713023" - - self.adyen.client = self.test.create_client_from_file(200, requests, - "test/mocks/" - "checkout/" - "paymentsresult-error-invalid-" - "data-payload-422.json") - - result = self.adyen.checkout.modifications_api.refund_or_cancel_payment(requests,psp_reference) - self.assertEqual(422, result.message['status']) - self.assertEqual("14_018", result.message['errorCode']) - self.assertEqual("Invalid payload provided", result.message['message']) - self.assertEqual("validation", result.message['errorType']) - - def test_payments_capture_success_mocked(self): - request = { - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "amount": { - "value": 2500, - "currency": "EUR" - }, - "reference": "YOUR_UNIQUE_REFERENCE" - } - psp_reference = "8536214160615591" - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "paymentcapture-" - "success.json") - - result = self.adyen.checkout.modifications_api.capture_authorised_payment(request, psp_reference) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.baseUrl}/payments/{psp_reference}/captures', - json=request, - xapikey='YourXapikey', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - ) - self.assertEqual(psp_reference, result.message["paymentPspReference"]) - self.assertIsNotNone(result.message["pspReference"]) - self.assertEqual("received", result.message['status']) - self.assertEqual(2500, result.message['amount']['value']) - - def test_payments_capture_error_mocked(self): - request = { - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "amount": { - "value": 2500, - "currency": "EUR" - }, - "reference": "YOUR_UNIQUE_REFERENCE" - } - psp_reference = "8536214160615591" - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "paymentsresult-error-invalid-" - "data-payload-422.json") - - result = self.adyen.checkout.modifications_api.capture_authorised_payment(request, psp_reference) - self.assertEqual(422, result.message['status']) - self.assertEqual("14_018", result.message['errorCode']) - self.assertEqual("Invalid payload provided", result.message['message']) - self.assertEqual("validation", result.message['errorType']) - - def test_orders_success(self): - request = {'merchantAccount': "YourMerchantAccount"} - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "orders" - "-success.json") - result = self.adyen.checkout.orders_api.orders(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.baseUrl}/orders', - json=request, - xapikey='YourXapikey', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - - ) - self.assertEqual("8515930288670953", result.message['pspReference']) - self.assertEqual("Success", result.message['resultCode']) - self.assertEqual("order reference", result.message['reference']) - self.assertEqual("EUR", result.message['remainingAmount']["currency"]) - self.assertEqual(2500, result.message['remainingAmount']['value']) - - def test_orders_cancel_success(self): - request = {'merchantAccount': "YourMerchantAccount"} - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "orders-cancel" - "-success.json") - result = self.adyen.checkout.orders_api.cancel_order(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.baseUrl}/orders/cancel', - json=request, - xapikey='YourXapikey', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - ) - self.assertEqual("8515931182066678", result.message['pspReference']) - self.assertEqual("Received", result.message['resultCode']) - - def test_paymentmethods_balance_success(self): - request = {'merchantAccount': "YourMerchantAccount"} - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "paymentmethods" - "-balance" - "-success.json") - result = self.adyen.checkout.orders_api.get_balance_of_gift_card(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.baseUrl}/paymentMethods/balance', - json=request, - xapikey='YourXapikey', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - ) - self.assertEqual("851611111111713K", result.message['pspReference']) - self.assertEqual("Success", result.message['resultCode']) - self.assertEqual(100, result.message['balance']['value']) - self.assertEqual("EUR", result.message['balance']['currency']) - - def test_sessions_success(self): - request = {'merchantAccount': "YourMerchantAccount"} - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "sessions" - "-success.json") - result = self.adyen.checkout.payments_api.sessions(request) - - self.assertEqual("session-test-id", result.message['id']) - self.assertEqual("TestReference", result.message['reference']) - self.assertEqual("http://test-url.com", result.message['returnUrl']) - - def test_sessions_error(self): - request = {'merchantAccount': "YourMerchantAccount"} - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "sessions" - "-error" - "-invalid" - "-data-422" - ".json") - result = self.adyen.checkout.payments_api.sessions(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.baseUrl}/sessions', - json={'merchantAccount': 'YourMerchantAccount'}, - xapikey='YourXapikey', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - ) - self.assertEqual(422, result.message['status']) - self.assertEqual("130", result.message['errorCode']) - self.assertEqual("validation", result.message['errorType']) - - def test_payment_link(self): - request = { - "reference": "YOUR_ORDER_NUMBER", - "amount": { - "value": 1250, - "currency": "BRL" - }, - "countryCode": "BR", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "shopperReference": "YOUR_UNIQUE_SHOPPER_ID", - "shopperEmail": "test@email.com", - "shopperLocale": "pt-BR", - "billingAddress": { - "street": "Roque Petroni Jr", - "postalCode": "59000060", - "city": "São Paulo", - "houseNumberOrName": "999", - "country": "BR", - "stateOrProvince": "SP" - }, - "deliveryAddress": { - "street": "Roque Petroni Jr", - "postalCode": "59000060", - "city": "São Paulo", - "houseNumberOrName": "999", - "country": "BR", - "stateOrProvince": "SP" - } - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "paymentlinks" - "-success" - ".json") - result = self.adyen.checkout.payment_links_api.payment_links(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.baseUrl}/paymentLinks', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - xapikey='YourXapikey', - json=request - ) - self.assertEqual("YOUR_ORDER_NUMBER", result.message["reference"]) - - def test_get_payment_link(self): - id = "PL61C53A8B97E6915A" - self.adyen.client = self.test.create_client_from_file(200, None, - "test/mocks/" - "checkout/" - "getpaymenlinks" - "-succes.json") - result = self.adyen.checkout.payment_links_api.get_payment_link(id) - self.adyen.client.http_client.request.assert_called_once_with( - 'GET', - f'{self.baseUrl}/paymentLinks/{id}', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - xapikey="YourXapikey", - json=None - ) - self.assertEqual("TestMerchantCheckout", result.message["merchantAccount"]) - - def test_update_payment_link(self): - id = "PL61C53A8B97E6915A" - request = { - "status": "expired" - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/checkout" - "/updatepaymentlinks" - "-success.json") - result = self.adyen.checkout.payment_links_api.update_payment_link(request, id) - self.adyen.client.http_client.request.assert_called_once_with( - 'PATCH', - f'{self.baseUrl}/paymentLinks/{id}', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - xapikey="YourXapikey", - json=request - ) - self.assertEqual("expired",result.message["status"]) - - def test_service_name_validation(self): - """ - This test prevents a regression of a bug found in the Adyen Ruby library - where the `service` attribute of the `PaymentsApi` class was being - overridden due to the way Ruby handles open classes. - - This test validates that the `service` and `baseUrl` attributes of the - `payments_api` for both `checkout` and `payment` are set correctly and - are not being overridden by ensuring that each service has its own - `PaymentsApi` class in a separate module. - """ - checkout_service = self.adyen.checkout.payments_api.service - payment_service = self.adyen.payment.payments_api.service - checkout_base_url = self.adyen.checkout.payments_api.baseUrl - payment_base_url = self.adyen.payment.payments_api.baseUrl - - self.assertEqual("checkout", checkout_service) - self.assertEqual("payments", payment_service) - self.assertTrue(checkout_base_url.startswith("https://checkout-test.adyen.com/")) - self.assertTrue(payment_base_url.startswith("https://pal-test.adyen.com/pal/servlet/Payment/")) - diff --git a/test/CheckoutUtilityTest.py b/test/CheckoutUtilityTest.py deleted file mode 100644 index 1c9eb0a2..00000000 --- a/test/CheckoutUtilityTest.py +++ /dev/null @@ -1,70 +0,0 @@ -import unittest - -import Adyen -from Adyen import settings -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestCheckoutUtility(unittest.TestCase): - ady = Adyen.Adyen() - - client = ady.client - test = BaseTest(ady) - client.xapikey = "YourXapikey" - client.platform = "test" - checkout_url = ady.checkout.utility_api.baseUrl - - def test_origin_keys_success_mocked(self): - request = { - "originDomains": { - "https://www.your-domain1.com", - "https://www.your-domain2.com", - "https://www.your-domain3.com" - } - } - - self.ady.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkoututility/" - "originkeys" - "-success.json") - result = self.ady.checkout.utility_api.origin_keys(request) - - self.assertEqual("pub.v2.7814286629520534.aHR0cHM6Ly93d3cu" - "eW91ci1kb21haW4xLmNvbQ.UEwIBmW9-c_uXo5wS" - "Er2w8Hz8hVIpujXPHjpcEse3xI", - result.message['originKeys'] - ['https://www.your-domain1.com']) - - self.assertEqual("pub.v2.7814286629520534.aHR0cHM6Ly93d3cu" - "eW91ci1kb21haW4zLmNvbQ.fUvflu-YIdZSsLEH8" - "Qqmr7ksE4ag_NYiiMXK0s6aq_4", - result.message['originKeys'] - ['https://www.your-domain3.com']) - - self.assertEqual("pub.v2.7814286629520534.aHR0cHM6Ly93d3cue" - "W91ci1kb21haW4yLmNvbQ.EP6eXBJKk0t7-QIUl6e_" - "b1qMuMHGepxG_SlUqxAYrfY", - result.message['originKeys'] - ['https://www.your-domain2.com']) - - def test_checkout_utility_api_url_custom(self): - url = self.ady.client._determine_api_url("test", self.checkout_url + "/originKeys") - - self.assertEqual(url, f"{self.checkout_url}/originKeys") - - def test_applePay_session(self): - request = { - "displayName": "YOUR_MERCHANT_NAME", - "domainName": "YOUR_DOMAIN_NAME", - "merchantIdentifier": "YOUR_MERCHANT_ID" - } - self.ady.client = self.test.create_client_from_file(200, request, "test/mocks/" - "checkoututility/" - "applepay-sessions" - "-success.json") - result = self.ady.checkout.utility_api.get_apple_pay_session(request) - self.assertEqual("BASE_64_ENCODED_DATA", result.message['data']) diff --git a/test/ClientTest.py b/test/ClientTest.py deleted file mode 100644 index 02619241..00000000 --- a/test/ClientTest.py +++ /dev/null @@ -1,18 +0,0 @@ -import Adyen -import unittest -from Adyen import settings - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestClient(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.xapikey = "YOUR_API_KEY" - client.platform = "test" - lib_version = settings.LIB_VERSION diff --git a/test/DataProtectionTest.py b/test/DataProtectionTest.py deleted file mode 100644 index 395a77a8..00000000 --- a/test/DataProtectionTest.py +++ /dev/null @@ -1,38 +0,0 @@ -import Adyen -import unittest -from Adyen import settings - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestCheckout(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.xapikey = "YourXapikey" - client.platform = "test" - data_protection_url = adyen.dataProtection.data_protection_api.baseUrl - lib_version = settings.LIB_VERSION - - def test_data_erasure(self): - request = { - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "pspReference": "9915520502347613", - "forceErasure": True - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/dataProtection/erasure-response.json") - result = self.adyen.dataProtection.data_protection_api.request_subject_erasure(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.data_protection_url}' - '/requestSubjectErasure', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - xapikey="YourXapikey", - json=request - ) - self.assertEqual("SUCCESS", result.message["result"]) diff --git a/test/DetermineEndpointTest.py b/test/DetermineEndpointTest.py deleted file mode 100644 index b8113143..00000000 --- a/test/DetermineEndpointTest.py +++ /dev/null @@ -1,155 +0,0 @@ -import Adyen -from Adyen import settings -import unittest -from Adyen.services.posMobile import AdyenPosMobileApi - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - -from Adyen.exceptions import AdyenEndpointInvalidFormat - - -class TestDetermineUrl(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.xapikey = "YourXapikey" - checkout_url = adyen.checkout.payments_api.baseUrl - checkout_version = checkout_url.split('/')[-1] - payment_url = adyen.payment.payments_api.baseUrl - payment_version = payment_url.split('/')[-1] - binlookup_url = adyen.binlookup.bin_lookup_api.baseUrl - management_url = adyen.management.account_merchant_level_api.baseUrl - sessionauth_url = adyen.sessionAuthentication.session_authentication_api.baseUrl - sessionauth_version = sessionauth_url.split('/')[-1] - capital_url = adyen.capital.grants_api.baseUrl - capital_version = capital_url.split('/')[-1] - - def test_checkout_api_url_custom(self): - self.client.live_endpoint_prefix = "1797a841fbb37ca7-AdyenDemo" - url = self.adyen.client._determine_api_url("live", self.checkout_url + "/payments") - self.assertEqual("https://1797a841fbb37ca7-AdyenDemo-checkout-" - f"live.adyenpayments.com/checkout/{self.checkout_version}/payments", url) - - def test_pos_mobile_api_url_live(self): - self.client.live_endpoint_prefix = "1797a841fbb37ca7-AdyenDemo" - pos_mobile = AdyenPosMobileApi(self.client) - pos_mobile_url = pos_mobile.pos_mobile_api.baseUrl - pos_mobile_version = pos_mobile_url.split('/')[-1] - url = self.adyen.client._determine_api_url("live", pos_mobile_url + "/sessions") - self.assertEqual("https://1797a841fbb37ca7-AdyenDemo-checkout-" - f"live.adyenpayments.com/checkout/possdk/{pos_mobile_version}/sessions", url) - - def test_checkout_api_url(self): - self.client.live_endpoint_prefix = None - url = self.adyen.client._determine_api_url("test", self.checkout_url + "/payments/details") - self.assertEqual(url, f"{self.checkout_url}/payments/details") - - def test_payments_invalid_platform(self): - - request = { - 'amount': {"value": "100000", "currency": "EUR"}, - "reference": "Your order number", - 'paymentMethod': { - "type": "scheme", - "number": "4111111111111111", - "expiryMonth": "08", - "expiryYear": "2018", - "holderName": "John Smith", - "cvc": "737" - }, - 'merchantAccount': "YourMerchantAccount", - 'returnUrl': "https://your-company.com/..." - } - - self.client.platform = "live" - self.client.live_endpoint_prefix = None - - try: - self.adyen.checkout.payments_api.sessions(request) - except AdyenEndpointInvalidFormat as error: - self.assertIsNotNone(error) - - def test_pal_url_live_endpoint_prefix_live_platform(self): - self.client.live_endpoint_prefix = "1797a841fbb37ca7-AdyenDemo" - url = self.adyen.client._determine_api_url( - "live", self.payment_url + "/payments" - ) - self.assertEqual( - url, - ("https://1797a841fbb37ca7-AdyenDemo-pal-" - f"live.adyenpayments.com/pal/servlet/Payment/{self.payment_version}/payments") - ) - - def test_pal_url_live_endpoint_prefix_test_platform(self): - self.client.live_endpoint_prefix = "1797a841fbb37ca7-AdyenDemo" - url = self.adyen.client._determine_api_url( - "test", self.payment_url + "/payments" - ) - self.assertEqual( - url, - f"{self.payment_url}/payments") - - def test_pal_url_no_live_endpoint_prefix_test_platform(self): - self.client.live_endpoint_prefix = None - url = self.adyen.client._determine_api_url( - "test", self.payment_url + "/payments" - ) - self.assertEqual( - url, - f"{self.payment_url}/payments") - - def test_binlookup_url_no_live_endpoint_prefix_test_platform(self): - self.client.live_endpoint_prefix = None - url = self.adyen.client._determine_api_url( - "test", self.binlookup_url + "/get3dsAvailability" - ) - self.assertEqual( - url, - f"{self.binlookup_url}/get3dsAvailability" - ) - - def test_checkout_api_url_orders(self): - self.client.live_endpoint_prefix = None - url = self.adyen.client._determine_api_url("test", self.checkout_url + - "/orders") - self.assertEqual(url, f"{self.checkout_url}/orders") - - def test_checkout_api_url_order_cancel(self): - self.client.live_endpoint_prefix = None - url = self.adyen.client._determine_api_url("test", self.checkout_url + "/orders/cancel") - self.assertEqual(url, f"{self.checkout_url}/orders/cancel") - - def test_checkout_api_url_order_payment_methods_balance(self): - self.client.live_endpoint_prefix = None - url = self.adyen.client._determine_api_url("test", self.checkout_url + "/paymentMethods/balance") - self.assertEqual(url, f"{self.checkout_url}/paymentMethods/balance") - - def test_checkout_api_url_sessions(self): - self.client.live_endpoint_prefix = None - url = self.adyen.client._determine_api_url("test", self.checkout_url + "/sessions") - self.assertEqual(url, f"{self.checkout_url}/sessions") - - def test_management_api_url_companies(self): - companyId = "YOUR_COMPANY_ID" - url = self.adyen.client._determine_api_url("test", self.management_url + f'/companies/{companyId}/users') - self.assertEqual(url, f"{self.management_url}/companies/{companyId}/users") - - def test_secureauthentication_api_url(self): - url = self.adyen.client._determine_api_url("test", self.sessionauth_url) - self.assertEqual(url, self.sessionauth_url) - - def test_live_secureauthentication_api_url(self): - url = self.adyen.client._determine_api_url("live", self.sessionauth_url + "/sessions") - self.assertEqual(url, f"https://authe-live.adyen.com/authe/api/{self.sessionauth_version}/sessions") - - def test_capital_api_url(self): - url = self.adyen.client._determine_api_url("test", self.capital_url) - self.assertEqual(url, self.capital_url) - - def test_live_capital_api_url(self): - url = self.adyen.client._determine_api_url("live", self.capital_url) - self.assertEqual(url, f"https://balanceplatform-api-live.adyen.com/capital/{self.capital_version}") diff --git a/test/DisputesTest.py b/test/DisputesTest.py deleted file mode 100644 index 9cb29350..00000000 --- a/test/DisputesTest.py +++ /dev/null @@ -1,135 +0,0 @@ -import Adyen -import unittest -from Adyen import settings - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestDisputes(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.xapikey = "YourXapikey" - client.platform = "test" - disputes_url = adyen.disputes.disputes_api.baseUrl - - def test_accept_dispute(self): - request = { - "disputePspReference": "DZ4DPSHB4WD2WN82", - "merchantAccountCode": "YOUR_MERCHANT_ACCOUNT" - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/disputes/" - "post-acceptDispute-accept-dispute-200.json") - result = self.adyen.disputes.disputes_api.accept_dispute(request) - - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.disputes_url}/acceptDispute', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_defend_dispute(self): - request = { - "defenseReasonCode": "SupplyDefenseMaterial", - "disputePspReference": "DZ4DPSHB4WD2WN82", - "merchantAccountCode": "YOUR_MERCHANT_ACCOUNT" - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/disputes/" - "post-defendDispute-defend-dispute-200.json") - result = self.adyen.disputes.disputes_api.defend_dispute(request) - - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.disputes_url}/defendDispute', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_delete_defense_dispute_document(self): - request = { - "defenseDocumentType": "DefenseMaterial", - "disputePspReference": "DZ4DPSHB4WD2WN82", - "merchantAccountCode": "YOUR_MERCHANT_ACCOUNT" - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/disputes/" - "post-deleteDisputeDefenseDocument-delete-dispute-defense-document-200.json") - result = self.adyen.disputes.disputes_api.delete_dispute_defense_document(request) - - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.disputes_url}/deleteDisputeDefenseDocument', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_download_dispute_defense_document(self): - request = { - "disputePspReference": "DZ4DPSHB4WD2WN82", - "merchantAccountCode": "YOUR_MERCHANT_ACCOUNT" - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/disputes/" - "post-downloadDisputeDefenseDocument-download-dispute-defense-document-200.json") - result = self.adyen.disputes.disputes_api.delete_dispute_defense_document(request) - - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.disputes_url}/deleteDisputeDefenseDocument', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_retrieve_applicable_defense_reasons(self): - request = { - "disputePspReference": "DZ4DPSHB4WD2WN82", - "merchantAccountCode": "YOUR_MERCHANT_ACCOUNT" - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/disputes/" - "post-retrieveApplicableDefenseReasons-retrieve-defense-reasons-200.json") - result = self.adyen.disputes.disputes_api.retrieve_applicable_defense_reasons(request) - - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.disputes_url}/retrieveApplicableDefenseReasons', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_supply_defense_document(self): - request = { - "defenseDocuments": [ - { - "content": "JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBv+f/ub0j6JPRX+E3EmC==", - "contentType": "application/pdf", - "defenseDocumentTypeCode": "DefenseMaterial" - } - ], - "disputePspReference": "DZ4DPSHB4WD2WN82", - "merchantAccountCode": "YOUR_MERCHANT_ACCOUNT" - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/disputes/" - "post-supplyDefenseDocument-supply-defense-document-200.json") - result = self.adyen.disputes.disputes_api.supply_defense_document(request) - - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.disputes_url}/supplyDefenseDocument', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) \ No newline at end of file diff --git a/test/HttpClientTest.py b/test/HttpClientTest.py deleted file mode 100644 index 7173597e..00000000 --- a/test/HttpClientTest.py +++ /dev/null @@ -1,61 +0,0 @@ -import unittest -import Adyen -from Adyen import settings - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestHttpClient(unittest.TestCase): - def setUp(self): - self.adyen = Adyen.Adyen() - self.client = self.adyen.client - self.client.xapikey = "TEST_XAPI_KEY" - self.test = BaseTest(self.adyen) - - def test_user_agent_without_application_name(self): - # Mock the http_client.request method - self.test.create_client_from_file(200, {}, "test/mocks/checkout/paymentmethods-success.json") - - # Call a dummy API method - _ = self.adyen.checkout.payments_api.payment_methods({}) - - # Assert that http_client.request was called with the correct headers - self.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.adyen.checkout.payments_api.baseUrl}/paymentMethods', - headers={ - 'adyen-library-name': settings.LIB_NAME, - 'adyen-library-version': settings.LIB_VERSION, - 'User-Agent': settings.LIB_NAME + "/" + settings.LIB_VERSION - }, - json={}, - xapikey='TEST_XAPI_KEY' - ) - - def test_user_agent_with_application_name(self): - self.client.application_name = "MyTestApp" - - # Mock the http_client.request method - self.test.create_client_from_file(200, {}, "test/mocks/checkout/paymentmethods-success.json") - - # Call a dummy API method - _ = self.adyen.checkout.payments_api.payment_methods({}) - - # Assert that http_client.request was called with the correct headers - self.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.adyen.checkout.payments_api.baseUrl}/paymentMethods', - headers={ - 'adyen-library-name': settings.LIB_NAME, - 'adyen-library-version': settings.LIB_VERSION, - 'User-Agent': "MyTestApp " + settings.LIB_NAME + "/" + settings.LIB_VERSION - }, - json={}, - xapikey='TEST_XAPI_KEY' - ) - -if __name__ == '__main__': - unittest.main() diff --git a/test/LegalEntityManagementTest.py b/test/LegalEntityManagementTest.py deleted file mode 100644 index 527063f0..00000000 --- a/test/LegalEntityManagementTest.py +++ /dev/null @@ -1,105 +0,0 @@ -import Adyen -import unittest -from Adyen import settings - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestManagement(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.xapikey = "YourXapikey" - client.platform = "test" - lem_url = adyen.legalEntityManagement.legal_entities_api.baseUrl - - def test_creating_legal_entity(self): - request = { - "type": "individual", - "individual": { - "residentialAddress": { - "city": "Amsterdam", - "country": "NL", - "postalCode": "1011DJ", - "street": "Simon Carmiggeltstraat 6 - 50" - }, - "name": { - "firstName": "Shelly", - "lastName": "Eller" - }, - "birthData": { - "dateOfBirth": "1990-06-21" - }, - "email": "s.eller@example.com" - } - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/legalEntityManagement/" - "individual_legal_entity_created.json") - result = self.adyen.legalEntityManagement.legal_entities_api.create_legal_entity(request) - self.assertEqual('Shelly', result.message['individual']['name']['firstName']) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.lem_url}/legalEntities', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_get_transfer_instrument(self): - instrumentId = "SE322JV223222F5GNXSR89TMW" - self.adyen.client = self.test.create_client_from_file(200, None, "test/mocks/legalEntityManagement/" - "details_of_trainsfer_instrument.json") - result = self.adyen.legalEntityManagement.transfer_instruments_api.get_transfer_instrument(instrumentId) - self.assertEqual(instrumentId, result.message['id']) - self.adyen.client.http_client.request.assert_called_once_with( - 'GET', - f'{self.lem_url}/transferInstruments/{instrumentId}', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=None, - xapikey="YourXapikey" - ) - - def test_update_business_line(self): - businessLineId = "SE322JV223222F5GVGMLNB83F" - request = { - "industryCode": "55", - "webData": [ - { - "webAddress": "https://www.example.com" - } - ] - } - self.adyen.client = self.test.create_client_from_file(200, request, "test/mocks/legalEntityManagement/" - "business_line_updated.json") - result = self.adyen.legalEntityManagement.business_lines_api.update_business_line(request, businessLineId) - self.assertEqual(businessLineId, result.message['id']) - self.adyen.client.http_client.request.assert_called_once_with( - 'PATCH', - f'{self.lem_url}/businessLines/{businessLineId}', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_accept_terms_of_service(self): - legalEntityId = "legalId" - documentId = "documentId" - request = { - 'acceptedBy': "UserId", - 'ipAddress': "UserIpAddress" - } - self.adyen.client = self.test.create_client_from_file(204, request) - self.adyen.legalEntityManagement.terms_of_service_api.accept_terms_of_service(request, legalEntityId, - documentId) - self.adyen.client.http_client.request.assert_called_once_with( - 'PATCH', - f'{self.lem_url}/legalEntities/{legalEntityId}/termsOfService/{documentId}', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) diff --git a/test/ManagementTest.py b/test/ManagementTest.py deleted file mode 100644 index a88ae89c..00000000 --- a/test/ManagementTest.py +++ /dev/null @@ -1,182 +0,0 @@ -import Adyen -from Adyen import settings -import unittest - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestManagement(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.xapikey = "YourXapikey" - client.platform = "test" - management_url = adyen.management.my_api_credential_api.baseUrl - - def test_get_company_account(self): - request = None - company_id = "YOUR_COMPANY_ACCOUNT" - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "management/" - "get_company_account" - ".json") - - result = self.adyen.management.account_company_level_api.get_company_account(companyId=company_id) - - self.assertEqual(company_id, result.message['id']) - self.adyen.client.http_client.request.assert_called_once_with( - 'GET', - f'{self.management_url}/companies/{company_id}', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=None, - xapikey="YourXapikey" - ) - - def test_my_api_credential_api(self): - request = {"domain": "YOUR_DOMAIN"} - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "management/" - "post_me_allowed" - "_origins.json") - - result = self.adyen.management.my_api_credential_api.add_allowed_origin(request) - - self.assertEqual("YOUR_DOMAIN", result.message['domain']) - - def test_no_content(self): - self.adyen.client = self.test.create_client_from_file(204, {}, - "test/mocks/" - "management/" - "no_content.json") - origin_id = 'YOUR_DOMAIN_ID' - - self.adyen.management.my_api_credential_api.remove_allowed_origin(origin_id) - - self.adyen.client.http_client.request.assert_called_once_with( - 'DELETE', - f'{self.management_url}/me/allowedOrigins/{origin_id}', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=None, - xapikey="YourXapikey" - ) - - def test_update_store(self): - request = { - "address": { - "line1": "1776 West Pinewood Avenue", - "line2": "Heartland Building", - "line3": "", - "postalCode": "20251" - } - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "management/" - "update_a_store" - ".json") - store_id = "YOUR_STORE_ID" - merchant_id = "YOUR_MERCHANT_ACCOUNT_ID" - - result = self.adyen.management.account_store_level_api.update_store(request, merchant_id, store_id) - - self.adyen.client.http_client.request.assert_called_once_with( - 'PATCH', - f'{self.management_url}/merchants/{merchant_id}/stores/{store_id}', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - self.assertEqual(store_id, result.message['id']) - self.assertEqual("1776 West Pinewood Avenue", result.message['address']['line1']) - - def test_reassign_terminal(self): - request = { - 'storeId': 'ST123ABC', - 'inventory': False, - } - self.adyen.client = self.test.create_client_from_file(200, request) - - result = self.adyen.management.terminals_terminal_level_api.reassign_terminal(request, 'AMS1-2345') - - self.assertEqual(200, result.status_code) - self.assertEqual({}, result.message) - self.assertEqual("", result.raw_response) - - def test_create_a_user(self): - request = { - "name": { - "firstName": "John", - "lastName": "Smith" - }, - "username": "johnsmith", - "email": "john.smith@example.com", - "timeZoneCode": "Europe/Amsterdam", - "roles": [ - "Merchant standard role", - "Merchant admin" - ], - "associatedMerchantAccounts": [ - "YOUR_MERCHANT_ACCOUNT" - ] - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "management/" - "create_a_user" - ".json") - company_id = "YOUR_COMPANY_ACCOUNT" - - result = self.adyen.management.users_company_level_api.create_new_user(request, company_id) - - self.assertEqual(request['name']['firstName'], result.message['name']['firstName']) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.management_url}/companies/{company_id}/users', - json=request, - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - xapikey="YourXapikey" - ) - - def test_get_list_of_android_apps(self): - request = {} - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "management/" - "get_list_of" - "_android_apps" - ".json") - company_id = "YOUR_COMPANY_ACCOUNT" - - result = self.adyen.management.android_files_company_level_api.list_android_apps(company_id) - - self.assertEqual("ANDA422LZ223223K5F694GCCF732K8", result.message['androidApps'][0]['id']) - - def test_query_parameters(self): - request = {} - company_id = "YOUR_COMPANY_ACCOUNT" - query_parameters = { - 'pageNumber': 1, - 'pageSize': 10 - - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "management/" - "get_list_of_merchant_accounts.json") - - self.adyen.management.account_company_level_api. \ - list_merchant_accounts(company_id, query_parameters=query_parameters) - - self.adyen.client.http_client.request.assert_called_once_with( - 'GET', - f'{self.management_url}/companies/{company_id}/merchants?pageNumber=1&pageSize=10', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=None, - xapikey="YourXapikey" - ) diff --git a/test/ModificationTest.py b/test/ModificationTest.py deleted file mode 100644 index 7ee47e0f..00000000 --- a/test/ModificationTest.py +++ /dev/null @@ -1,112 +0,0 @@ -import Adyen -import unittest -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestModifications(unittest.TestCase): - ady = Adyen.Adyen() - - client = ady.client - test = BaseTest(ady) - client.username = "YourWSUser" - client.password = "YourWSPassword" - client.platform = "test" - - def test_capture_success(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['reference'] = "YourReference" - request['modificationAmount'] = {"value": "1234", "currency": "EUR"} - request['originalReference'] = "YourOriginalReference" - self.ady.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'capture-success' - '.json') - result = self.ady.payment.modifications_api.capture(request) - self.assertEqual("[capture-received]", result.message['response']) - - def test_capture_error_167(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['reference'] = "YourReference" - request['modificationAmount'] = {"value": "1234", "currency": "EUR"} - request['originalReference'] = "YourOriginalReference" - self.ady.client = self.test.create_client_from_file(422, request, - 'test/mocks/' - 'capture-error-167' - '.json') - self.assertRaisesRegex( - Adyen.AdyenAPIUnprocessableEntity, - "AdyenAPIUnprocessableEntity:{'status': 422, 'errorCode': '167', 'message': 'Original pspReference required for this operation', 'errorType': 'validation'}", - self.ady.payment.modifications_api.capture, - request - ) - - def test_cancel_or_refund_received(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['reference'] = "YourReference" - request['originalReference'] = "YourOriginalReference" - self.ady.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'cancelOrRefund' - '-received.json') - result = self.ady.payment.modifications_api.cancel_or_refund(request) - self.assertEqual("[cancelOrRefund-received]", - result.message['response']) - - def test_refund_received(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['reference'] = "YourReference" - request['originalReference'] = "YourOriginalReference" - request['modificationAmount'] = {"value": "1234", "currency": "EUR"} - self.ady.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'refund-received' - '.json') - result = self.ady.payment.modifications_api.refund(request) - self.assertEqual("[refund-received]", result.message['response']) - - def test_cancel_received(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['reference'] = "YourReference" - request['originalReference'] = "YourOriginalReference" - self.ady.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'cancel-received' - '.json') - result = self.ady.payment.modifications_api.cancel(request) - self.assertEqual("[cancel-received]", result.message['response']) - - def test_adjust_authorisation_received(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['reference'] = "YourReference" - request['modificationAmount'] = {"value": "1234", "currency": "EUR"} - request['originalReference'] = "YourOriginalReference" - self.ady.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'adjust-' - 'authorisation-' - 'received.json') - result = self.ady.payment.modifications_api.adjust_authorisation(request) - self.assertEqual("[adjustAuthorisation-received]", - result.message['response']) - - -TestModifications.client.http_force = "requests" -suite = unittest.TestLoader().loadTestsFromTestCase(TestModifications) -unittest.TextTestRunner(verbosity=2).run(suite) -TestModifications.client.http_force = "pycurl" -TestModifications.client.http_init = False -suite = unittest.TestLoader().loadTestsFromTestCase(TestModifications) -unittest.TextTestRunner(verbosity=2).run(suite) -TestModifications.client.http_force = "other" -TestModifications.client.http_init = False -suite = unittest.TestLoader().loadTestsFromTestCase(TestModifications) -unittest.TextTestRunner(verbosity=2).run(suite) diff --git a/test/PaymentTest.py b/test/PaymentTest.py deleted file mode 100644 index b98d6d3c..00000000 --- a/test/PaymentTest.py +++ /dev/null @@ -1,393 +0,0 @@ -import Adyen -import unittest - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestPayments(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.username = "YourWSUser" - client.password = "YourWSPassword" - client.platform = "test" - client.xapikey = "" - - def test_authorise_success_mocked(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['amount'] = {"value": "100000", "currency": "EUR"} - request['reference'] = "123456" - request['card'] = { - "number": "5136333333333335", - "expiryMonth": "08", - "expiryYear": "2018", - "cvc": "737", - "holderName": "John Doe" - } - self.adyen.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'authorise' - '-success' - '.json') - result = self.adyen.payment.payments_api.authorise(request) - self.assertEqual("Authorised", result.message['resultCode']) - self.assertEqual("8/2018", - result.message['additionalData']['expiryDate']) - self.assertEqual("411111", - result.message['additionalData']['cardBin']) - self.assertEqual("1111", - result.message['additionalData']['cardSummary']) - self.assertEqual("Holder", - result.message['additionalData']['cardHolderName']) - self.assertEqual("true", - result.message['additionalData']['threeDOffered']) - self.assertEqual("false", - result.message['additionalData'] - ['threeDAuthenticated']) - self.assertEqual("69746", result.message['authCode']) - self.assertEqual(11, len(result.message['fraudResult']['results'])) - fraud_checks = result.message['fraudResult']['results'] - fraud_check_result = fraud_checks[0]['FraudCheckResult'] - self.assertEqual("CardChunkUsage", fraud_check_result['name']) - self.assertEqual(8, fraud_check_result['accountScore']) - self.assertEqual(2, fraud_check_result['checkId']) - - def test_authorise_error010_mocked(self): - request = {} - request['merchantAccount'] = "testaccount" - request['amount'] = {"value": "100000", "currency": "EUR"} - request['reference'] = "123456" - request['card'] = { - "number": "5136333333333335", - "expiryMonth": "08", - "expiryYear": "2018", - "cvc": "737", - "holderName": "John Doe" - } - self.adyen.client = self.test.create_client_from_file(403, request, - 'test/mocks/' - 'authorise-error' - '-010' - '.json') - self.assertRaises(Adyen.AdyenAPIInvalidPermission, - self.adyen.payment.payments_api.authorise, request) - - def test_authorise_error_cvc_declined_mocked(self): - request = {} - request['amount'] = {"value": "100000", "currency": "EUR"} - request['reference'] = "123456" - request['card'] = { - "number": "5136333333333335", - "expiryMonth": "08", - "expiryYear": "2018", - "cvc": "787", - "holderName": "John Doe" - } - self.adyen.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'authorise' - '-error-' - 'cvc-declined' - '.json') - result = self.adyen.payment.payments_api.authorise(request) - self.assertEqual("Refused", result.message['resultCode']) - - def test_authorise_success_3d_mocked(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['amount'] = {"value": "100000", "currency": "EUR"} - request['reference'] = "123456" - request['card'] = { - "number": "5136333333333335", - "expiryMonth": "08", - "expiryYear": "2018", - "cvc": "787", - "holderName": "John Doe" - } - request['browserInfo'] = { - "userAgent": "YourUserAgent", - "acceptHeader": "YourAcceptHeader" - } - self.adyen.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'authorise' - '-success' - '-3d.json') - result = self.adyen.payment.payments_api.authorise(request) - self.assertEqual("RedirectShopper", result.message['resultCode']) - self.assertIsNotNone(result.message['md']) - self.assertIsNotNone(result.message['issuerUrl']) - self.assertIsNotNone(result.message['paRequest']) - - def test_authorise_3d_success_mocked(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['md'] = "testMD" - request['paResponse'] = "paresponsetest" - request['browserInfo'] = { - "userAgent": "YourUserAgent", - "acceptHeader": "YourAcceptHeader" - } - self.adyen.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'authorise3d-' - 'success.json') - result = self.adyen.payment.payments_api.authorise3d(request) - self.assertEqual("Authorised", result.message['resultCode']) - self.assertIsNotNone(result.message['pspReference']) - - def test_authorise_cse_success_mocked(self): - request = {} - request['amount'] = {"value": "1234", "currency": "EUR"} - request['merchantAccount'] = "YourMerchantAccount" - request['reference'] = "YourReference" - request['additionalData'] = { - "card.encrypted.json": "YourCSEToken" - } - self.adyen.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'authorise' - '-success' - '-cse.json') - result = self.adyen.payment.payments_api.authorise(request) - self.assertEqual("Authorised", result.message['resultCode']) - - def test_authorise_cse_error_expired_mocked(self): - request = {} - request['amount'] = {"value": "1234", "currency": "EUR"} - request['merchantAccount'] = "YourMerchantAccount" - request['reference'] = "YourReference" - request['additionalData'] = { - "card.encrypted.json": "YourCSEToken" - } - - self.adyen.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'authorise' - '-error-' - 'expired.json') - result = self.adyen.payment.payments_api.authorise(request) - self.assertEqual("Refused", result.message['resultCode']) - self.assertEqual("DECLINED Expiry Incorrect", - result.message['additionalData']['refusalReasonRaw']) - - def test_error_401_mocked(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['amount'] = {"value": "100000", "currency": "EUR"} - request['reference'] = "123456" - request['card'] = { - "number": "5136333333333335", - "expiryMonth": "08", - "expiryYear": "2018", - "cvc": "787", - "holderName": "John Doe" - } - self.adyen.client = self.test.create_client_from_file(401, request, - 'test/mocks/' - 'authorise' - '-error-' - '010.json') - self.assertRaisesRegex(Adyen.AdyenAPIAuthenticationError, - "AdyenAPIAuthenticationError:{'status': 403, 'errorCode': '010'," - " 'message': 'Not allowed', 'errorType': 'security'," - " 'pspReference': '8514836072314693'}", - self.adyen.payment.payments_api.authorise, request) - - -class TestPaymentsWithXapiKey(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.platform = "test" - client.username = "YourWSUser" - client.password = "YourWSPassword" - client.xapikey = "" - - def test_authorise_success_mocked(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['amount'] = {"value": "100000", "currency": "EUR"} - request['reference'] = "123456" - request['card'] = { - "number": "5136333333333335", - "expiryMonth": "08", - "expiryYear": "2018", - "cvc": "737", - "holderName": "John Doe" - } - self.adyen.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'authorise' - '-success' - '.json') - result = self.adyen.payment.payments_api.authorise(request) - self.assertEqual("Authorised", result.message['resultCode']) - self.assertEqual("8/2018", - result.message['additionalData']['expiryDate']) - self.assertEqual("411111", - result.message['additionalData']['cardBin']) - self.assertEqual("1111", - result.message['additionalData']['cardSummary']) - self.assertEqual("Holder", - result.message['additionalData']['cardHolderName']) - self.assertEqual("true", - result.message['additionalData']['threeDOffered']) - self.assertEqual("false", - result.message['additionalData'] - ['threeDAuthenticated']) - self.assertEqual("69746", result.message['authCode']) - self.assertEqual(11, len(result.message['fraudResult']['results'])) - fraud_checks = result.message['fraudResult']['results'] - fraud_check_result = fraud_checks[0]['FraudCheckResult'] - self.assertEqual("CardChunkUsage", fraud_check_result['name']) - self.assertEqual(8, fraud_check_result['accountScore']) - self.assertEqual(2, fraud_check_result['checkId']) - - def test_authorise_error010_mocked(self): - request = {} - request['merchantAccount'] = "testaccount" - request['amount'] = {"value": "100000", "currency": "EUR"} - request['reference'] = "123456" - request['card'] = { - "number": "5136333333333335", - "expiryMonth": "08", - "expiryYear": "2018", - "cvc": "737", - "holderName": "John Doe" - } - self.adyen.client = self.test.create_client_from_file(403, request, - 'test/mocks/' - 'authorise-error' - '-010' - '.json') - self.assertRaises(Adyen.AdyenAPIInvalidPermission, - self.adyen.payment.payments_api.authorise, request) - - def test_authorise_error_cvc_declined_mocked(self): - request = {} - request['amount'] = {"value": "100000", "currency": "EUR"} - request['reference'] = "123456" - request['card'] = { - "number": "5136333333333335", - "expiryMonth": "08", - "expiryYear": "2018", - "cvc": "787", - "holderName": "John Doe" - } - self.adyen.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'authorise' - '-error-' - 'cvc-declined' - '.json') - result = self.adyen.payment.payments_api.authorise(request) - self.assertEqual("Refused", result.message['resultCode']) - - def test_authorise_success_3d_mocked(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['amount'] = {"value": "100000", "currency": "EUR"} - request['reference'] = "123456" - request['card'] = { - "number": "5136333333333335", - "expiryMonth": "08", - "expiryYear": "2018", - "cvc": "787", - "holderName": "John Doe" - } - request['browserInfo'] = { - "userAgent": "YourUserAgent", - "acceptHeader": "YourAcceptHeader" - } - self.adyen.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'authorise' - '-success' - '-3d.json') - result = self.adyen.payment.payments_api.authorise(request) - self.assertEqual("RedirectShopper", result.message['resultCode']) - self.assertIsNotNone(result.message['md']) - self.assertIsNotNone(result.message['issuerUrl']) - self.assertIsNotNone(result.message['paRequest']) - - def test_authorise_3d_success_mocked(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['md'] = "testMD" - request['paResponse'] = "paresponsetest" - request['browserInfo'] = { - "userAgent": "YourUserAgent", - "acceptHeader": "YourAcceptHeader" - } - self.adyen.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'authorise3d-' - 'success.json') - result = self.adyen.payment.payments_api.authorise3d(request) - self.assertEqual("Authorised", result.message['resultCode']) - self.assertIsNotNone(result.message['pspReference']) - - def test_authorise_cse_success_mocked(self): - request = {} - request['amount'] = {"value": "1234", "currency": "EUR"} - request['merchantAccount'] = "YourMerchantAccount" - request['reference'] = "YourReference" - request['additionalData'] = { - "card.encrypted.json": "YourCSEToken" - } - self.adyen.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'authorise' - '-success' - '-cse.json') - result = self.adyen.payment.payments_api.authorise(request) - self.assertEqual("Authorised", result.message['resultCode']) - - def test_authorise_cse_error_expired_mocked(self): - request = {} - request['amount'] = {"value": "1234", "currency": "EUR"} - request['merchantAccount'] = "YourMerchantAccount" - request['reference'] = "YourReference" - request['additionalData'] = { - "card.encrypted.json": "YourCSEToken" - } - - self.adyen.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'authorise' - '-error-' - 'expired.json') - result = self.adyen.payment.payments_api.authorise(request) - self.assertEqual("Refused", result.message['resultCode']) - self.assertEqual("DECLINED Expiry Incorrect", - result.message['additionalData']['refusalReasonRaw']) - - def test_error_401_mocked(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['amount'] = {"value": "100000", "currency": "EUR"} - request['reference'] = "123456" - request['card'] = { - "number": "5136333333333335", - "expiryMonth": "08", - "expiryYear": "2018", - "cvc": "787", - "holderName": "John Doe" - } - self.adyen.client = self.test.create_client_from_file(401, request, - 'test/mocks/' - 'authorise' - '-error-' - '010.json') - self.assertRaisesRegex(Adyen.AdyenAPIAuthenticationError, - "AdyenAPIAuthenticationError:{'status': 403, 'errorCode': '010'," - " 'message': 'Not allowed', 'errorType': 'security'," - " 'pspReference': '8514836072314693'}", - self.adyen.payment.payments_api.authorise, request) \ No newline at end of file diff --git a/test/PosMobileTest.py b/test/PosMobileTest.py deleted file mode 100644 index 2d79e1a1..00000000 --- a/test/PosMobileTest.py +++ /dev/null @@ -1,29 +0,0 @@ -import Adyen -import unittest -from Adyen import settings - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestPosMobile(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.xapikey = "YourXapikey" - client.platform = "test" - lib_version = settings.LIB_VERSION - - def test_create_communication_session(self): - request = {} - self.adyen.client = self.test.create_client_from_file( - 200, - request, - "test/mocks/posMobile/create-communication-session-success.json" - ) - result = self.adyen.posMobile.pos_mobile_api.create_communication_session(request) - self.assertEqual("CS00000000000000000000001", result.message['id']) - self.assertEqual("session_data_example", result.message['sessionData']) diff --git a/test/RecurringTest.py b/test/RecurringTest.py deleted file mode 100644 index 43d3a3a0..00000000 --- a/test/RecurringTest.py +++ /dev/null @@ -1,101 +0,0 @@ -import Adyen -import unittest -from Adyen import settings -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestRecurring(unittest.TestCase): - adyen = Adyen.Adyen() - client = adyen.client - test = BaseTest(adyen) - client.username = "YourWSUser" - client.password = "YourWSPassword" - client.platform = "test" - baseUrl = adyen.recurring.recurring_api.baseUrl - - def test_list_recurring_details(self): - request = {} - request['merchantAccount'] = "YourMerchantAccount" - request['reference'] = "YourReference" - request["shopperEmail"] = "ref@email.com" - request["shopperReference"] = "ref" - request['recurring'] = {} - request["recurring"]['contract'] = "RECURRING" - self.adyen.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'recurring/' - 'listRecurring' - 'Details-' - 'success.json') - result = self.adyen.recurring.recurring_api.list_recurring_details(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.baseUrl}/listRecurringDetails', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - username='YourWSUser', - password='YourWSPassword' - ) - self.assertEqual(1, len(result.message['details'])) - self.assertEqual(1, len(result.message['details'][0])) - recurringDetail = result.message['details'][0]['RecurringDetail'] - self.assertEqual("recurringReference", - recurringDetail['recurringDetailReference']) - self.assertEqual("cardAlias", recurringDetail['alias']) - self.assertEqual("1111", recurringDetail['card']['number']) - - def test_disable(self): - request = {} - request["shopperEmail"] = "ref@email.com" - request["shopperReference"] = "ref" - request["recurringDetailReference"] = "12345678889" - self.adyen.client = self.test.create_client_from_file(200, request, - 'test/mocks/' - 'recurring/' - 'disable-success' - '.json') - result = self.adyen.recurring.recurring_api.disable(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.baseUrl}/disable', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - username='YourWSUser', - password='YourWSPassword', - ) - self.assertEqual(1, len(result.message['details'])) - self.assertEqual("[detail-successfully-disabled]", - result.message['response']) - - def test_disable_803(self): - request = {} - request["shopperEmail"] = "ref@email.com" - request["shopperReference"] = "ref" - request["recurringDetailReference"] = "12345678889" - self.adyen.client = self.test.create_client_from_file(422, request, - 'test/mocks/' - 'recurring/' - 'disable-error-803' - '.json') - self.assertRaisesRegex( - Adyen.AdyenAPIUnprocessableEntity, - "AdyenAPIUnprocessableEntity:{'status': 422, 'errorCode': '803', 'message': 'PaymentDetail not found', 'errorType': 'validation'}", - self.adyen.recurring.recurring_api.disable, - request - ) - - -TestRecurring.client.http_force = "requests" -suite = unittest.TestLoader().loadTestsFromTestCase(TestRecurring) -unittest.TextTestRunner(verbosity=2).run(suite) -TestRecurring.client.http_force = "pycurl" -TestRecurring.client.http_init = False -suite = unittest.TestLoader().loadTestsFromTestCase(TestRecurring) -unittest.TextTestRunner(verbosity=2).run(suite) -TestRecurring.client.http_force = "other" -TestRecurring.client.http_init = False -suite = unittest.TestLoader().loadTestsFromTestCase(TestRecurring) -unittest.TextTestRunner(verbosity=2).run(suite) diff --git a/test/SessionAuthenticationTest.py b/test/SessionAuthenticationTest.py deleted file mode 100644 index fab107df..00000000 --- a/test/SessionAuthenticationTest.py +++ /dev/null @@ -1,49 +0,0 @@ -import Adyen -import unittest -from Adyen import settings - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestSessionAuthentication(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.xapikey = "YourXapikey" - client.platform = "test" - session_url = adyen.sessionAuthentication.session_authentication_api.baseUrl - - def test_create_session_token(self): - request = { - "allowOrigin": 'https://www.your-website.com', - "product": "platform", - "policy": { - "resources": [ - { - "type": "accountHolder", - "accountHolderId": "AH00000000000000000000001" - } - ], - "roles": [ - "Transactions Overview Component: View", - "Payouts Overview Component: View" - ] - } - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/sessionAuthentication/" - "authentication-session-created.json") - - result = self.adyen.sessionAuthentication.session_authentication_api.create_authentication_session(request) - self.assertEqual("long_session_token_string", result.message["sessionToken"]) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.session_url}/sessions', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) diff --git a/test/StoredValueTest.py b/test/StoredValueTest.py deleted file mode 100644 index 848901f8..00000000 --- a/test/StoredValueTest.py +++ /dev/null @@ -1,161 +0,0 @@ -import Adyen -import unittest -from Adyen import settings - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestManagement(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.xapikey = "YourXapikey" - client.platform = "test" - stored_value_url = adyen.storedValue.stored_value_api.baseUrl - - def issue(self): - request = { - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "store": "YOUR_STORE_ID", - "paymentMethod": { - "type": "valuelink" - }, - "giftCardPromoCode": "1324", - "reference": "YOUR_REFERENCE" - } - - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/storedValue/issue-giftcard.json") - result = self.adyen.storedValue.stored_value_api.issue(request) - self.assertEqual(result.message['paymentMethod']['type'], 'givex') - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.stored_value_url}/issue', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_activate_giftcard(self): - request = { - "status": "active", - "amount": { - "currency": "USD", - "value": 1000 - }, - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "store": "YOUR_STORE_ID", - "paymentMethod": { - "type": "svs", - "number": "6006491286999921374", - "securityCode": "1111" - }, - "reference": "YOUR_REFERENCE" - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/storedValue/activate-giftcards.json") - result = self.adyen.storedValue.stored_value_api.change_status(request) - self.assertEqual(result.message['currentBalance']['value'], 1000) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.stored_value_url}/changeStatus', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_load_funds(self): - request = { - "amount": { - "currency": "USD", - "value": 2000 - }, - "loadType": "merchandiseReturn", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "store": "YOUR_STORE_ID", - "paymentMethod": { - "type": "svs", - "number": "6006491286999921374", - "securityCode": "1111" - }, - "reference": "YOUR_REFERENCE" - } - self.adyen.client = self.test.create_client_from_file(200, request, "test/mocks/storedValue/load-funds.json") - result = self.adyen.storedValue.stored_value_api.load(request) - self.assertEqual(result.message['resultCode'], 'Success') - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.stored_value_url}/load', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_check_balance(self): - request = { - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "store": "YOUR_STORE_ID", - "paymentMethod": { - "type": "svs", - "number": "603628672882001915092", - "securityCode": "5754" - }, - "reference": "YOUR_REFERENCE" - } - self.adyen.client = self.test.create_client_from_file(200, request, "test/mocks/storedValue/check-balance.json") - result = self.adyen.storedValue.stored_value_api.check_balance(request) - self.assertEqual(result.message['currentBalance']['value'], 5600) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.stored_value_url}/checkBalance', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_merge_balance(self): - request = { - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "store": "YOUR_STORE_ID", - "sourcePaymentMethod": { - "number": "7777182708544835", - "securityCode": "2329" - }, - "paymentMethod": { - "type": "valuelink", - "number": "8888182708544836", - "securityCode": "2330" - }, - "reference": "YOUR_REFERENCE" - } - self.adyen.client = self.test.create_client_from_file(200, request, "test/mocks/storedValue/merge-balance.json") - result = self.adyen.storedValue.stored_value_api.merge_balance(request) - self.assertEqual(result.message['pspReference'], "881564657480267D") - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.stored_value_url}/mergeBalance', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_void_transaction(self): - request = { - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "originalReference": "851564654294247B", - "reference": "YOUR_REFERENCE" - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/storedValue/undo-transaction.json") - result = self.adyen.storedValue.stored_value_api.void_transaction(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.stored_value_url}/voidTransaction', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) diff --git a/test/TerminalTest.py b/test/TerminalTest.py deleted file mode 100644 index 694f6208..00000000 --- a/test/TerminalTest.py +++ /dev/null @@ -1,266 +0,0 @@ -import unittest -import Adyen -from Adyen import settings - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestTerminal(unittest.TestCase): - adyen = Adyen.Adyen(username="YourWSUser", - password="YourWSPassword", - platform="test", - xapikey="YourXapikey") - test = BaseTest(adyen) - client = adyen.client - terminal_url = adyen.terminal.baseUrl - - def test_assign_terminals(self): - request = { - "companyAccount": "YOUR_COMPANY_ACCOUNT", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "store": "YOUR_STORE", - "terminals": [ - "P400Plus-275479597" - ] - } - self.test.create_client_from_file( - 200, request, "test/mocks/terminal/assignTerminals.json" - ) - result = self.adyen.terminal.assign_terminals(request=request) - self.assertIn("P400Plus-275479597", result.message["results"]) - - self.client.http_client.request.assert_called_once_with( - "POST", - f"{self.terminal_url}/assignTerminals", - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json={ - "companyAccount": "YOUR_COMPANY_ACCOUNT", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "store": "YOUR_STORE", - "terminals": [ - "P400Plus-275479597" - ] - }, - xapikey="YourXapikey" - ) - - def test_assign_terminals_422(self): - request = { - "companyAccount": "YOUR_COMPANY_ACCOUNT", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "store": "YOUR_STORE", - "terminals": [ - "P400Plus-123456789" - ] - } - self.test.create_client_from_file( - 200, request, "test/mocks/terminal/assignTerminals-422.json" - ) - result = self.adyen.terminal.assign_terminals(request=request) - self.assertEqual(422, result.message["status"]) - self.assertEqual("000", result.message["errorCode"]) - self.assertEqual("Terminals not found: P400Plus-123456789", result.message["message"]) - self.assertEqual("validation", result.message["errorType"]) - - def test_find_terminal(self): - request = { - "terminal": "P400Plus-275479597", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT" - } - self.test.create_client_from_file( - 200, request, "test/mocks/terminal/findTerminal.json" - ) - result = self.adyen.terminal.find_terminal(request=request) - self.assertIn("P400Plus-275479597", result.message["terminal"]) - - self.client.http_client.request.assert_called_once_with( - "POST", - f"{self.terminal_url}/findTerminal", - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json={ - "terminal": "P400Plus-275479597", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - }, - xapikey="YourXapikey" - ) - - def test_find_terminal_422(self): - request = { - "terminal": "P400Plus-123456789" - } - self.test.create_client_from_file( - 200, request, "test/mocks/terminal/findTerminal-422.json" - ) - result = self.adyen.terminal.find_terminal(request=request) - self.assertEqual(422, result.message["status"]) - self.assertEqual("000", result.message["errorCode"]) - self.assertEqual("Terminal not found", result.message["message"]) - self.assertEqual("validation", result.message["errorType"]) - - def test_get_stores_under_account(self): - request = { - "companyAccount": "YOUR_COMPANY_ACCOUNT", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT" - } - self.test.create_client_from_file( - 200, request, "test/mocks/terminal/getStoresUnderAccount.json" - ) - result = self.adyen.terminal.get_stores_under_account(request=request) - self.assertEqual(result.message["stores"], [ - { - "store": "YOUR_STORE", - "description": "YOUR_STORE", - "address": { - "city": "The City", - "countryCode": "NL", - "postalCode": "1234", - "streetAddress": "The Street" - }, - "status": "Active", - "merchantAccountCode": "YOUR_MERCHANT_ACCOUNT" - } - ]) - - self.client.http_client.request.assert_called_once_with( - "POST", - f"{self.terminal_url}/getStoresUnderAccount", - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json={ - "companyAccount": "YOUR_COMPANY_ACCOUNT", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - }, - xapikey="YourXapikey" - ) - - def test_get_terminal_details(self): - request = { - "terminal": "P400Plus-275479597", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - } - - self.test.create_client_from_file( - 200, request, "test/mocks/terminal/getTerminalDetails.json" - ) - result = self.adyen.terminal.get_terminal_details(request=request) - - self.assertEqual(result.message["deviceModel"], "P400Plus") - self.assertEqual(result.message["terminal"], "P400Plus-275479597") - - self.client.http_client.request.assert_called_once_with( - "POST", - f"{self.terminal_url}/getTerminalDetails", - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json={ - "terminal": "P400Plus-275479597", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - }, - xapikey="YourXapikey" - ) - - def test_get_terminal_details_422(self): - request = { - "terminal": "P400Plus-123456789" - } - self.test.create_client_from_file( - 200, request, "test/mocks/terminal/getTerminalDetails-422.json" - ) - result = self.adyen.terminal.get_terminal_details(request=request) - self.assertEqual(422, result.message["status"]) - self.assertEqual("000", result.message["errorCode"]) - self.assertEqual("Terminal not found", result.message["message"]) - self.assertEqual("validation", result.message["errorType"]) - - def test_get_terminals_under_account(self): - request = { - "companyAccount": "YOUR_COMPANY_ACCOUNT", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT" - } - - self.test.create_client_from_file( - 200, request, "test/mocks/terminal/getTerminalsUnderAccount.json" - ) - result = self.adyen.terminal.get_terminals_under_account(request=request) - - self.assertEqual(result.message["merchantAccounts"], [ - { - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "inStoreTerminals": [ - "P400Plus-275479597" - ], - "stores": [ - { - "store": "YOUR_STORE", - "inStoreTerminals": [ - "M400-401972715" - ] - } - ] - } - ]) - - self.client.http_client.request.assert_called_once_with( - "POST", - f"{self.terminal_url}/getTerminalsUnderAccount", - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json={ - "companyAccount": "YOUR_COMPANY_ACCOUNT", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - }, - xapikey="YourXapikey" - ) - - def test_get_terminals_under_account_store(self): - request = { - "companyAccount": "YOUR_COMPANY_ACCOUNT", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "store": "YOUR_STORE" - } - - self.test.create_client_from_file( - 200, request, "test/mocks/terminal/getTerminalsUnderAccount-store.json" - ) - result = self.adyen.terminal.get_terminals_under_account(request=request) - - self.assertEqual(result.message["merchantAccounts"], [ - { - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "stores": [ - { - "store": "YOUR_STORE", - "inStoreTerminals": [ - "M400-401972715" - ] - } - ] - } - ]) - - self.client.http_client.request.assert_called_once_with( - "POST", - f"{self.terminal_url}/getTerminalsUnderAccount", - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json={ - "companyAccount": "YOUR_COMPANY_ACCOUNT", - "merchantAccount": "YOUR_MERCHANT_ACCOUNT", - "store": "YOUR_STORE", - }, - xapikey="YourXapikey" - ) - - -TestTerminal.client.http_force = "requests" -suite = unittest.TestLoader().loadTestsFromTestCase(TestTerminal) -unittest.TextTestRunner(verbosity=2).run(suite) - -TestTerminal.client.http_force = "pycurl" -TestTerminal.client.http_init = False -suite = unittest.TestLoader().loadTestsFromTestCase(TestTerminal) -unittest.TextTestRunner(verbosity=2).run(suite) - -TestTerminal.client.http_force = "other" -TestTerminal.client.http_init = False -suite = unittest.TestLoader().loadTestsFromTestCase(TestTerminal) -unittest.TextTestRunner(verbosity=2).run(suite) diff --git a/test/ThirdPartyPayoutTest.py b/test/ThirdPartyPayoutTest.py deleted file mode 100644 index cc2cbd1d..00000000 --- a/test/ThirdPartyPayoutTest.py +++ /dev/null @@ -1,343 +0,0 @@ -import Adyen -import unittest -from Adyen import settings -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestThirdPartyPayout(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.username = "YourWSUser" - client.password = "YourWSPassword" - client.platform = "test" - client.review_payout_username = "YourReviewPayoutUser" - client.review_payout_password = "YourReviewPayoutPassword" - client.store_payout_username = "YourStorePayoutUser" - client.store_payout_password = "YourStorePayoutPassword" - payout_url = adyen.payout.initialization_api.baseUrl - - def test_confirm_success(self): - request = { - "merchantAccount": "YourMerchantAccount", - "originalReference": "YourReference" - } - resp = 'test/mocks/payout/confirm-success.json' - self.adyen.client = self.test.create_client_from_file(200, request, resp) - result = self.adyen.payout.reviewing_api.confirm_third_party(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.payout_url}/confirmThirdParty', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - username='YourWSUser', - password='YourWSPassword', - ) - self.assertIsNotNone(result.message['pspReference']) - expected = "[payout-confirm-received]" - self.assertEqual(expected, result.message['resultCode']) - - def test_confirm_missing_reference(self): - request = { - "merchantAccount": "YourMerchantAccount", - "originalReference": "" - } - resp = 'test/mocks/payout/confirm-missing-reference.json' - self.adyen.client = self.test.create_client_from_file(500, request, resp) - self.assertRaisesRegex( - Adyen.AdyenAPICommunicationError, - "AdyenAPICommunicationError:{'status': 500, 'errorCode': '702', 'message': \"Required field 'merchantAccount' is null\", 'errorType': 'validation'}", - self.adyen.payout.reviewing_api.confirm_third_party, - request - ) - - def test_decline_success(self): - request = { - "merchantAccount": "YourMerchantAccount", - "originalReference": "YourReference" - } - resp = 'test/mocks/payout/decline-success.json' - self.adyen.client = self.test.create_client_from_file(200, request, resp) - result = self.adyen.payout.reviewing_api.decline_third_party(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.payout_url}/declineThirdParty', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - username='YourWSUser', - password='YourWSPassword', - ) - self.assertIsNotNone(result.message['pspReference']) - expected = "[payout-decline-received]" - self.assertEqual(expected, result.message['resultCode']) - - def test_decline_missing_reference(self): - request = { - "merchantAccount": "YourMerchantAccount", - "originalReference": "" - } - resp = 'test/mocks/payout/decline-missing-reference.json' - self.adyen.client = self.test.create_client_from_file(500, request, resp) - self.assertRaisesRegex( - Adyen.AdyenAPICommunicationError, - "AdyenAPICommunicationError:{'status': 500, 'errorCode': '702', 'message': \"Required field 'merchantAccount' is null\", 'errorType': 'validation'}", - self.adyen.payout.reviewing_api.confirm_third_party, - request - ) - - def test_store_detail_bank_success(self): - request = { - "bank": { - "bankName": "AbnAmro", - "bic": "ABNANL2A", - "countryCode": "NL", - "iban": "NL32ABNA0515071439", - "ownerName": "Adyen", - "bankCity": "Amsterdam", - "taxId": "bankTaxId" - }, - "merchantAccount": "YourMerchantAccount", - "recurring": { - "contract": "PAYOUT" - }, - "shopperEmail": "ref@email.com", - "shopperReference": "ref" - } - resp = 'test/mocks/payout/storeDetail-success.json' - self.adyen.client = self.test.create_client_from_file(200, request, resp) - result = self.adyen.payout.initialization_api.store_detail(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.payout_url}/storeDetail', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - username='YourWSUser', - password='YourWSPassword' - ) - self.assertIsNotNone(result.message['pspReference']) - self.assertIsNotNone(result.message['recurringDetailReference']) - expected = "Success" - self.assertEqual(expected, result.message['resultCode']) - - def test_submit_success(self): - request = { - "amount": { - "value": "100000", - "currency": "EUR" - }, - "reference": "payout-test", "recurring": { - "contract": "PAYOUT" - }, - "merchantAccount": "YourMerchantAccount", - "shopperEmail": "ref@email.com", - "shopperReference": "ref", - "selectedRecurringDetailReference": "LATEST" - } - resp = 'test/mocks/payout/submit-success.json' - self.adyen.client = self.test.create_client_from_file(200, request, resp) - result = self.adyen.payout.initialization_api.submit_third_party(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.payout_url}/submitThirdParty', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - username='YourWSUser', - password='YourWSPassword' - ) - self.assertIsNotNone(result.message['pspReference']) - expected = "[payout-submit-received]" - self.assertEqual(expected, result.message['resultCode']) - - def test_submit_invalid_recurring_reference(self): - request = { - "amount": { - "value": "100000", - "currency": "EUR" - }, - "reference": "payout-test", "recurring": { - "contract": "PAYOUT" - }, - "merchantAccount": "YourMerchantAccount", - "shopperEmail": "ref@email.com", - "shopperReference": "ref", - "selectedRecurringDetailReference": "1234" - } - resp = 'test/mocks/payout/submit-invalid-reference.json' - self.adyen.client = self.test.create_client_from_file(422, request, resp) - self.assertRaisesRegex( - Adyen.AdyenAPIUnprocessableEntity, - "AdyenAPIUnprocessableEntity:{'status': 422, 'errorCode': '800'," - " 'message': 'Contract not found', 'errorType': 'validation'}", - self.adyen.payout.initialization_api.submit_third_party, - request - ) - - def test_store_detail_and_submit_missing_reference(self): - request = { - "amount": { - "value": "100000", - "currency": "EUR" - }, - "merchantAccount": "YourMerchantAccount", - "recurring": { - "contract": "PAYOUT" - }, - "shopperEmail": "ref@email.com", - "shopperReference": "ref", - "bank": { - "iban": "NL32ABNA0515071439", - "ownerName": "Adyen", - "countryCode": "NL", - } - } - - resp = 'test/mocks/payout/submit-missing-reference.json' - self.adyen.client = self.test.create_client_from_file(422, request, resp) - - self.assertRaisesRegex( - Adyen.AdyenAPIUnprocessableEntity, - "AdyenAPIUnprocessableEntity:{'status': 422, 'message': 'Contract not found'," - " 'errorCode': '800', 'errorType': 'validation'}", - self.adyen.payout.initialization_api.store_detail_and_submit_third_party, - request - ) - - def test_store_detail_and_submit_missing_payment(self): - request = { - "amount": { - "value": "100000", - "currency": "EUR" - }, - "merchantAccount": "YourMerchantAccount", - "reference": "payout-test", - "recurring": { - "contract": "PAYOUT" - }, - "shopperEmail": "ref@email.com", - "shopperReference": "ref" - } - resp = 'test/mocks/payout/storeDetailAndSubmit-missing-payment.json' - self.adyen.client = self.test.create_client_from_file(422, request, resp) - self.assertRaisesRegex( - Adyen.AdyenAPIUnprocessableEntity, - "AdyenAPIUnprocessableEntity:{'status': 422, 'errorCode': '000'," - " 'message': 'Please supply paymentDetails', 'errorType': 'validation'}", - self.adyen.payout.initialization_api.store_detail_and_submit_third_party, - request - ) - - def test_store_detail_and_submit_invalid_iban(self): - request = { - "amount": { - "value": "100000", - "currency": "EUR" - }, - "merchantAccount": "YourMerchantAccount", - "reference": "payout-test", - "recurring": { - "contract": "PAYOUT" - }, - "shopperEmail": "ref@email.com", - "shopperReference": "ref", - "bank": { - "countryCode": "NL", - "iban": "4111111111111111", - "ownerName": "Adyen", - } - } - resp = 'test/mocks/payout/storeDetailAndSubmit-invalid-iban.json' - self.adyen.client = self.test.create_client_from_file(422, request, resp) - self.assertRaisesRegex( - Adyen.AdyenAPIUnprocessableEntity, - "AdyenAPIUnprocessableEntity:{'status': 422, 'errorCode': '161'," - " 'message': 'Invalid iban', 'errorType': 'validation'}", - self.adyen.payout.initialization_api.store_detail_and_submit_third_party, - request - ) - - def test_store_detail_and_submit_card_success(self): - request = { - "amount": { - "value": "100000", - "currency": "EUR" - }, - "merchantAccount": "YourMerchantAccount", - "reference": "payout-test", - "recurring": { - "contract": "PAYOUT" - }, - "shopperEmail": "ref@email.com", - "shopperReference": "ref", - "card": { - "number": "4111111111111111", - "expiryMonth": "08", - "expiryYear": "2018", - "cvc": "737", - "holderName": "John Smith" - } - } - resp = 'test/mocks/payout/storeDetailAndSubmit-card-success.json' - self.adyen.client = self.test.create_client_from_file(200, request, resp) - result = self.adyen.payout.initialization_api.store_detail_and_submit_third_party(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.payout_url}/storeDetailAndSubmitThirdParty', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - username='YourWSUser', - password='YourWSPassword' - ) - self.assertIsNotNone(result.message['pspReference']) - expected = "[payout-submit-received]" - self.assertEqual(expected, result.message['resultCode']) - - def test_store_detail_and_submit_bank_success(self): - request = { - "amount": { - "value": "100000", - "currency": "EUR" - }, - "bank": { - "countryCode": "NL", - "iban": "NL32ABNA0515071439", - "ownerName": "Adyen", - }, - "merchantAccount": "YourMerchantAccount", - "recurring": { - "contract": "PAYOUT" - }, - "reference": "YourReference", - "shopperEmail": "ref@email.com", - "shopperReference": "ref" - } - resp = 'test/mocks/payout/storeDetailAndSubmit-bank-success.json' - self.adyen.client = self.test.create_client_from_file(200, request, resp) - result = self.adyen.payout.initialization_api.store_detail_and_submit_third_party(request) - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.payout_url}/storeDetailAndSubmitThirdParty', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - username='YourWSUser', - password='YourWSPassword' - ) - self.assertIsNotNone(result.message['pspReference']) - expected = "[payout-submit-received]" - self.assertEqual(expected, result.message['resultCode']) - - -TestThirdPartyPayout.client.http_force = "requests" -suite = unittest.TestLoader().loadTestsFromTestCase(TestThirdPartyPayout) -unittest.TextTestRunner(verbosity=2).run(suite) -TestThirdPartyPayout.client.http_force = "pycurl" -TestThirdPartyPayout.client.http_init = False -suite = unittest.TestLoader().loadTestsFromTestCase(TestThirdPartyPayout) -unittest.TextTestRunner(verbosity=2).run(suite) -TestThirdPartyPayout.client.http_force = "other" -TestThirdPartyPayout.client.http_init = False -suite = unittest.TestLoader().loadTestsFromTestCase(TestThirdPartyPayout) -unittest.TextTestRunner(verbosity=2).run(suite) diff --git a/test/TransfersTest.py b/test/TransfersTest.py deleted file mode 100644 index 4e2c42c6..00000000 --- a/test/TransfersTest.py +++ /dev/null @@ -1,91 +0,0 @@ -import Adyen -import unittest -from Adyen import settings - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class TestManagement(unittest.TestCase): - adyen = Adyen.Adyen() - - client = adyen.client - test = BaseTest(adyen) - client.xapikey = "YourXapikey" - client.platform = "test" - transfers_url = adyen.transfers.transfers_api.baseUrl - - def test_transfer_fund(self): - request = { - "amount": { - "value": 110000, - "currency": "EUR" - }, - "balanceAccountId": "BAB8B2C3D4E5F6G7H8D9J6GD4", - "category": "bank", - "counterparty": { - "bankAccount": { - "accountHolder": { - "fullName": "A. Klaassen", - "address": { - "city": "San Francisco", - "country": "US", - "postalCode": "94678", - "stateOrProvince": "CA", - "street": "Brannan Street", - "street2": "274" - } - } - }, - "accountIdentification": { - "type": "numberAndBic", - "accountNumber": "123456789", - "bic": "BOFAUS3NXXX" - } - }, - "priority": "wire", - "referenceForBeneficiary": "Your reference sent to the beneficiary", - "reference": "Your internal reference for the transfer", - "description": "Your description for the transfer" - } - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/transfers/" - "make-transfer-response.json") - result = self.adyen.transfers.transfers_api.transfer_funds(request) - - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'{self.transfers_url}/transfers', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_get_all_transactions(self): - self.adyen.client = self.test.create_client_from_file(200, None, "test/mocks/transfers/" - "get-all-transactions.json") - - result = self.adyen.transfers.transactions_api.get_all_transactions() - self.adyen.client.http_client.request.assert_called_once_with( - 'GET', - f'{self.transfers_url}/transactions', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=None, - xapikey="YourXapikey" - ) - - def test_get_transaction(self): - transacion_id="123" - self.adyen.client = self.test.create_client_from_file(200, None, "test/mocks/transfers/" - "get-transaction.json") - result = self.adyen.transfers.transactions_api.get_transaction(transacion_id) - self.adyen.client.http_client.request.assert_called_once_with( - 'GET', - f'{self.transfers_url}/transactions/{transacion_id}', - headers={'adyen-library-name': 'adyen-python-api-library', 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': 'adyen-python-api-library/' + settings.LIB_VERSION}, - json=None, - xapikey="YourXapikey" - ) - diff --git a/test/UtilTest.py b/test/UtilTest.py deleted file mode 100644 index 429d18c5..00000000 --- a/test/UtilTest.py +++ /dev/null @@ -1,185 +0,0 @@ -import unittest -from json import load -import Adyen -from Adyen import settings -from Adyen.util import ( - generate_notification_sig, - is_valid_hmac_payload, - is_valid_hmac_notification, - get_query -) - -try: - from BaseTest import BaseTest -except ImportError: - from .BaseTest import BaseTest - - -class UtilTest(unittest.TestCase): - adyen = Adyen.Adyen() - client = adyen.client - - def test_notification_request_item_hmac(self): - request = { - "pspReference": "7914073381342284", - "merchantReference": "TestPayment-1407325143704", - "merchantAccountCode": "TestMerchant", - "amount": { - "currency": "EUR", - "value": 1130 - }, - "eventCode": "AUTHORISATION", - "success": "true", - "eventDate": "2019-05-06T17:15:34.121+02:00", - "operations": [ - "CANCEL", - "CAPTURE", - "REFUND" - ], - "paymentMethod": "visa", - } - key = "44782DEF547AAA06C910C43932B1EB0C" \ - "71FC68D9D0C057550C48EC2ACF6BA056" - hmac_calculation = generate_notification_sig(request, key) - hmac_calculation_str = hmac_calculation.decode("utf-8") - expected_hmac = "coqCmt/IZ4E3CzPvMY8zTjQVL5hYJUiBRg8UU+iCWo0=" - self.assertTrue(hmac_calculation_str != "") - self.assertEqual(hmac_calculation_str, expected_hmac) - request['additionalData'] = {'hmacSignature': hmac_calculation_str} - hmac_validate = is_valid_hmac_notification(request, key) - self.assertIn('additionalData', request) - self.assertDictEqual(request['additionalData'], - {'hmacSignature': hmac_calculation_str}) - self.assertTrue(hmac_validate) - - def test_webhooks_with_slashes(self): - hmac_key = "74F490DD33F7327BAECC88B2947C011FC02D014A473AAA33A8EC93E4DC069174" - with open('test/mocks/util/backslash_notification.json') as file: - backslash_notification = load(file) - self.assertTrue(is_valid_hmac_notification(backslash_notification, hmac_key)) - with open('test/mocks/util/colon_notification.json') as file: - colon_notification = load(file) - self.assertTrue(is_valid_hmac_notification(colon_notification, hmac_key)) - with open('test/mocks/util/forwardslash_notification.json') as file: - forwardslash_notification = load(file) - self.assertTrue(is_valid_hmac_notification(forwardslash_notification, hmac_key)) - with open('test/mocks/util/mixed_notification.json') as file: - mixed_notification = load(file) - self.assertTrue(is_valid_hmac_notification(mixed_notification, hmac_key)) - - def test_query_string_creation(self): - query_parameters = { - "pageSize": 7, - "pageNumber": 3 - } - query_string = get_query(query_parameters) - self.assertEqual(query_string, '?pageSize=7&pageNumber=3') - - def test_passing_xapikey_in_method(self): - request = {'merchantAccount': "YourMerchantAccount"} - self.test = BaseTest(self.adyen) - self.client.platform = "test" - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "paymentmethods" - "-success.json") - result = self.adyen.checkout.payments_api.payment_methods(request, xapikey="YourXapikey") - self.assertEqual("AliPay", result.message['paymentMethods'][0]['name']) - self.assertEqual("Credit Card", - result.message['paymentMethods'][2]['name']) - self.assertEqual("Credit Card via AsiaPay", - result.message['paymentMethods'][3]['name']) - - def test_custom_version(self): - self.client.api_checkout_version = 60 - request = {'merchantAccount': "YourMerchantAccount"} - self.test = BaseTest(self.adyen) - self.client.platform = "test" - self.adyen.client = self.test.create_client_from_file(200, request, - "test/mocks/" - "checkout/" - "paymentmethods" - "-success.json") - result = self.adyen.checkout.payments_api.payment_methods(request, xapikey="YourXapikey") - self.adyen.client.http_client.request.assert_called_once_with( - 'POST', - f'https://checkout-test.adyen.com/v{self.client.api_checkout_version}/paymentMethods', - headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, - json=request, - xapikey="YourXapikey" - ) - - def test_is_valid_hmac_notification_removes_additional_data(self): - notification = { - "live": "false", - "notificationItems": [ - { - "NotificationRequestItem": { - "additionalData": { - "hmacSignature": "11aa", - "fraudResultType": "GREEN", - "fraudManualReview": "false", - "totalFraudScore": "75" - }, - "amount": { - "currency": "USD", - "value": 10000 - }, - "success": "true" - - } - } - ]} - is_valid_hmac_notification(notification, "11aa") - self.assertIsNotNone(notification['notificationItems'][0]['NotificationRequestItem']['additionalData']) - - def test_is_valid_hmac_payload(self): - - payload = ''' - { - "type": "merchant.created", - "environment": "test", - "createdAt": "01-01-2024", - "data": { - "capabilities": { - "sendToTransferInstrument": { - "requested": true, - "requestedLevel": "notApplicable" - } - }, - "companyId": "YOUR_COMPANY_ID", - "merchantId": "YOUR_MERCHANT_ACCOUNT", - "status": "PreActive" - } - } - ''' - hmac_key = "44782DEF547AAA06C910C43932B1EB0C71FC68D9D0C057550C48EC2ACF6BA056" - expected_hmac = "fX74xUdztFmaXAn3IusMFFUBUSkLmDQUK0tm8xL6ZTU=" - - self.assertTrue(is_valid_hmac_payload(expected_hmac, hmac_key, payload.encode("utf-8"))) - - def test_is_invalid_hmac_payload(self): - payload = ''' - { - "type": "merchant.created", - "environment": "test", - "createdAt": "01-01-2024", - "data": { - "capabilities": { - "sendToTransferInstrument": { - "requested": true, - "requestedLevel": "notApplicable" - } - }, - "companyId": "YOUR_COMPANY_ID", - "merchantId": "YOUR_MERCHANT_ACCOUNT", - "status": "PreActive" - } - } - ''' - - hmac_key = "44782DEF547AAA06C910C43932B1EB0C71FC68D9D0C057550C48EC2ACF6BA056" - expected_hmac = "MismatchingHmacKey=" - - self.assertFalse(is_valid_hmac_payload(expected_hmac, hmac_key, payload.encode("utf-8"))) diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 00000000..5a659094 --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,144 @@ +import pytest +import json +import Adyen +from unittest import mock +import http.server +import threading +import socket + +import os + +class MockHandler(http.server.BaseHTTPRequestHandler): + def _respond_from_file(self, filename): + if not filename: + return None + + # Try to find the file + if not os.path.exists(filename): + self.send_response(404) + self.end_headers() + self.wfile.write(f"Mock file not found: {filename}".encode()) + return True + + with open(filename, 'rb') as f: + content = f.read() + + self.send_response(200) + self.send_header('Content-Type', 'application/json') + self.end_headers() + self.wfile.write(content) + return True + + def handle_request(self): + # Allow tests to specify a mock file via header + mock_file = self.headers.get('X-Mock-File') + if mock_file and self._respond_from_file(mock_file): + return + + if self.path == "/slow-endpoint": + import time + threading.Event().wait(0.5) + + self.send_response(200) + self.send_header('Content-Type', 'application/json') + self.end_headers() + + response = { + "status": "success", + "method": self.command, + "path": self.path, + "received_headers": dict(self.headers) + } + + # Read body if present + content_length = int(self.headers.get('Content-Length', 0)) + if content_length > 0: + post_data = self.rfile.read(content_length) + try: + response["received_body"] = json.loads(post_data.decode('utf-8')) + except: + response["received_body"] = post_data.decode('utf-8') + + self.wfile.write(json.dumps(response).encode('utf-8')) + + def do_POST(self): + self.handle_request() + + def do_PATCH(self): + self.handle_request() + + def do_GET(self): + self.handle_request() + + def do_DELETE(self): + self.handle_request() + + def log_message(self, format, *args): + return + +@pytest.fixture(scope="session") +def mock_server(): + """Starts a local HTTP server for integration testing backends.""" + server = http.server.HTTPServer(('localhost', 0), MockHandler) + port = server.server_port + thread = threading.Thread(target=server.serve_forever) + thread.daemon = True + thread.start() + yield f"http://localhost:{port}" + server.shutdown() + server.server_close() + +@pytest.fixture +def mock_server_client(mock_server): + """Provides an Adyen instance configured to use the real HTTP stack against the mock server.""" + def _create_integration_client(mock_file=None, backend="requests"): + ady = Adyen.Adyen() + ady.client.xapikey = "TEST_XAPI_KEY" + ady.client.platform = "test" + ady.client.http_force = backend + + # Override the base URLs to point to our mock server + # We need to catch calls and redirect them + # A simple way is to use a prefix or just point everything to mock_server + + # We can pass the mock file via a header parameter in the actual call + header_params = {} + if mock_file: + header_params['X-Mock-File'] = mock_file + + return ady, header_params + + return _create_integration_client + +@pytest.fixture +def adyen_instance(): + """Returns a fresh Adyen instance for each test.""" + ady = Adyen.Adyen() + # xapikey and platform can be set by individual tests if needed + ady.client.platform = "test" + return ady + +@pytest.fixture +def mock_client(adyen_instance): + """Fixture that provides a function to mock the Adyen client from a file.""" + def _create_client_from_file(status, request, filename=None): + if filename: + with open(filename) as data_file: + data = json.load(data_file) + with open(filename) as st: + strjson = st.read() + else: + data = {} + strjson = "" + + # Ensure the actual http_client instance is initialized + if not adyen_instance.client.http_init: + adyen_instance.client._init_http_client() + + adyen_instance.client.http_init = True + adyen_instance.client.http_client.request = mock.MagicMock( + return_value=[strjson, request, status, data]) + + return adyen_instance.client + + return _create_client_from_file diff --git a/test/methodNamesTests/checkoutTest.py b/test/methodNamesTests/checkoutTest.py deleted file mode 100644 index 220612eb..00000000 --- a/test/methodNamesTests/checkoutTest.py +++ /dev/null @@ -1,104 +0,0 @@ -import unittest -from Adyen import checkout - - -class TestClassicCheckoutSDKApi(unittest.TestCase): - client = checkout.classic_checkout_sdk_api - - def test_payment_session(self): - self.assertIsNotNone(self.client.payment_session) - - def test_verify_payment_result(self): - self.assertIsNotNone(self.client.verify_payment_result) - - -class TestModificationsApi(unittest.TestCase): - client = checkout.modifications_api - - def test_cancel_authorised_payment(self): - self.assertIsNotNone(self.client.cancel_authorised_payment) - - def test_update_authorised_amount(self): - self.assertIsNotNone(self.client.update_authorised_amount) - - def test_cancel_authorised_payment_by_psp_reference(self): - self.assertIsNotNone(self.client.cancel_authorised_payment_by_psp_reference) - - def test_capture_authorised_payment(self): - self.assertIsNotNone(self.client.capture_authorised_payment) - - def test_refund_captured_payment(self): - self.assertIsNotNone(self.client.refund_captured_payment) - - def test_refund_or_cancel_payment(self): - self.assertIsNotNone(self.client.refund_or_cancel_payment) - - -class TestOrdersApi(unittest.TestCase): - client = checkout.orders_api - - def test_orders(self): - self.assertIsNotNone(self.client.orders) - - def test_cancel_order(self): - self.assertIsNotNone(self.client.cancel_order) - - def test_get_balance_of_gift_card(self): - self.assertIsNotNone(self.client.get_balance_of_gift_card) - - -class TestPaymentLinksApi(unittest.TestCase): - client = checkout.payment_links_api - - def test_get_payment_link(self): - self.assertIsNotNone(self.client.get_payment_link) - - def test_update_payment_link(self): - self.assertIsNotNone(self.client.update_payment_link) - - def test_payment_links(self): - self.assertIsNotNone(self.client.payment_links) - - -class TestPaymentsApi(unittest.TestCase): - client = checkout.payments_api - - def test_card_details(self): - self.assertIsNotNone(self.client.card_details) - - def test_donations(self): - self.assertIsNotNone(self.client.donations) - - def test_payment_methods(self): - self.assertIsNotNone(self.client.payment_methods) - - def test_payments(self): - self.assertIsNotNone(self.client.payments) - - def test_payments_details(self): - self.assertIsNotNone(self.client.payments_details) - - def test_sessions(self): - self.assertIsNotNone(self.client.sessions) - - -class TestRecurringApi(unittest.TestCase): - client = checkout.recurring_api - - def test_delete_token_for_stored_payment_details(self): - self.assertIsNotNone(self.client.delete_token_for_stored_payment_details) - - def test_get_tokens_for_stored_payment_details(self): - self.assertIsNotNone(self.client.get_tokens_for_stored_payment_details) - - -class TestUtilityApi(unittest.TestCase): - client = checkout.utility_api - - def test_get_apple_pay_session(self): - self.assertIsNotNone(self.client.get_apple_pay_session) - - def test_origin_keys(self): - self.assertIsNotNone(self.client.origin_keys) - - diff --git a/test/methodNamesTests/test_checkout_methods.py b/test/methodNamesTests/test_checkout_methods.py new file mode 100644 index 00000000..6a730d9f --- /dev/null +++ b/test/methodNamesTests/test_checkout_methods.py @@ -0,0 +1,47 @@ +def test_checkout_api_structure(adyen_instance): + checkout = adyen_instance.checkout + assert checkout.donations_api is not None + assert checkout.modifications_api is not None + assert checkout.orders_api is not None + assert checkout.payment_links_api is not None + assert checkout.payments_api is not None + assert checkout.recurring_api is not None + assert checkout.utility_api is not None + +def test_modifications_api_methods(adyen_instance): + client = adyen_instance.checkout.modifications_api + assert client.cancel_authorised_payment is not None + assert client.update_authorised_amount is not None + assert client.cancel_authorised_payment_by_psp_reference is not None + assert client.capture_authorised_payment is not None + assert client.refund_captured_payment is not None + assert client.refund_or_cancel_payment is not None + +def test_orders_api_methods(adyen_instance): + client = adyen_instance.checkout.orders_api + assert client.orders is not None + assert client.cancel_order is not None + assert client.get_balance_of_gift_card is not None + +def test_payment_links_api_methods(adyen_instance): + client = adyen_instance.checkout.payment_links_api + assert client.get_payment_link is not None + assert client.update_payment_link is not None + assert client.payment_links is not None + +def test_payments_api_methods(adyen_instance): + client = adyen_instance.checkout.payments_api + assert client.card_details is not None + assert client.payment_methods is not None + assert client.payments is not None + assert client.payments_details is not None + assert client.sessions is not None + +def test_recurring_api_methods(adyen_instance): + client = adyen_instance.checkout.recurring_api + assert client.delete_token_for_stored_payment_details is not None + assert client.get_tokens_for_stored_payment_details is not None + +def test_utility_api_methods(adyen_instance): + client = adyen_instance.checkout.utility_api + assert client.get_apple_pay_session is not None diff --git a/test/test_balance_platform.py b/test/test_balance_platform.py new file mode 100644 index 00000000..7a1dc06e --- /dev/null +++ b/test/test_balance_platform.py @@ -0,0 +1,81 @@ +import pytest + +from Adyen import settings + + +@pytest.fixture +def balance_platform_url(adyen_instance): + return adyen_instance.balancePlatform.platform_api.baseUrl + +def test_creating_balance_account(adyen_instance, mock_client, balance_platform_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "accountHolderId": "AH32272223222B59K6ZKBBFNQ", + "description": "S.Hopper - Main balance account" + } + adyen_instance.client = mock_client(200, request, + "test/mocks/configuration/" + "balance-account-created.json") + result = adyen_instance.balancePlatform.balance_accounts_api.create_balance_account(request) + assert result.message['accountHolderId'] == 'AH32272223222B59K6ZKBBFNQ' + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{balance_platform_url}/balanceAccounts', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_creating_account_holder(adyen_instance, mock_client, balance_platform_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "description": "Liable account holder used for international payments and payouts", + "reference": "S.Eller-001", + "legalEntityId": "LE322JV223222D5GG42KN6869" + } + adyen_instance.client = mock_client(200, request, "test/mocks/configuration/" + "account-holder-created.json") + result = adyen_instance.balancePlatform.account_holders_api.create_account_holder(request) + assert result.message['legalEntityId'] == "LE322JV223222D5GG42KN6869" + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{balance_platform_url}/accountHolders', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_get_balance_platform(adyen_instance, mock_client, balance_platform_url): + adyen_instance.client.xapikey = "YourXapikey" + platform_id = "YOUR_BALANCE_PLATFORM" + adyen_instance.client = mock_client(200, None, "test/mocks/configuration/" + "balance-platform-retrieved.json") + result = adyen_instance.balancePlatform.platform_api.get_balance_platform(platform_id) + assert result.message['id'] == platform_id + adyen_instance.client.http_client.request.assert_called_once_with( + 'GET', + f'{balance_platform_url}/balancePlatforms/{platform_id}', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=None, + xapikey="YourXapikey" + ) + +def test_creating_payment_instrument(adyen_instance, mock_client, balance_platform_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "type": "bankAccount", + "description": "YOUR_DESCRIPTION", + "balanceAccountId": "BA3227C223222B5CTBLR8BWJB", + "issuingCountryCode": "NL" + } + adyen_instance.client = mock_client(200, request, "test/mocks/configuration/" + "business-account-created.json") + result = adyen_instance.balancePlatform.payment_instruments_api.create_payment_instrument(request) + assert result.message["balanceAccountId"] == "BA3227C223222B5CTBLR8BWJB" + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{balance_platform_url}/paymentInstruments', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) diff --git a/test/test_bin_lookup.py b/test/test_bin_lookup.py new file mode 100644 index 00000000..906945f9 --- /dev/null +++ b/test/test_bin_lookup.py @@ -0,0 +1,79 @@ +import pytest + +from Adyen import settings + + +@pytest.fixture +def REQUEST_KWARGS(): + return { + 'merchantAccount': 'YourMerchantAccount', + 'amount': '1000' + } + +@pytest.fixture +def binLookup_version(adyen_instance): + return adyen_instance.binlookup.bin_lookup_api.baseUrl.split('/')[-1] + +def test_get_cost_estimate_success(adyen_instance, mock_client, REQUEST_KWARGS, binLookup_version): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + adyen_instance.client.platform = "test" + + expected = { + 'cardBin': { + 'bin': '458012', + 'commercial': False, + 'fundingSource': 'CHARGE', + 'fundsAvailability': 'N', + 'issuingBank': 'Bank Of America', + 'issuingCountry': 'US', 'issuingCurrency': 'USD', + 'paymentMethod': 'Y', + 'summary': '6789' + }, + 'costEstimateAmount': { + 'currency': 'USD', 'value': 1234 + }, + 'resultCode': 'Success', + 'surchargeType': 'PASSTHROUGH' + } + + adyen_instance.client = mock_client( + status=200, + request=REQUEST_KWARGS, + filename='test/mocks/binlookup/getcostestimate-success.json' + ) + + result = adyen_instance.binlookup.bin_lookup_api.get_cost_estimate(REQUEST_KWARGS) + assert result.message == expected + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + 'https://pal-test.adyen.com/pal/servlet/' + f'BinLookup/{binLookup_version}/getCostEstimate', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json={ + 'merchantAccount': 'YourMerchantAccount', + 'amount': '1000', + }, + password='YourWSPassword', + username='YourWSUser' + ) + +def test_get_cost_estimate_error_mocked(adyen_instance, mock_client, REQUEST_KWARGS): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + adyen_instance.client.platform = "test" + + adyen_instance.client = mock_client( + status=200, + request=REQUEST_KWARGS, + filename=( + "test/mocks/binlookup/" + "getcostestimate-error-invalid-data-422.json" + ) + ) + + result = adyen_instance.binlookup.bin_lookup_api.get_cost_estimate(REQUEST_KWARGS) + assert result.message['status'] == 422 + assert result.message['errorCode'] == "101" + assert result.message['message'] == "Invalid card number" + assert result.message['errorType'] == "validation" diff --git a/test/test_capital.py b/test/test_capital.py new file mode 100644 index 00000000..61db03eb --- /dev/null +++ b/test/test_capital.py @@ -0,0 +1,104 @@ +def test_request_grant(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = {} + adyen_instance.client = mock_client( + 200, + request, + "test/mocks/capital/grants-success.json" + ) + result = adyen_instance.capital.grants_api.request_grant(request) + assert len(result.message['grants']) == 1 + assert result.message['grants'][0]['id'] == "GR00000000000000000000001" + +def test_get_all_grant_offers(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = {} + adyen_instance.client = mock_client( + 200, + request, + "test/mocks/capital/grant-offers-success.json" + ) + result = adyen_instance.capital.grant_offers_api.get_all_grant_offers(request) + assert len(result.message['grantOffers']) == 1 + assert result.message['grantOffers'][0]['id'] == "GO00000000000000000000001" + +def test_get_all_grants(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = {} + adyen_instance.client = mock_client( + 200, + request, + "test/mocks/capital/grants-success.json" + ) + result = adyen_instance.capital.grants_api.get_all_grants(counterparty_account_holder_id="AH00000000000000000000001") + assert len(result.message['grants']) == 1 + assert result.message['grants'][0]['id'] == "GR00000000000000000000001" + +def test_get_grant(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = {} + adyen_instance.client = mock_client( + 200, + request, + "test/mocks/capital/get-grant-success.json" + ) + result = adyen_instance.capital.grants_api.get_grant(grantId="GR00000000000000000000001") + assert result.message['id'] == "GR00000000000000000000001" + +def test_get_all_grant_disbursements(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = {} + adyen_instance.client = mock_client( + 200, + request, + "test/mocks/capital/get-grant-disbursements-success.json" + ) + result = adyen_instance.capital.grants_api.get_all_grant_disbursements(grantId="GR00000000000000000000001") + assert len(result.message['disbursements']) == 1 + assert result.message['disbursements'][0]['id'] == "DI00000000000000000000001" + +def test_get_grant_disbursement(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = {} + adyen_instance.client = mock_client( + 200, + request, + "test/mocks/capital/get-grant-disbursement-success.json" + ) + result = adyen_instance.capital.grants_api.get_grant_disbursement(grantId="GR00000000000000000000001", + disbursementId="DI00000000000000000000001") + assert result.message['id'] == "DI00000000000000000000001" + +def test_update_grant_disbursement(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = {} + adyen_instance.client = mock_client( + 200, + request, + "test/mocks/capital/update-grant-disbursement-success.json" + ) + result = adyen_instance.capital.grants_api.update_grant_disbursement(request, grantId="GR00000000000000000000001", + disbursementId="DI00000000000000000000001") + assert result.message['repayment']['basisPoints'] == 1500 + +def test_get_grant_account_information(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = {} + adyen_instance.client = mock_client( + 200, + request, + "test/mocks/capital/get-grant-account-success.json" + ) + result = adyen_instance.capital.grant_accounts_api.get_grant_account_information(id="CG00000000000000000000001") + assert result.message['id'] == "CG00000000000000000000001" + +def test_get_grant_offer(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = {} + adyen_instance.client = mock_client( + 200, + request, + "test/mocks/capital/get-grant-offer-success.json" + ) + result = adyen_instance.capital.grant_offers_api.get_grant_offer(id="GO00000000000000000000001") + assert result.message['id'] == "GO00000000000000000000001" diff --git a/test/test_checkout.py b/test/test_checkout.py new file mode 100644 index 00000000..9c11c3e0 --- /dev/null +++ b/test/test_checkout.py @@ -0,0 +1,97 @@ +from Adyen import settings + +def test_payment_methods_success_mocked(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = {'merchantAccount': "YourMerchantAccount"} + adyen_instance.client = mock_client(200, request, + "test/mocks/" + "checkout/" + "paymentmethods" + "-success.json") + result = adyen_instance.checkout.payments_api.payment_methods(request) + assert result.message['paymentMethods'][0]['name'] == "AliPay" + assert result.message['paymentMethods'][2]['name'] == "Credit Card" + assert result.message['paymentMethods'][3]['name'] == "Credit Card via AsiaPay" + +def test_payment_methods_error_mocked(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = {'merchantAccount': "YourMerchantAccount"} + adyen_instance.client = mock_client(200, request, + "test/mocks/" + "checkout/" + "paymentmethods-" + "error-forbidden" + "-403.json") + result = adyen_instance.checkout.payments_api.payment_methods(request) + assert result.message['status'] == 403 + assert result.message['errorCode'] == "901" + assert result.message['message'] == "Invalid Merchant Account" + assert result.message['errorType'] == "security" + +def test_payments_success_mocked(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = { + 'amount': {"value": "100000", "currency": "EUR"}, + 'reference': "123456", + 'paymentMethod': { + "type": "scheme", + "number": "4111111111111111", + "expiryMonth": "08", + "expiryYear": "2018", + "holderName": "John Smith", + "cvc": "737" + }, + 'merchantAccount': "YourMerchantAccount", + 'returnUrl': "https://your-company.com/..." + } + + adyen_instance.client = mock_client(200, request, + "test/mocks/" + "checkout/" + "payments" + "-success" + ".json") + result = adyen_instance.checkout.payments_api.payments(request) + assert result.message['pspReference'] == "8535296650153317" + assert result.message['resultCode'] == "Authorised" + assert result.message["additionalData"]['expiryDate'] == "8/2018" + assert result.message["additionalData"]['fraudResultType'] == "GREEN" + +def test_payments_error_mocked(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = { + 'amount': {"value": "100000", "currency": "EUR"}, + 'reference': "54431", + 'paymentMethod': { + "type": "scheme", + "number": "4111111111111111", + "expiryMonth": "08", + "expiryYear": "2018", + "holderName": "John Smith", + "cvc": "737" + }, + 'merchantAccount': "YourMerchantAccount", + 'returnUrl': "https://your-company.com/..." + } + + adyen_instance.client = mock_client(200, request, + "test/mocks/" + "checkout/" + "payments-error" + "-invalid" + "-data-422" + ".json") + result = adyen_instance.checkout.payments_api.payments(request) + + baseUrl = adyen_instance.checkout.payments_api.baseUrl + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{baseUrl}/payments', + headers={ + 'adyen-library-name': settings.LIB_NAME, + 'adyen-library-version': settings.LIB_VERSION, + 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION + }, + json=request, + xapikey="YourXapikey" + ) diff --git a/test/test_checkout_utility.py b/test/test_checkout_utility.py new file mode 100644 index 00000000..dd820bbe --- /dev/null +++ b/test/test_checkout_utility.py @@ -0,0 +1,56 @@ +import pytest + + +@pytest.fixture +def checkout_utility_url(adyen_instance): + return adyen_instance.checkout.utility_api.baseUrl + +def test_origin_keys_success_mocked(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "originDomains": [ + "https://www.your-domain1.com", + "https://www.your-domain2.com", + "https://www.your-domain3.com" + ] + } + + adyen_instance.client = mock_client(200, request, + "test/mocks/" + "checkoututility/" + "originkeys" + "-success.json") + result = adyen_instance.checkout.utility_api.origin_keys(request) + + assert result.message['originKeys']['https://www.your-domain1.com'] == \ + "pub.v2.7814286629520534.aHR0cHM6Ly93d3cu" \ + "eW91ci1kb21haW4xLmNvbQ.UEwIBmW9-c_uXo5wS" \ + "Er2w8Hz8hVIpujXPHjpcEse3xI" + + assert result.message['originKeys']['https://www.your-domain3.com'] == \ + "pub.v2.7814286629520534.aHR0cHM6Ly93d3cu" \ + "eW91ci1kb21haW4zLmNvbQ.fUvflu-YIdZSsLEH8" \ + "Qqmr7ksE4ag_NYiiMXK0s6aq_4" + + assert result.message['originKeys']['https://www.your-domain2.com'] == \ + "pub.v2.7814286629520534.aHR0cHM6Ly93d3cue" \ + "W91ci1kb21haW4yLmNvbQ.EP6eXBJKk0t7-QIUl6e_" \ + "b1qMuMHGepxG_SlUqxAYrfY" + +def test_checkout_utility_api_url_custom(adyen_instance, checkout_utility_url): + url = adyen_instance.client._determine_api_url("test", checkout_utility_url + "/originKeys") + assert url == f"{checkout_utility_url}/originKeys" + +def test_applePay_session(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "displayName": "YOUR_MERCHANT_NAME", + "domainName": "YOUR_DOMAIN_NAME", + "merchantIdentifier": "YOUR_MERCHANT_ID" + } + adyen_instance.client = mock_client(200, request, "test/mocks/" + "checkoututility/" + "applepay-sessions" + "-success.json") + result = adyen_instance.checkout.utility_api.get_apple_pay_session(request) + assert result.message['data'] == "BASE_64_ENCODED_DATA" diff --git a/test/test_client.py b/test/test_client.py new file mode 100644 index 00000000..e3e4660f --- /dev/null +++ b/test/test_client.py @@ -0,0 +1,7 @@ +def test_client_initialization(adyen_instance): + assert adyen_instance.client.platform == "test" + assert adyen_instance.client.http_timeout == 30 + +def test_client_credentials(adyen_instance): + adyen_instance.client.xapikey = "YOUR_API_KEY" + assert adyen_instance.client.xapikey == "YOUR_API_KEY" diff --git a/test/test_data_protection.py b/test/test_data_protection.py new file mode 100644 index 00000000..aeacff81 --- /dev/null +++ b/test/test_data_protection.py @@ -0,0 +1,28 @@ +import pytest + +from Adyen import settings + + +@pytest.fixture +def data_protection_url(adyen_instance): + return adyen_instance.dataProtection.data_protection_api.baseUrl + +def test_data_erasure(adyen_instance, mock_client, data_protection_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + "pspReference": "9915520502347613", + "forceErasure": True + } + adyen_instance.client = mock_client(200, request, + "test/mocks/dataProtection/erasure-response.json") + result = adyen_instance.dataProtection.data_protection_api.request_subject_erasure(request) + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{data_protection_url}' + '/requestSubjectErasure', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + xapikey="YourXapikey", + json=request + ) + assert result.message["result"] == "SUCCESS" diff --git a/test/test_determine_endpoint.py b/test/test_determine_endpoint.py new file mode 100644 index 00000000..07dc0288 --- /dev/null +++ b/test/test_determine_endpoint.py @@ -0,0 +1,147 @@ +import pytest + +from Adyen.exceptions import AdyenEndpointInvalidFormat +from Adyen.services.posMobile import AdyenPosMobileApi + + +@pytest.fixture +def checkout_url(adyen_instance): + return adyen_instance.checkout.payments_api.baseUrl + +@pytest.fixture +def checkout_version(checkout_url): + return checkout_url.split('/')[-1] + +@pytest.fixture +def payment_url(adyen_instance): + return adyen_instance.payment.payments_api.baseUrl + +@pytest.fixture +def payment_version(payment_url): + return payment_url.split('/')[-1] + +@pytest.fixture +def binlookup_url(adyen_instance): + return adyen_instance.binlookup.bin_lookup_api.baseUrl + +@pytest.fixture +def management_url(adyen_instance): + return adyen_instance.management.account_merchant_level_api.baseUrl + +@pytest.fixture +def sessionauth_url(adyen_instance): + return adyen_instance.sessionAuthentication.session_authentication_api.baseUrl + +@pytest.fixture +def sessionauth_version(sessionauth_url): + return sessionauth_url.split('/')[-1] + +@pytest.fixture +def capital_url(adyen_instance): + return adyen_instance.capital.grants_api.baseUrl + +@pytest.fixture +def capital_version(capital_url): + return capital_url.split('/')[-1] + +def test_checkout_api_url_custom(adyen_instance, checkout_url, checkout_version): + adyen_instance.client.live_endpoint_prefix = "1797a841fbb37ca7-AdyenDemo" + url = adyen_instance.client._determine_api_url("live", checkout_url + "/payments") + assert url == f"https://1797a841fbb37ca7-AdyenDemo-checkout-live.adyenpayments.com/checkout/{checkout_version}/payments" + +def test_pos_mobile_api_url_live(adyen_instance): + adyen_instance.client.live_endpoint_prefix = "1797a841fbb37ca7-AdyenDemo" + pos_mobile = AdyenPosMobileApi(adyen_instance.client) + pos_mobile_url = pos_mobile.pos_mobile_api.baseUrl + pos_mobile_version = pos_mobile_url.split('/')[-1] + url = adyen_instance.client._determine_api_url("live", pos_mobile_url + "/sessions") + assert url == f"https://1797a841fbb37ca7-AdyenDemo-checkout-live.adyenpayments.com/checkout/possdk/{pos_mobile_version}/sessions" + +def test_checkout_api_url(adyen_instance, checkout_url): + adyen_instance.client.live_endpoint_prefix = None + url = adyen_instance.client._determine_api_url("test", checkout_url + "/payments/details") + assert url == f"{checkout_url}/payments/details" + +def test_payments_invalid_platform(adyen_instance): + request = { + 'amount': {"value": "100000", "currency": "EUR"}, + "reference": "Your order number", + 'paymentMethod': { + "type": "scheme", + "number": "4111111111111111", + "expiryMonth": "08", + "expiryYear": "2018", + "holderName": "John Smith", + "cvc": "737" + }, + 'merchantAccount': "YourMerchantAccount", + 'returnUrl': "https://your-company.com/..." + } + + adyen_instance.client.platform = "live" + adyen_instance.client.live_endpoint_prefix = None + adyen_instance.client.xapikey = "dummy" + + with pytest.raises(AdyenEndpointInvalidFormat): + adyen_instance.checkout.payments_api.sessions(request) + +def test_pal_url_live_endpoint_prefix_live_platform(adyen_instance, payment_url, payment_version): + adyen_instance.client.live_endpoint_prefix = "1797a841fbb37ca7-AdyenDemo" + url = adyen_instance.client._determine_api_url("live", payment_url + "/payments") + assert url == f"https://1797a841fbb37ca7-AdyenDemo-pal-live.adyenpayments.com/pal/servlet/Payment/{payment_version}/payments" + +def test_pal_url_live_endpoint_prefix_test_platform(adyen_instance, payment_url): + adyen_instance.client.live_endpoint_prefix = "1797a841fbb37ca7-AdyenDemo" + url = adyen_instance.client._determine_api_url("test", payment_url + "/payments") + assert url == f"{payment_url}/payments" + +def test_pal_url_no_live_endpoint_prefix_test_platform(adyen_instance, payment_url): + adyen_instance.client.live_endpoint_prefix = None + url = adyen_instance.client._determine_api_url("test", payment_url + "/payments") + assert url == f"{payment_url}/payments" + +def test_binlookup_url_no_live_endpoint_prefix_test_platform(adyen_instance, binlookup_url): + adyen_instance.client.live_endpoint_prefix = None + url = adyen_instance.client._determine_api_url("test", binlookup_url + "/get3dsAvailability") + assert url == f"{binlookup_url}/get3dsAvailability" + +def test_checkout_api_url_orders(adyen_instance, checkout_url): + adyen_instance.client.live_endpoint_prefix = None + url = adyen_instance.client._determine_api_url("test", checkout_url + "/orders") + assert url == f"{checkout_url}/orders" + +def test_checkout_api_url_order_cancel(adyen_instance, checkout_url): + adyen_instance.client.live_endpoint_prefix = None + url = adyen_instance.client._determine_api_url("test", checkout_url + "/orders/cancel") + assert url == f"{checkout_url}/orders/cancel" + +def test_checkout_api_url_order_payment_methods_balance(adyen_instance, checkout_url): + adyen_instance.client.live_endpoint_prefix = None + url = adyen_instance.client._determine_api_url("test", checkout_url + "/paymentMethods/balance") + assert url == f"{checkout_url}/paymentMethods/balance" + +def test_checkout_api_url_sessions(adyen_instance, checkout_url): + adyen_instance.client.live_endpoint_prefix = None + url = adyen_instance.client._determine_api_url("test", checkout_url + "/sessions") + assert url == f"{checkout_url}/sessions" + +def test_management_api_url_companies(adyen_instance, management_url): + companyId = "YOUR_COMPANY_ID" + url = adyen_instance.client._determine_api_url("test", management_url + f'/companies/{companyId}/users') + assert url == f"{management_url}/companies/{companyId}/users" + +def test_secureauthentication_api_url(adyen_instance, sessionauth_url): + url = adyen_instance.client._determine_api_url("test", sessionauth_url) + assert url == sessionauth_url + +def test_live_secureauthentication_api_url(adyen_instance, sessionauth_url, sessionauth_version): + url = adyen_instance.client._determine_api_url("live", sessionauth_url + "/sessions") + assert url == f"https://authe-live.adyen.com/authe/api/{sessionauth_version}/sessions" + +def test_capital_api_url(adyen_instance, capital_url): + url = adyen_instance.client._determine_api_url("test", capital_url) + assert url == capital_url + +def test_live_capital_api_url(adyen_instance, capital_url, capital_version): + url = adyen_instance.client._determine_api_url("live", capital_url) + assert url == f"https://balanceplatform-api-live.adyen.com/capital/{capital_version}" diff --git a/test/test_disputes.py b/test/test_disputes.py new file mode 100644 index 00000000..c2f51091 --- /dev/null +++ b/test/test_disputes.py @@ -0,0 +1,112 @@ +import pytest + +from Adyen import settings + + +@pytest.fixture +def disputes_url(adyen_instance): + return adyen_instance.disputes.disputes_api.baseUrl + +def test_accept_dispute(adyen_instance, mock_client, disputes_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "disputePspReference": "DZ4DPSHB4WD2WN82", + "merchantAccountCode": "YOUR_MERCHANT_ACCOUNT" + } + adyen_instance.client = mock_client(200, request, + "test/mocks/disputes/" + "post-acceptDispute-accept-dispute-200.json") + result = adyen_instance.disputes.disputes_api.accept_dispute(request) + + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{disputes_url}/acceptDispute', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_defend_dispute(adyen_instance, mock_client, disputes_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "defenseReasonCode": "SupplyDefenseMaterial", + "disputePspReference": "DZ4DPSHB4WD2WN82", + "merchantAccountCode": "YOUR_MERCHANT_ACCOUNT" + } + adyen_instance.client = mock_client(200, request, + "test/mocks/disputes/" + "post-defendDispute-defend-dispute-200.json") + result = adyen_instance.disputes.disputes_api.defend_dispute(request) + + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{disputes_url}/defendDispute', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_delete_defense_dispute_document(adyen_instance, mock_client, disputes_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "defenseDocumentType": "DefenseMaterial", + "disputePspReference": "DZ4DPSHB4WD2WN82", + "merchantAccountCode": "YOUR_MERCHANT_ACCOUNT" + } + adyen_instance.client = mock_client(200, request, + "test/mocks/disputes/" + "post-deleteDisputeDefenseDocument-delete-dispute-defense-document-200.json") + result = adyen_instance.disputes.disputes_api.delete_dispute_defense_document(request) + + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{disputes_url}/deleteDisputeDefenseDocument', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_retrieve_applicable_defense_reasons(adyen_instance, mock_client, disputes_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "disputePspReference": "DZ4DPSHB4WD2WN82", + "merchantAccountCode": "YOUR_MERCHANT_ACCOUNT" + } + adyen_instance.client = mock_client(200, request, + "test/mocks/disputes/" + "post-retrieveApplicableDefenseReasons-retrieve-defense-reasons-200.json") + result = adyen_instance.disputes.disputes_api.retrieve_applicable_defense_reasons(request) + + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{disputes_url}/retrieveApplicableDefenseReasons', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_supply_defense_document(adyen_instance, mock_client, disputes_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "defenseDocuments": [ + { + "content": "JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBv+f/ub0j6JPRX+E3EmC==", + "contentType": "application/pdf", + "defenseDocumentTypeCode": "DefenseMaterial" + } + ], + "disputePspReference": "DZ4DPSHB4WD2WN82", + "merchantAccountCode": "YOUR_MERCHANT_ACCOUNT" + } + adyen_instance.client = mock_client(200, request, + "test/mocks/disputes/" + "post-supplyDefenseDocument-supply-defense-document-200.json") + result = adyen_instance.disputes.disputes_api.supply_defense_document(request) + + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{disputes_url}/supplyDefenseDocument', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) diff --git a/test/test_http_backends.py b/test/test_http_backends.py new file mode 100644 index 00000000..85856c51 --- /dev/null +++ b/test/test_http_backends.py @@ -0,0 +1,76 @@ +import pytest +import Adyen +from Adyen import settings + +@pytest.mark.parametrize("backend", ["requests", "pycurl", "urllib"]) +def test_backend_communication(mock_server, backend): + """Verifies that each HTTP backend correctly places bytes on the wire.""" + ady = Adyen.Adyen() + ady.client.xapikey = "TEST_XAPI_KEY" + ady.client.platform = "test" + ady.client.http_force = backend + + # We use a custom endpoint to point to our local mock server + # Since we are testing the httpclient directly, we can call it from the client + if not ady.client.http_init: + ady.client._init_http_client() + + request_data = {"test": "data"} + headers = {"Custom-Header": "Value"} + + # We call the http_client.request directly to avoid URL determination logic + # which might prepend adyen domains. + result, raw_request, status_code, response_headers = ady.client.http_client.request( + "POST", + f"{mock_server}/test-endpoint", + json=request_data, + headers=headers, + xapikey="TEST_XAPI_KEY" + ) + + import json + response_data = json.loads(result) + + assert status_code == 200 + assert response_data["method"] == "POST" + assert response_data["path"] == "/test-endpoint" + assert response_data["received_body"] == request_data + + # Verify common headers + received_headers = {k.lower(): v for k, v in response_data["received_headers"].items()} + assert received_headers["x-api-key"] == "TEST_XAPI_KEY" + assert "adyen-python-api-library" in received_headers["user-agent"] + assert received_headers["custom-header"] == "Value" + +def test_backend_with_real_mock_file(mock_server, mock_server_client): + """Verifies that backends can handle real mock responses served from files.""" + mock_file = "test/mocks/checkout/paymentmethods-success.json" + ady, headers = mock_server_client(mock_file=mock_file) + + # We manually set the base URL to our mock server for this service + ady.checkout.payments_api.baseUrl = f"{mock_server}/checkout/v71" + + result = ady.checkout.payments_api.payment_methods( + {"merchantAccount": "Test"}, + header_parameters=headers + ) + + # Verify the data came from the JSON file + assert result.message['paymentMethods'][0]['name'] == "AliPay" + assert result.status_code == 200 + + """Verifies that timeouts are handled (using a non-responsive endpoint if possible).""" + # This is a bit harder with http.server as it is single-threaded and handles one request at a time. + # But we can verify that the timeout parameter is at least passed correctly. + ady = Adyen.Adyen() + ady.client.http_timeout = 0.001 + ady.client.http_force = "requests" + ady.client._init_http_client() + + # We expect a timeout error from the backend + with pytest.raises(Exception): + ady.client.http_client.request( + "GET", + f"{mock_server}/slow-endpoint", + xapikey="TEST_XAPI_KEY" + ) diff --git a/test/test_http_client.py b/test/test_http_client.py new file mode 100644 index 00000000..8ba9b0d9 --- /dev/null +++ b/test/test_http_client.py @@ -0,0 +1,45 @@ +from Adyen import settings + +def test_user_agent_without_application_name(adyen_instance, mock_client): + adyen_instance.client.xapikey = "TEST_XAPI_KEY" + # Mock the http_client.request method + mock_client(200, {}, "test/mocks/checkout/paymentmethods-success.json") + + # Call a dummy API method + _ = adyen_instance.checkout.payments_api.payment_methods({}) + + # Assert that http_client.request was called with the correct headers + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{adyen_instance.checkout.payments_api.baseUrl}/paymentMethods', + headers={ + 'adyen-library-name': settings.LIB_NAME, + 'adyen-library-version': settings.LIB_VERSION, + 'User-Agent': settings.LIB_NAME + "/" + settings.LIB_VERSION + }, + json={}, + xapikey='TEST_XAPI_KEY' + ) + +def test_user_agent_with_application_name(adyen_instance, mock_client): + adyen_instance.client.xapikey = "TEST_XAPI_KEY" + adyen_instance.client.application_name = "MyTestApp" + + # Mock the http_client.request method + mock_client(200, {}, "test/mocks/checkout/paymentmethods-success.json") + + # Call a dummy API method + _ = adyen_instance.checkout.payments_api.payment_methods({}) + + # Assert that http_client.request was called with the correct headers + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{adyen_instance.checkout.payments_api.baseUrl}/paymentMethods', + headers={ + 'adyen-library-name': settings.LIB_NAME, + 'adyen-library-version': settings.LIB_VERSION, + 'User-Agent': "MyTestApp " + settings.LIB_NAME + "/" + settings.LIB_VERSION + }, + json={}, + xapikey='TEST_XAPI_KEY' + ) diff --git a/test/test_legal_entity_management.py b/test/test_legal_entity_management.py new file mode 100644 index 00000000..10bb7dc0 --- /dev/null +++ b/test/test_legal_entity_management.py @@ -0,0 +1,99 @@ +import pytest + +from Adyen import settings + + +@pytest.fixture +def lem_url(adyen_instance): + return adyen_instance.legalEntityManagement.legal_entities_api.baseUrl + +def test_creating_legal_entity(adyen_instance, mock_client, lem_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "type": "individual", + "individual": { + "residentialAddress": { + "city": "Amsterdam", + "country": "NL", + "postalCode": "1011DJ", + "street": "Simon Carmiggeltstraat 6 - 50" + }, + "name": { + "firstName": "Shelly", + "lastName": "Eller" + }, + "birthData": { + "dateOfBirth": "1990-06-21" + }, + "email": "s.eller@example.com" + } + } + adyen_instance.client = mock_client(200, request, + "test/mocks/legalEntityManagement/" + "individual_legal_entity_created.json") + result = adyen_instance.legalEntityManagement.legal_entities_api.create_legal_entity(request) + assert result.message['individual']['name']['firstName'] == 'Shelly' + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{lem_url}/legalEntities', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_get_transfer_instrument(adyen_instance, mock_client, lem_url): + adyen_instance.client.xapikey = "YourXapikey" + instrumentId = "SE322JV223222F5GNXSR89TMW" + adyen_instance.client = mock_client(200, None, "test/mocks/legalEntityManagement/" + "details_of_trainsfer_instrument.json") + result = adyen_instance.legalEntityManagement.transfer_instruments_api.get_transfer_instrument(instrumentId) + assert result.message['id'] == instrumentId + adyen_instance.client.http_client.request.assert_called_once_with( + 'GET', + f'{lem_url}/transferInstruments/{instrumentId}', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=None, + xapikey="YourXapikey" + ) + +def test_update_business_line(adyen_instance, mock_client, lem_url): + adyen_instance.client.xapikey = "YourXapikey" + businessLineId = "SE322JV223222F5GVGMLNB83F" + request = { + "industryCode": "55", + "webData": [ + { + "webAddress": "https://www.example.com" + } + ] + } + adyen_instance.client = mock_client(200, request, "test/mocks/legalEntityManagement/" + "business_line_updated.json") + result = adyen_instance.legalEntityManagement.business_lines_api.update_business_line(request, businessLineId) + assert result.message['id'] == businessLineId + adyen_instance.client.http_client.request.assert_called_once_with( + 'PATCH', + f'{lem_url}/businessLines/{businessLineId}', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_accept_terms_of_service(adyen_instance, mock_client, lem_url): + adyen_instance.client.xapikey = "YourXapikey" + legalEntityId = "legalId" + documentId = "documentId" + request = { + 'acceptedBy': "UserId", + 'ipAddress': "UserIpAddress" + } + adyen_instance.client = mock_client(204, request) + adyen_instance.legalEntityManagement.terms_of_service_api.accept_terms_of_service(request, legalEntityId, + documentId) + adyen_instance.client.http_client.request.assert_called_once_with( + 'PATCH', + f'{lem_url}/legalEntities/{legalEntityId}/termsOfService/{documentId}', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) diff --git a/test/test_management.py b/test/test_management.py new file mode 100644 index 00000000..b3ff0d17 --- /dev/null +++ b/test/test_management.py @@ -0,0 +1,112 @@ +import pytest + +from Adyen import settings + + +@pytest.fixture +def management_url(adyen_instance): + return adyen_instance.management.my_api_credential_api.baseUrl + +def test_get_company_account(adyen_instance, mock_client, management_url): + adyen_instance.client.xapikey = "YourXapikey" + request = None + company_id = "YOUR_COMPANY_ACCOUNT" + adyen_instance.client = mock_client(200, request, + "test/mocks/" + "management/" + "get_company_account" + ".json") + + result = adyen_instance.management.account_company_level_api.get_company_account(companyId=company_id) + + assert result.message['id'] == company_id + adyen_instance.client.http_client.request.assert_called_once_with( + 'GET', + f'{management_url}/companies/{company_id}', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=None, + xapikey="YourXapikey" + ) + +def test_my_api_credential_api(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = {"domain": "YOUR_DOMAIN"} + adyen_instance.client = mock_client(200, request, + "test/mocks/" + "management/" + "post_me_allowed" + "_origins.json") + + result = adyen_instance.management.my_api_credential_api.add_allowed_origin(request) + + assert result.message['domain'] == "YOUR_DOMAIN" + +def test_no_content(adyen_instance, mock_client, management_url): + adyen_instance.client.xapikey = "YourXapikey" + adyen_instance.client = mock_client(204, {}, + "test/mocks/" + "management/" + "no_content.json") + origin_id = 'YOUR_DOMAIN_ID' + + adyen_instance.management.my_api_credential_api.remove_allowed_origin(origin_id) + + adyen_instance.client.http_client.request.assert_called_once_with( + 'DELETE', + f'{management_url}/me/allowedOrigins/{origin_id}', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=None, + xapikey="YourXapikey" + ) + +def test_update_store(adyen_instance, mock_client, management_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "address": { + "line1": "1776 West Pinewood Avenue", + "line2": "Heartland Building", + "line3": "", + "postalCode": "20251" + } + } + adyen_instance.client = mock_client(200, request, + "test/mocks/" + "management/" + "update_a_store" + ".json") + store_id = "YOUR_STORE_ID" + merchant_id = "YOUR_MERCHANT_ACCOUNT_ID" + + result = adyen_instance.management.account_store_level_api.update_store(request, merchant_id, store_id) + + adyen_instance.client.http_client.request.assert_called_once_with( + 'PATCH', + f'{management_url}/merchants/{merchant_id}/stores/{store_id}', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + assert result.message['id'] == store_id + assert result.message['address']['line1'] == "1776 West Pinewood Avenue" + +def test_reassign_terminal(adyen_instance, mock_client, management_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + 'storeId': 'ST123ABC', + 'inventory': False, + } + adyen_instance.client = mock_client(200, request) + terminal_id = "AMS1-2345" + + result = adyen_instance.management.terminals_terminal_level_api.reassign_terminal(request, terminal_id) + + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{management_url}/terminals/{terminal_id}/reassign', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + assert result.status_code == 200 + assert result.message == {} + diff --git a/test/test_modification.py b/test/test_modification.py new file mode 100644 index 00000000..5f1f35b4 --- /dev/null +++ b/test/test_modification.py @@ -0,0 +1,98 @@ +import pytest +import Adyen + +def test_capture_success(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + 'merchantAccount': "YourMerchantAccount", + 'reference': "YourReference", + 'modificationAmount': {"value": "1234", "currency": "EUR"}, + 'originalReference': "YourOriginalReference" + } + adyen_instance.client = mock_client(200, request, + 'test/mocks/' + 'capture-success' + '.json') + result = adyen_instance.payment.modifications_api.capture(request) + assert result.message['response'] == "[capture-received]" + +def test_capture_error_167(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + 'merchantAccount': "YourMerchantAccount", + 'reference': "YourReference", + 'modificationAmount': {"value": "1234", "currency": "EUR"}, + 'originalReference': "YourOriginalReference" + } + adyen_instance.client = mock_client(422, request, + 'test/mocks/' + 'capture-error-167' + '.json') + with pytest.raises(Adyen.AdyenAPIUnprocessableEntity) as excinfo: + adyen_instance.payment.modifications_api.capture(request) + assert "Original pspReference required for this operation" in str(excinfo.value) + +def test_cancel_or_refund_received(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + 'merchantAccount': "YourMerchantAccount", + 'reference': "YourReference", + 'originalReference': "YourOriginalReference" + } + adyen_instance.client = mock_client(200, request, + 'test/mocks/' + 'cancelOrRefund' + '-received.json') + result = adyen_instance.payment.modifications_api.cancel_or_refund(request) + assert result.message['response'] == "[cancelOrRefund-received]" + +def test_refund_received(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + 'merchantAccount': "YourMerchantAccount", + 'reference': "YourReference", + 'originalReference': "YourOriginalReference", + 'modificationAmount': {"value": "1234", "currency": "EUR"} + } + adyen_instance.client = mock_client(200, request, + 'test/mocks/' + 'refund-received' + '.json') + result = adyen_instance.payment.modifications_api.refund(request) + assert result.message['response'] == "[refund-received]" + +def test_cancel_received(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + 'merchantAccount': "YourMerchantAccount", + 'reference': "YourReference", + 'originalReference': "YourOriginalReference" + } + adyen_instance.client = mock_client(200, request, + 'test/mocks/' + 'cancel-received' + '.json') + result = adyen_instance.payment.modifications_api.cancel(request) + assert result.message['response'] == "[cancel-received]" + +def test_adjust_authorisation_received(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + 'merchantAccount': "YourMerchantAccount", + 'reference': "YourReference", + 'modificationAmount': {"value": "1234", "currency": "EUR"}, + 'originalReference': "YourOriginalReference" + } + adyen_instance.client = mock_client(200, request, + 'test/mocks/' + 'adjust-' + 'authorisation-' + 'received.json') + result = adyen_instance.payment.modifications_api.adjust_authorisation(request) + assert result.message['response'] == "[adjustAuthorisation-received]" diff --git a/test/test_payment.py b/test/test_payment.py new file mode 100644 index 00000000..efade50c --- /dev/null +++ b/test/test_payment.py @@ -0,0 +1,106 @@ +import pytest +import Adyen + +def test_authorise_success_mocked(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + 'merchantAccount': "YourMerchantAccount", + 'amount': {"value": "100000", "currency": "EUR"}, + 'reference': "123456", + 'card': { + "number": "5136333333333335", + "expiryMonth": "08", + "expiryYear": "2018", + "cvc": "737", + "holderName": "John Doe" + } + } + adyen_instance.client = mock_client(200, request, + 'test/mocks/' + 'authorise' + '-success' + '.json') + result = adyen_instance.payment.payments_api.authorise(request) + assert result.message['resultCode'] == "Authorised" + assert result.message['additionalData']['expiryDate'] == "8/2018" + assert result.message['additionalData']['cardBin'] == "411111" + assert result.message['additionalData']['cardSummary'] == "1111" + assert result.message['additionalData']['cardHolderName'] == "Holder" + assert result.message['additionalData']['threeDOffered'] == "true" + assert result.message['additionalData']['threeDAuthenticated'] == "false" + assert result.message['authCode'] == "69746" + assert len(result.message['fraudResult']['results']) == 11 + fraud_checks = result.message['fraudResult']['results'] + fraud_check_result = fraud_checks[0]['FraudCheckResult'] + assert fraud_check_result['name'] == "CardChunkUsage" + assert fraud_check_result['accountScore'] == 8 + assert fraud_check_result['checkId'] == 2 + +def test_authorise_error010_mocked(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + 'merchantAccount': "testaccount", + 'amount': {"value": "100000", "currency": "EUR"}, + 'reference': "123456", + 'card': { + "number": "5136333333333335", + "expiryMonth": "08", + "expiryYear": "2018", + "cvc": "737", + "holderName": "John Doe" + } + } + adyen_instance.client = mock_client(403, request, + 'test/mocks/' + 'authorise-error' + '-010' + '.json') + with pytest.raises(Adyen.AdyenAPIInvalidPermission): + adyen_instance.payment.payments_api.authorise(request) + +def test_authorise_error_cvc_declined_mocked(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + 'amount': {"value": "100000", "currency": "EUR"}, + 'reference': "123456", + 'card': { + "number": "5136333333333335", + "expiryMonth": "08", + "expiryYear": "2018", + "cvc": "787", + "holderName": "John Doe" + } + } + adyen_instance.client = mock_client(200, request, + 'test/mocks/' + 'authorise' + '-error-' + 'cvc-declined' + '.json') + result = adyen_instance.payment.payments_api.authorise(request) + assert result.message['resultCode'] == "Refused" + +def test_authorise_success_3d_mocked(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + 'amount': {"value": "100000", "currency": "EUR"}, + 'reference': "123456", + 'card': { + "number": "5136333333333335", + "expiryMonth": "08", + "expiryYear": "2018", + "cvc": "737", + "holderName": "John Doe" + } + } + adyen_instance.client = mock_client(200, request, + 'test/mocks/' + 'authorise' + '-success-3d' + '.json') + result = adyen_instance.payment.payments_api.authorise(request) + assert result.message['resultCode'] == "RedirectShopper" diff --git a/test/test_pos_mobile.py b/test/test_pos_mobile.py new file mode 100644 index 00000000..1a80254e --- /dev/null +++ b/test/test_pos_mobile.py @@ -0,0 +1,11 @@ +def test_create_communication_session(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = {} + adyen_instance.client = mock_client( + 200, + request, + "test/mocks/posMobile/create-communication-session-success.json" + ) + result = adyen_instance.posMobile.pos_mobile_api.create_communication_session(request) + assert result.message['id'] == "CS00000000000000000000001" + assert result.message['sessionData'] == "session_data_example" diff --git a/test/test_recurring.py b/test/test_recurring.py new file mode 100644 index 00000000..d841e5ea --- /dev/null +++ b/test/test_recurring.py @@ -0,0 +1,81 @@ +import pytest +import Adyen +from Adyen import settings + +@pytest.fixture +def recurring_url(adyen_instance): + return adyen_instance.recurring.recurring_api.baseUrl + +def test_list_recurring_details(adyen_instance, mock_client, recurring_url): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + 'merchantAccount': "YourMerchantAccount", + 'reference': "YourReference", + "shopperEmail": "ref@email.com", + "shopperReference": "ref", + 'recurring': {'contract': "RECURRING"} + } + adyen_instance.client = mock_client(200, request, + 'test/mocks/' + 'recurring/' + 'listRecurring' + 'Details-' + 'success.json') + result = adyen_instance.recurring.recurring_api.list_recurring_details(request) + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{recurring_url}/listRecurringDetails', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + username='YourWSUser', + password='YourWSPassword' + ) + assert len(result.message['details']) == 1 + assert len(result.message['details'][0]) == 1 + recurringDetail = result.message['details'][0]['RecurringDetail'] + assert recurringDetail['recurringDetailReference'] == "recurringReference" + assert recurringDetail['alias'] == "cardAlias" + assert recurringDetail['card']['number'] == "1111" + +def test_disable(adyen_instance, mock_client, recurring_url): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + "shopperEmail": "ref@email.com", + "shopperReference": "ref", + "recurringDetailReference": "12345678889" + } + adyen_instance.client = mock_client(200, request, + 'test/mocks/' + 'recurring/' + 'disable-success' + '.json') + result = adyen_instance.recurring.recurring_api.disable(request) + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{recurring_url}/disable', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + username='YourWSUser', + password='YourWSPassword', + ) + assert len(result.message['details']) == 1 + assert result.message['response'] == "[detail-successfully-disabled]" + +def test_disable_803(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + "shopperEmail": "ref@email.com", + "shopperReference": "ref", + "recurringDetailReference": "12345678889" + } + adyen_instance.client = mock_client(422, request, + 'test/mocks/' + 'recurring/' + 'disable-error-803' + '.json') + with pytest.raises(Adyen.AdyenAPIUnprocessableEntity) as excinfo: + adyen_instance.recurring.recurring_api.disable(request) + assert "PaymentDetail not found" in str(excinfo.value) diff --git a/test/test_session_authentication.py b/test/test_session_authentication.py new file mode 100644 index 00000000..878b2957 --- /dev/null +++ b/test/test_session_authentication.py @@ -0,0 +1,40 @@ +import pytest + +from Adyen import settings + + +@pytest.fixture +def session_url(adyen_instance): + return adyen_instance.sessionAuthentication.session_authentication_api.baseUrl + +def test_create_session_token(adyen_instance, mock_client, session_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "allowOrigin": 'https://www.your-website.com', + "product": "platform", + "policy": { + "resources": [ + { + "type": "accountHolder", + "accountHolderId": "AH00000000000000000000001" + } + ], + "roles": [ + "Transactions Overview Component: View", + "Payouts Overview Component: View" + ] + } + } + adyen_instance.client = mock_client(200, request, + "test/mocks/sessionAuthentication/" + "authentication-session-created.json") + + result = adyen_instance.sessionAuthentication.session_authentication_api.create_authentication_session(request) + assert result.message["sessionToken"] == "long_session_token_string" + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{session_url}/sessions', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) diff --git a/test/test_stored_value.py b/test/test_stored_value.py new file mode 100644 index 00000000..9014e1c9 --- /dev/null +++ b/test/test_stored_value.py @@ -0,0 +1,157 @@ +import pytest + +from Adyen import settings + + +@pytest.fixture +def stored_value_url(adyen_instance): + return adyen_instance.storedValue.stored_value_api.baseUrl + +def test_issue(adyen_instance, mock_client, stored_value_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + "store": "YOUR_STORE_ID", + "paymentMethod": { + "type": "valuelink" + }, + "giftCardPromoCode": "1324", + "reference": "YOUR_REFERENCE" + } + + adyen_instance.client = mock_client(200, request, + "test/mocks/storedValue/issue-giftcard.json") + result = adyen_instance.storedValue.stored_value_api.issue(request) + assert result.message['paymentMethod']['type'] == 'givex' + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{stored_value_url}/issue', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_activate_giftcard(adyen_instance, mock_client, stored_value_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "status": "active", + "amount": { + "currency": "USD", + "value": 1000 + }, + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + "store": "YOUR_STORE_ID", + "paymentMethod": { + "type": "svs", + "number": "6006491286999921374", + "securityCode": "1111" + }, + "reference": "YOUR_REFERENCE" + } + adyen_instance.client = mock_client(200, request, + "test/mocks/storedValue/activate-giftcards.json") + result = adyen_instance.storedValue.stored_value_api.change_status(request) + assert result.message['currentBalance']['value'] == 1000 + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{stored_value_url}/changeStatus', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_load_funds(adyen_instance, mock_client, stored_value_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "amount": { + "currency": "USD", + "value": 2000 + }, + "loadType": "merchandiseReturn", + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + "store": "YOUR_STORE_ID", + "paymentMethod": { + "type": "svs", + "number": "6006491286999921374", + "securityCode": "1111" + }, + "reference": "YOUR_REFERENCE" + } + adyen_instance.client = mock_client(200, request, "test/mocks/storedValue/load-funds.json") + result = adyen_instance.storedValue.stored_value_api.load(request) + assert result.message['resultCode'] == 'Success' + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{stored_value_url}/load', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_check_balance(adyen_instance, mock_client, stored_value_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + "store": "YOUR_STORE_ID", + "paymentMethod": { + "type": "svs", + "number": "603628672882001915092", + "securityCode": "5754" + }, + "reference": "YOUR_REFERENCE" + } + adyen_instance.client = mock_client(200, request, "test/mocks/storedValue/check-balance.json") + result = adyen_instance.storedValue.stored_value_api.check_balance(request) + assert result.message['currentBalance']['value'] == 5600 + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{stored_value_url}/checkBalance', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_merge_balance(adyen_instance, mock_client, stored_value_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + "store": "YOUR_STORE_ID", + "sourcePaymentMethod": { + "number": "7777182708544835", + "securityCode": "2329" + }, + "paymentMethod": { + "type": "valuelink", + "number": "8888182708544836", + "securityCode": "2330" + }, + "reference": "YOUR_REFERENCE" + } + adyen_instance.client = mock_client(200, request, "test/mocks/storedValue/merge-balance.json") + result = adyen_instance.storedValue.stored_value_api.merge_balance(request) + assert result.message['pspReference'] == "881564657480267D" + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{stored_value_url}/mergeBalance', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_void_transaction(adyen_instance, mock_client, stored_value_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + "originalReference": "851564654294247B", + "reference": "YOUR_REFERENCE" + } + adyen_instance.client = mock_client(200, request, + "test/mocks/storedValue/undo-transaction.json") + result = adyen_instance.storedValue.stored_value_api.void_transaction(request) + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{stored_value_url}/voidTransaction', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) diff --git a/test/test_terminal.py b/test/test_terminal.py new file mode 100644 index 00000000..b3267321 --- /dev/null +++ b/test/test_terminal.py @@ -0,0 +1,253 @@ +import pytest + +from Adyen import settings + + +@pytest.fixture +def terminal_url(adyen_instance): + return adyen_instance.terminal.baseUrl + +def test_assign_terminals(adyen_instance, mock_client, terminal_url): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + adyen_instance.client.platform = "test" + adyen_instance.client.xapikey = "YourXapikey" + request = { + "companyAccount": "YOUR_COMPANY_ACCOUNT", + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + "store": "YOUR_STORE", + "terminals": [ + "P400Plus-275479597" + ] + } + mock_client( + 200, request, "test/mocks/terminal/assignTerminals.json" + ) + result = adyen_instance.terminal.assign_terminals(request=request) + assert "P400Plus-275479597" in result.message["results"] + + adyen_instance.client.http_client.request.assert_called_once_with( + "POST", + f"{terminal_url}/assignTerminals", + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json={ + "companyAccount": "YOUR_COMPANY_ACCOUNT", + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + "store": "YOUR_STORE", + "terminals": [ + "P400Plus-275479597" + ] + }, + xapikey="YourXapikey" + ) + +def test_assign_terminals_422(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "companyAccount": "YOUR_COMPANY_ACCOUNT", + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + "store": "YOUR_STORE", + "terminals": [ + "P400Plus-123456789" + ] + } + mock_client( + 200, request, "test/mocks/terminal/assignTerminals-422.json" + ) + result = adyen_instance.terminal.assign_terminals(request=request) + assert result.message["status"] == 422 + assert result.message["errorCode"] == "000" + assert result.message["message"] == "Terminals not found: P400Plus-123456789" + assert result.message["errorType"] == "validation" + +def test_find_terminal(adyen_instance, mock_client, terminal_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "terminal": "P400Plus-275479597", + "merchantAccount": "YOUR_MERCHANT_ACCOUNT" + } + mock_client( + 200, request, "test/mocks/terminal/findTerminal.json" + ) + result = adyen_instance.terminal.find_terminal(request=request) + assert "P400Plus-275479597" in result.message["terminal"] + + adyen_instance.client.http_client.request.assert_called_once_with( + "POST", + f"{terminal_url}/findTerminal", + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json={ + "terminal": "P400Plus-275479597", + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + }, + xapikey="YourXapikey" + ) + +def test_find_terminal_422(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "terminal": "P400Plus-123456789" + } + mock_client( + 200, request, "test/mocks/terminal/findTerminal-422.json" + ) + result = adyen_instance.terminal.find_terminal(request=request) + assert result.message["status"] == 422 + assert result.message["errorCode"] == "000" + assert result.message["message"] == "Terminal not found" + assert result.message["errorType"] == "validation" + +def test_get_stores_under_account(adyen_instance, mock_client, terminal_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "companyAccount": "YOUR_COMPANY_ACCOUNT", + "merchantAccount": "YOUR_MERCHANT_ACCOUNT" + } + mock_client( + 200, request, "test/mocks/terminal/getStoresUnderAccount.json" + ) + result = adyen_instance.terminal.get_stores_under_account(request=request) + assert result.message["stores"] == [ + { + "store": "YOUR_STORE", + "description": "YOUR_STORE", + "address": { + "city": "The City", + "countryCode": "NL", + "postalCode": "1234", + "streetAddress": "The Street" + }, + "status": "Active", + "merchantAccountCode": "YOUR_MERCHANT_ACCOUNT" + } + ] + + adyen_instance.client.http_client.request.assert_called_once_with( + "POST", + f"{terminal_url}/getStoresUnderAccount", + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json={ + "companyAccount": "YOUR_COMPANY_ACCOUNT", + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + }, + xapikey="YourXapikey" + ) + +def test_get_terminal_details(adyen_instance, mock_client, terminal_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "terminal": "P400Plus-275479597", + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + } + + mock_client( + 200, request, "test/mocks/terminal/getTerminalDetails.json" + ) + result = adyen_instance.terminal.get_terminal_details(request=request) + + assert result.message["deviceModel"] == "P400Plus" + assert result.message["terminal"] == "P400Plus-275479597" + + adyen_instance.client.http_client.request.assert_called_once_with( + "POST", + f"{terminal_url}/getTerminalDetails", + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json={ + "terminal": "P400Plus-275479597", + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + }, + xapikey="YourXapikey" + ) + +def test_get_terminal_details_422(adyen_instance, mock_client): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "terminal": "P400Plus-123456789" + } + mock_client( + 200, request, "test/mocks/terminal/getTerminalDetails-422.json" + ) + result = adyen_instance.terminal.get_terminal_details(request=request) + assert result.message["status"] == 422 + assert result.message["errorCode"] == "000" + assert result.message["message"] == "Terminal not found" + assert result.message["errorType"] == "validation" + +def test_get_terminals_under_account(adyen_instance, mock_client, terminal_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "companyAccount": "YOUR_COMPANY_ACCOUNT", + "merchantAccount": "YOUR_MERCHANT_ACCOUNT" + } + + mock_client( + 200, request, "test/mocks/terminal/getTerminalsUnderAccount.json" + ) + result = adyen_instance.terminal.get_terminals_under_account(request=request) + + assert result.message["merchantAccounts"] == [ + { + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + "inStoreTerminals": [ + "P400Plus-275479597" + ], + "stores": [ + { + "store": "YOUR_STORE", + "inStoreTerminals": [ + "M400-401972715" + ] + } + ] + } + ] + + adyen_instance.client.http_client.request.assert_called_once_with( + "POST", + f"{terminal_url}/getTerminalsUnderAccount", + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json={ + "companyAccount": "YOUR_COMPANY_ACCOUNT", + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + }, + xapikey="YourXapikey" + ) + +def test_get_terminals_under_account_store(adyen_instance, mock_client, terminal_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "companyAccount": "YOUR_COMPANY_ACCOUNT", + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + "store": "YOUR_STORE" + } + + mock_client( + 200, request, "test/mocks/terminal/getTerminalsUnderAccount-store.json" + ) + result = adyen_instance.terminal.get_terminals_under_account(request=request) + + assert result.message["merchantAccounts"] == [ + { + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + "stores": [ + { + "store": "YOUR_STORE", + "inStoreTerminals": [ + "M400-401972715" + ] + } + ] + } + ] + + adyen_instance.client.http_client.request.assert_called_once_with( + "POST", + f"{terminal_url}/getTerminalsUnderAccount", + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json={ + "companyAccount": "YOUR_COMPANY_ACCOUNT", + "merchantAccount": "YOUR_MERCHANT_ACCOUNT", + "store": "YOUR_STORE", + }, + xapikey="YourXapikey" + ) diff --git a/test/test_third_party_payout.py b/test/test_third_party_payout.py new file mode 100644 index 00000000..5ef2c3bc --- /dev/null +++ b/test/test_third_party_payout.py @@ -0,0 +1,311 @@ +import pytest +import Adyen +from Adyen import settings + +@pytest.fixture +def payout_url(adyen_instance): + return adyen_instance.payout.initialization_api.baseUrl + +def test_confirm_success(adyen_instance, mock_client, payout_url): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + "merchantAccount": "YourMerchantAccount", + "originalReference": "YourReference" + } + resp = 'test/mocks/payout/confirm-success.json' + adyen_instance.client = mock_client(200, request, resp) + result = adyen_instance.payout.reviewing_api.confirm_third_party(request) + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{payout_url}/confirmThirdParty', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + username='YourWSUser', + password='YourWSPassword', + ) + assert result.message['pspReference'] is not None + assert result.message['resultCode'] == "[payout-confirm-received]" + +def test_confirm_missing_reference(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + "merchantAccount": "YourMerchantAccount", + "originalReference": "" + } + resp = 'test/mocks/payout/confirm-missing-reference.json' + adyen_instance.client = mock_client(500, request, resp) + with pytest.raises(Adyen.AdyenAPICommunicationError) as excinfo: + adyen_instance.payout.reviewing_api.confirm_third_party(request) + assert "Required field 'merchantAccount' is null" in str(excinfo.value) + +def test_decline_success(adyen_instance, mock_client, payout_url): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + "merchantAccount": "YourMerchantAccount", + "originalReference": "YourReference" + } + resp = 'test/mocks/payout/decline-success.json' + adyen_instance.client = mock_client(200, request, resp) + result = adyen_instance.payout.reviewing_api.decline_third_party(request) + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{payout_url}/declineThirdParty', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + username='YourWSUser', + password='YourWSPassword', + ) + assert result.message['pspReference'] is not None + assert result.message['resultCode'] == "[payout-decline-received]" + +def test_decline_missing_reference(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + "merchantAccount": "YourMerchantAccount", + "originalReference": "" + } + resp = 'test/mocks/payout/decline-missing-reference.json' + adyen_instance.client = mock_client(500, request, resp) + with pytest.raises(Adyen.AdyenAPICommunicationError) as excinfo: + adyen_instance.payout.reviewing_api.confirm_third_party(request) + assert "Required field 'merchantAccount' is null" in str(excinfo.value) + +def test_store_detail_bank_success(adyen_instance, mock_client, payout_url): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + "bank": { + "bankName": "AbnAmro", + "bic": "ABNANL2A", + "countryCode": "NL", + "iban": "NL32ABNA0515071439", + "ownerName": "Adyen", + "bankCity": "Amsterdam", + "taxId": "bankTaxId" + }, + "merchantAccount": "YourMerchantAccount", + "recurring": { + "contract": "PAYOUT" + }, + "shopperEmail": "ref@email.com", + "shopperReference": "ref" + } + resp = 'test/mocks/payout/storeDetail-success.json' + adyen_instance.client = mock_client(200, request, resp) + result = adyen_instance.payout.initialization_api.store_detail(request) + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{payout_url}/storeDetail', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + username='YourWSUser', + password='YourWSPassword' + ) + assert result.message['pspReference'] is not None + assert result.message['recurringDetailReference'] is not None + assert result.message['resultCode'] == "Success" + +def test_submit_success(adyen_instance, mock_client, payout_url): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + "amount": { + "value": "100000", + "currency": "EUR" + }, + "reference": "payout-test", "recurring": { + "contract": "PAYOUT" + }, + "merchantAccount": "YourMerchantAccount", + "shopperEmail": "ref@email.com", + "shopperReference": "ref", + "selectedRecurringDetailReference": "LATEST" + } + resp = 'test/mocks/payout/submit-success.json' + adyen_instance.client = mock_client(200, request, resp) + result = adyen_instance.payout.initialization_api.submit_third_party(request) + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{payout_url}/submitThirdParty', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + username='YourWSUser', + password='YourWSPassword' + ) + assert result.message['pspReference'] is not None + assert result.message['resultCode'] == "[payout-submit-received]" + +def test_submit_invalid_recurring_reference(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + "amount": { + "value": "100000", + "currency": "EUR" + }, + "reference": "payout-test", "recurring": { + "contract": "PAYOUT" + }, + "merchantAccount": "YourMerchantAccount", + "shopperEmail": "ref@email.com", + "shopperReference": "ref", + "selectedRecurringDetailReference": "1234" + } + resp = 'test/mocks/payout/submit-invalid-reference.json' + adyen_instance.client = mock_client(422, request, resp) + with pytest.raises(Adyen.AdyenAPIUnprocessableEntity) as excinfo: + adyen_instance.payout.initialization_api.submit_third_party(request) + assert "Contract not found" in str(excinfo.value) + +def test_store_detail_and_submit_missing_reference(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + "amount": { + "value": "100000", + "currency": "EUR" + }, + "merchantAccount": "YourMerchantAccount", + "recurring": { + "contract": "PAYOUT" + }, + "shopperEmail": "ref@email.com", + "shopperReference": "ref", + "bank": { + "iban": "NL32ABNA0515071439", + "ownerName": "Adyen", + "countryCode": "NL", + } + } + + resp = 'test/mocks/payout/submit-missing-reference.json' + adyen_instance.client = mock_client(422, request, resp) + + with pytest.raises(Adyen.AdyenAPIUnprocessableEntity) as excinfo: + adyen_instance.payout.initialization_api.store_detail_and_submit_third_party(request) + assert "Contract not found" in str(excinfo.value) + +def test_store_detail_and_submit_missing_payment(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + "amount": { + "value": "100000", + "currency": "EUR" + }, + "merchantAccount": "YourMerchantAccount", + "reference": "payout-test", + "recurring": { + "contract": "PAYOUT" + }, + "shopperEmail": "ref@email.com", + "shopperReference": "ref" + } + resp = 'test/mocks/payout/storeDetailAndSubmit-missing-payment.json' + adyen_instance.client = mock_client(422, request, resp) + with pytest.raises(Adyen.AdyenAPIUnprocessableEntity) as excinfo: + adyen_instance.payout.initialization_api.store_detail_and_submit_third_party(request) + assert "Please supply paymentDetails" in str(excinfo.value) + +def test_store_detail_and_submit_invalid_iban(adyen_instance, mock_client): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + "amount": { + "value": "100000", + "currency": "EUR" + }, + "merchantAccount": "YourMerchantAccount", + "reference": "payout-test", + "recurring": { + "contract": "PAYOUT" + }, + "shopperEmail": "ref@email.com", + "shopperReference": "ref", + "bank": { + "countryCode": "NL", + "iban": "4111111111111111", + "ownerName": "Adyen", + } + } + resp = 'test/mocks/payout/storeDetailAndSubmit-invalid-iban.json' + adyen_instance.client = mock_client(422, request, resp) + with pytest.raises(Adyen.AdyenAPIUnprocessableEntity) as excinfo: + adyen_instance.payout.initialization_api.store_detail_and_submit_third_party(request) + assert "Invalid iban" in str(excinfo.value) + +def test_store_detail_and_submit_card_success(adyen_instance, mock_client, payout_url): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + "amount": { + "value": "100000", + "currency": "EUR" + }, + "merchantAccount": "YourMerchantAccount", + "reference": "payout-test", + "recurring": { + "contract": "PAYOUT" + }, + "shopperEmail": "ref@email.com", + "shopperReference": "ref", + "card": { + "number": "4111111111111111", + "expiryMonth": "08", + "expiryYear": "2018", + "cvc": "737", + "holderName": "John Smith" + } + } + resp = 'test/mocks/payout/storeDetailAndSubmit-card-success.json' + adyen_instance.client = mock_client(200, request, resp) + result = adyen_instance.payout.initialization_api.store_detail_and_submit_third_party(request) + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{payout_url}/storeDetailAndSubmitThirdParty', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + username='YourWSUser', + password='YourWSPassword' + ) + assert result.message['pspReference'] is not None + assert result.message['resultCode'] == "[payout-submit-received]" + +def test_store_detail_and_submit_bank_success(adyen_instance, mock_client, payout_url): + adyen_instance.client.username = "YourWSUser" + adyen_instance.client.password = "YourWSPassword" + request = { + "amount": { + "value": "100000", + "currency": "EUR" + }, + "bank": { + "countryCode": "NL", + "iban": "NL32ABNA0515071439", + "ownerName": "Adyen", + }, + "merchantAccount": "YourMerchantAccount", + "recurring": { + "contract": "PAYOUT" + }, + "reference": "YourReference", + "shopperEmail": "ref@email.com", + "shopperReference": "ref" + } + resp = 'test/mocks/payout/storeDetailAndSubmit-bank-success.json' + adyen_instance.client = mock_client(200, request, resp) + result = adyen_instance.payout.initialization_api.store_detail_and_submit_third_party(request) + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{payout_url}/storeDetailAndSubmitThirdParty', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + username='YourWSUser', + password='YourWSPassword' + ) + assert result.message['pspReference'] is not None + assert result.message['resultCode'] == "[payout-submit-received]" diff --git a/test/test_transfers.py b/test/test_transfers.py new file mode 100644 index 00000000..fceb3fe6 --- /dev/null +++ b/test/test_transfers.py @@ -0,0 +1,83 @@ +import pytest + +from Adyen import settings + + +@pytest.fixture +def transfers_url(adyen_instance): + return adyen_instance.transfers.transfers_api.baseUrl + +def test_transfer_fund(adyen_instance, mock_client, transfers_url): + adyen_instance.client.xapikey = "YourXapikey" + request = { + "amount": { + "value": 110000, + "currency": "EUR" + }, + "balanceAccountId": "BAB8B2C3D4E5F6G7H8D9J6GD4", + "category": "bank", + "counterparty": { + "bankAccount": { + "accountHolder": { + "fullName": "A. Klaassen", + "address": { + "city": "San Francisco", + "country": "US", + "postalCode": "94678", + "stateOrProvince": "CA", + "street": "Brannan Street", + "street2": "274" + } + } + }, + "accountIdentification": { + "type": "numberAndBic", + "accountNumber": "123456789", + "bic": "BOFAUS3NXXX" + } + }, + "priority": "wire", + "referenceForBeneficiary": "Your reference sent to the beneficiary", + "reference": "Your internal reference for the transfer", + "description": "Your description for the transfer" + } + adyen_instance.client = mock_client(200, request, + "test/mocks/transfers/" + "make-transfer-response.json") + result = adyen_instance.transfers.transfers_api.transfer_funds(request) + + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'{transfers_url}/transfers', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_get_all_transactions(adyen_instance, mock_client, transfers_url): + adyen_instance.client.xapikey = "YourXapikey" + adyen_instance.client = mock_client(200, None, "test/mocks/transfers/" + "get-all-transactions.json") + + result = adyen_instance.transfers.transactions_api.get_all_transactions() + adyen_instance.client.http_client.request.assert_called_once_with( + 'GET', + f'{transfers_url}/transactions', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=None, + xapikey="YourXapikey" + ) + +def test_get_transaction(adyen_instance, mock_client, transfers_url): + adyen_instance.client.xapikey = "YourXapikey" + transacion_id="123" + adyen_instance.client = mock_client(200, None, "test/mocks/transfers/" + "get-transaction.json") + result = adyen_instance.transfers.transactions_api.get_transaction(transacion_id) + adyen_instance.client.http_client.request.assert_called_once_with( + 'GET', + f'{transfers_url}/transactions/{transacion_id}', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=None, + xapikey="YourXapikey" + ) diff --git a/test/test_util.py b/test/test_util.py new file mode 100644 index 00000000..12833ae5 --- /dev/null +++ b/test/test_util.py @@ -0,0 +1,166 @@ +from json import load + +from Adyen import settings +from Adyen.util import ( + generate_notification_sig, + is_valid_hmac_payload, + is_valid_hmac_notification, + get_query +) + + +def test_notification_request_item_hmac(): + request = { + "pspReference": "7914073381342284", + "merchantReference": "TestPayment-1407325143704", + "merchantAccountCode": "TestMerchant", + "amount": { + "currency": "EUR", + "value": 1130 + }, + "eventCode": "AUTHORISATION", + "success": "true", + "eventDate": "2019-05-06T17:15:34.121+02:00", + "operations": [ + "CANCEL", + "CAPTURE", + "REFUND" + ], + "paymentMethod": "visa", + } + key = "44782DEF547AAA06C910C43932B1EB0C" \ + "71FC68D9D0C057550C48EC2ACF6BA056" + hmac_calculation = generate_notification_sig(request, key) + hmac_calculation_str = hmac_calculation.decode("utf-8") + expected_hmac = "coqCmt/IZ4E3CzPvMY8zTjQVL5hYJUiBRg8UU+iCWo0=" + assert hmac_calculation_str != "" + assert hmac_calculation_str == expected_hmac + request['additionalData'] = {'hmacSignature': hmac_calculation_str} + hmac_validate = is_valid_hmac_notification(request, key) + assert 'additionalData' in request + assert request['additionalData'] == {'hmacSignature': hmac_calculation_str} + assert hmac_validate + +def test_webhooks_with_slashes(): + hmac_key = "74F490DD33F7327BAECC88B2947C011FC02D014A473AAA33A8EC93E4DC069174" + with open('test/mocks/util/backslash_notification.json') as file: + backslash_notification = load(file) + assert is_valid_hmac_notification(backslash_notification, hmac_key) + with open('test/mocks/util/colon_notification.json') as file: + colon_notification = load(file) + assert is_valid_hmac_notification(colon_notification, hmac_key) + with open('test/mocks/util/forwardslash_notification.json') as file: + forwardslash_notification = load(file) + assert is_valid_hmac_notification(forwardslash_notification, hmac_key) + with open('test/mocks/util/mixed_notification.json') as file: + mixed_notification = load(file) + assert is_valid_hmac_notification(mixed_notification, hmac_key) + +def test_query_string_creation(): + query_parameters = { + "pageSize": 7, + "pageNumber": 3 + } + query_string = get_query(query_parameters) + assert query_string == '?pageSize=7&pageNumber=3' + +def test_passing_xapikey_in_method(adyen_instance, mock_client): + request = {'merchantAccount': "YourMerchantAccount"} + adyen_instance.client = mock_client(200, request, + "test/mocks/" + "checkout/" + "paymentmethods" + "-success.json") + result = adyen_instance.checkout.payments_api.payment_methods(request, xapikey="YourXapikey") + assert result.message['paymentMethods'][0]['name'] == "AliPay" + assert result.message['paymentMethods'][2]['name'] == "Credit Card" + assert result.message['paymentMethods'][3]['name'] == "Credit Card via AsiaPay" + +def test_custom_version(adyen_instance, mock_client): + adyen_instance.client.api_checkout_version = 60 + request = {'merchantAccount': "YourMerchantAccount"} + adyen_instance.client = mock_client(200, request, + "test/mocks/" + "checkout/" + "paymentmethods" + "-success.json") + result = adyen_instance.checkout.payments_api.payment_methods(request, xapikey="YourXapikey") + adyen_instance.client.http_client.request.assert_called_once_with( + 'POST', + f'https://checkout-test.adyen.com/v{adyen_instance.client.api_checkout_version}/paymentMethods', + headers={'adyen-library-name': settings.LIB_NAME, 'adyen-library-version': settings.LIB_VERSION, 'User-Agent': settings.LIB_NAME + '/' + settings.LIB_VERSION}, + json=request, + xapikey="YourXapikey" + ) + +def test_is_valid_hmac_notification_removes_additional_data(): + notification = { + "live": "false", + "notificationItems": [ + { + "NotificationRequestItem": { + "additionalData": { + "hmacSignature": "11aa", + "fraudResultType": "GREEN", + "fraudManualReview": "false", + "totalFraudScore": "75" + }, + "amount": { + "currency": "USD", + "value": 10000 + }, + "success": "true" + + } + } + ]} + is_valid_hmac_notification(notification, "11aa") + assert notification['notificationItems'][0]['NotificationRequestItem']['additionalData'] is not None + +import textwrap + +def test_is_valid_hmac_payload(): + + payload = textwrap.dedent('''\ + { + "type": "merchant.created", + "environment": "test", + "createdAt": "01-01-2024", + "data": { + "capabilities": { + "sendToTransferInstrument": { + "requested": true, + "requestedLevel": "notApplicable" + } + }, + "companyId": "YOUR_COMPANY_ID", + "merchantId": "YOUR_MERCHANT_ACCOUNT", + "status": "PreActive" + } + }''') + hmac_key = "44782DEF547AAA06C910C43932B1EB0C71FC68D9D0C057550C48EC2ACF6BA056" + expected_hmac = "NiqA5vsdV5etZMOaR27+GBSG4i6JeP6j1wkCM6t53vA=" + + assert is_valid_hmac_payload(expected_hmac, hmac_key, payload.encode("utf-8")) + +def test_is_invalid_hmac_payload(): + payload = '''{ + "type": "merchant.created", + "environment": "test", + "createdAt": "01-01-2024", + "data": { + "capabilities": { + "sendToTransferInstrument": { + "requested": true, + "requestedLevel": "notApplicable" + } + }, + "companyId": "YOUR_COMPANY_ID", + "merchantId": "YOUR_MERCHANT_ACCOUNT", + "status": "PreActive" + } +}''' + hmac_key = "44782DEF547AAA06C910C43932B1EB0C71FC68D9D0C057550C48EC2ACF6BA056" + expected_hmac = "MismatchingHmacKey=" + + assert not is_valid_hmac_payload(expected_hmac, hmac_key, payload.encode("utf-8")) diff --git a/tox.ini b/tox.ini index a20f227f..f5541d78 100644 --- a/tox.ini +++ b/tox.ini @@ -6,8 +6,9 @@ skip_missing_interpreters=true allowlist_externals = make setenv = PYTHONHASHSEED = 34237731 deps = - mock + pytest + pytest-mock requests: requests pycurl: pycurl commands = - make tests \ No newline at end of file + pytest \ No newline at end of file