"""Contract tests for resume editing API request and response models.""" from datetime import UTC, datetime import pytest from pydantic import ValidationError from app.models import ( ActionResponse, BusinessResume, OptimizeEntryRequest, OptimizeRequest, ResumePatchOperation, ResumePatchRequest, TimelineResponse, ) def test_resume_patch_request_validates_revision_and_extra_fields() -> None: request = ResumePatchRequest( expected_revision=2, operation={"type": "update_entry", "entry_id": "entry_1", "fields": {"major": "AI"}}, ) assert request.operation.type == "update_entry" with pytest.raises(ValidationError): ResumePatchRequest( expected_revision=0, operation={"type": "delete_entry", "entry_id": "entry_1"}, ) with pytest.raises(ValidationError): ResumePatchOperation(type="delete_entry", entry_id="entry_1", unexpected=True) def test_optimize_requests_require_entry_id() -> None: assert OptimizeRequest(entry_id="entry_1", instruction="更量化").entry_id == "entry_1" assert OptimizeEntryRequest(entry_id="entry_1").entry_id == "entry_1" with pytest.raises(ValidationError): OptimizeRequest(entry_id="") def test_action_and_timeline_responses_expose_optional_resume_field() -> None: assert "resume" in ActionResponse.model_fields assert "resume" in TimelineResponse.model_fields assert ActionResponse.model_fields["resume"].default is None assert TimelineResponse.model_fields["resume"].default is None now = datetime.now(UTC) resume = BusinessResume( id="resume_1", session_id="session_1", revision=1, content={"schema_version": 2}, created_at=now, updated_at=now, ) assert resume.content["schema_version"] == 2