158 lines
5.6 KiB
Python
158 lines
5.6 KiB
Python
"""预签约订单:意向金状态机与转正约束单测"""
|
|
|
|
import unittest
|
|
|
|
from app.services.protocol_transfer_status import can_confirm_receipt, can_submit_receipt
|
|
|
|
|
|
class TestPresignTransferStatus(unittest.TestCase):
|
|
def test_presign_transfer_same_status_machine(self):
|
|
self.assertTrue(can_submit_receipt("dfj"))
|
|
self.assertFalse(can_submit_receipt("jfqrz"))
|
|
self.assertFalse(can_submit_receipt("yjf"))
|
|
self.assertTrue(can_confirm_receipt("jfqrz"))
|
|
self.assertFalse(can_confirm_receipt("dfj"))
|
|
|
|
def test_can_withdraw_only_jfqrz(self):
|
|
from app.services.protocol_transfer_status import can_withdraw_receipt
|
|
|
|
self.assertTrue(can_withdraw_receipt("jfqrz"))
|
|
self.assertFalse(can_withdraw_receipt("dfj"))
|
|
self.assertFalse(can_withdraw_receipt("yjf"))
|
|
self.assertFalse(can_withdraw_receipt(None))
|
|
self.assertFalse(can_withdraw_receipt(""))
|
|
|
|
|
|
class TestFinanceTransferFields(unittest.TestCase):
|
|
def test_sample_type_names_helper_exists(self):
|
|
from app.crud.presign_order import _sample_type_names
|
|
|
|
self.assertTrue(callable(_sample_type_names))
|
|
|
|
|
|
class TestConvertRules(unittest.TestCase):
|
|
def test_convert_requires_active_status(self):
|
|
from app.crud.presign_order import assert_presign_convertible
|
|
|
|
with self.assertRaises(ValueError):
|
|
assert_presign_convertible(order_status="converted")
|
|
with self.assertRaises(ValueError):
|
|
assert_presign_convertible(order_status="void")
|
|
assert_presign_convertible(order_status="active")
|
|
assert_presign_convertible(order_status="draft")
|
|
|
|
|
|
class TestConvertStaffMapping(unittest.TestCase):
|
|
"""转正式:采集专员→采集专员+市场专员;采集经理→地区经理。"""
|
|
|
|
def test_collector_fills_collector_and_sales(self):
|
|
from app.crud.presign_order import resolve_convert_staff_fields
|
|
|
|
out = resolve_convert_staff_fields(
|
|
collector_user_id="c1",
|
|
sales_user_id="s1",
|
|
region_manager_user_id="m1",
|
|
fallback_user_id="u0",
|
|
)
|
|
self.assertEqual(out["collector_user_id"], "c1")
|
|
self.assertEqual(out["sales_user_id"], "c1")
|
|
self.assertEqual(out["region_manager_user_id"], "m1")
|
|
|
|
def test_collector_fallback_to_operator_when_empty(self):
|
|
from app.crud.presign_order import resolve_convert_staff_fields
|
|
|
|
out = resolve_convert_staff_fields(
|
|
collector_user_id=None,
|
|
sales_user_id="s1",
|
|
region_manager_user_id="",
|
|
fallback_user_id="u0",
|
|
)
|
|
self.assertEqual(out["collector_user_id"], "u0")
|
|
self.assertEqual(out["sales_user_id"], "u0")
|
|
self.assertIsNone(out["region_manager_user_id"])
|
|
|
|
|
|
class TestProtocolDepositAssociation(unittest.TestCase):
|
|
"""正式协议意向金通过 source_presign_order_id 关联预签,不落快照表。"""
|
|
|
|
def test_list_deposit_transfers_for_protocol_uses_presign_source(self):
|
|
from app.crud.protocol_sample_payment import list_deposit_transfers_for_protocol
|
|
|
|
# 无来源预签时返回空列表
|
|
class _FakeDb:
|
|
pass
|
|
|
|
self.assertEqual(
|
|
list_deposit_transfers_for_protocol(
|
|
_FakeDb(), source_presign_order_id=None, tenant_no="t1"
|
|
),
|
|
[],
|
|
)
|
|
self.assertEqual(
|
|
list_deposit_transfers_for_protocol(
|
|
_FakeDb(), source_presign_order_id=" ", tenant_no="t1"
|
|
),
|
|
[],
|
|
)
|
|
|
|
|
|
class TestPresignWithdrawReceipt(unittest.TestCase):
|
|
def test_withdraw_sets_dfj_keeps_finance_remark(self):
|
|
from types import SimpleNamespace
|
|
from unittest.mock import MagicMock
|
|
from app.crud import presign_order as po
|
|
|
|
t = SimpleNamespace(
|
|
id="t1",
|
|
pay_status="jfqrz",
|
|
finance_remark="keep-me",
|
|
finance_confirm_attachments="http://x",
|
|
update_by=None,
|
|
update_time=None,
|
|
)
|
|
db = MagicMock()
|
|
orig = po._get_transfer_or_raise
|
|
orig_update = po._update_transfer_expected_status
|
|
po._get_transfer_or_raise = lambda *a, **k: t
|
|
|
|
def atomic_update(*args, **kwargs):
|
|
for column, value in kwargs["values"].items():
|
|
setattr(t, column.key, value)
|
|
db.commit()
|
|
return t
|
|
|
|
po._update_transfer_expected_status = atomic_update
|
|
try:
|
|
out = po.withdraw_receipt(
|
|
db, transfer_id="t1", tenant_no="zkxw", user_id="u1"
|
|
)
|
|
self.assertEqual(out.pay_status, "dfj")
|
|
self.assertEqual(out.finance_remark, "keep-me")
|
|
self.assertEqual(out.finance_confirm_attachments, "http://x")
|
|
db.commit.assert_called()
|
|
finally:
|
|
po._get_transfer_or_raise = orig
|
|
po._update_transfer_expected_status = orig_update
|
|
|
|
def test_withdraw_rejects_non_jfqrz(self):
|
|
from types import SimpleNamespace
|
|
from unittest.mock import MagicMock
|
|
from app.crud import presign_order as po
|
|
|
|
t = SimpleNamespace(id="t1", pay_status="yjf", finance_remark="x")
|
|
db = MagicMock()
|
|
orig = po._get_transfer_or_raise
|
|
po._get_transfer_or_raise = lambda *a, **k: t
|
|
try:
|
|
with self.assertRaises(ValueError) as ctx:
|
|
po.withdraw_receipt(
|
|
db, transfer_id="t1", tenant_no="zkxw", user_id="u1"
|
|
)
|
|
self.assertIn("撤回", str(ctx.exception))
|
|
finally:
|
|
po._get_transfer_or_raise = orig
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|