a2add43fa5
- 未填写筛选日期的参与者不再默认进入 SCREENING,状态显示为占位符。 - SubjectUpdate 不再开放 status 入参,改由后端依据日期推导,并新增 screening_date 字段允许 PM/CRA 后续补录筛选日期。 - 参与者管理页与详情页同步:详情页支持编辑筛选日期,列表页与详情页 在没有筛选日期时显示占位符而非旧 enum 值。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
55 lines
1.7 KiB
Python
55 lines
1.7 KiB
Python
from datetime import date, datetime
|
|
from types import SimpleNamespace
|
|
import uuid
|
|
|
|
from app.crud.subject import _validate_actual_medication_count
|
|
from app.schemas.subject import SubjectRead, SubjectUpdate
|
|
|
|
|
|
def test_subject_update_accepts_actual_medication_count():
|
|
payload = SubjectUpdate(actual_medication_count=12)
|
|
|
|
assert payload.actual_medication_count == 12
|
|
|
|
|
|
def test_subject_update_accepts_screening_date():
|
|
payload = SubjectUpdate(screening_date=date(2026, 5, 25))
|
|
|
|
assert payload.screening_date == date(2026, 5, 25)
|
|
|
|
|
|
def test_subject_update_does_not_expose_status_input():
|
|
assert "status" not in SubjectUpdate.model_fields
|
|
|
|
|
|
def test_subject_read_includes_actual_medication_count():
|
|
subject = SimpleNamespace(
|
|
id=uuid.UUID("00000000-0000-0000-0000-000000000001"),
|
|
study_id=uuid.UUID("00000000-0000-0000-0000-000000000002"),
|
|
site_id=uuid.UUID("00000000-0000-0000-0000-000000000003"),
|
|
subject_no="S001",
|
|
status="ENROLLED",
|
|
screening_date=None,
|
|
consent_date=None,
|
|
enrollment_date=None,
|
|
baseline_date=None,
|
|
completion_date=None,
|
|
actual_medication_count=10,
|
|
drop_reason=None,
|
|
created_at=datetime(2026, 5, 9, 0, 0, 0),
|
|
updated_at=datetime(2026, 5, 9, 0, 0, 0),
|
|
)
|
|
|
|
data = SubjectRead.model_validate(subject)
|
|
|
|
assert data.actual_medication_count == 10
|
|
|
|
|
|
def test_actual_medication_count_cannot_be_negative():
|
|
try:
|
|
_validate_actual_medication_count(-1)
|
|
except ValueError as exc:
|
|
assert "实际用药次数不能小于0" in str(exc)
|
|
else:
|
|
raise AssertionError("negative actual medication count should be rejected")
|