Files
shanxia2.0/backend/tests/test_crm_contract_keyword.py
2026-09-09 13:03:02 +08:00

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