"""合同列表 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