"""Ledger Reserve Release Schedule logic tests.""" from unittest.mock import patch from ledger.constants.error import ERROR_RECORD_ALREADY_EXISTS from ledger.logic import ledger_reserve_release_schedule as logic from ledger.schemas.ledger_reserve_release_schedule import ( LedgerReserveReleaseScheduleDetailSchema, LedgerReserveReleaseScheduleExtendedSchema, LedgerReserveReleaseSchedulePostSchema, ) from tests.utils.factories import ( LedgerReserveReleaseScheduleFactory, LedgerReserveTakenFactory, ) @patch('ledger.logic.ledger_reserve_release_schedule.LedgerReserveReleaseSchedule') def test_create_bulk(mock_model, mock_event_fixtures): """Test creating ledger reserve release schedule items.""" LedgerReserveTakenFactory.create() release_schedule = LedgerReserveReleaseScheduleFactory.create() mock_model.build.return_value = release_schedule post_data = LedgerReserveReleaseSchedulePostSchema(many=True).dump( [release_schedule] ) res = logic.bulk_create(post_data) assert res.status == 201 assert res.message == LedgerReserveReleaseScheduleDetailSchema(many=True).dump( [release_schedule] ) mock_model.build.assert_called_once_with(**post_data[0]) @patch('ledger.logic.ledger_reserve_release_schedule.LedgerReserveReleaseSchedule') def test_get_by_release_statement_period_id(mock_model, mock_event_fixtures): """Test logic getting release schedule items by statement period.""" LedgerReserveTakenFactory.create() release_schedule = LedgerReserveReleaseScheduleFactory.create() mock_model.get_by_release_statement_period_id.return_value = [release_schedule] res = logic.get_by_release_statement_period_id(1) assert res.status == 200 assert res.message == LedgerReserveReleaseScheduleExtendedSchema(many=True).dump( [release_schedule] ) mock_model.get_by_release_statement_period_id.assert_called_once_with(1) @patch('ledger.logic.ledger_reserve_release_schedule.LedgerReserveReleaseSchedule') def test_get_existing_ledger_records(mock_model, mock_event_fixtures): """Test _get_existing_ledger_records function.""" mock_post_records = [ { 'abacus_event_id': 1, 'account_id': 1, 'taken_statement_period_id': 284, 'release_statement_period_id': 286, 'ledger_reserve_taken_id': 1, 'currency_code': 'USD', 'installment_amount': -800.53, 'outstanding_amount_after_installment': 0, } ] LedgerReserveTakenFactory.create() release_schedule = LedgerReserveReleaseScheduleFactory.create() mock_model.get_by_ledger_reserve_taken_ids.return_value = [release_schedule] res = logic._get_existing_ledger_records(mock_post_records) assert len(res) == 1 mock_model.get_by_ledger_reserve_taken_ids.assert_called_once_with([1]) @patch('ledger.logic.ledger_reserve_release_schedule.abort') def test_has_existing_ledger_record(mock_abort): """Test _has_existing_ledger_record function if record exist.""" mock_existing_records = [ { 'abacus_event_id': 1, 'account_id': 1, 'taken_statement_period_id': 1, 'release_statement_period_id': 2, 'ledger_reserve_taken_id': 1, } ] mock_post_record = { 'abacus_event_id': 1, 'account_id': 1, 'taken_statement_period_id': 1, 'release_statement_period_id': 2, 'ledger_reserve_taken_id': 1, 'currency_code': 'USD', 'installment_amount': -800.53, 'outstanding_amount_after_installment': 0, } logic._has_existing_ledger_record(mock_post_record, mock_existing_records) mock_abort.assert_called_once_with( status=409, description=ERROR_RECORD_ALREADY_EXISTS.format(mock_existing_records[0]), ) @patch('ledger.logic.ledger_reserve_release_schedule.abort') def test_has_existing_ledger_record_no_error(mock_abort): """Test _has_existing_ledger_record function if record doesn't exist.""" mock_existing_records = [ { 'abacus_event_id': 1, 'account_id': 1, 'taken_statement_period_id': 1, 'release_statement_period_id': 2, 'ledger_reserve_taken_id': 1, } ] mock_post_record = { 'abacus_event_id': 1, 'account_id': 1, 'taken_statement_period_id': 1, 'release_statement_period_id': 2, 'ledger_reserve_taken_id': 2, 'currency_code': 'USD', 'installment_amount': -800.53, 'outstanding_amount_after_installment': 0, } mock_post_record.update(ledger_reserve_taken_id=2) logic._has_existing_ledger_record(mock_post_record, mock_existing_records) mock_abort.assert_not_called() @patch('ledger.logic.ledger_reserve_release_schedule.abort') def test_validate_post_request_unique_data(mock_abort): """Test _validate_post_request_data function. if request body contains unique data. """ mock_post_request = [ { 'abacus_event_id': 1, 'account_id': 1, 'taken_statement_period_id': 1, 'release_statement_period_id': 2, 'ledger_reserve_taken_id': 2, 'currency_code': 'USD', 'installment_amount': -800.53, 'outstanding_amount_after_installment': 0, }, { 'abacus_event_id': 1, 'account_id': 1, 'taken_statement_period_id': 1, 'release_statement_period_id': 2, 'ledger_reserve_taken_id': 3, 'currency_code': 'USD', 'installment_amount': 1000.10, 'outstanding_amount_after_installment': 0, }, { 'abacus_event_id': 1, 'account_id': 1, 'taken_statement_period_id': 1, 'release_statement_period_id': 2, 'ledger_reserve_taken_id': 4, 'currency_code': 'USD', 'installment_amount': 500.10, 'outstanding_amount_after_installment': 0, }, ] logic._validate_post_request_data(mock_post_request) mock_abort.assert_not_called() @patch('ledger.logic.ledger_reserve_release_schedule.abort') def test_validate_post_request_non_unique_data(mock_abort): """Test _validate_post_request_data function. if request body contains non-unique data. """ mock_post_request = [ { 'abacus_event_id': 1, 'account_id': 1, 'taken_statement_period_id': 1, 'release_statement_period_id': 2, 'ledger_reserve_taken_id': 2, 'currency_code': 'USD', 'installment_amount': -800.53, 'outstanding_amount_after_installment': 0, }, { 'abacus_event_id': 1, 'account_id': 1, 'taken_statement_period_id': 1, 'release_statement_period_id': 2, 'ledger_reserve_taken_id': 3, 'currency_code': 'USD', 'installment_amount': 1000.10, 'outstanding_amount_after_installment': 0, }, { 'abacus_event_id': 1, 'account_id': 1, 'taken_statement_period_id': 1, 'release_statement_period_id': 2, 'ledger_reserve_taken_id': 2, 'currency_code': 'USD', 'installment_amount': 1000.53, 'outstanding_amount_after_installment': 0, }, ] logic._validate_post_request_data(mock_post_request) mock_abort.assert_called()