"""Contract Term Condition schema tests.""" from abacus_common_logic.utils.dates import safe_format_datetime from marshmallow import ValidationError import pytest from abacus_contract.schemas.contract_term_condition import ConditionsSchema from abacus_contract.schemas.contract_term_condition import \ ContractTermConditionPostSchema from abacus_contract.schemas.contract_term_condition import \ ContractTermConditionPutSchema from abacus_contract.schemas.contract_term_condition import ContractTermConditionSchema from abacus_contract.schemas.contract_term_condition import \ ContractTermConditionVerboseSchema from tests.utils.factories import ContractTermConditionFactory def test_conditions_schema(): """Test conditions schema.""" conditions = { 'countries': ['IND', 'POL', 'UKR'], 'stores': ['Spotify'], 'transaction_types': [] } res = ConditionsSchema().dump(conditions) assert res['countries'] == conditions['countries'] assert res['stores'] == conditions['stores'] assert res['transaction_types'] == conditions['transaction_types'] def test_contract_term_condition_schema(): """Test contract term condition schema.""" contract_term_condition = ContractTermConditionFactory.build() res = ContractTermConditionSchema().dump(contract_term_condition) assert res['contract_term_condition_id'] == \ contract_term_condition.contract_term_condition_id assert res['contract_term_id'] == contract_term_condition.contract_term_id assert res['conditions'] == contract_term_condition.conditions assert res['priority'] == contract_term_condition.priority assert res['term_rate'] == str(contract_term_condition.term_rate) assert res['commission'] == str(contract_term_condition.commission) def test_contract_term_condition_verbose_schema(): """Test contract term condition verbose schema includes created / modified data.""" contract_term_condition = ContractTermConditionFactory.build() res = ContractTermConditionVerboseSchema().dump(contract_term_condition) assert res['created_at'] == safe_format_datetime(contract_term_condition.created_at) assert res['created_by'] == contract_term_condition.created_by assert res['last_modified'] == \ safe_format_datetime(contract_term_condition.last_modified) assert res['last_modified_by'] == contract_term_condition.last_modified_by def test_contract_term_condition_put_schema(): """Test contract term condition put schema.""" contract_term_condition = ContractTermConditionFactory.build() res = ContractTermConditionPutSchema().dump(contract_term_condition) assert res['contract_term_condition_id'] == \ contract_term_condition.contract_term_condition_id assert res['conditions'] == contract_term_condition.conditions assert res['priority'] == contract_term_condition.priority assert res['term_rate'] == str(contract_term_condition.term_rate) def test_contract_term_condition_put_schema_error(): """Test contract term condition put schema. Schema throws an error when sum of term_rate and commission is not equal to 100. """ contract_term_condition = { 'contract_term_condition_id': 1, 'term_rate': 100, 'commission': 20 } with pytest.raises(ValidationError) as excinfo: ContractTermConditionPutSchema().load(contract_term_condition) assert str(excinfo.value) == \ str({'_schema': ['The sum of commissions and term_rate should be 100.']}) def test_contract_term_condition_put_schema_for_invalid_values(): """Test contract term condition put schema. Schema throws an error when term_rate or commission is not within the range of 0 and 100. """ contract_term_condition = { 'contract_term_condition_id': 1, 'term_rate': 190 } with pytest.raises(ValidationError) as excinfo: ContractTermConditionPutSchema().load(contract_term_condition) assert str(excinfo.value) == \ "{'term_rate': ['Must be greater than or equal to 0.0 and less than or equal to 100.0.']}" # noqa:E501 contract_term_condition = { 'contract_term_condition_id': 1, 'commission': 120 } with pytest.raises(ValidationError) as excinfo: ContractTermConditionPutSchema().load(contract_term_condition) assert str(excinfo.value) == \ "{'commission': ['Must be greater than or equal to 0.0 and less than or equal to 100.0.']}" # noqa:E501 def test_contract_term_condition_post_schema(): """Test contract term condition post schema.""" contract_term_condition = ContractTermConditionFactory.build() res = ContractTermConditionPostSchema().dump(contract_term_condition) assert res == { 'conditions': contract_term_condition.conditions, 'priority': contract_term_condition.priority, 'term_rate': str(contract_term_condition.term_rate), 'commission': str(contract_term_condition.commission), 'contract_term_condition_name': contract_term_condition.contract_term_condition_name } def test_contract_term_condition_post_schema_error(): """Test contract term condition post schema. Schema throws an error when sum of term_rate and commission is not equal to 100. """ contract_term_condition = { 'conditions': {'countries': ['USA'], 'stores': [], 'transaction_types': []}, 'priority': 1, 'term_rate': 100, 'commission': 20 } with pytest.raises(ValidationError) as excinfo: ContractTermConditionPostSchema().load(contract_term_condition) assert str(excinfo.value) == \ str({'_schema': ['The sum of commissions and term_rate should be 100.']}) def test_contract_term_condition_post_schema_for_invalid_values(): """Test contract term condition post schema. Schema throws an error when term_rate or commission is not within the range of 0 and 100. """ contract_term_condition = { 'conditions': {'countries': ['USA'], 'stores': [], 'transaction_types': []}, 'priority': 1, 'term_rate': 190 } with pytest.raises(ValidationError) as excinfo: ContractTermConditionPostSchema().load(contract_term_condition) assert str(excinfo.value) == \ "{'term_rate': ['Must be greater than or equal to 0.0 and less than or equal to 100.0.']}" # noqa:E501 contract_term_condition = { 'conditions': {'countries': ['USA'], 'stores': [], 'transaction_types': []}, 'priority': 1, 'commission': 120 } with pytest.raises(ValidationError) as excinfo: ContractTermConditionPostSchema().load(contract_term_condition) assert str(excinfo.value) == \ "{'commission': ['Must be greater than or equal to 0.0 and less than or equal to 100.0.']}" # noqa:E501 def test_contract_term_condition_post_schema_for_missing_values(): """Test contract term condition post schema. Schema throws an error when term_rate and commission both missing. """ contract_term_condition = { 'conditions': {'countries': ['USA'], 'stores': [], 'transaction_types': []}, 'priority': 1 } with pytest.raises(ValidationError) as excinfo: ContractTermConditionPostSchema().load(contract_term_condition) assert str(excinfo.value) == \ str({'_schema': ['Both the term rate and commission cannot be blank.']})