generated from kgod/ai-review-template
56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
"""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
|