121 lines
5.6 KiB
Python
121 lines
5.6 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from unittest import mock
|
|
|
|
from odoo.fields import Command
|
|
from odoo.tests import tagged
|
|
|
|
from odoo.addons.payment_sepa_direct_debit.tests.common import SepaDirectDebitCommon
|
|
|
|
|
|
@tagged('post_install', '-at_install')
|
|
class TestSepaDirectDebit(SepaDirectDebitCommon):
|
|
|
|
# TODO: Should only test that processing the tx confirms it.
|
|
def test_transactions_are_confirmed_as_soon_as_mandate_is_valid(self):
|
|
token = self._create_token(provider_ref=self.mandate.name, sdd_mandate_id=self.mandate.id)
|
|
tx = self._create_transaction(flow='token', token_id=token.id)
|
|
|
|
tx._charge_with_token()
|
|
self.assertEqual(tx.state, 'done', "SEPA transactions should be immediately confirmed.")
|
|
|
|
def test_send_payment_request_refreshes_mandate_validity(self):
|
|
"""Test that sending a payment request refreshes the mandate's state."""
|
|
token = self._create_token(provider_ref=self.mandate.name, sdd_mandate_id=self.mandate.id)
|
|
tx = self._create_transaction(flow='token', token_id=token.id)
|
|
|
|
with mock.patch(
|
|
'odoo.addons.account_sepa_direct_debit.models.sdd_mandate.SddMandate'
|
|
'._update_and_partition_state_by_validity'
|
|
) as refresh_mandate_state_mock:
|
|
tx._send_payment_request()
|
|
self.assertEqual(refresh_mandate_state_mock.call_count, 1)
|
|
|
|
def test_send_payment_request_succeeds_for_active_mandates(self):
|
|
"""Test that token payment requests are accepted for txs with an active mandate."""
|
|
token = self._create_token(provider_ref=self.mandate.name, sdd_mandate_id=self.mandate.id)
|
|
tx = self._create_transaction(flow='token', token_id=token.id)
|
|
|
|
tx._send_payment_request()
|
|
self.assertNotEqual(tx.state, 'error')
|
|
|
|
def test_send_payment_request_fails_for_inactive_mandates(self):
|
|
"""Test that token payment requests are rejected for txs with an inactive mandate."""
|
|
self.mandate.state = 'revoked'
|
|
token = self._create_token(provider_ref=self.mandate.name, sdd_mandate_id=self.mandate.id)
|
|
tx = self._create_transaction('token', token_id=token.id)
|
|
|
|
tx._send_payment_request()
|
|
self.assertEqual(tx.state, 'error')
|
|
|
|
def test_bank_statement_confirms_transaction_and_mandate(self):
|
|
tx = self._create_transaction(flow='direct', state='pending', mandate_id=self.mandate.id)
|
|
AccountBankStatementLine = self.env['account.bank.statement.line']
|
|
AccountBankStatementLine.create({
|
|
'journal_id': self.company_data['default_journal_bank'].id,
|
|
'partner_id': self.mandate.partner_id.id,
|
|
'amount_currency': tx.amount,
|
|
'foreign_currency_id': tx.currency_id.id,
|
|
'payment_ref': tx.reference,
|
|
'account_number': self.partner_bank_number
|
|
})
|
|
AccountBankStatementLine._cron_confirm_sepa_transactions()
|
|
self.assertEqual(tx.state, 'done')
|
|
|
|
def test_bank_statement_confirms_transaction_and_mandate_based_on_partner_name(self):
|
|
tx = self._create_transaction(flow='direct', state='pending', mandate_id=self.mandate.id)
|
|
AccountBankStatementLine = self.env['account.bank.statement.line']
|
|
AccountBankStatementLine.create({
|
|
'journal_id': self.company_data['default_journal_bank'].id,
|
|
'partner_name': self.mandate.partner_id.name,
|
|
'amount_currency': tx.amount,
|
|
'foreign_currency_id': tx.currency_id.id,
|
|
'payment_ref': tx.reference,
|
|
'account_number': self.partner_bank_number
|
|
})
|
|
AccountBankStatementLine._cron_confirm_sepa_transactions()
|
|
self.assertEqual(tx.state, 'done')
|
|
|
|
def test_confirming_transaction_creates_token(self):
|
|
tx = self._create_transaction(flow='direct', state='pending', mandate_id=self.mandate.id)
|
|
tx._set_done()
|
|
tx._post_process()
|
|
token = self.env['payment.token'].search([('sdd_mandate_id', '=', self.mandate.id)])
|
|
self.assertTrue(token)
|
|
self.assertTrue(token.active)
|
|
self.assertEqual(tx.token_id, token)
|
|
self.assertEqual(self.mandate.state, 'active')
|
|
|
|
def test_revoking_mandate_archives_token(self):
|
|
tx = self._create_transaction(flow='direct', state='pending', mandate_id=self.mandate.id)
|
|
tx._set_done()
|
|
token = self.env['payment.token'].search([('sdd_mandate_id', '=', self.mandate.id)])
|
|
self.mandate.with_user(self.invoicing_banks_user).action_revoke_mandate()
|
|
self.assertFalse(token.active)
|
|
|
|
def test_creating_batch_payment_generates_export_file(self):
|
|
""" Test the XML generation when validating a batch payment. """
|
|
sdd_provider_method_line = self.company_data['default_journal_bank'] \
|
|
.inbound_payment_method_line_ids.filtered(lambda l: l.code == 'sepa_direct_debit')
|
|
payment = self.env['account.payment'].create({
|
|
'payment_type': 'inbound',
|
|
'partner_id': self.partner.id,
|
|
'amount': 100.0,
|
|
'journal_id': self.company_data['default_journal_bank'].id,
|
|
'payment_method_line_id': sdd_provider_method_line.id,
|
|
})
|
|
payment.action_post()
|
|
|
|
batch_payment = self.env['account.batch.payment'].create(
|
|
{
|
|
'journal_id': payment.journal_id.id,
|
|
'payment_method_id': payment.payment_method_id.id,
|
|
'payment_ids': [
|
|
(Command.set(payment.ids))
|
|
],
|
|
}
|
|
)
|
|
batch_payment.validate_batch_button()
|
|
|
|
self.assertTrue(batch_payment.export_file)
|