"""Unit tests for Worksheet Payment Contract Advance schemas.""" from decimal import Decimal from marshmallow import ValidationError import pytest from payment.schemas.worksheet_payment_contract_advance import ( WorksheetPaymentContractAdvanceDetailSchema, WorksheetPaymentContractAdvancePostSchema, WorksheetPaymentContractAdvancePutSchema, ) from tests.utils.factories import WorksheetPaymentContractAdvanceFactory def test_worksheet_payment_contact_advance_post_schema_load(): """Test WorksheetPaymentContractAdvancePostSchema load data.""" test_data = { 'exchange_rate_id': 1, 'statement_period_id': 1, 'payment_name': 'test_name', 'amount': '100.00', 'currency_code': 'USD', 'payee_currency_code': 'GBP', 'withholding_tax_amount': '-10.00', 'vat_amount': '20.00', 'amount_after_withholding_and_vat': '110.00', 'us_source_income_rate': '90.00', 'is_internal': True, } result = WorksheetPaymentContractAdvancePostSchema().load(test_data) assert result == { 'exchange_rate_id': 1, 'statement_period_id': 1, 'payment_name': 'test_name', 'amount': Decimal('100.00'), 'currency_code': 'USD', 'payee_currency_code': 'GBP', 'withholding_tax_amount': Decimal('-10.00'), 'vat_amount': Decimal('20.00'), 'amount_after_withholding_and_vat': Decimal('110.00'), 'us_source_income_rate': Decimal('90.00'), 'is_internal': True, } def test_worksheet_payment_contact_advance_post_schema_load_failure(): """Test WorksheetPaymentContractAdvancePostSchema load data failure.""" test_data = { 'exchange_rate_id': 1, 'statement_period_id': 1, 'payment_name': 'test_name', 'amount': '100.00', 'currency_code': 'USD', 'payee_currency_code': 'GBP', 'withholding_tax_amount': '10.00', 'vat_amount': '-20.00', 'amount_after_withholding_and_vat': '-110.00', 'us_source_income_rate': '-90.00', 'is_internal': True, } with pytest.raises(Exception) as excinfo: WorksheetPaymentContractAdvancePostSchema().load(test_data) 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.'], 'amount_after_withholding_and_vat': ['Must be greater 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_worksheet_payment_contact_advance_detail_schema_dump( fresh_db, mock_statement_periods, mock_exchange_rates, mock_contract_advance ): """Test WorksheetPaymentContractAdvanceDetailSchema dump.""" worksheet = WorksheetPaymentContractAdvanceFactory.create() result = WorksheetPaymentContractAdvanceDetailSchema().dump(worksheet) assert result == { 'worksheet_payment_contract_advance_id': worksheet.worksheet_payment_contract_advance_id, 'contract_advance_id': worksheet.contract_advance_id, 'statement_period_id': worksheet.statement_period_id, 'exchange_rate_statement_period_id': worksheet.exchange_rate_statement_period_id, 'payment_name': worksheet.payment_name, 'amount': str(worksheet.amount), 'amount_payee_currency': str(worksheet.amount_payee_currency), 'currency_code': worksheet.currency_code, 'payee_currency_code': worksheet.payee_currency_code, 'exchange_rate': str(worksheet.exchange_rate), 'withholding_tax_amount': str(worksheet.withholding_tax_amount), 'vat_amount': str(worksheet.vat_amount), 'amount_after_withholding_and_vat': str( worksheet.amount_after_withholding_and_vat ), 'withholding_tax_amount_payee_currency': str( worksheet.withholding_tax_amount_payee_currency ), 'vat_amount_payee_currency': str(worksheet.vat_amount_payee_currency), 'amount_after_withholding_and_vat_payee_currency': str( worksheet.amount_after_withholding_and_vat_payee_currency ), 'us_source_income_rate': str(worksheet.us_source_income_rate), 'salesforce_id': worksheet.salesforce_id, 'is_internal': worksheet.is_internal, } @pytest.mark.parametrize('salesforce_id', ('test_id', None)) def test_worksheet_payment_contact_advance_put_schema_load(salesforce_id): """Test WorksheetPaymentContractAdvancePutSchema load.""" test_data = {'salesforce_id': salesforce_id} result = WorksheetPaymentContractAdvancePutSchema().load(test_data) assert result == {'salesforce_id': salesforce_id} def test_worksheet_payment_contact_advance_put_schema_load_failure(): """Test WorksheetPaymentContractAdvancePutSchema load.""" test_data = {} with pytest.raises(ValidationError) as excinfo: WorksheetPaymentContractAdvancePutSchema().load(test_data) assert excinfo.value.messages == {'salesforce_id': ['Must be specified.']}