"""Unit tests for commit_advance_payment or return_advance_payment ledger event.""" from decimal import Decimal from unittest.mock import MagicMock, patch from commit_ledger_account_contract.constants.constants import LEDGER_TYPES from commit_ledger_account_contract.constants.errors import SOMETHING_WENT_WRONG from commit_ledger_account_contract.ledger_events.commit_advance_payment import ( CommitAdvancePayment, ) import_path = 'commit_ledger_account_contract.ledger_events.commit_advance_payment' def test__format_ledger_account_contract(mock_ledger_contract_advance_applied): """Test formatting a ledger_account_contract entry.""" abacus_event_id = mock_ledger_contract_advance_applied['abacus_event_id'] advance_amount = mock_ledger_contract_advance_applied[ 'advance_amount_payee_currency' ] worksheet_payment_contract_advance_id = mock_ledger_contract_advance_applied[ 'worksheet_payment_contract_advance_id' ] commit_advance_payment = CommitAdvancePayment( abacus_event_id, 'debit', worksheet_payment_contract_advance_id ) commit_advance_payment._ledger_contract_advance_applied = ( mock_ledger_contract_advance_applied ) res = commit_advance_payment._format_ledger_account_contract() assert res == { 'abacus_event_id': abacus_event_id, 'account_id': mock_ledger_contract_advance_applied['account_id'], 'contract_id': mock_ledger_contract_advance_applied['contract_id'], 'currency_amount': str(Decimal(advance_amount)), 'currency_code': mock_ledger_contract_advance_applied[ 'advance_payee_currency_code' ], 'model_type': LEDGER_TYPES.ACCOUNT, } def test__format_ledger_deposit(mock_ledger_contract_advance_applied): """Test formatting a ledger_deposit entry.""" abacus_event_id = mock_ledger_contract_advance_applied['abacus_event_id'] worksheet_payment_contract_advance_id = mock_ledger_contract_advance_applied[ 'worksheet_payment_contract_advance_id' ] remainder_amount = Decimal('0.001670608520505290000') rounded_amount = Decimal('-150.66') commit_advance_payment = CommitAdvancePayment( abacus_event_id, 'debit', worksheet_payment_contract_advance_id ) commit_advance_payment._ledger_contract_advance_applied = ( mock_ledger_contract_advance_applied ) res = commit_advance_payment._format_ledger_deposit() assert res == { 'abacus_event_id': abacus_event_id, 'account_id': mock_ledger_contract_advance_applied['account_id'], 'contract_id': mock_ledger_contract_advance_applied['contract_id'], 'currency_code': mock_ledger_contract_advance_applied[ 'advance_payee_currency_code' ], 'model_type': LEDGER_TYPES.DEPOSIT, 'rounded_amount': str(rounded_amount), 'remaining_amount': str(remainder_amount), } @patch(f'{import_path}.LedgerEntryQueue') @patch(f'{import_path}.get_ledger_contract_advance_applied') def test_commit_applied_contract_advance_different_currencies( mock_get_ledger_contract_advance_applied, mock_ledger_entry_queue, mock_ledger_contract_advance_applied, mock_bulk_ledger_post_body, ): """Test ledger_account_contract and ledger_deposit entries are created.""" abacus_event_id = mock_ledger_contract_advance_applied['abacus_event_id'] worksheet_payment_contract_advance_id = mock_ledger_contract_advance_applied[ 'worksheet_payment_contract_advance_id' ] mock_ledger_account_contract, mock_ledger_deposit = mock_bulk_ledger_post_body mock_get_ledger_contract_advance_applied.return_value = ( mock_ledger_contract_advance_applied ) mock_ledger_entry_queue.return_value._ledger_entries.return_value = ( mock_bulk_ledger_post_body ) CommitAdvancePayment._format_ledger_account_contract = MagicMock( return_value=mock_ledger_account_contract ) CommitAdvancePayment._format_ledger_deposit = MagicMock( return_value=mock_ledger_deposit ) commit_advance_payment = CommitAdvancePayment( abacus_event_id, 'debit', worksheet_payment_contract_advance_id ) commit_advance_payment.commit_applied_contract_advance() mock_get_ledger_contract_advance_applied.assert_called_once_with( 'debit', worksheet_payment_contract_advance_id ) CommitAdvancePayment._format_ledger_account_contract.assert_called_once() assert mock_ledger_entry_queue.return_value.append.call_count == 2 mock_ledger_entry_queue.return_value.flush_entries.assert_called_once() @patch(f'{import_path}.LedgerEntryQueue') @patch(f'{import_path}.get_ledger_contract_advance_applied') def test_return_applied_contract_advance_different_currencies( mock_get_ledger_contract_advance_applied, mock_ledger_entry_queue, mock_ledger_contract_advance_applied, mock_bulk_ledger_post_body, ): """Test two ledger entries are created for a returned advance payment.""" abacus_event_id = mock_ledger_contract_advance_applied['abacus_event_id'] worksheet_payment_contract_advance_id = mock_ledger_contract_advance_applied[ 'worksheet_payment_contract_advance_id' ] mock_ledger_account_contract, mock_ledger_deposit = mock_bulk_ledger_post_body mock_get_ledger_contract_advance_applied.return_value = ( mock_ledger_contract_advance_applied ) mock_ledger_entry_queue.return_value._ledger_entries.return_value = ( mock_bulk_ledger_post_body ) CommitAdvancePayment._format_ledger_account_contract = MagicMock( return_value=mock_ledger_account_contract ) CommitAdvancePayment._format_ledger_deposit = MagicMock( return_value=mock_ledger_deposit ) commit_advance_payment = CommitAdvancePayment( abacus_event_id, 'credit', worksheet_payment_contract_advance_id ) commit_advance_payment.commit_applied_contract_advance() mock_get_ledger_contract_advance_applied.assert_called_once_with( 'credit', worksheet_payment_contract_advance_id ) CommitAdvancePayment._format_ledger_account_contract.assert_called_once() assert mock_ledger_entry_queue.return_value.append.call_count == 2 mock_ledger_entry_queue.return_value.flush_entries.assert_called_once() @patch(f'{import_path}.LedgerEntryQueue') @patch(f'{import_path}.get_ledger_contract_advance_applied') def test_commit_applied_contract_advance_same_currency( mock_get_ledger_contract_advance_applied, mock_ledger_entry_queue, mock_ledger_contract_advance_applied, mock_bulk_ledger_post_body, ): """Test ledger_account_contract entry only is created.""" abacus_event_id = mock_ledger_contract_advance_applied['abacus_event_id'] worksheet_payment_contract_advance_id = mock_ledger_contract_advance_applied[ 'worksheet_payment_contract_advance_id' ] mock_ledger_account_contract, _ = mock_bulk_ledger_post_body mock_ledger_contract_advance_applied['advance_payee_currency_code'] = 'USD' mock_get_ledger_contract_advance_applied.return_value = ( mock_ledger_contract_advance_applied ) mock_ledger_entry_queue.return_value._ledger_entries.return_value = [ mock_ledger_account_contract ] CommitAdvancePayment._format_ledger_account_contract = MagicMock( return_value=mock_ledger_account_contract ) CommitAdvancePayment._format_ledger_deposit = MagicMock() commit_advance_payment = CommitAdvancePayment( abacus_event_id, 'debit', worksheet_payment_contract_advance_id ) commit_advance_payment.commit_applied_contract_advance() mock_get_ledger_contract_advance_applied.assert_called_once_with( 'debit', worksheet_payment_contract_advance_id ) CommitAdvancePayment._format_ledger_account_contract.assert_called_once() assert mock_ledger_entry_queue.return_value.append.call_count == 1 mock_ledger_entry_queue.return_value.flush_entries.assert_called_once() CommitAdvancePayment._format_ledger_deposit.assert_not_called() @patch(f'{import_path}.LedgerEntryQueue') @patch(f'{import_path}.get_ledger_contract_advance_applied') def test_return_applied_contract_advance_same_currency( mock_get_ledger_contract_advance_applied, mock_ledger_entry_queue, mock_ledger_contract_advance_applied, mock_bulk_ledger_post_body, ): """Test ledger_account_contract entry is created for returned advance payment.""" abacus_event_id = mock_ledger_contract_advance_applied['abacus_event_id'] worksheet_payment_contract_advance_id = mock_ledger_contract_advance_applied[ 'worksheet_payment_contract_advance_id' ] mock_ledger_account_contract, _ = mock_bulk_ledger_post_body mock_ledger_contract_advance_applied['advance_payee_currency_code'] = 'USD' mock_get_ledger_contract_advance_applied.return_value = ( mock_ledger_contract_advance_applied ) mock_ledger_entry_queue.return_value._ledger_entries.return_value = [ mock_ledger_account_contract ] CommitAdvancePayment._format_ledger_account_contract = MagicMock( return_value=mock_ledger_account_contract ) CommitAdvancePayment._format_ledger_deposit = MagicMock() commit_advance_payment = CommitAdvancePayment( abacus_event_id, 'credit', worksheet_payment_contract_advance_id ) commit_advance_payment.commit_applied_contract_advance() mock_get_ledger_contract_advance_applied.assert_called_once_with( 'credit', worksheet_payment_contract_advance_id ) CommitAdvancePayment._format_ledger_account_contract.assert_called_once() assert mock_ledger_entry_queue.return_value.append.call_count == 1 mock_ledger_entry_queue.return_value.flush_entries.assert_called_once() CommitAdvancePayment._format_ledger_deposit.assert_not_called() @patch(f'{import_path}.get_ledger_contract_advance_applied') @patch(f'{import_path}.app_logger') def test_commit_applied_contract_advance_handles_error( mock_logger, mock_get_ledger_contract_advance_applied, mock_ledger_contract_advance_applied, ): """Test main commit method handles errors.""" abacus_event_id = mock_ledger_contract_advance_applied['abacus_event_id'] worksheet_payment_contract_advance_id = mock_ledger_contract_advance_applied[ 'worksheet_payment_contract_advance_id' ] mock_get_ledger_contract_advance_applied.side_effect = Exception('wtf?') commit_advance_payment = CommitAdvancePayment( abacus_event_id, 'debit', worksheet_payment_contract_advance_id ) commit_advance_payment.commit_applied_contract_advance() mock_get_ledger_contract_advance_applied.assert_called_once_with( 'debit', worksheet_payment_contract_advance_id ) mock_logger.error.assert_any_call(SOMETHING_WENT_WRONG.format('a contract advance')) mock_logger.error.assert_called_with('wtf?')