from __future__ import annotations from unittest.mock import MagicMock, patch import pytest from supply_infra.scheduler.jobs.demand_pool.belong_rel import ( sync_demand_belong_pool_rel, ) @patch( "supply_infra.scheduler.jobs.demand_pool.belong_rel.DemandBelongPoolRelRepository" ) @patch( "supply_infra.scheduler.jobs.demand_pool.belong_rel.MultiDemandPoolDiRepository" ) @patch( "supply_infra.scheduler.jobs.demand_pool.belong_rel.DemandBelongCategoryRepository" ) @patch("supply_infra.scheduler.jobs.demand_pool.belong_rel.get_session") def test_relations_are_date_scoped_and_require_explicit_tokens( mock_get_session, mock_belong_repo_cls, mock_pool_repo_cls, mock_rel_repo_cls, ) -> None: mock_get_session.return_value.__enter__.return_value = MagicMock() mock_belong_repo_cls.return_value.list_active_id_name.return_value = [ (1, "老年"), (2, "年"), ] mock_pool_repo_cls.return_value.list_id_name_video_lists.return_value = [ (101, "老年 健身", '["v-1"]'), (102, "老年健身", '["v-2"]'), ] mock_rel_repo_cls.return_value.delete_by_pool_ids.return_value = 2 mock_rel_repo_cls.return_value.bulk_insert_ignore.return_value = 1 mock_belong_repo_cls.return_value.update_video_lists.return_value = 2 result = sync_demand_belong_pool_rel("20260730") mock_pool_repo_cls.return_value.list_id_name_video_lists.assert_called_once_with( "20260730" ) inserted_rows = mock_rel_repo_cls.return_value.bulk_insert_ignore.call_args.args[0] assert inserted_rows == [ { "demand_belong_category_id": 1, "multi_demand_pool_di_id": 101, "biz_dt": "20260730", "relation_type": "explicit_token", "relation_source": "demand_pool_name_tokens", "reason": "需求归属词完整命中上游 demand_name 的显式空格分词", "confidence": 1.0, "is_inferred": True, "status": "active", "valid_from_biz_dt": "20260730", "valid_to_biz_dt": None, } ] assert result["biz_dt"] == "20260730" assert result["matched_edges"] == 1 assert result["rejected_substring_candidates"] == 3 assert result["replaced_edges"] == 2 def test_relation_sync_rejects_invalid_business_date() -> None: with pytest.raises(ValueError, match="YYYYMMDD"): sync_demand_belong_pool_rel("2026-07-30")