"""Unit tests for Contract Mechanical Deduction schemas.""" from marshmallow import ValidationError import pytest from abacus_contract.constants.constants import MECHANICAL_DEDUCTION_ADMIN_TYPES from abacus_contract.constants.constants import MECHANICAL_DEDUCTION_TERRITORIES from abacus_contract.constants.constants import MECHANICAL_DEDUCTION_TYPES from abacus_contract.constants.error import ERROR_MECHANICAL_TYPE_CAN_NOT_BE_EMPTY from abacus_contract.schemas.contract_mechanical_deduction \ import ActiveContractsByDateSchema from abacus_contract.schemas.contract_mechanical_deduction \ import BaseContractMechanicalDeductionSchema from abacus_contract.schemas.contract_mechanical_deduction \ import ContractMechanicalDeductionDetailSchema from abacus_contract.schemas.contract_mechanical_deduction \ import ContractMechanicalDeductionPostSchema from abacus_contract.schemas.contract_mechanical_deduction \ import ContractMechanicalDeductionPutSchema from abacus_contract.schemas.contract_mechanical_deduction \ import ContractWorldWideMechanicalDeductionPostSchema from tests.utils.factories import ContractMechanicalDeductionFactory def test_base_contract_mechanical_deduction_schema(): """Test contract_mechanical_deduction base schema.""" mock_contract_mechanical_deduction = ContractMechanicalDeductionFactory.create() res = BaseContractMechanicalDeductionSchema().dump( mock_contract_mechanical_deduction ) assert res == { 'territory': mock_contract_mechanical_deduction.territory, 'mechanical_type': list(mock_contract_mechanical_deduction.mechanical_type), 'admin_type': mock_contract_mechanical_deduction.admin_type, 'admin_fee': str(mock_contract_mechanical_deduction.admin_fee) } def test_contract_mechanical_deduction_detail_schema(): """Test contract_mechanical_deduction detail schema.""" mock_contract_mechanical_deduction = ContractMechanicalDeductionFactory.create() res = ContractMechanicalDeductionDetailSchema().dump( mock_contract_mechanical_deduction ) assert res == { 'contract_id': mock_contract_mechanical_deduction.contract_id, 'contract_mechanical_deduction_id': mock_contract_mechanical_deduction.contract_mechanical_deduction_id, 'territory': mock_contract_mechanical_deduction.territory, 'mechanical_type': list(mock_contract_mechanical_deduction.mechanical_type), 'admin_type': mock_contract_mechanical_deduction.admin_type, 'admin_fee': str(mock_contract_mechanical_deduction.admin_fee) } def test_contract_mechanical_deduction_post_schema(): """Test contract_mechanical_deduction post schema.""" mock_payload_request = { 'admin_fee': 1.09, 'admin_type': MECHANICAL_DEDUCTION_ADMIN_TYPES.BOTH, 'territory': MECHANICAL_DEDUCTION_TERRITORIES.USA, 'mechanical_type': [MECHANICAL_DEDUCTION_TYPES.DIGITAL] } res = ContractMechanicalDeductionPostSchema().dump( mock_payload_request ) assert res == { 'territory': mock_payload_request['territory'], 'mechanical_type': mock_payload_request['mechanical_type'], 'admin_type': mock_payload_request['admin_type'], 'admin_fee': str(mock_payload_request['admin_fee']) } def test_contract_mechanical_deduction_post_schema_empty_error(): """Test contract_mechanical_deduction post schema. Schema throws an error when mechanical_type is passed with empty list. """ mock_payload_request = { 'admin_fee': 1.09, 'admin_type': MECHANICAL_DEDUCTION_ADMIN_TYPES.BOTH, 'territory': MECHANICAL_DEDUCTION_TERRITORIES.USA, 'mechanical_type': [] } with pytest.raises(ValidationError) as excinfo: ContractMechanicalDeductionPostSchema().load(mock_payload_request) assert str(excinfo.value) == \ str({'_schema': [ERROR_MECHANICAL_TYPE_CAN_NOT_BE_EMPTY]}) def test_contract_mechanical_deduction_put_schema(): """Test contract_mechanical_deduction put schema.""" mock_payload_request = { 'admin_fee': 1.09, 'admin_type': MECHANICAL_DEDUCTION_ADMIN_TYPES.BOTH, 'mechanical_type': [MECHANICAL_DEDUCTION_TYPES.DIGITAL] } res = ContractMechanicalDeductionPutSchema().dump( mock_payload_request ) assert res == { 'mechanical_type': mock_payload_request['mechanical_type'], 'admin_type': mock_payload_request['admin_type'], 'admin_fee': str(mock_payload_request['admin_fee']) } def test_contract_mechanical_deduction_put_schema_empty_error(): """Test contract_mechanical_deduction put schema. Schema throws an error when mechanical_type is passed with empty list. """ mock_payload_request = { 'admin_fee': 1.09, 'admin_type': MECHANICAL_DEDUCTION_ADMIN_TYPES.BOTH, 'mechanical_type': [] } with pytest.raises(ValidationError) as excinfo: ContractMechanicalDeductionPutSchema().load(mock_payload_request) assert str(excinfo.value) == \ str({'_schema': [ERROR_MECHANICAL_TYPE_CAN_NOT_BE_EMPTY]}) def test_contract_worldwide_mechanical_deduction_post_schema(): """Test contract_mechanical_deduction POST schema for worldwide.""" mock_payload_request = { 'admin_fee': 1.09, 'admin_type': MECHANICAL_DEDUCTION_ADMIN_TYPES.BOTH, 'mechanical_type': [MECHANICAL_DEDUCTION_TYPES.DIGITAL] } res = ContractWorldWideMechanicalDeductionPostSchema().dump( mock_payload_request ) assert res == { 'mechanical_type': mock_payload_request['mechanical_type'], 'admin_type': mock_payload_request['admin_type'], 'admin_fee': str(mock_payload_request['admin_fee']) } def test_contract_worldwide_mechanical_deduction_post_schema_empty_error(): """Test contract_mechanical_deduction POST schema for worldwide. Schema throws an error when mechanical_type is passed with empty list. """ mock_payload_request = { 'admin_fee': 1.09, 'admin_type': MECHANICAL_DEDUCTION_ADMIN_TYPES.BOTH, 'mechanical_type': [] } with pytest.raises(ValidationError) as excinfo: ContractWorldWideMechanicalDeductionPostSchema().load(mock_payload_request) assert str(excinfo.value) == \ str({'_schema': [ERROR_MECHANICAL_TYPE_CAN_NOT_BE_EMPTY]}) def test_active_contracts_by_date_schema(): """Test ActiveContractsByDateSchema with valid input.""" payload = { 'account_id': 1, 'contract_id': 1001, 'term_type': 'label', 'attachments': ['123', '456'], 'mechanical_type': [ MECHANICAL_DEDUCTION_TYPES.DIGITAL, MECHANICAL_DEDUCTION_TYPES.PHYSICAL ] } schema = ActiveContractsByDateSchema() result = schema.dump(payload) assert result == payload