"""合同费用基础字段测试""" from datetime import date from decimal import Decimal import uuid from starlette.requests import Request from app.api.v1 import fees_contracts from app.models.contract_fee import ContractFee from app.schemas.contract_fee import ContractFeeCreate, ContractFeeRead, ContractFeeUpdate def _request_with_query(query: str) -> Request: return Request( { "type": "http", "method": "GET", "path": "/api/v1/fees/contracts", "query_string": query.encode(), "headers": [], } ) def test_contract_fee_list_query_accepts_legacy_project_params(): """合同费用列表应兼容旧 projectId/centerId 查询参数。""" study_id = uuid.uuid4() center_id = uuid.uuid4() resolver = getattr(fees_contracts, "_resolve_contract_fee_list_query", None) assert resolver is not None resolved_study_id, resolved_center_id = resolver( _request_with_query(f"projectId={study_id}¢erId={center_id}"), None, None, ) assert resolved_study_id == study_id assert resolved_center_id == center_id def test_contract_fee_schema_includes_contract_basic_fields(): """合同费用应包含合同基础信息字段。""" study_id = uuid.uuid4() center_id = uuid.uuid4() payload = ContractFeeCreate( study_id=study_id, center_id=center_id, contract_no="CT-001", signed_date=date(2026, 5, 27), contract_amount=Decimal("120000.00"), currency="CNY", remark="首版合同", contract_cases=12, ) assert payload.contract_no == "CT-001" assert payload.signed_date == date(2026, 5, 27) assert payload.currency == "CNY" assert payload.remark == "首版合同" assert payload.study_id == study_id assert "project_id" not in ContractFeeCreate.model_fields update_payload = ContractFeeUpdate(contract_no="CT-002", currency="USD", remark="变更合同信息") assert update_payload.model_dump(exclude_unset=True) == { "contract_no": "CT-002", "currency": "USD", "remark": "变更合同信息", } for field in ("contract_no", "signed_date", "currency", "remark"): assert field in ContractFeeRead.model_fields assert "study_id" in ContractFeeRead.model_fields assert "project_id" not in ContractFeeRead.model_fields def test_contract_fee_model_includes_contract_basic_columns(): """合同费用模型应持久化合同基础信息。""" columns = ContractFee.__table__.columns assert "contract_no" in columns assert "signed_date" in columns assert "currency" in columns assert "remark" in columns