"""Unit tests for handling the commit_vat_summary ledger event.""" from decimal import Decimal from unittest.mock import MagicMock, patch import config from commit_ledger_account_contract.constants import errors from commit_ledger_account_contract.constants.constants import LEDGER_TYPES from commit_ledger_account_contract.ledger_events import CommitVatSummary import_path = 'commit_ledger_account_contract.ledger_events.commit_vat_summary' @patch(f'{import_path}.ows_client') def test__ows_moneyhub( mock_ows_client: MagicMock, mock_commit_vat_summary_event, ) -> None: """Test initializing OwsMoneyhub.""" abacus_event_id = mock_commit_vat_summary_event['abacus_event_id'] vat_summary_file_id = mock_commit_vat_summary_event['target_id'] returned_moneyhub_client = CommitVatSummary( abacus_event_id, vat_summary_file_id )._ows_moneyhub() # noqa:E501 assert returned_moneyhub_client._ows_client == mock_ows_client def test__format_ledger_account_contract_list( mock_commit_vat_summary_event, mock_ledger_vat_summary ): """Test summing on contract and formatting ledger_account_contract entries.""" abacus_event_id = mock_commit_vat_summary_event['abacus_event_id'] vat_summary_file_id = mock_commit_vat_summary_event['target_id'] mock_ledger_vat_summary_grouped_by_contract = { 1: [mock_ledger_vat_summary[0], mock_ledger_vat_summary[2]], 2: [mock_ledger_vat_summary[1]], } contract_1_amount = sum( [ Decimal(mock_ledger_vat_summary[0]['vat_amount_payee_currency']), Decimal(mock_ledger_vat_summary[2]['vat_amount_payee_currency']), ] ) commit_vat_summary = CommitVatSummary(abacus_event_id, vat_summary_file_id) res = commit_vat_summary._format_ledger_account_contract_list( mock_ledger_vat_summary_grouped_by_contract ) assert len(res) == len(mock_ledger_vat_summary_grouped_by_contract.keys()) assert res == [ { 'abacus_event_id': abacus_event_id, 'account_id': mock_ledger_vat_summary[0]['account_id'], 'contract_id': mock_ledger_vat_summary[0]['contract_id'], 'currency_amount': str(contract_1_amount), 'currency_code': mock_ledger_vat_summary[0]['payee_currency_code'], 'model_type': LEDGER_TYPES.ACCOUNT, }, { 'abacus_event_id': abacus_event_id, 'account_id': mock_ledger_vat_summary[1]['account_id'], 'contract_id': mock_ledger_vat_summary[1]['contract_id'], 'currency_amount': mock_ledger_vat_summary[1]['vat_amount_payee_currency'], 'currency_code': mock_ledger_vat_summary[1]['payee_currency_code'], 'model_type': LEDGER_TYPES.ACCOUNT, }, ] @patch(f'{import_path}.app_logger') def test__get_ledger_vat_summary_list( mock_logger, mock_commit_vat_summary_event, mock_ledger_vat_summary ): """Test getting a list of ledger_vat_summary items.""" abacus_event_id = mock_commit_vat_summary_event['abacus_event_id'] vat_summary_file_id = mock_commit_vat_summary_event['target_id'] mock_ows_moneyhub = MagicMock() CommitVatSummary._ows_moneyhub = mock_ows_moneyhub mock_ows_moneyhub.return_value.get_ledger_vat_summary_by_file.return_value = { 'items': mock_ledger_vat_summary, 'pagination': {'total_records': len(mock_ledger_vat_summary)}, } commit_vat_summary = CommitVatSummary(abacus_event_id, vat_summary_file_id) res = commit_vat_summary._get_ledger_vat_summary_list() assert res == mock_ledger_vat_summary mock_ows_moneyhub.return_value.get_ledger_vat_summary_by_file.assert_called_once_with( vat_summary_file_id=vat_summary_file_id, limit=int(config.BATCH_SIZE_GET), offset=0, ) mock_logger.info.assert_called_once_with( f'{len(mock_ledger_vat_summary)} ledger_vat_summary_items: {mock_ledger_vat_summary}' # noqa E501 ) @patch(f'{import_path}.app_logger') def test__get_ledger_vat_summary_list_batches( mock_logger, mock_commit_vat_summary_event, mock_ledger_vat_summary ): """Test getting a list of ledger_vat_summary items in batches.""" abacus_event_id = mock_commit_vat_summary_event['abacus_event_id'] vat_summary_file_id = mock_commit_vat_summary_event['target_id'] mock_batch_size_get = 1 mock_ows_moneyhub = MagicMock() CommitVatSummary._ows_moneyhub = mock_ows_moneyhub mock_ows_moneyhub.return_value.get_ledger_vat_summary_by_file.side_effect = [ { 'items': [mock_ledger_vat_summary[0]], 'pagination': {'total_records': len(mock_ledger_vat_summary)}, }, { 'items': [mock_ledger_vat_summary[1]], 'pagination': {'total_records': len(mock_ledger_vat_summary)}, }, { 'items': [mock_ledger_vat_summary[2]], 'pagination': {'total_records': len(mock_ledger_vat_summary)}, }, ] commit_vat_summary = CommitVatSummary(abacus_event_id, vat_summary_file_id) commit_vat_summary._batch_size_get = mock_batch_size_get res = commit_vat_summary._get_ledger_vat_summary_list() assert res == mock_ledger_vat_summary assert mock_ows_moneyhub.return_value.get_ledger_vat_summary_by_file.call_count > 1 mock_ows_moneyhub.return_value.get_ledger_vat_summary_by_file.assert_any_call( vat_summary_file_id=vat_summary_file_id, limit=mock_batch_size_get, offset=0 ) mock_ows_moneyhub.return_value.get_ledger_vat_summary_by_file.assert_any_call( vat_summary_file_id=vat_summary_file_id, limit=mock_batch_size_get, offset=1 ) mock_ows_moneyhub.return_value.get_ledger_vat_summary_by_file.assert_called_with( vat_summary_file_id=vat_summary_file_id, limit=mock_batch_size_get, offset=2 ) mock_logger.info.assert_called_once_with( f'{len(mock_ledger_vat_summary)} ledger_vat_summary_items: {mock_ledger_vat_summary}' # noqa E501 ) def test__group_by_contract(mock_commit_vat_summary_event, mock_ledger_vat_summary): """Test grouping list of ledger_vat_summary items by contract_id.""" abacus_event_id = mock_commit_vat_summary_event['abacus_event_id'] vat_summary_file_id = mock_commit_vat_summary_event['target_id'] commit_vat_summary = CommitVatSummary(abacus_event_id, vat_summary_file_id) res = commit_vat_summary._group_by_contract(mock_ledger_vat_summary) assert len(res.keys()) < len(mock_ledger_vat_summary) assert set(res.keys()) == set( [item['contract_id'] for item in mock_ledger_vat_summary] ) assert res == { 1: [mock_ledger_vat_summary[0], mock_ledger_vat_summary[2]], 2: [mock_ledger_vat_summary[1]], } @patch(f'{import_path}.LedgerEntryQueue') @patch(f'{import_path}.app_logger') def test_commit_vat_summary_success( mock_logger, mock_ledger_entry_queue, mock_commit_vat_summary_event, mock_ledger_vat_summary, ): """Test committing ledger_vat_summary items to ledger_account_contract.""" abacus_event_id = mock_commit_vat_summary_event['abacus_event_id'] vat_summary_file_id = mock_commit_vat_summary_event['target_id'] mock_ledger_vat_summary_grouped_by_contract = { 1: [mock_ledger_vat_summary[0], mock_ledger_vat_summary[2]], 2: [mock_ledger_vat_summary[1]], } mock_ledger_account_contract = [ { 'abacus_event_id': abacus_event_id, 'account_id': 1, 'contract_id': 1, 'currency_amount': '-113.45', # -123.45 + 10.00 'currency_code': 'GBP', 'model_type': LEDGER_TYPES.ACCOUNT, }, { 'abacus_event_id': abacus_event_id, 'account_id': 2, 'contract_id': 2, 'currency_amount': '-111.22', 'currency_code': 'GBP', 'model_type': LEDGER_TYPES.ACCOUNT, }, ] mock_ledger_entry_queue.return_value.length = len(mock_ledger_account_contract) CommitVatSummary._get_ledger_vat_summary_list = MagicMock( return_value=mock_ledger_vat_summary ) CommitVatSummary._group_by_contract = MagicMock( return_value=mock_ledger_vat_summary_grouped_by_contract ) CommitVatSummary._format_ledger_account_contract_list = MagicMock( return_value=mock_ledger_account_contract ) CommitVatSummary(abacus_event_id, vat_summary_file_id).commit_vat_summary() CommitVatSummary._get_ledger_vat_summary_list.assert_called_once() CommitVatSummary._group_by_contract.assert_called_once_with(mock_ledger_vat_summary) CommitVatSummary._format_ledger_account_contract_list.assert_called_once_with( mock_ledger_vat_summary_grouped_by_contract ) mock_ledger_entry_queue.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() mock_logger.error.assert_not_called() @patch(f'{import_path}.LedgerEntryQueue') @patch(f'{import_path}.app_logger') def test_commit_vat_summary_batches_success( mock_logger, mock_ledger_entry_queue, mock_commit_vat_summary_event, mock_ledger_vat_summary, ): """Test batch-committing ledger_vat_summary items to ledger_account_contract.""" abacus_event_id = mock_commit_vat_summary_event['abacus_event_id'] vat_summary_file_id = mock_commit_vat_summary_event['target_id'] mock_ledger_vat_summary_grouped_by_contract = { 1: [mock_ledger_vat_summary[0], mock_ledger_vat_summary[2]], 2: [mock_ledger_vat_summary[1]], } mock_ledger_account_contract = [ { 'abacus_event_id': abacus_event_id, 'account_id': 1, 'contract_id': 1, 'currency_amount': '-113.45', # -123.45 + 10.00 'currency_code': 'GBP', 'model_type': LEDGER_TYPES.ACCOUNT, }, { 'abacus_event_id': abacus_event_id, 'account_id': 2, 'contract_id': 2, 'currency_amount': '-111.22', 'currency_code': 'GBP', 'model_type': LEDGER_TYPES.ACCOUNT, }, ] mock_ledger_entry_queue.return_value.length = int(config.BATCH_SIZE_POST) CommitVatSummary._get_ledger_vat_summary_list = MagicMock( return_value=mock_ledger_vat_summary ) CommitVatSummary._group_by_contract = MagicMock( return_value=mock_ledger_vat_summary_grouped_by_contract ) CommitVatSummary._format_ledger_account_contract_list = MagicMock( return_value=mock_ledger_account_contract ) CommitVatSummary(abacus_event_id, vat_summary_file_id).commit_vat_summary() CommitVatSummary._get_ledger_vat_summary_list.assert_called_once() CommitVatSummary._group_by_contract.assert_called_once_with(mock_ledger_vat_summary) CommitVatSummary._format_ledger_account_contract_list.assert_called_once_with( mock_ledger_vat_summary_grouped_by_contract ) mock_ledger_entry_queue.assert_called_once() assert mock_ledger_entry_queue.return_value.append.call_count == 2 assert mock_ledger_entry_queue.return_value.flush_entries.call_count > 1 mock_logger.error.assert_not_called() @patch(f'{import_path}.app_logger') def test_commit_vat_summary_handles_error(mock_logger, mock_commit_vat_summary_event): """Test main commit method handles errors.""" abacus_event_id = mock_commit_vat_summary_event['abacus_event_id'] vat_summary_file_id = mock_commit_vat_summary_event['target_id'] CommitVatSummary._get_ledger_vat_summary_list.side_effect = Exception('wtf?') CommitVatSummary(abacus_event_id, vat_summary_file_id).commit_vat_summary() mock_logger.error.assert_any_call( errors.SOMETHING_WENT_WRONG.format('a vat summary file') ) mock_logger.error.assert_called_with('wtf?')