"""Unit tests for the "payment group" events.""" from unittest.mock import MagicMock, patch import pytest import config from commit_ledger_account_contract.constants.constants import ( LEDGER_EVENT_TYPES, LEDGER_TYPES, PAYMENT_GROUP_TYPES, ) from commit_ledger_account_contract.constants.errors import SOMETHING_WENT_WRONG from commit_ledger_account_contract.ledger_events.commit_payment_group import ( CommitPaymentGroup, ) import_path = 'commit_ledger_account_contract.ledger_events.commit_payment_group' def test__format_ledger_account_contract_entries(mock_payment_group_payment_data): """Test formatting ledger_account_contract entries.""" abacus_event_id = 123 target_id = 456 commit_payment_group = CommitPaymentGroup( abacus_event_id, LEDGER_EVENT_TYPES.DEBIT, PAYMENT_GROUP_TYPES.PAYMENT, target_id, ) res = commit_payment_group._format_ledger_account_contract_entries( mock_payment_group_payment_data ) assert len(res) == len(mock_payment_group_payment_data) assert res[0] == { 'abacus_event_id': abacus_event_id, 'account_id': mock_payment_group_payment_data[0]['account_id'], 'contract_id': mock_payment_group_payment_data[0]['contract_id'], 'currency_amount': mock_payment_group_payment_data[0]['amount'], 'currency_code': mock_payment_group_payment_data[0]['currency_code'], 'model_type': LEDGER_TYPES.ACCOUNT, } @patch(f'{import_path}.get_payment_group_payment_data') @patch(f'{import_path}.LedgerEntryQueue') @patch(f'{import_path}.app_logger') def test_commit_success( mock_logger, mock_ledger_entry_queue, mock_get_payment_group_payment_data, mock_commit_batch_payment_event, mock_payment_group_payment_data, ): """Test committing a payment group payment to ledger_account_contract.""" abacus_event_id = mock_commit_batch_payment_event['abacus_event_id'] target_id = mock_commit_batch_payment_event['target_id'] ledger_event_type = LEDGER_EVENT_TYPES.DEBIT payment_group_type = PAYMENT_GROUP_TYPES.PAYMENT mock_ledger_account_contract_entries = [ { 'abacus_event_id': abacus_event_id, 'account_id': mock_payment_group_payment_data[0]['account_id'], 'contract_id': mock_payment_group_payment_data[0]['contract_id'], 'currency_amount': mock_payment_group_payment_data[0]['amount'], 'currency_code': mock_payment_group_payment_data[0]['currency_code'], 'model_type': LEDGER_TYPES.ACCOUNT, }, { 'abacus_event_id': abacus_event_id, 'account_id': mock_payment_group_payment_data[1]['account_id'], 'contract_id': mock_payment_group_payment_data[1]['contract_id'], 'currency_amount': mock_payment_group_payment_data[1]['amount'], 'currency_code': mock_payment_group_payment_data[1]['currency_code'], 'model_type': LEDGER_TYPES.ACCOUNT, }, { 'abacus_event_id': abacus_event_id, 'account_id': mock_payment_group_payment_data[2]['account_id'], 'contract_id': mock_payment_group_payment_data[2]['contract_id'], 'currency_amount': mock_payment_group_payment_data[2]['amount'], 'currency_code': mock_payment_group_payment_data[2]['currency_code'], 'model_type': LEDGER_TYPES.ACCOUNT, }, ] mock_get_payment_group_payment_data.return_value = mock_payment_group_payment_data mock_ledger_entry_queue.return_value.length = len( mock_ledger_account_contract_entries ) CommitPaymentGroup._format_ledger_account_contract_entries = MagicMock( return_value=mock_ledger_account_contract_entries ) CommitPaymentGroup( abacus_event_id, ledger_event_type, payment_group_type, target_id ).commit() mock_get_payment_group_payment_data.assert_called_once_with( ledger_event_type, payment_group_type, target_id ) CommitPaymentGroup._format_ledger_account_contract_entries.assert_called_once_with( mock_payment_group_payment_data ) mock_ledger_entry_queue.assert_called_once() assert mock_ledger_entry_queue.return_value.append.call_count == 3 mock_ledger_entry_queue.return_value.flush_entries.assert_called_once() mock_logger.error.assert_not_called() @patch(f'{import_path}.get_payment_group_payment_data') @patch(f'{import_path}.LedgerEntryQueue') @patch(f'{import_path}.app_logger') def test_commit_return_success( mock_logger, mock_ledger_entry_queue, mock_get_payment_group_payment_data, mock_commit_batch_payment_event, mock_payment_group_payment_data, ): """Test committing a payment group return payment to ledger_account_contract.""" abacus_event_id = mock_commit_batch_payment_event['abacus_event_id'] target_id = mock_commit_batch_payment_event['target_id'] ledger_event_type = LEDGER_EVENT_TYPES.CREDIT payment_group_type = PAYMENT_GROUP_TYPES.WHT mock_ledger_account_contract_entries = [ { 'abacus_event_id': abacus_event_id, 'account_id': mock_payment_group_payment_data[0]['account_id'], 'contract_id': mock_payment_group_payment_data[0]['contract_id'], 'currency_amount': mock_payment_group_payment_data[0]['amount'], 'currency_code': mock_payment_group_payment_data[0]['currency_code'], 'model_type': LEDGER_TYPES.ACCOUNT, }, { 'abacus_event_id': abacus_event_id, 'account_id': mock_payment_group_payment_data[1]['account_id'], 'contract_id': mock_payment_group_payment_data[1]['contract_id'], 'currency_amount': mock_payment_group_payment_data[1]['amount'], 'currency_code': mock_payment_group_payment_data[1]['currency_code'], 'model_type': LEDGER_TYPES.ACCOUNT, }, { 'abacus_event_id': abacus_event_id, 'account_id': mock_payment_group_payment_data[2]['account_id'], 'contract_id': mock_payment_group_payment_data[2]['contract_id'], 'currency_amount': mock_payment_group_payment_data[2]['amount'], 'currency_code': mock_payment_group_payment_data[2]['currency_code'], 'model_type': LEDGER_TYPES.ACCOUNT, }, ] mock_get_payment_group_payment_data.return_value = mock_payment_group_payment_data mock_ledger_entry_queue.return_value.length = len( mock_ledger_account_contract_entries ) CommitPaymentGroup._format_ledger_account_contract_entries = MagicMock( return_value=mock_ledger_account_contract_entries ) CommitPaymentGroup( abacus_event_id, ledger_event_type, payment_group_type, target_id ).commit() mock_get_payment_group_payment_data.assert_called_once_with( ledger_event_type, payment_group_type, target_id ) CommitPaymentGroup._format_ledger_account_contract_entries.assert_called_once_with( mock_payment_group_payment_data ) mock_ledger_entry_queue.assert_called_once() assert mock_ledger_entry_queue.return_value.append.call_count == 3 mock_ledger_entry_queue.return_value.flush_entries.assert_called_once() mock_logger.error.assert_not_called() @patch(f'{import_path}.get_payment_group_payment_data') @patch(f'{import_path}.LedgerEntryQueue') @patch(f'{import_path}.app_logger') def test_commit_batches_success( mock_logger, mock_ledger_entry_queue, mock_get_payment_group_payment_data, mock_commit_batch_payment_event, mock_payment_group_payment_data, ): """Test committing more than one batch of items to ledger_account_contract.""" abacus_event_id = mock_commit_batch_payment_event['abacus_event_id'] target_id = mock_commit_batch_payment_event['target_id'] ledger_event_type = LEDGER_EVENT_TYPES.DEBIT payment_group_type = PAYMENT_GROUP_TYPES.WHT mock_ledger_account_contract_entries = [ { 'abacus_event_id': abacus_event_id, 'account_id': mock_payment_group_payment_data[0]['account_id'], 'contract_id': mock_payment_group_payment_data[0]['contract_id'], 'currency_amount': mock_payment_group_payment_data[0]['amount'], 'currency_code': mock_payment_group_payment_data[0]['currency_code'], 'model_type': LEDGER_TYPES.ACCOUNT, }, { 'abacus_event_id': abacus_event_id, 'account_id': mock_payment_group_payment_data[1]['account_id'], 'contract_id': mock_payment_group_payment_data[1]['contract_id'], 'currency_amount': mock_payment_group_payment_data[1]['amount'], 'currency_code': mock_payment_group_payment_data[1]['currency_code'], 'model_type': LEDGER_TYPES.ACCOUNT, }, { 'abacus_event_id': abacus_event_id, 'account_id': mock_payment_group_payment_data[2]['account_id'], 'contract_id': mock_payment_group_payment_data[2]['contract_id'], 'currency_amount': mock_payment_group_payment_data[2]['amount'], 'currency_code': mock_payment_group_payment_data[2]['currency_code'], 'model_type': LEDGER_TYPES.ACCOUNT, }, ] mock_get_payment_group_payment_data.return_value = mock_payment_group_payment_data mock_ledger_entry_queue.return_value.length = int(config.BATCH_SIZE_POST) CommitPaymentGroup._format_ledger_account_contract_entries = MagicMock( return_value=mock_ledger_account_contract_entries ) CommitPaymentGroup( abacus_event_id, ledger_event_type, payment_group_type, target_id ).commit() mock_get_payment_group_payment_data.assert_called_once_with( ledger_event_type, payment_group_type, target_id ) CommitPaymentGroup._format_ledger_account_contract_entries.assert_called_once_with( mock_payment_group_payment_data ) mock_ledger_entry_queue.assert_called_once() assert mock_ledger_entry_queue.return_value.append.call_count == 3 mock_ledger_entry_queue.return_value.flush_entries.call_count > 1 mock_logger.error.assert_not_called() @patch(f'{import_path}.get_payment_group_payment_data') @patch(f'{import_path}.app_logger') def test_commit_handles_error( mock_logger, mock_get_payment_group_payment_data, mock_commit_batch_payment_event ): """Test main commit method handles errors.""" abacus_event_id = mock_commit_batch_payment_event['abacus_event_id'] target_id = mock_commit_batch_payment_event['target_id'] ledger_event_type = LEDGER_EVENT_TYPES.DEBIT payment_group_type = PAYMENT_GROUP_TYPES.PAYMENT mock_get_payment_group_payment_data.side_effect = Exception('SERVICE ERROR') with pytest.raises(Exception) as e: CommitPaymentGroup( abacus_event_id, ledger_event_type, payment_group_type, target_id ).commit() mock_logger.error.assert_any_call( SOMETHING_WENT_WRONG.format( f'payment group: {payment_group_type}/{ledger_event_type}' ) ) mock_logger.error.assert_called_with('SERVICE ERROR') assert str(e) == 'SERVICE ERROR'