"""Tests for ScheduleEntriesProcessor module.""" from decimal import Decimal from unittest.mock import MagicMock import pytest from reserves_schedule.schedule_entries_processor import ScheduleEntriesProcessor def test_processor_method( mock_ledger_reserve_taken_entries, mock_contract_reserves_response ): """Test for processor method.""" abacus_event_id = 1 mocked_installments = [ Decimal('2.1'), Decimal('2.1'), Decimal('2.1'), Decimal('2.0') ] entries_processor = ScheduleEntriesProcessor( abacus_event_id=abacus_event_id, reserves_taken=mock_ledger_reserve_taken_entries['items'], contract_reserves=mock_contract_reserves_response ) entries_processor._calc_installment_amounts = MagicMock( return_value=mocked_installments ) entries_processor.format_ledger_release_schedule_item = MagicMock( return_value='formatted_entry' ) entries_processor.process() entries_processor._calc_installment_amounts.assert_called_once_with( Decimal(mock_ledger_reserve_taken_entries['items'][0]['reserve_amount']), mock_contract_reserves_response[0]['release_schedule'] ) assert entries_processor.format_ledger_release_schedule_item.call_count == \ len(mocked_installments) assert entries_processor.reserves_schedule_entries == [ 'formatted_entry', 'formatted_entry', 'formatted_entry', 'formatted_entry' ] def test_format_ledger_release_schedule_item(): """Test for format_ledger_release_schedule_item method.""" entries_processor = ScheduleEntriesProcessor( abacus_event_id=1, reserves_taken=[], contract_reserves=[] ) reserve_taken_item = { 'account_id': 1, 'currency_code': 'USD', 'statement_period_id': 10, 'ledger_reserve_taken_id': 15 } contract_reserve_item = { 'reserve_release_offset_in_months': 4 } result = entries_processor.format_ledger_release_schedule_item( reserve_taken_item=reserve_taken_item, contract_reserve_item=contract_reserve_item, installment_amount=Decimal('-5.55'), outstanding_amount=Decimal('-45.45'), schedule_offset=3 ) assert result == { 'abacus_event_id': 1, 'account_id': 1, 'taken_statement_period_id': 10, 'release_statement_period_id': 10 + 4 + 3, 'ledger_reserve_taken_id': 15, 'currency_code': 'USD', 'installment_amount': '-5.55', 'outstanding_amount_after_installment': '-45.45' } def test_calc_installment_amounts(): """Test for _calc_installment_amounts method.""" entries_processor = ScheduleEntriesProcessor( abacus_event_id=1, reserves_taken=[], contract_reserves=[] ) reserve_amount = Decimal('-80.18') release_schedule = [ 0.083333333333, 0.083333333333, 0.083333333333, 0.083333333333, 0.083333333333, 0.083333333333, 0.083333333333, 0.083333333333, 0.083333333333, 0.083333333333, 0.083333333333, 0.083333333337 ] result = entries_processor._calc_installment_amounts( reserve_amount, release_schedule ) assert result == [ Decimal('-6.69'), Decimal('-6.69'), Decimal('-6.69'), Decimal('-6.69'), Decimal('-6.69'), Decimal('-6.69'), Decimal('-6.69'), Decimal('-6.69'), Decimal('-6.69'), Decimal('-6.69'), Decimal('-6.69'), Decimal('-6.59') ] assert sum(result) == reserve_amount @pytest.mark.parametrize( 'amount, expected', [ (Decimal('-7.05624323423'), Decimal('-7.06')), (Decimal('1.5024323423'), Decimal('1.51')), (Decimal('150.00624323423'), Decimal('150.01')), (Decimal('-452.99024323423'), Decimal('-453.00')) ] ) def test_rounded_amount(amount, expected): """Test for _rounded_amount method.""" assert ScheduleEntriesProcessor( 1, [], [] )._rounded_amount(amount) == expected