test_demand_belong_rel.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from __future__ import annotations
  2. from unittest.mock import MagicMock, patch
  3. import pytest
  4. from supply_infra.scheduler.jobs.demand_pool.belong_rel import (
  5. sync_demand_belong_pool_rel,
  6. )
  7. @patch(
  8. "supply_infra.scheduler.jobs.demand_pool.belong_rel.DemandBelongPoolRelRepository"
  9. )
  10. @patch(
  11. "supply_infra.scheduler.jobs.demand_pool.belong_rel.MultiDemandPoolDiRepository"
  12. )
  13. @patch(
  14. "supply_infra.scheduler.jobs.demand_pool.belong_rel.DemandBelongCategoryRepository"
  15. )
  16. @patch("supply_infra.scheduler.jobs.demand_pool.belong_rel.get_session")
  17. def test_relations_are_date_scoped_and_require_explicit_tokens(
  18. mock_get_session,
  19. mock_belong_repo_cls,
  20. mock_pool_repo_cls,
  21. mock_rel_repo_cls,
  22. ) -> None:
  23. mock_get_session.return_value.__enter__.return_value = MagicMock()
  24. mock_belong_repo_cls.return_value.list_active_id_name.return_value = [
  25. (1, "老年"),
  26. (2, "年"),
  27. ]
  28. mock_pool_repo_cls.return_value.list_id_name_video_lists.return_value = [
  29. (101, "老年 健身", '["v-1"]'),
  30. (102, "老年健身", '["v-2"]'),
  31. ]
  32. mock_rel_repo_cls.return_value.delete_by_pool_ids.return_value = 2
  33. mock_rel_repo_cls.return_value.bulk_insert_ignore.return_value = 1
  34. mock_belong_repo_cls.return_value.update_video_lists.return_value = 2
  35. result = sync_demand_belong_pool_rel("20260730")
  36. mock_pool_repo_cls.return_value.list_id_name_video_lists.assert_called_once_with(
  37. "20260730"
  38. )
  39. inserted_rows = mock_rel_repo_cls.return_value.bulk_insert_ignore.call_args.args[0]
  40. assert inserted_rows == [
  41. {
  42. "demand_belong_category_id": 1,
  43. "multi_demand_pool_di_id": 101,
  44. "biz_dt": "20260730",
  45. "relation_type": "explicit_token",
  46. "relation_source": "demand_pool_name_tokens",
  47. "reason": "需求归属词完整命中上游 demand_name 的显式空格分词",
  48. "confidence": 1.0,
  49. "is_inferred": True,
  50. "status": "active",
  51. "valid_from_biz_dt": "20260730",
  52. "valid_to_biz_dt": None,
  53. }
  54. ]
  55. assert result["biz_dt"] == "20260730"
  56. assert result["matched_edges"] == 1
  57. assert result["rejected_substring_candidates"] == 3
  58. assert result["replaced_edges"] == 2
  59. def test_relation_sync_rejects_invalid_business_date() -> None:
  60. with pytest.raises(ValueError, match="YYYYMMDD"):
  61. sync_demand_belong_pool_rel("2026-07-30")