| 12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- """合同列表 keyword:合同编号/合同名称/客户名称(及产品)OR 匹配。"""
- from __future__ import annotations
- from unittest.mock import MagicMock
- from sqlalchemy import literal_column
- from app.crud.crm.contract import list_contracts
- from app.models.crm_models import CrmContract
- def test_list_contracts_keyword_includes_name_and_customer():
- """快捷检索应对齐界面占位:合同编号/合同名称/客户名称。"""
- db = MagicMock()
- q = MagicMock()
- q.filter.return_value = q
- q.order_by.return_value = q
- q.with_entities.return_value = q
- q.scalar.return_value = 0
- q.offset.return_value = q
- q.limit.return_value = q
- q.all.return_value = []
- product_q = MagicMock()
- product_q.outerjoin.return_value = product_q
- product_q.filter.return_value = product_q
- # 不可用 true()/false(),否则 or_ 会被 SQLAlchemy 短路折叠
- product_q.exists.return_value = literal_column("1 = 0")
- def query_side_effect(*args):
- if args and args[0] is CrmContract:
- return q
- return product_q
- db.query.side_effect = query_side_effect
- list_contracts(db, "shanxia2.0", filters={"keyword": "德泽"})
- assert q.filter.call_count >= 2
- keyword_expr = " ".join(str(a) for a in q.filter.call_args_list[1][0])
- assert "contract_no" in keyword_expr
- assert "contract_name" in keyword_expr
- assert "customer_name" in keyword_expr
|