test_crm_contract_no_align.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from datetime import date
  2. from unittest.mock import MagicMock, patch
  3. from app.crud.crm.contract import align_contract_no_to_sign_date, replace_contract_no_date
  4. def test_replace_keeps_seq_and_swaps_date():
  5. assert (
  6. replace_contract_no_date("SX/X-JT20250803001", date(2025, 8, 10))
  7. == "SX/X-JT20250810001"
  8. )
  9. def test_replace_noop_when_same_date():
  10. assert replace_contract_no_date("SX/X-JT20250803001", date(2025, 8, 3)) == "SX/X-JT20250803001"
  11. def test_replace_returns_none_for_nonstandard():
  12. assert replace_contract_no_date("CUSTOM-001", date(2025, 8, 10)) is None
  13. assert replace_contract_no_date("", date(2025, 8, 10)) is None
  14. assert replace_contract_no_date(None, date(2025, 8, 10)) is None
  15. def test_align_returns_original_when_nonstandard():
  16. db = MagicMock()
  17. assert (
  18. align_contract_no_to_sign_date(
  19. db, "t1", "CUSTOM-001", date(2025, 8, 10)
  20. )
  21. == "CUSTOM-001"
  22. )
  23. def test_align_bumps_seq_when_occupied():
  24. db = MagicMock()
  25. def _exists(db_, tenant, no, exclude_id=None):
  26. return no == "SX/X-JT20250810001"
  27. with patch("app.crud.crm.contract.contract_no_exists", side_effect=_exists):
  28. out = align_contract_no_to_sign_date(
  29. db, "t1", "SX/X-JT20250803001", date(2025, 8, 10)
  30. )
  31. assert out == "SX/X-JT20250810002"
  32. def test_align_exclude_id_skips_self():
  33. db = MagicMock()
  34. def _exists(db_, tenant, no, exclude_id=None):
  35. if exclude_id == "self-id":
  36. return False
  37. return no == "SX/X-JT20250810001"
  38. with patch("app.crud.crm.contract.contract_no_exists", side_effect=_exists):
  39. out = align_contract_no_to_sign_date(
  40. db,
  41. "t1",
  42. "SX/X-JT20250803001",
  43. date(2025, 8, 10),
  44. exclude_id="self-id",
  45. )
  46. assert out == "SX/X-JT20250810001"