Compare commits

...

1 Commits

Author SHA1 Message Date
guke 9036bc5a08 fix: admin 比价记录列表兼容 user_id 为空的孤儿行
软鉴权/匿名下 pricebot 帧0 建行时 user_id 可空(见 models.comparison),admin
全看含孤儿行;但 AdminComparisonListItem.user_id 声明为必填 int,Pydantic v2
对 None 抛 ValidationError,致 GET /admin/api/comparison-records 列表接口 500。
改为 int|None(详情接口继承一并修复),并补回归测试
test_comparison_records_list_tolerates_orphan_null_user。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 10:49:57 +08:00
2 changed files with 32 additions and 1 deletions
+2 -1
View File
@@ -13,7 +13,8 @@ class AdminComparisonListItem(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: int
user_id: int
# 软鉴权/匿名下帧0 建行时 user_id 可能暂缺(见 models.comparison 注释);admin 全看含孤儿行,故可空。
user_id: int | None = None
phone: str | None = None # join User 瞬态(非 DB 列)
nickname: str | None = None # join User 瞬态
business_type: str
+30
View File
@@ -842,6 +842,36 @@ def test_comparison_records_show_readable_device_and_rom_version(
assert detail.json()["platforms"][0]["is_best"] is True
def test_comparison_records_list_tolerates_orphan_null_user(
admin_client: TestClient, admin_token: str
) -> None:
"""帧0 建行但 user_id 暂缺的孤儿记录(软鉴权/匿名),admin 列表必须能序列化、不 500。"""
db = SessionLocal()
try:
db.add(
ComparisonRecord(
user_id=None,
trace_id="comparison-orphan-null-user",
status="success",
store_name="孤儿比价专用店ZZZ",
)
)
db.commit()
finally:
db.close()
response = admin_client.get(
"/admin/api/comparison-records",
params={"store": "孤儿比价专用店ZZZ"},
headers=_auth(admin_token),
)
assert response.status_code == 200, response.text
items = response.json()["items"]
assert len(items) == 1
assert items[0]["user_id"] is None
assert items[0]["trace_id"] == "comparison-orphan-null-user"
def test_comparison_records_show_real_order_status(
admin_client: TestClient, admin_token: str
) -> None: