summaryrefslogtreecommitdiff
path: root/addons/payment_authorize/tests/test_authorize.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/payment_authorize/tests/test_authorize.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/payment_authorize/tests/test_authorize.py')
-rw-r--r--addons/payment_authorize/tests/test_authorize.py275
1 files changed, 275 insertions, 0 deletions
diff --git a/addons/payment_authorize/tests/test_authorize.py b/addons/payment_authorize/tests/test_authorize.py
new file mode 100644
index 00000000..af9eda6b
--- /dev/null
+++ b/addons/payment_authorize/tests/test_authorize.py
@@ -0,0 +1,275 @@
+# -*- coding: utf-8 -*-
+
+import time
+from werkzeug import urls
+from lxml import objectify
+
+import odoo
+from odoo.addons.payment.models.payment_acquirer import ValidationError
+from odoo.addons.payment.tests.common import PaymentAcquirerCommon
+from odoo.addons.payment_authorize.controllers.main import AuthorizeController
+from odoo.tools import mute_logger
+
+
+@odoo.tests.tagged('post_install', '-at_install')
+class AuthorizeCommon(PaymentAcquirerCommon):
+
+ @classmethod
+ def setUpClass(cls, chart_template_ref=None):
+ super().setUpClass(chart_template_ref=chart_template_ref)
+ # authorize only support USD in test environment
+ cls.currency_usd = cls.env['res.currency'].search([('name', '=', 'USD')], limit=1)[0]
+ # get the authorize account
+ cls.authorize = cls.env.ref('payment.payment_acquirer_authorize')
+ cls.authorize.write({
+ 'authorize_login': 'dummy',
+ 'authorize_transaction_key': 'dummy',
+ 'authorize_signature_key': '00000000',
+ 'state': 'test',
+ })
+ # Be sure to be in 'capture' mode
+ # self.authorize.auto_confirm = 'confirm_so'
+
+
+@odoo.tests.tagged('post_install', '-at_install', '-standard', 'external')
+class AuthorizeForm(AuthorizeCommon):
+
+ def test_10_Authorize_form_render(self):
+ self.assertEqual(self.authorize.state, 'test', 'test without test environment')
+
+ # ----------------------------------------
+ # Test: button direct rendering
+ # ----------------------------------------
+ base_url = self.env['ir.config_parameter'].get_param('web.base.url')
+ form_values = {
+ 'x_login': self.authorize.authorize_login,
+ 'x_amount': '56.16',
+ 'x_show_form': 'PAYMENT_FORM',
+ 'x_type': 'AUTH_CAPTURE',
+ 'x_method': 'CC',
+ 'x_fp_sequence': '%s%s' % (self.authorize.id, int(time.time())),
+ 'x_version': '3.1',
+ 'x_relay_response': 'TRUE',
+ 'x_fp_timestamp': str(int(time.time())),
+ 'x_relay_url': urls.url_join(base_url, AuthorizeController._return_url),
+ 'x_cancel_url': urls.url_join(base_url, AuthorizeController._cancel_url),
+ 'return_url': None,
+ 'x_currency_code': 'USD',
+ 'x_invoice_num': 'SO004',
+ 'x_first_name': 'Norbert',
+ 'x_last_name': 'Buyer',
+ 'x_company': 'Big Company',
+ 'x_address': 'Huge Street 2/543',
+ 'x_city': 'Sin City',
+ 'x_zip': '1000',
+ 'x_country': 'Belgium',
+ 'x_phone': '0032 12 34 56 78',
+ 'x_email': 'norbert.buyer@example.com',
+ 'x_state': None,
+ 'x_ship_to_first_name': 'Norbert',
+ 'x_ship_to_last_name': 'Buyer',
+ 'x_ship_to_address': 'Huge Street 2/543',
+ 'x_ship_to_city': 'Sin City',
+ 'x_ship_to_zip': '1000',
+ 'x_ship_to_country': 'Belgium',
+ 'x_ship_to_phone': '0032 12 34 56 78',
+ 'x_ship_to_email': 'norbert.buyer@example.com',
+ 'x_ship_to_state': None,
+ }
+
+ form_values['x_fp_hash'] = self.authorize._authorize_generate_hashing(form_values)
+ # render the button
+ res = self.authorize.render('SO004', 56.16, self.currency_usd.id, values=self.buyer_values)
+ # check form result
+ tree = objectify.fromstring(res)
+
+ data_set = tree.xpath("//input[@name='data_set']")
+ self.assertEqual(len(data_set), 1, 'Authorize: Found %d "data_set" input instead of 1' % len(data_set))
+ self.assertEqual(data_set[0].get('data-action-url'), 'https://test.authorize.net/gateway/transact.dll', 'Authorize: wrong data-action-url POST url')
+ for el in tree.iterfind('input'):
+ values = list(el.attrib.values())
+ if values[1] in ['submit', 'x_fp_hash', 'return_url', 'x_state', 'x_ship_to_state', 'data_set']:
+ continue
+ self.assertEqual(
+ values[2],
+ form_values[values[1]],
+ 'Authorize: wrong value for input %s: received %s instead of %s' % (values[1], values[2], form_values[values[1]])
+ )
+
+ @mute_logger('odoo.addons.payment_authorize.models.payment', 'ValidationError')
+ def test_20_authorize_form_management(self):
+ # be sure not to do stupid thing
+ self.assertEqual(self.authorize.state, 'test', 'test without test environment')
+
+ # typical data posted by authorize after client has successfully paid
+ authorize_post_data = {
+ 'return_url': u'/shop/payment/validate',
+ # x_MD5_Hash will be empty starting the 28th March 2019
+ 'x_MD5_Hash': u'7934485E1C105940BE854208D10FAB4F',
+ 'x_SHA2_Hash': u'7D3AC844BE8CA3F649AB885A90D22CFE35B850338EC91D1A5ADD819A85FF948A3D777334A18CDE36821DC8F2B42A6E1950C1FF96B52B60F23201483A656195FB',
+ 'x_account_number': u'XXXX0027',
+ 'x_address': u'Huge Street 2/543',
+ 'x_amount': u'320.00',
+ 'x_auth_code': u'E4W7IU',
+ 'x_avs_code': u'Y',
+ 'x_card_type': u'Visa',
+ 'x_cavv_response': u'2',
+ 'x_city': u'Sun City',
+ 'x_company': u'',
+ 'x_country': u'Belgium',
+ 'x_cust_id': u'',
+ 'x_cvv2_resp_code': u'',
+ 'x_description': u'',
+ 'x_duty': u'0.00',
+ 'x_email': u'norbert.buyer@example.com',
+ 'x_fax': u'',
+ 'x_first_name': u'Norbert',
+ 'x_freight': u'0.00',
+ 'x_invoice_num': u'SO004',
+ 'x_last_name': u'Buyer',
+ 'x_method': u'CC',
+ 'x_phone': u'0032 12 34 56 78',
+ 'x_po_num': u'',
+ 'x_response_code': u'1',
+ 'x_response_reason_code': u'1',
+ 'x_response_reason_text': u'This transaction has been approved.',
+ 'x_ship_to_address': u'Huge Street 2/543',
+ 'x_ship_to_city': u'Sun City',
+ 'x_ship_to_company': u'',
+ 'x_ship_to_country': u'Belgium',
+ 'x_ship_to_first_name': u'Norbert',
+ 'x_ship_to_last_name': u'Buyer',
+ 'x_ship_to_state': u'',
+ 'x_ship_to_zip': u'1000',
+ 'x_state': u'',
+ 'x_tax': u'0.00',
+ 'x_tax_exempt': u'FALSE',
+ 'x_test_request': u'false',
+ 'x_trans_id': u'2217460311',
+ 'x_type': u'auth_capture',
+ 'x_zip': u'1000'
+ }
+
+ # should raise error about unknown tx
+ with self.assertRaises(ValidationError):
+ self.env['payment.transaction'].form_feedback(authorize_post_data, 'authorize')
+
+ tx = self.env['payment.transaction'].create({
+ 'amount': 320.0,
+ 'acquirer_id': self.authorize.id,
+ 'currency_id': self.currency_usd.id,
+ 'reference': 'SO004',
+ 'partner_name': 'Norbert Buyer',
+ 'partner_country_id': self.country_france.id})
+
+ # validate it
+ self.env['payment.transaction'].form_feedback(authorize_post_data, 'authorize')
+ # check state
+ self.assertEqual(tx.state, 'done', 'Authorize: validation did not put tx into done state')
+ self.assertEqual(tx.acquirer_reference, authorize_post_data.get('x_trans_id'), 'Authorize: validation did not update tx payid')
+
+ tx = self.env['payment.transaction'].create({
+ 'amount': 320.0,
+ 'acquirer_id': self.authorize.id,
+ 'currency_id': self.currency_usd.id,
+ 'reference': 'SO004-2',
+ 'partner_name': 'Norbert Buyer',
+ 'partner_country_id': self.country_france.id})
+
+ # simulate an error
+ authorize_post_data['x_response_code'] = u'3'
+ self.env['payment.transaction'].form_feedback(authorize_post_data, 'authorize')
+ # check state
+ self.assertNotEqual(tx.state, 'done', 'Authorize: erroneous validation did put tx into done state')
+
+
+@odoo.tests.tagged('post_install', '-at_install', '-standard')
+class AuthorizeS2s(AuthorizeCommon):
+ def test_30_authorize_s2s(self):
+ # be sure not to do stupid thing
+ authorize = self.authorize
+ self.assertEqual(authorize.state, 'test', 'test without test environment')
+
+ # add credential
+ # FIXME: put this test in master-nightly on odoo/odoo + create sandbox account
+ authorize.write({
+ 'authorize_transaction_key': '',
+ 'authorize_login': '',
+ })
+ self.assertTrue(authorize.authorize_test_credentials, 'Authorize.net: s2s authentication failed')
+
+ # create payment meethod
+ payment_token = self.env['payment.token'].create({
+ 'acquirer_id': authorize.id,
+ 'partner_id': self.buyer_id,
+ 'opaqueData': {
+ 'dataDescriptor': 'COMMON.ACCEPT.INAPP.PAYMENT',
+ 'dataValue': '9487801666614876704604'
+ },
+ })
+
+ # create normal s2s transaction
+ transaction = self.env['payment.transaction'].create({
+ 'amount': 500,
+ 'acquirer_id': authorize.id,
+ 'type': 'server2server',
+ 'currency_id': self.currency_usd.id,
+ 'reference': 'test_ref_%s' % int(time.time()),
+ 'payment_token_id': payment_token.id,
+ 'partner_id': self.buyer_id,
+
+ })
+ transaction.authorize_s2s_do_transaction()
+ self.assertEqual(transaction.state, 'done',)
+
+ # switch to 'authorize only'
+ # create authorize only s2s transaction & capture it
+ self.authorize.capture_manually = True
+ transaction = self.env['payment.transaction'].create({
+ 'amount': 500,
+ 'acquirer_id': authorize.id,
+ 'type': 'server2server',
+ 'currency_id': self.currency_usd.id,
+ 'reference': 'test_%s' % int(time.time()),
+ 'payment_token_id': payment_token.id,
+ 'partner_id': self.buyer_id,
+
+ })
+ transaction.authorize_s2s_do_transaction()
+ self.assertEqual(transaction.state, 'authorized')
+ transaction.action_capture()
+ self.assertEqual(transaction.state, 'done')
+
+ # create authorize only s2s transaction & void it
+ self.authorize.capture_manually = True
+ transaction = self.env['payment.transaction'].create({
+ 'amount': 500,
+ 'acquirer_id': authorize.id,
+ 'type': 'server2server',
+ 'currency_id': self.currency_usd.id,
+ 'reference': 'test_%s' % int(time.time()),
+ 'payment_token_id': payment_token.id,
+ 'partner_id': self.buyer_id,
+
+ })
+ transaction.authorize_s2s_do_transaction()
+ self.assertEqual(transaction.state, 'authorized')
+ transaction.action_void()
+ self.assertEqual(transaction.state, 'cancel')
+
+ # try charging an unexisting profile
+ ghost_payment_token = payment_token.copy()
+ ghost_payment_token.authorize_profile = '99999999999'
+ # create normal s2s transaction
+ transaction = self.env['payment.transaction'].create({
+ 'amount': 500,
+ 'acquirer_id': authorize.id,
+ 'type': 'server2server',
+ 'currency_id': self.currency_usd.id,
+ 'reference': 'test_ref_%s' % int(time.time()),
+ 'payment_token_id': ghost_payment_token.id,
+ 'partner_id': self.buyer_id,
+
+ })
+ transaction.authorize_s2s_do_transaction()
+ self.assertEqual(transaction.state, 'cancel')