110 lines
4.8 KiB
Python
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')
|