Source code for tests.test_verifone

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Tests for `verifone` package."""


import unittest
import logging
import os
from datetime import datetime
from verifone import verifone

try:
    import http.client as http_client
except ImportError:
    import httplib as http_client

# logging
http_client.HTTPConnection.debuglevel = 1
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True


[docs]class TestVerifone(unittest.TestCase): """ Test for Verifone package. """
[docs] @classmethod def setUpClass(cls): """ Set up our Verifone client for tests. It requires the following environment variables: AGREEMENTCODE, RSAPRIVATEKEY and EMAIL """ cls._verifone_client = verifone.Verifone(os.environ.get('AGREEMENTCODE'), os.environ.get('RSAPRIVATEKEY'), os.environ.get('RSAVERIFONEPUBLICKEY'), "IntegrationTest", "6.0.37") cls._test_requests = os.environ.get('TESTSENDINGREQUEST') cls._verifone_client_2 = verifone.Verifone(os.environ.get('AGREEMENTCODE'), os.environ.get('RSAPRIVATEKEY'), os.environ.get('RSAVERIFONEPUBLICKEY'), "IntegrationTest", "6.0.37", return_error_dict=1)
[docs] def test_001_create_object_with_defaults(self): """ Test creating a new object with default values """ self.assertTrue(self._verifone_client._currency == "EUR") self.assertTrue(self._verifone_client._test_mode == 0)
[docs] def test_002_get_endpoint(self): """ Test to get endpoint url and change to test mode """ self.assertEqual(self._verifone_client.endpoint, 'https://epayment1.point.fi/pw/serverinterface') self._verifone_client._test_mode = 1 self.assertEqual(self._verifone_client.endpoint, 'https://epayment.test.point.fi/pw/serverinterface') self.assertTrue(self._verifone_client._test_mode == 1)
[docs] def test_003_create_object_wrong_currency(self): """ Test creating a new object with wrong currency, so default currency should be used """ default_currency = 'EUR' verifone_cl = verifone.Verifone('test_apikey', '1234', 'Test', 'IntegrationTest', '6.0.37', 'euro') self.assertEqual(verifone_cl._currency, default_currency) verifone_cl = verifone.Verifone('test_apikey', '1234', 'Test', 'IntegrationTest', '6.0.37', 'eu1') self.assertEqual(verifone_cl._currency, default_currency) verifone_cl = verifone.Verifone('test_apikey', '1234', 'Test', 'IntegrationTest', '6.0.37', '€') self.assertEqual(verifone_cl._currency, default_currency) verifone_cl = verifone.Verifone('test_apikey', '1234', 'Test', 'IntegrationTest', '6.0.37', 'abc') self.assertNotEqual(verifone_cl._currency, default_currency)
[docs] def test_004_create_object_currency_lower(self): """ Test creating a new object with currency in lower case """ verifone_cl = verifone.Verifone('test_apikey', '1234', 'Test', 'IntegrationTest', '6.0.37', 'eur') self.assertEqual(verifone_cl._currency, 'EUR')
[docs] def test_005_update_currency(self): """ Test that currency is updated """ new_value = "SEK" self._verifone_client.currency = new_value self.assertEqual(self._verifone_client._currency, new_value) with self.assertRaises(ValueError): self._verifone_client.currency = "Euro" with self.assertRaises(ValueError): self._verifone_client.currency = "" with self.assertRaises(ValueError): self._verifone_client.currency = "kr3" with self.assertRaises(ValueError): self._verifone_client.currency = "€" new_value = "abc" self._verifone_client.currency = new_value self.assertEqual(self._verifone_client._currency, new_value.upper()) self._verifone_client._currency = "abc" with self.assertRaises(ValueError): self._verifone_client.currency new_value = "eur" self._verifone_client.currency = new_value self.assertEqual(self._verifone_client._currency, new_value.upper()) self.assertEqual(self._verifone_client.currency, '978')
[docs] def test_006_is_available(self): """ Test connection to Verifone server """ if (self._test_requests == "1"): response = self._verifone_client.is_available() self.assertTrue(response['i-f-1-1_availability'] == '2') self._verifone_client._test_mode = 1 response = self._verifone_client.is_available() self.assertTrue(response['i-f-1-1_availability'] == '2')
[docs] def test_007_get_payment_methods(self): """ Test to get all available payment methods """ if (self._test_requests == "1"): response = self._verifone_client.list_payment_methods() self.assertIsNotNone(response['s-t-1-30_payment-method-code-0'])
[docs] def test_008_list_saved_payment_methods(self): """ Test to get saved payment methods """ if (self._test_requests == "1"): params = { 's-f-1-30_buyer-first-name': 'Test', 's-f-1-30_buyer-last-name': 'Tester', 's-f-1-100_buyer-email-address': os.environ.get('EMAIL'), 's-t-1-30_buyer-phone-number': '123456789', 's-t-1-255_buyer-external-id': os.environ.get('EXTERNALID'), } response = self._verifone_client.list_saved_payment_methods(params) self.assertTrue('l-t-1-20_payment-method-id-0' in response)
[docs] def test_009_remove_saved_payment_method(self): """ Test to remove saved payment method when saved payment method is wrong """ if (self._test_requests == "1"): response = self._verifone_client.remove_saved_payment_method(123456) self.assertEqual(response['l-t-1-10_removed-count'], '0')
[docs] def test_010_generate_payment_data(self): """ Test to generate payment data """ customer_id = '1234567890asdfghjklp-1234567890zxcvbnmklo' note = "Note" params = { 'order_number': '58459', 'order_timestamp': '2018-08-02 09:14:12', 'payment_timestamp': '2018-08-02 11:59:16', 'locale': 'fi_FI', 'amount_gross': 1.51, 'amount_net': 1.22, 'vat_amount': 0.29, 'first_name': 'Test', 'last_name': 'Tester', 'email': 'test@test.test', 'phone': '1212121212121212', 'address': 'Test Street 4', 'postal_code': 33200, 'city': 'Tampere', 'country': 'fi', 'style': '', 'cancel_url': 'https://cancel.url', 'error_url': 'https://error.url', 'expired_url': 'https://expired.url', 'rejected_url': 'https://rejected.url', 'success_url': 'https://success.url', 'success_url_server': 'https://server.success.url', 'save_method': 3, 'payment_method': 'nordea-e-payment', 'customer_id': customer_id, 'note': note, 'products': [ { 'name': 'er_7142303001', 'pieces': 1, 'discount': 0, 'vat': 24.00, 'amount_gross': 1.51, 'amount_net': 1.22, 'unit_cost_gross': 1.51, }, ], 'dynamic_feedback': 's-t-1-4_error-code,i-t-6-6_card-pan-first6,i-t-4-4_card-pan-last4', } data = self._verifone_client.generate_payment_data(params) self.assertTrue('s-t-256-256_signature-one' in data) self.assertIsNotNone(data['s-t-256-256_signature-one']) self.assertTrue('s-t-256-256_signature-two' in data) self.assertIsNotNone(data['s-t-256-256_signature-two']) self.assertEqual(data['l-f-1-20_order-gross-amount'], 151) self.assertEqual(data['l-f-1-20_order-net-amount'], 122) self.assertEqual(data['l-f-1-20_order-vat-amount'], 29) self.assertEqual(data['s-t-1-255_buyer-external-id'], customer_id) self.assertEqual(data['s-t-1-36_order-note'], note) self.assertIsNotNone(data['s-t-1-1024_dynamic-feedback']) self.assertEqual(data['s-t-1-30_bi-name-0'], 'er_7142303001') self.assertEqual(len(data['s-t-1-30_bi-name-0']), 13)
[docs] def test_011_generate_payment_data(self): """ Test to generate payment data when all data is not defined """ params = { 'order_number': '58459', 'locale': 'fi_FI', 'first_name': 'Test', 'last_name': 'Tester', 'email': 'test@test.test', 'cancel_url': 'https://cancel.url', 'error_url': 'https://error.url', 'expired_url': 'https://expired.url', 'rejected_url': 'https://rejected.url', 'success_url': 'https://success.url', 'success_url_server': 'https://server.success.url', 'skip_confirmation': 1, 'country': '246', 'products': [ { 'name': 'er_7142303001', 'pieces': 1, 'vat': 24.00, }, ] } data = self._verifone_client.generate_payment_data(params) self.assertTrue('s-t-1-30_style-code' in data) self.assertTrue('i-t-1-1_skip-confirmation-page' in data) self.assertEqual(data['i-t-1-1_skip-confirmation-page'], 1) self.assertEqual(data['i-t-1-3_delivery-address-country-code'], '246')
[docs] def test_015_process_payment(self): """ Test to process payment """ if (self._test_requests == "1"): params = { 's-f-1-30_buyer-first-name': 'Test', 's-f-1-30_buyer-last-name': 'Tester', 's-f-1-100_buyer-email-address': os.environ.get('EMAIL'), 's-t-1-30_buyer-phone-number': '123456789', 's-t-1-255_buyer-external-id': os.environ.get('EXTERNALID'), } response = self._verifone_client.list_saved_payment_methods(params) saved_payment_id = response['l-t-1-20_payment-method-id-0'] self.assertIsNotNone(saved_payment_id) params = { 'locale-f-2-5_payment-locale': 'fi_FI', 's-f-1-36_order-number': '1234', 'l-f-1-20_order-gross-amount': 2391, 's-f-1-30_buyer-first-name': "Test", 's-f-1-30_buyer-last-name': "Tester", 's-t-1-30_buyer-phone-number': 123456789, 's-f-1-100_buyer-email-address': os.environ.get('EMAIL'), 's-t-1-30_delivery-address-line-one': "Test Street 3", 's-t-1-30_delivery-address-city': "Tampere", 's-t-1-30_delivery-address-postal-code': "33210", 'i-t-1-3_delivery-address-country-code': 'FI', 's-t-1-30_bi-name-0': 'Test Product', 'l-t-1-20_bi-unit-gross-cost-0': 2391, 'i-t-1-11_bi-unit-count-0': 1, 'l-t-1-20_bi-gross-amount-0': 2391, 'l-t-1-20_bi-net-amount-0': 1928, 'i-t-1-4_bi-vat-percentage-0': 2400, 'i-t-1-4_bi-discount-percentage-0': 0, 's-t-1-255_buyer-external-id': os.environ.get('EXTERNALID'), 'l-t-1-20_saved-payment-method-id': saved_payment_id, } response = self._verifone_client.process_payment(params) self.assertTrue('l-f-1-20_transaction-number' in response) self.assertIsNotNone(response['l-f-1-20_transaction-number'])
[docs] def test_016_list_transaction_numbers(self): """ Test to get transaction numbers for one order. """ if (self._test_requests == "1"): response = self._verifone_client.list_transaction_numbers("1234") self.assertTrue('l-f-1-20_transaction-number-0' in response)
[docs] def test_017_get_payment_status(self): """ Test to get payment status """ if (self._test_requests == "1"): response = self._verifone_client.list_transaction_numbers("1234") transaction_id = response['l-f-1-20_transaction-number-0'] self.assertIsNotNone(transaction_id) params = { 's-f-1-30_payment-method-code': 'visa', 'l-f-1-20_transaction-number': transaction_id, } response = self._verifone_client.get_payment_status(params) self.assertTrue('s-f-1-30_payment-status-code' in response)
[docs] def test_018_refund_payment(self): """ Test to refund payment """ if (self._test_requests == "1"): response = self._verifone_client.list_transaction_numbers("1234") transaction_id = response['l-f-1-20_transaction-number-0'] self.assertIsNotNone(transaction_id) params = { 'l-f-1-20_refund-amount': 1, 's-f-1-30_payment-method-code': 'visa', 'l-f-1-20_transaction-number': transaction_id, } response = self._verifone_client.refund_payment(params) self.assertTrue('l-f-1-20_transaction-number' in response)
[docs] def test_019_cancel_payment(self): """ Test to cancel payment. """ if (self._test_requests == "1"): params = { 's-f-1-30_payment-method-code': 'visa', 'l-f-1-20_transaction-number': '123456', } with self.assertRaises(ValueError): self._verifone_client.cancel_payment(params) result = self._verifone_client_2.cancel_payment(params) self.assertTrue('s-f-1-30_error-message' in result)
[docs] def test_020_process_supplementary(self): """ Test to process supplementary. """ if (self._test_requests == "1"): params = { 'l-f-1-20_original-transaction-number': '123456', 's-f-1-30_payment-method-code': 'visa', 'l-f-1-20_order-gross-amount': 500, } with self.assertRaises(ValueError): self._verifone_client.process_supplementary(params) result = self._verifone_client_2.process_supplementary(params) self.assertTrue('s-f-1-30_error-message' in result) self.assertEqual(result['s-f-1-30_error-message'],'invalid-transaction-number')
[docs] def test_021_get_endpoint(self): """ Test for getting endpoints """ verifone_cl = verifone.Verifone('test_apikey', '1234', 'Test', 'IntegrationTest', '6.0.37', 'eur') self.assertEqual(verifone_cl.endpoint, 'https://epayment1.point.fi/pw/serverinterface') self.assertEqual(verifone_cl.endpoint2, 'https://epayment2.point.fi/pw/serverinterface') verifone_cl.test_mode = 1 self.assertEqual(verifone_cl.endpoint, 'https://epayment.test.point.fi/pw/serverinterface') self.assertEqual(verifone_cl.endpoint2, 'https://epayment.test.point.fi/pw/serverinterface')
[docs] def test_022_save_test_mode(self): """ Test for save test mode """ verifone_cl = verifone.Verifone('test_apikey', '1234', 'Test', 'IntegrationTest', '6.0.37', 'eur') self.assertEqual(verifone_cl.test_mode, 0) verifone_cl.test_mode = 1 self.assertEqual(verifone_cl.test_mode, 1) with self.assertRaises(ValueError): verifone_cl.test_mode = 3 verifone_cl.test_mode = None self.assertEqual(verifone_cl.test_mode, 0)
[docs] def test_023_get_endpoint(self): """ Test for getting post urls """ verifone_cl = verifone.Verifone('test_apikey', '1234', 'Test', 'IntegrationTest', '6.0.37', 'eur') self.assertIsNotNone(verifone_cl.posturl) self.assertEqual(verifone_cl.posturl1, 'https://epayment1.point.fi/pw/payment') self.assertEqual(verifone_cl.posturl2, 'https://epayment2.point.fi/pw/payment') verifone_cl.test_mode = 1 self.assertIsNotNone(verifone_cl.posturl) self.assertEqual(verifone_cl.posturl1, 'https://epayment.test.point.fi/pw/payment') self.assertEqual(verifone_cl.posturl2, 'https://epayment.test.point.fi/pw/payment')
[docs] def test_024_build_product_data(self): """ Test building product data """ params = [{ 'name': 'er_7142303001', 'pieces': 1, 'discount': 10, 'vat': 24.00, 'amount_net': 1.22, 'unit_cost_gross': 1.51, }] response = self._verifone_client.build_product_data(params) self.assertTrue('l-t-1-20_bi-unit-gross-cost-0' in response) self.assertTrue('l-t-1-20_bi-net-amount-0' in response) self.assertEqual(response['i-t-1-4_bi-discount-percentage-0'], 1000) params = [{ 'name': 'er_7142303001', 'pieces': 1, 'vat': 24.00, }] response = self._verifone_client.build_product_data(params) self.assertEqual(response['i-t-1-4_bi-discount-percentage-0'], 0) self.assertEqual(response['i-t-1-4_bi-vat-percentage-0'], 2400) self.assertEqual(response['i-t-1-11_bi-unit-count-0'], 1)
[docs] def test_025_verify_response(self): """ Test to verify response with extra data. """ response = { 'i-f-1-11_interface-version': '5', 'l-f-1-20_request-id': '2018102613094825567', 'l-f-1-20_response-id': '2018102613094825567', 'l-f-1-20_transaction-number': '2110929913', 's-f-1-10_software-version': '1.74.1.238', 's-f-1-30_operation': 'refund-payment', 's-f-1-30_payment-method-code': 'visa', 's-t-256-256_signature-one': '79C10BC83D94746C2A0859645EB476A73DBE2653C6B24C403CEB9017A759A330F7488AFF549E5AA861E8B6A8962B752B5066651F9C530277ABCAC04C25731EA17B220A638567403035B4A82D6C4CB96DE3F68DF0A089761030CF6766D7811B6895064C90DEC59A796BB3531D5F7C4C3E60B052D3642D35513D29EB89919F8434', 's-t-256-256_signature-two': 'ACB93737CB1DB0D0C7DDCA62DFC921095D2465A751F39F95A9E660B423A4DBF83C7C50914E803019B9884388D336340E18D028F4D58B4C0320EBBC069D0F1402B028ECCB04AD615340670C200062A4C7BDBD2293C44B091E6379B253866BA751BACA133BA58A89125E58DF92E7ABE0E548521565DE05DBAFE5A487F9C9E451B7', 't-f-14-19_response-timestamp': '2018-10-26 10:09:48', 's-t-1-40_shop-order__phase': 'Takaisin tilaukseen' } result = self._verifone_client.verify_response(response) self.assertTrue(result)
[docs] def test_026_verify_incorrect_signature(self): """ Test to verify incorrect signature """ result = self._verifone_client.verify_signature("signature", 'SHA123', "Test") self.assertFalse(result)
[docs] def test_027_check_currency(self): """ Test that currency is valid """ current_currency = self._verifone_client._currency new_value = "123" currency = self._verifone_client.check_currency(new_value) self.assertEqual(current_currency, currency)
[docs] def test_028_process_payment(self): """ Test to process payment when 's-t-1-30_bi-name-0' data is longer than Verifone accepts """ if (self._test_requests == "1"): params = { 's-f-1-30_buyer-first-name': 'Test', 's-f-1-30_buyer-last-name': 'Tester', 's-f-1-100_buyer-email-address': os.environ.get('EMAIL'), 's-t-1-30_buyer-phone-number': '123456789', 's-t-1-255_buyer-external-id': os.environ.get('EXTERNALID'), } response = self._verifone_client.list_saved_payment_methods(params) saved_payment_id = response['l-t-1-20_payment-method-id-0'] self.assertIsNotNone(saved_payment_id) params = { 'locale-f-2-5_payment-locale': 'fi_FI', 's-f-1-36_order-number': '1234', 'l-f-1-20_order-gross-amount': 2391, 's-f-1-30_buyer-first-name': "Test", 's-f-1-30_buyer-last-name': "Tester", 's-t-1-30_buyer-phone-number': 123456789, 's-f-1-100_buyer-email-address': os.environ.get('EMAIL'), 's-t-1-30_delivery-address-line-one': "Test Street 3", 's-t-1-30_delivery-address-city': "Tampere", 's-t-1-30_delivery-address-postal-code': "33210", 'i-t-1-3_delivery-address-country-code': 'FI', 's-t-1-30_bi-name-0': 'Test Product: test with long product name', 'l-t-1-20_bi-unit-gross-cost-0': 2391, 'i-t-1-11_bi-unit-count-0': 1, 'l-t-1-20_bi-gross-amount-0': 2391, 'l-t-1-20_bi-net-amount-0': 1928, 'i-t-1-4_bi-vat-percentage-0': 2400, 'i-t-1-4_bi-discount-percentage-0': 0, 's-t-1-255_buyer-external-id': os.environ.get('EXTERNALID'), 'l-t-1-20_saved-payment-method-id': saved_payment_id, } response = self._verifone_client.process_payment(params) self.assertTrue('l-f-1-20_transaction-number' in response) self.assertIsNotNone(response['l-f-1-20_transaction-number'])
[docs] def test_029_generate_payment_data(self): """ Test to generate payment data with too long product names """ params = { 'order_number': '58459', 'locale': 'fi_FI', 'first_name': 'Test', 'last_name': 'Tester', 'email': 'test@test.test', 'cancel_url': 'https://cancel.url', 'error_url': 'https://error.url', 'expired_url': 'https://expired.url', 'rejected_url': 'https://rejected.url', 'success_url': 'https://success.url', 'success_url_server': 'https://server.success.url', 'skip_confirmation': 1, 'country': '246', 'products': [ { 'name': 'Test Product: test with long product name', 'pieces': 1, 'vat': 24.00, }, { 'name': 'Test Product 2: test with long product name', 'pieces': 1, 'vat': 24.00, }, ] } data = self._verifone_client.generate_payment_data(params) self.assertEqual(data['s-t-1-30_bi-name-0'], 'Test Product: test with long p') self.assertEqual(len(data['s-t-1-30_bi-name-0']), 30) self.assertEqual(data['s-t-1-30_bi-name-1'], 'Test Product 2: test with long') self.assertEqual(len(data['s-t-1-30_bi-name-1']), 30)
[docs] def test_030_generate_payment_data(self): """ Test to generate payment data when customer id is defined """ params = { 'order_number': '58459', 'locale': 'fi_FI', 'first_name': 'Test', 'last_name': 'Tester', 'email': 'test@test.test', 'cancel_url': 'https://cancel.url', 'error_url': 'https://error.url', 'expired_url': 'https://expired.url', 'rejected_url': 'https://rejected.url', 'success_url': 'https://success.url', 'success_url_server': 'https://server.success.url', 'skip_confirmation': 1, 'country': '246', 'customer_id': 'testi123456', 'products': [ { 'name': 'Test Product: test with long product name', 'pieces': 1, 'vat': 24.00, }, ] } data = self._verifone_client.generate_payment_data(params) self.assertEqual(data['s-t-1-255_buyer-external-id'], 'testi123456')
[docs] def test_031_generate_payment_data(self): """ Test to generate payment data when saved payment method id is defined """ params = { 'order_number': '58459', 'locale': 'fi_FI', 'first_name': 'Test', 'last_name': 'Tester', 'email': 'test@test.test', 'cancel_url': 'https://cancel.url', 'error_url': 'https://error.url', 'expired_url': 'https://expired.url', 'rejected_url': 'https://rejected.url', 'success_url': 'https://success.url', 'success_url_server': 'https://server.success.url', 'skip_confirmation': 1, 'country': '246', 'customer_id': 'testi123456', 'saved_payment_method_id': 'test123456', 'products': [ { 'name': 'Test Product: test with long product name', 'pieces': 1, 'vat': 24.00, }, ] } data = self._verifone_client.generate_payment_data(params) self.assertEqual(data['l-t-1-20_saved-payment-method-id'], 'test123456')
if __name__ == '__main__': unittest.main(verbosity=2)