"""Tests for schemas.graphql — GraphQL input/output model serialization.""" import pytest from pydantic import ValidationError from schemas import ( AbacusContract, AbacusContractInput, AbacusContractLifecycleInput, AbacusContractLifecycleScheduleInput, AbacusContractWithLifecyclesInput, ContractType, PeriodType, RenewalType, ) def _make_input() -> AbacusContractWithLifecyclesInput: lifecycle = AbacusContractLifecycleInput(lifecycle_term_start='2026-01-01') return AbacusContractWithLifecyclesInput( contract=AbacusContractInput( account_id=1, contract_name='Test', contract_type=ContractType.DISTRIBUTION, ), lifecycle=lifecycle, lifecycle_schedules=[ AbacusContractLifecycleScheduleInput( renewal_type=RenewalType.CONTINUOUSLY_ACTIVE, termination_notice_detail_interval=30, termination_notice_detail_type=PeriodType.DAY, contract_lifecycle=lifecycle, ) ], ) class TestGraphQLInputModels: def test_camel_case_serialization(self): gql_input = _make_input() d = gql_input.model_dump(by_alias=True) assert 'contractName' in d['contract'] assert 'contractType' in d['contract'] assert 'accountId' in d['contract'] assert d['contract']['contractName'] == 'Test' def test_lifecycle_schedule_camel_keys(self): gql_input = _make_input() d = gql_input.model_dump(by_alias=True) schedule = d['lifecycleSchedules'][0] assert 'renewalType' in schedule assert 'terminationNoticeDetailInterval' in schedule assert 'terminationNoticeDetailType' in schedule assert 'contractLifecycle' in schedule def test_round_trip_values(self): gql_input = _make_input() d = gql_input.model_dump(by_alias=True) assert d['contract']['contractType'] == 'distribution' assert d['lifecycle']['lifecycleTermStart'] == '2026-01-01' assert d['lifecycleSchedules'][0]['renewalType'] == 'CONTINUOUSLY_ACTIVE' def test_input_is_frozen(self): gql_input = _make_input() with pytest.raises(ValidationError): gql_input.contract = None class TestGraphQLOutputModels: def test_abacus_contract_is_frozen(self): contract = AbacusContract( contract_id=42, contract_name='Test', contract_type='distribution', ) with pytest.raises(ValidationError): contract.contract_id = 99 def test_abacus_contract_optional_fields(self): contract = AbacusContract( contract_id=42, contract_name='Test', contract_type='distribution', ) assert contract.contract_status is None assert contract.run_controller_id is None assert contract.is_excluded_from_accounting_run is None