payment_demo/tests/test_payment_transaction.py

103 lines
5.1 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from unittest.mock import patch
from odoo.tests import tagged
from odoo.tools import mute_logger
from odoo.addons.payment_demo.tests.common import PaymentDemoCommon
from odoo.addons.payment.tests.http_common import PaymentHttpCommon
@tagged('-at_install', 'post_install')
class TestPaymentTransaction(PaymentDemoCommon, PaymentHttpCommon):
def test_processing_notification_data_sets_transaction_pending(self):
""" Test that the transaction state is set to 'pending' when the notification data indicate
a pending payment. """
tx = self._create_transaction('direct')
tx._process_notification_data(dict(self.notification_data, simulated_state='pending'))
self.assertEqual(tx.state, 'pending')
def test_processing_notification_data_authorizes_transaction(self):
""" Test that the transaction state is set to 'authorize' when the notification data
indicate a successful payment and manual capture is enabled. """
self.provider.capture_manually = True
tx = self._create_transaction('direct')
tx._process_notification_data(self.notification_data)
self.assertEqual(tx.state, 'authorized')
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('direct')
tx._process_notification_data(self.notification_data)
self.assertEqual(tx.state, 'done')
def test_processing_notification_data_cancels_transaction(self):
""" Test that the transaction state is set to 'cancel' when the notification data indicate
an unsuccessful payment. """
tx = self._create_transaction('direct')
tx._process_notification_data(dict(self.notification_data, simulated_state='cancel'))
self.assertEqual(tx.state, 'cancel')
def test_processing_notification_data_sets_transaction_in_error(self):
""" Test that the transaction state is set to 'error' when the notification data indicate
an error during the payment. """
tx = self._create_transaction('direct')
tx._process_notification_data(dict(self.notification_data, simulated_state='error'))
self.assertEqual(tx.state, 'error')
def test_processing_notification_data_tokenizes_transaction(self):
""" Test that the transaction is tokenized when it was requested and the notification data
include token data. """
tx = self._create_transaction('direct', tokenize=True)
with patch(
'odoo.addons.payment_demo.models.payment_transaction.PaymentTransaction'
'._demo_tokenize_from_notification_data'
) as tokenize_mock:
tx._process_notification_data(self.notification_data)
self.assertEqual(tokenize_mock.call_count, 1)
@mute_logger('odoo.addons.payment_demo.models.payment_transaction')
def test_processing_notification_data_propagates_simulated_state_to_token(self):
""" Test that the simulated state of the notification data is set on the token when
processing notification data. """
for counter, state in enumerate(['pending', 'done', 'cancel', 'error']):
tx = self._create_transaction(
'direct', reference=f'{self.reference}-{counter}', tokenize=True
)
tx._process_notification_data(dict(self.notification_data, simulated_state=state))
self.assertEqual(tx.token_id.demo_simulated_state, state)
def test_making_a_payment_request_propagates_token_simulated_state_to_transaction(self):
""" Test that the simulated state of the token is set on the transaction when making a
payment request. """
for counter, state in enumerate(['pending', 'done', 'cancel', 'error']):
tx = self._create_transaction(
'direct', reference=f'{self.reference}-{counter}'
)
tx.token_id = self._create_token(demo_simulated_state=state)
tx._send_payment_request()
self.assertEqual(tx.state, tx.token_id.demo_simulated_state)
def test_send_full_capture_request_does_not_create_capture_tx(self):
self.provider.capture_manually = True
source_tx = self._create_transaction(flow='direct', state='authorized')
child_tx = source_tx._send_capture_request()
self.assertFalse(
child_tx, msg="Full capture should not create a child transaction."
)
def test_send_partial_capture_request_creates_capture_tx(self):
self.provider.capture_manually = True
source_tx = self._create_transaction(flow='direct', state='authorized')
child_tx = source_tx._send_capture_request(amount_to_capture=10)
self.assertTrue(
source_tx.child_transaction_ids,
msg="Partial capture should create a child transaction and linked it to the source tx.",
)
self.assertEqual(
child_tx.amount, 10, msg="Child transaction should have the requested amount."
)