test_crm_contract_keyword.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. """合同列表 keyword:合同编号/合同名称/客户名称(及产品)OR 匹配。"""
  2. from __future__ import annotations
  3. from unittest.mock import MagicMock
  4. from sqlalchemy import literal_column
  5. from app.crud.crm.contract import list_contracts
  6. from app.models.crm_models import CrmContract
  7. def test_list_contracts_keyword_includes_name_and_customer():
  8. """快捷检索应对齐界面占位:合同编号/合同名称/客户名称。"""
  9. db = MagicMock()
  10. q = MagicMock()
  11. q.filter.return_value = q
  12. q.order_by.return_value = q
  13. q.with_entities.return_value = q
  14. q.scalar.return_value = 0
  15. q.offset.return_value = q
  16. q.limit.return_value = q
  17. q.all.return_value = []
  18. product_q = MagicMock()
  19. product_q.outerjoin.return_value = product_q
  20. product_q.filter.return_value = product_q
  21. # 不可用 true()/false(),否则 or_ 会被 SQLAlchemy 短路折叠
  22. product_q.exists.return_value = literal_column("1 = 0")
  23. def query_side_effect(*args):
  24. if args and args[0] is CrmContract:
  25. return q
  26. return product_q
  27. db.query.side_effect = query_side_effect
  28. list_contracts(db, "shanxia2.0", filters={"keyword": "德泽"})
  29. assert q.filter.call_count >= 2
  30. keyword_expr = " ".join(str(a) for a in q.filter.call_args_list[1][0])
  31. assert "contract_no" in keyword_expr
  32. assert "contract_name" in keyword_expr
  33. assert "customer_name" in keyword_expr