"""LedgerProcessor unit tests.""" from decimal import Decimal, ROUND_UP from commit_royalties.constants.constants import LEDGER_TYPES from commit_royalties.ledger_processor import LedgerProcessor def test_format_ledger_account_entry(mock_event, mock_ledger_params): """Test creating ledger_account params.""" account_id = 123 entry_queue = list() processor = LedgerProcessor(account_id, entry_queue, mock_event) res = processor._format_ledger_account_entry(mock_ledger_params) assert res assert res == { 'abacus_event_id': mock_event.get('abacus_event_id'), 'account_id': account_id, 'contract_id': mock_ledger_params.get('contract_id'), 'currency_amount': mock_ledger_params.get('account_ledger_amount'), 'currency_code': mock_ledger_params.get('currency_code'), 'model_type': LEDGER_TYPES.ACCOUNT } def test_format_ledger_deposit_entry(mock_event, mock_ledger_params): """Test creating ledger_deposit params.""" account_id = 123 entry_queue = list() processor = LedgerProcessor(account_id, entry_queue, mock_event) res = processor._format_ledger_deposit_entry(mock_ledger_params) assert res assert res == { 'abacus_event_id': mock_event.get('abacus_event_id'), 'account_id': account_id, 'contract_id': mock_ledger_params.get('contract_id'), 'currency_code': mock_ledger_params.get('currency_code'), 'model_type': LEDGER_TYPES.DEPOSIT, 'remaining_amount': mock_ledger_params.get('remainder'), 'rounded_amount': mock_ledger_params.get('rounded_amount') } def test_process_ledger_account( mock_event, mock_sales_query ): """Test ledger processor's main process method queues ledger_account entries.""" account_id = mock_sales_query[0].get('ACCOUNT_ID') entry_queue = list() num_of_ledgers = 2 processor = LedgerProcessor(account_id, entry_queue, mock_event) processor.process(mock_sales_query) assert len(processor._entries) == len(mock_sales_query) * num_of_ledgers account_entries = [ e for e in processor._entries if e.get('model_type') == LEDGER_TYPES.ACCOUNT ] assert len(account_entries) == len(mock_sales_query) assert all(ae.get('abacus_event_id') for ae in account_entries) assert all(ae.get('account_id') for ae in account_entries) assert all(ae.get('contract_id') for ae in account_entries) assert all(ae.get('currency_amount') for ae in account_entries) assert all(ae.get('currency_code') for ae in account_entries) assert all( abs(ae.get('currency_amount').as_tuple().exponent) == 2 for ae in account_entries ) # assert that the amounts were rounded/added correctly for account_entry in account_entries: contract_id = account_entry.get('contract_id') default = Decimal('0.00') sale = next(( mock_sale.get('AMOUNT') for mock_sale in mock_sales_query if mock_sale['CONTRACT_ID'] == contract_id), default ) rounded_sale = sale.quantize(Decimal('0.01'), rounding=ROUND_UP) assert account_entry.get('currency_amount') == rounded_sale def test_process_ledger_deposit(mock_event, mock_sales_query): """Test ledger processor's main process method queues ledger_deposit entries.""" account_id = mock_sales_query[0].get('ACCOUNT_ID') entry_queue = list() num_of_ledgers = 2 processor = LedgerProcessor(account_id, entry_queue, mock_event) processor.process(mock_sales_query) assert len(processor._entries) == len(mock_sales_query) * num_of_ledgers deposit_entries = [ e for e in processor._entries if e.get('model_type') == LEDGER_TYPES.DEPOSIT ] assert len(deposit_entries) == len(mock_sales_query) assert all(de.get('abacus_event_id') for de in deposit_entries) assert all(de.get('account_id') for de in deposit_entries) assert all(de.get('contract_id') for de in deposit_entries) assert all(de.get('currency_code') for de in deposit_entries) assert all(de.get('remaining_amount') for de in deposit_entries) assert all(de.get('rounded_amount') for de in deposit_entries) assert all( abs(de.get('remaining_amount').as_tuple().exponent) == 18 for de in deposit_entries ) assert all( abs(de.get('rounded_amount').as_tuple().exponent) == 2 for de in deposit_entries )