44 lines
1.4 KiB
Python
44 lines
1.4 KiB
Python
"""合同列表 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
|