"""Unit tests for contract_advance schemas.""" from datetime import date from decimal import Decimal from abacus_common_logic.utils.dates import safe_format_date import pytest from abacus_contract.schemas.contract_advance import ContractAdvancePaidSchema from abacus_contract.schemas.contract_advance import ContractAdvancePostSchema from abacus_contract.schemas.contract_advance import ContractAdvancePutSchema from abacus_contract.schemas.contract_advance import ContractAdvanceSchema from tests.utils.factories import ( ContractAdvanceFactory, ReferencePaymentTypeFactory ) def test_contract_advance_schema(): """Test contract_advance schema.""" reference_payment_type = ReferencePaymentTypeFactory.create() mock_contract_advance = ContractAdvanceFactory.create( note='Testing', reference_payment_type_id=reference_payment_type.reference_payment_type_id # noqa ) res = ContractAdvanceSchema().dump(mock_contract_advance) assert res == { 'note': 'Testing', 'contract_id': 1, 'advance_status': 'not_qualified', 'currency_code': 'USD', 'created_at': safe_format_date(mock_contract_advance.created_at), 'milestone': 'recoupment', 'milestone_description': 'Milestone Description', 'milestone_date': safe_format_date(mock_contract_advance.milestone_date), 'advance_description': 'Advance Description', 'contract_advance_id': 1, 'amount': '100.00', 'vat_amount': '20.00', 'withholding_tax_amount': '-10.00', 'amount_after_withholding_and_vat': '110.00', 'us_source_income_rate': '99.000001', 'reference_payment_type_id': reference_payment_type.reference_payment_type_id, 'created_by': mock_contract_advance.created_by } def test_contract_advance_paid_schema(): """Test ContractAdvancePaid schema.""" mock_paid_advance = { 'contract_advance_id': 3, 'contract_id': 4, 'statement_period_id': 282, 'milestone': 'delivery', 'advance_status': 'paid', 'milestone_date': date(2022, 9, 23), 'currency_code': 'CAD', 'amount': '1234.00', 'vat_amount': '20.00', 'withholding_tax_amount': '-10.00', 'us_source_income_rate': '99.000001', 'amount_after_withholding_and_vat': '110.00', 'advance_payee_currency_code': 'AUD', 'advance_amount_payee_currency': '4567.00', 'advance_description': 'Test Advance 3', 'milestone_description': 'Test Milestone', 'note': None, 'reference_payment_type_id': 1, 'date_paid': date(2022, 9, 13), 'created_at': date(2022, 9, 8) } res = ContractAdvancePaidSchema().dump(mock_paid_advance) assert res == { 'contract_advance_id': 3, 'contract_id': 4, 'statement_period_id': 282, 'milestone': 'delivery', 'advance_status': 'paid', 'milestone_date': safe_format_date(mock_paid_advance['milestone_date']), 'currency_code': 'CAD', 'amount': '1234.00', 'vat_amount': '20.00', 'withholding_tax_amount': '-10.00', 'amount_after_withholding_and_vat': '110.00', 'us_source_income_rate': '99.000001', 'advance_payee_currency_code': 'AUD', 'advance_amount_payee_currency': '4567.00', 'advance_description': 'Test Advance 3', 'milestone_description': 'Test Milestone', 'note': None, 'reference_payment_type_id': 1, 'date_paid': safe_format_date(mock_paid_advance['date_paid']), 'created_at': safe_format_date(mock_paid_advance['created_at']) } def test_contract_advance_post_schema_success(): """Test contract_advance post schema.""" milestone_date = date.today() mock_contract_advance = { 'note': 'Testing', 'advance_status': 'qualified', 'currency_code': 'USD', 'milestone': 'recoupment', 'milestone_description': 'Milestone Description', 'milestone_date': safe_format_date(milestone_date), 'advance_description': 'Advance Description', 'reference_payment_type_id': 1, 'amount': '100.00', 'vat_amount': '20.00', 'withholding_tax_amount': '-10.00', 'us_source_income_rate': '99.000001' } res = ContractAdvancePostSchema().load(mock_contract_advance) assert res == { 'note': 'Testing', 'advance_status': 'qualified', 'currency_code': 'USD', 'milestone': 'recoupment', 'milestone_description': 'Milestone Description', 'milestone_date': milestone_date, 'advance_description': 'Advance Description', 'reference_payment_type_id': 1, 'amount': Decimal('100.00'), 'vat_amount': Decimal('20.00'), 'withholding_tax_amount': Decimal('-10.00'), 'us_source_income_rate': Decimal('99.000001') } def test_contract_advance_post_schema_failure(): """Test contract_advance post schema.""" milestone_date = date.today() mock_contract_advance = { 'note': 'Testing', 'advance_status': 'qualified', 'currency_code': 'USD', 'milestone': 'recoupment', 'milestone_description': 'Milestone Description', 'milestone_date': safe_format_date(milestone_date), 'advance_description': 'Advance Description', 'reference_payment_type_id': 1, 'amount': '100.00', 'vat_amount': '-20.00', 'withholding_tax_amount': '10.00', 'us_source_income_rate': '-10.000001' } with pytest.raises(Exception) as excinfo: ContractAdvancePostSchema().load(mock_contract_advance) assert excinfo.value.messages == { 'vat_amount': ['Must be greater than or equal to 0.'], 'withholding_tax_amount': ['Must be less than or equal to 0.'], 'us_source_income_rate': [ 'Must be greater than or equal to 0 and less than or equal to 100.' ], } def test_contract_advance_put_schema_success(): """Test contract_advance put schema.""" milestone_date = date.today() mock_contract_advance = { 'note': None, 'advance_status': 'not_qualified', 'currency_code': 'USD', 'milestone': 'recoupment', 'milestone_description': 'Milestone Description', 'milestone_date': safe_format_date(milestone_date), 'advance_description': 'Advance Description', 'reference_payment_type_id': 1, 'amount': '100.00', 'vat_amount': '20.00', 'withholding_tax_amount': '-10.00', 'us_source_income_rate': '99.000001' } res = ContractAdvancePutSchema().load(mock_contract_advance) assert res == { 'note': None, 'advance_status': 'not_qualified', 'currency_code': 'USD', 'milestone': 'recoupment', 'milestone_description': 'Milestone Description', 'milestone_date': milestone_date, 'advance_description': 'Advance Description', 'reference_payment_type_id': 1, 'amount': Decimal('100.00'), 'vat_amount': Decimal('20.00'), 'withholding_tax_amount': Decimal('-10.00'), 'us_source_income_rate': Decimal('99.000001') } def test_contract_advance_put_schema_failure(): """Test contract_advance put schema.""" milestone_date = date.today() mock_contract_advance = { 'note': None, 'advance_status': 'not_qualified', 'currency_code': 'USD', 'milestone': 'recoupment', 'milestone_description': 'Milestone Description', 'milestone_date': safe_format_date(milestone_date), 'advance_description': 'Advance Description', 'reference_payment_type_id': 1, 'amount': '100.00', 'vat_amount': '-20.00', 'withholding_tax_amount': '10.00', 'us_source_income_rate': '-10.000001' } with pytest.raises(Exception) as excinfo: ContractAdvancePutSchema().load(mock_contract_advance) assert excinfo.value.messages == { 'vat_amount': ['Must be greater than or equal to 0.'], 'withholding_tax_amount': ['Must be less than or equal to 0.'], 'us_source_income_rate': [ 'Must be greater than or equal to 0 and less than or equal to 100.' ], }