test_protocol_status_change_history.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. """状态变更历史:同类型追加不覆盖。"""
  2. from datetime import datetime
  3. from sqlalchemy import create_engine
  4. from sqlalchemy.orm import sessionmaker
  5. def _session():
  6. from app.models.models import BizCollectionProtocol, BizProtocolStatusChange, SysUser
  7. engine = create_engine("sqlite:///:memory:")
  8. BizCollectionProtocol.__table__.create(engine)
  9. BizProtocolStatusChange.__table__.create(engine)
  10. SysUser.__table__.create(engine)
  11. return sessionmaker(bind=engine, autoflush=False, autocommit=False)(), engine
  12. def test_same_type_status_change_appends_instead_of_overwrite():
  13. from app.crud.collection_protocol import (
  14. list_protocol_status_changes,
  15. update_collection_protocol,
  16. )
  17. from app.models.models import BizCollectionProtocol
  18. db, engine = _session()
  19. try:
  20. now = datetime(2026, 3, 1, 10, 0, 0)
  21. db.add(
  22. BizCollectionProtocol(
  23. id="p1",
  24. protocol_no="XY0001",
  25. protocol_status="sxz",
  26. tenant_no="zkxw",
  27. create_dept_id="",
  28. create_time=now,
  29. update_time=now,
  30. del_flag=0,
  31. )
  32. )
  33. db.commit()
  34. update_collection_protocol(
  35. db,
  36. "p1",
  37. tenant_no="zkxw",
  38. user_id="u1",
  39. protocol_status="ygq",
  40. expire_time=datetime(2026, 6, 1, 12, 0, 0),
  41. expire_desc="第一次过期",
  42. )
  43. update_collection_protocol(
  44. db,
  45. "p1",
  46. tenant_no="zkxw",
  47. user_id="u2",
  48. protocol_status="ygq",
  49. expire_time=datetime(2026, 9, 15, 18, 0, 0),
  50. expire_desc="第二次过期",
  51. )
  52. row = db.query(BizCollectionProtocol).filter(BizCollectionProtocol.id == "p1").one()
  53. assert row.expire_desc == "第二次过期"
  54. items = list_protocol_status_changes(db, collection_protocol_id="p1", tenant_no="zkxw")
  55. assert [item["changeDesc"] for item in items] == ["第一次过期", "第二次过期"]
  56. assert [item["changeType"] for item in items] == ["expire", "expire"]
  57. assert items[0]["fromStatus"] == "sxz"
  58. assert items[1]["fromStatus"] == "ygq"
  59. assert items[1]["toStatus"] == "ygq"
  60. finally:
  61. db.close()
  62. engine.dispose()