Files
next-tjwater-server/tests/unit/test_peripheral_work_order_activity.py
T
jiang 05183aff93
Generic Container CI/CD / test-build-publish (push) Successful in 3m53s
Server CI/CD v2 / build-test-publish-and-deploy (push) Successful in 3m52s
feat: extend operational investigation workflows
2026-10-30 17:30:19 +08:00

92 lines
3.9 KiB
Python

from uuid import uuid4
import pytest
from pydantic import ValidationError
from samples.peripheral.auth import Identity
from samples.peripheral.config import SampleSettings
from samples.peripheral.schemas import CreateWorkOrder, UpdateWorkOrder, WorkOrder
from samples.peripheral.store import PostgresStore
def test_create_and_update_record_flat_order_activity(monkeypatch):
store = PostgresStore(SampleSettings())
actor = Identity(str(uuid4()), str(uuid4()), True)
saved = {}
monkeypatch.setattr(store, "_mutate", lambda who, key, command, operation: operation(None, "normal"))
def save(_conn, _who, document):
saved.clear()
saved.update(WorkOrder.model_validate(document).model_dump(mode="json"))
return dict(saved)
monkeypatch.setattr(store, "_save_work_order", save)
monkeypatch.setattr(store, "_managed_document", lambda *_args: dict(saved))
created = store.create_work_order(actor, CreateWorkOrder(
request_id=uuid4(), title="阀门预约复核", summary="现场复核开度",
location="北区阀门", assignee="北区班组",
feedback_requirements=["回传开度照片"],
))
assert created["feedback_requirements"] == ["回传开度照片"]
assert created["origin"] == "system_data"
assert created["activity"][0]["kind"] == "created"
assert "subtasks" not in created
updated = store.update_work_order(actor, created["work_order_id"], UpdateWorkOrder(
request_id=uuid4(), expected_revision=1, status="awaiting_reply",
progress_note="已复核开度,等待回执确认",
))
assert updated["status"] == "awaiting_reply"
assert updated["origin"] == "system_data"
assert [entry["sequence"] for entry in updated["activity"]] == [1, 2]
assert updated["activity"][1]["kind"] == "feedback"
assert updated["activity"][1]["detail"] == "已复核开度,等待回执确认"
assert "progress_note" not in updated
@pytest.mark.parametrize(("work_order_type", "detail"), [
("general", "预约工单已创建。"),
("water_quality_complaint", "投诉工单已创建。"),
("burst_report", "爆管上报工单已创建。"),
])
def test_created_activity_distinguishes_work_order_type(monkeypatch, work_order_type, detail):
store = PostgresStore(SampleSettings())
actor = Identity(str(uuid4()), str(uuid4()), True)
monkeypatch.setattr(store, "_mutate", lambda who, key, command, operation: operation(None, "normal"))
monkeypatch.setattr(store, "_save_work_order", lambda _conn, _who, document: document)
created = store.create_work_order(actor, CreateWorkOrder(
request_id=uuid4(), title="测试工单", summary="验证创建活动语义",
work_order_type=work_order_type,
))
assert created["activity"][0]["detail"] == detail
def test_legacy_order_reads_flat_without_claiming_unrecorded_progress():
legacy = {"work_order_id": str(uuid4()), "subtasks": [{"stages": [{"status": "done"}]}]}
projected = PostgresStore._active_managed_document(legacy)
assert "subtasks" not in projected
assert projected["feedback_requirements"] == []
assert projected["activity"] == []
def test_work_order_contract_rejects_synthetic_origin():
with pytest.raises(ValidationError):
CreateWorkOrder(
request_id=uuid4(), title="来源校验", summary="只接受系统数据", origin="synthetic",
)
def test_legacy_work_order_origin_is_normalized_for_reads():
legacy = {
"work_order_id": str(uuid4()), "project_id": str(uuid4()), "revision": 1,
"title": "历史工单", "summary": "迁移前记录", "status": "open", "priority": "normal",
"assignee": None, "scheduled_at": None, "origin": "synthetic",
"created_at": "2026-09-18T00:00:00Z", "updated_at": "2026-09-18T00:00:00Z",
"created_by": str(uuid4()), "updated_by": str(uuid4()),
}
assert WorkOrder.model_validate(legacy).origin == "system_data"