"""Unit Tests for contract_advance model.""" from decimal import Decimal from abacus_contract.constants import constants from abacus_contract.models.contract_advance import ContractAdvance from tests.utils.factories import ContractAdvanceFactory from tests.utils.factories import ContractFactory from tests.utils.factories import ReferencePaymentTypeFactory def test_create_contract_advance(): """Test to create contract_advance record.""" reference_payment_type = ReferencePaymentTypeFactory.create() contract = ContractFactory.create() advance = ContractAdvance.create( contract_id=contract.contract_id, advance_description='Advance Description', amount=100.00, currency_code='USD', milestone=constants.MILESTONES.RECOUPMENT, milestone_description='Milestone Description', advance_status=constants.ADVANCE_STATUSES.NOT_QUALIFIED, reference_payment_type=reference_payment_type, vat_amount=Decimal('20.00'), withholding_tax_amount=Decimal('-10.00'), us_source_income_rate=Decimal('99.000001') ) result = ContractAdvance.query.all() assert len(result) == 1 assert result[0] == advance def test_get_paid_advances_by_contract_id_with_worksheets_logic( create_mock_paid_advances_with_worksheets_logic ): """Test to get paid contract advances by contract id with worksheets.""" contract_id = 1 limit = 10 offset = 0 status = 'paid' items, total_count = ContractAdvance.get_by_contract_id( contract_id, limit, offset, status ) assert total_count == 2 for item in items: assert item.advance_status in ( constants.ADVANCE_STATUSES.PENDING_PAYMENT, constants.ADVANCE_STATUSES.PAID ) assert item.contract_id == contract_id def test_get_paid_advances_by_contract_id_with_worksheets_logic_no_ledger( create_mock_statement_period, create_mock_account ): """Test to get paid contract advances by contract id with worksheets.""" contract_id = 1 mock_contract = ContractFactory.create(contract_id=contract_id) ContractAdvanceFactory.create( contract=mock_contract, advance_status=constants.ADVANCE_STATUSES.PAID ) ContractAdvanceFactory.create( advance_status=constants.ADVANCE_STATUSES.PAID ) ContractAdvanceFactory.create( contract=mock_contract, advance_status=constants.ADVANCE_STATUSES.PENDING_PAYMENT ) limit = 10 offset = 0 status = 'paid' items, total_count = ContractAdvance.get_by_contract_id( contract_id, limit, offset, status ) assert total_count == 2 for item in items: assert item.advance_status in ( constants.ADVANCE_STATUSES.PENDING_PAYMENT, constants.ADVANCE_STATUSES.PAID ) assert item.contract_id == contract_id assert item.date_paid is None assert item.advance_amount_payee_currency is None assert item.advance_payee_currency_code is None def test_get_paid_advances_by_contract_id_with_running_worksheets( create_mock_paid_advances_running_worksheets ): """Test to get paid contract advances by contract id with running worksheets.""" contract_id = 1 limit = 10 offset = 0 status = 'paid' items, total_count = ContractAdvance.get_by_contract_id( contract_id, limit, offset, status ) assert total_count == 1 # the contract advance should return the completed payment entry data assert items[0].advance_amount_payee_currency == Decimal('100.00') assert items[0].advance_payee_currency_code == 'USD' assert items[0].date_paid is not None def test_get_paid_advances_by_contract_id_with_failed_worksheets( create_mock_paid_advances_previously_failed_worksheets ): """Test to get paid contract advances by contract id with rejected worksheets.""" contract_id = 1 limit = 10 offset = 0 status = 'paid' items, total_count = ContractAdvance.get_by_contract_id( contract_id, limit, offset, status ) assert total_count == 1 # the contract advance should return the completed payment entry data assert items[0].advance_amount_payee_currency == Decimal('120.00') assert items[0].advance_payee_currency_code == 'AUD' assert items[0].date_paid is not None def test_get_in_review_advances_by_contract_id(): """Test to get paid contract advances by contract id.""" contract_id = 1 limit = 10 offset = 0 contract = ContractFactory.create() ContractAdvanceFactory.create( contract=contract, advance_status=constants.ADVANCE_STATUSES.IN_REVIEW ) items, total_count = ContractAdvance.get_by_contract_id( contract_id, limit, offset, constants.ADVANCE_STATUSES.IN_REVIEW ) assert total_count == 1 assert items[0].advance_status == constants.ADVANCE_STATUSES.IN_REVIEW