112 lines
4.6 KiB
Python
112 lines
4.6 KiB
Python
|
|
from odoo.fields import Command
|
|
from odoo.addons.account.tests.common import AccountTestInvoicingCommon
|
|
from odoo.tests import tagged
|
|
from unittest.mock import patch
|
|
|
|
|
|
@tagged('post_install_l10n', 'post_install', '-at_install')
|
|
class TestQrisTransaction(AccountTestInvoicingCommon):
|
|
""" Testing the behaviours of QRIS Transaction """
|
|
|
|
@classmethod
|
|
@AccountTestInvoicingCommon.setup_chart_template('id')
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
cls.invoice = cls.env['account.move'].create({
|
|
'move_type': 'out_invoice',
|
|
'partner_id': cls.partner_a.id,
|
|
'invoice_date': '2019-05-01',
|
|
'date': '2019-05-01',
|
|
'invoice_line_ids': [
|
|
Command.create({'name': 'line1', 'price_unit': 110.0}),
|
|
],
|
|
})
|
|
cls.qris_status_success = {
|
|
"status": "success",
|
|
"data": {
|
|
"qris_status": "paid",
|
|
"qris_payment_customername": "Zainal Arief",
|
|
"qris_payment_methodby": "Sakuku"
|
|
},
|
|
"qris_api_version_code": "2206091709"
|
|
}
|
|
cls.qris_status_fail = {
|
|
"status": "failed",
|
|
"data": {
|
|
"qris_status": "unpaid"
|
|
}
|
|
}
|
|
|
|
cls.acc_qris_id = cls.env['res.partner.bank'].create({
|
|
'acc_number': '123456789012345678',
|
|
'partner_id': cls.company_data['company'].partner_id.id,
|
|
'l10n_id_qris_api_key': 'apikey',
|
|
'l10n_id_qris_mid': 'mid',
|
|
})
|
|
|
|
# Utility method to help create QRIS transactions
|
|
def _create_sample_transaction(self, model, model_id, qris_id, amount, create_at, content):
|
|
return self.env['l10n_id.qris.transaction'].create({
|
|
'model': model,
|
|
'model_id': model_id,
|
|
'qris_invoice_id': qris_id,
|
|
'qris_amount': amount,
|
|
'qris_creation_datetime': create_at,
|
|
'qris_content': content,
|
|
})
|
|
|
|
def test_retrieve_backend_record(self):
|
|
""" Test the _get_record method to retrieve original record accordingly """
|
|
trx = self._create_sample_transaction(
|
|
"account.move", str(self.invoice.id), "11254", 11000, "2024-08-01", "qris_content_sample"
|
|
)
|
|
invoice = trx._get_record()
|
|
self.assertEqual(invoice, self.invoice)
|
|
|
|
def test_latest_transaction(self):
|
|
""" Test method _get_latest_transaction"""
|
|
self._create_sample_transaction(
|
|
"account.move", "1", "11254", 11000, "2024-08-01 03:00:00", "qris_content_sample"
|
|
)
|
|
self._create_sample_transaction(
|
|
"account.move", "1", "11254", 11000, "2024-08-01 03:00:15", "qris_content_sample_latest"
|
|
)
|
|
|
|
trx = self.env['l10n_id.qris.transaction']._get_latest_transaction('account.move', '1')
|
|
self.assertTrue(
|
|
trx['qris_amount'] == 11000 and trx['qris_content'] == "qris_content_sample_latest"
|
|
)
|
|
|
|
def test_l10n_id_get_qris_qr_statuses(self):
|
|
""" Test the method _l10n_id_get_qris_qr_statuses """
|
|
|
|
# Create QRIS transaction with 2 entries in invoice details
|
|
trx = self._create_sample_transaction(
|
|
"account.move", "1", "11253", 11000, "2024-08-01", "qris_content_sample"
|
|
)
|
|
trx |= self._create_sample_transaction(
|
|
"account.move", "1", "11254", 11000, "2024-08-01", "qris_content_sample"
|
|
)
|
|
|
|
# if QRIS returns success, _l10n_id_make_request should only be called once and
|
|
# status returned is {'paid': True, 'qr_statuses': [{self.qris_status_success}]}
|
|
# and check that the transaction is also paid
|
|
with patch(
|
|
'odoo.addons.l10n_id.models.res_bank._l10n_id_make_qris_request', return_value=self.qris_status_success
|
|
) as patched:
|
|
res = trx._l10n_id_get_qris_qr_statuses()
|
|
patched.assert_called_once()
|
|
self.assertEqual(len(res['qr_statuses']), 1)
|
|
success_response = res['qr_statuses'][0]
|
|
self.assertTrue(res['paid'] and success_response['qris_payment_customername'] == 'Zainal Arief' and trx[0].paid)
|
|
|
|
# if QRIS returns fail for all, _l10n_id_make-request should be called twice and
|
|
# status returned is {'paid': False, 'qr_statuses': [{self.qris_status}, {self.qris_status_fail}]}
|
|
with patch(
|
|
'odoo.addons.l10n_id.models.res_bank._l10n_id_make_qris_request', return_value=self.qris_status_fail
|
|
) as patched:
|
|
res = trx._l10n_id_get_qris_qr_statuses()
|
|
self.assertEqual(patched.call_count, 2)
|
|
self.assertEqual(len(res['qr_statuses']), 2)
|