test_timeline_sql.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import importlib.util
  2. import sys
  3. from pathlib import Path
  4. SCRIPTS = Path(__file__).parents[1] / ".agents" / "skills" / "query-user-behavior-path" / "scripts"
  5. sys.path.insert(0, str(SCRIPTS))
  6. spec = importlib.util.spec_from_file_location("timeline_skill_script", SCRIPTS / "user_timeline.py")
  7. assert spec and spec.loader
  8. timeline = importlib.util.module_from_spec(spec)
  9. spec.loader.exec_module(timeline)
  10. def load_script(name: str):
  11. module_spec = importlib.util.spec_from_file_location(f"timeline_{name}", SCRIPTS / f"{name}.py")
  12. assert module_spec and module_spec.loader
  13. module = importlib.util.module_from_spec(module_spec)
  14. module_spec.loader.exec_module(module)
  15. return module
  16. realtime = load_script("user_timeline_realtime")
  17. realtime_batch = load_script("user_timeline_realtime_batch")
  18. def realtime_args(apptype):
  19. return {
  20. "mc": "mid_123",
  21. "mc_list": "'mid_123'",
  22. "apptype_filter": timeline.build_apptype_filter(apptype),
  23. "dt_start": "20260806000000",
  24. "dt_end": "20260806235959",
  25. "year": "2026",
  26. "month": "08",
  27. "day_of_month": "06",
  28. }
  29. def test_omitted_apptype_adds_no_product_predicate() -> None:
  30. sql = timeline.SQL_ALL.format(
  31. day="20260806",
  32. mc="mid_123",
  33. apptype_filter=timeline.build_apptype_filter(None),
  34. )
  35. assert "AND apptype=" not in sql
  36. def test_explicit_apptype_filters_every_timeline_source() -> None:
  37. sql = timeline.SQL_ALL.format(
  38. day="20260806",
  39. mc="mid_123",
  40. apptype_filter=timeline.build_apptype_filter("4"),
  41. )
  42. assert sql.count("apptype='4'") == 6
  43. def test_realtime_timeline_apptype_is_optional_across_all_sources() -> None:
  44. unfiltered = realtime.SQL_REALTIME.format(**realtime_args(None))
  45. filtered = realtime.SQL_REALTIME.format(**realtime_args("4"))
  46. assert "AND apptype=" not in unfiltered
  47. assert filtered.count("apptype='4'") == 7
  48. def test_realtime_batch_apptype_is_optional_across_all_sources() -> None:
  49. unfiltered = realtime_batch.SQL_REALTIME_BATCH.format(**realtime_args(None))
  50. filtered = realtime_batch.SQL_REALTIME_BATCH.format(**realtime_args("4"))
  51. assert "AND apptype=" not in unfiltered
  52. assert filtered.count("apptype='4'") == 7