Odoo18-Base/addons/payment_asiapay/tests/test_payment_transaction.py
2025-01-06 10:57:38 +07:00

110 lines
4.8 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from unittest.mock import patch
from freezegun import freeze_time
from odoo.fields import Command
from odoo.tests import tagged
from odoo.tools import mute_logger
from odoo.addons.payment.tests.http_common import PaymentHttpCommon
from odoo.addons.payment_asiapay import const
from odoo.addons.payment_asiapay.tests.common import AsiaPayCommon
@tagged('post_install', '-at_install')
class TestPaymentTransaction(AsiaPayCommon, PaymentHttpCommon):
@freeze_time('2011-11-02 12:00:21') # Freeze time for consistent singularization behavior.
def test_reference_is_singularized(self):
""" Test the singularization of reference prefixes. """
reference = self.env['payment.transaction']._compute_reference(self.asiapay.code)
self.assertEqual(reference, 'tx-20111102120021')
@freeze_time('2011-11-02 12:00:21') # Freeze time for consistent singularization behavior.
def test_reference_is_computed_based_on_document_name(self):
""" Test the computation of reference prefixes based on the provided invoice. """
self._skip_if_account_payment_is_not_installed()
invoice = self.env['account.move'].create({
'move_type': 'entry',
'date': '2011-11-02',
'line_ids': [
Command.create({
'name': 'line',
'account_id': self.company_data['default_account_revenue'].id,
}),
]
})
invoice.action_post()
reference = self.env['payment.transaction']._compute_reference(
self.asiapay.code, invoice_ids=[Command.set([invoice.id])]
)
self.assertEqual(reference, 'MISC/2011/11/0001-20111102120021')
@freeze_time('2011-11-02 12:00:21') # Freeze time for consistent singularization behavior.
def test_reference_is_stripped_at_max_length(self):
""" Test that reference prefixes are stripped to have a length of at most 35 chars. """
reference = self.env['payment.transaction']._compute_reference(
self.asiapay.code, prefix='this is a long reference of more than 35 characters'
)
self.assertEqual(reference, 'this is a long refer-20111102120021')
self.assertEqual(len(reference), 35)
def test_no_item_missing_from_rendering_values(self):
""" Test that the rendered values are conform to the transaction fields. """
tx = self._create_transaction(flow='redirect')
with patch(
'odoo.addons.payment_asiapay.models.payment_provider.PaymentProvider'
'._asiapay_calculate_signature', return_value='dummy_signature'
):
rendering_values = tx._get_specific_rendering_values(None)
self.assertDictEqual(
rendering_values,
{
'amount': tx.amount,
'api_url': tx.provider_id._asiapay_get_api_url(),
'currency_code': const.CURRENCY_MAPPING[tx.currency_id.name],
'language': const.LANGUAGE_CODES_MAPPING['en'],
'merchant_id': tx.provider_id.asiapay_merchant_id,
'mps_mode': 'SCP',
'payment_method': 'ALL',
'payment_type': 'N',
'reference': tx.reference,
'return_url': self._build_url('/payment/asiapay/return'),
'secure_hash': 'dummy_signature',
}
)
@mute_logger('odoo.addons.payment.models.payment_transaction')
def test_no_input_missing_from_redirect_form(self):
""" Test that no key is omitted from the rendering values. """
tx = self._create_transaction(flow='redirect')
expected_input_keys = [
'merchantId',
'amount',
'orderRef',
'currCode',
'mpsMode',
'successUrl',
'failUrl',
'cancelUrl',
'payType',
'lang',
'payMethod',
'secureHash',
]
processing_values = tx._get_processing_values()
form_info = self._extract_values_from_html_form(processing_values['redirect_form_html'])
self.assertEqual(form_info['action'], tx.provider_id._asiapay_get_api_url())
self.assertEqual(form_info['method'], 'post')
self.assertListEqual(list(form_info['inputs'].keys()), expected_input_keys)
def test_processing_notification_data_confirms_transaction(self):
""" Test that the transaction state is set to 'done' when the notification data indicate a
successful payment. """
tx = self._create_transaction(flow='redirect')
tx._process_notification_data(self.webhook_notification_data)
self.assertEqual(tx.state, 'done')