import unittest from datetime import date from pathlib import Path import collect_dy_persona_to_bitable as dy_worker import collect_jd_persona_to_bitable as jd_worker import collect_persona_to_bitable as tm_worker import run_daily_persona class PersonaLauncherTests(unittest.TestCase): def test_any_platform_failure_makes_launcher_fail(self): self.assertEqual(run_daily_persona.combined_exit_code({"tm": 0, "dy": 2, "jd": 0}), 2) def test_all_platforms_success_makes_launcher_success(self): self.assertEqual(run_daily_persona.combined_exit_code({"tm": 0, "dy": 0, "jd": 0}), 0) def test_launcher_passes_business_date_to_each_worker(self): command = run_daily_persona.build_child_command( Path("collect_persona_to_bitable.py"), date(2026, 8, 4), ) self.assertEqual(command[-2:], ["--date", "2026-08-04"]) def test_workers_fail_when_permission_is_skipped(self): results = [{"status": "ok"}, {"status": "permission_skipped"}] for worker in (tm_worker, dy_worker, jd_worker): with self.subTest(worker=worker.__name__): self.assertEqual(worker.combined_result_exit_code(results), 2) def test_workers_fail_when_no_styles_were_processed(self): for worker in (tm_worker, dy_worker, jd_worker): with self.subTest(worker=worker.__name__): self.assertEqual(worker.combined_result_exit_code([]), 2) def test_workers_succeed_only_when_all_styles_are_successful(self): results = [{"status": "ok"}, {"status": "dry-run"}] for worker in (tm_worker, dy_worker, jd_worker): with self.subTest(worker=worker.__name__): self.assertEqual(worker.combined_result_exit_code(results), 0) def test_workers_fail_when_collector_itself_failed(self): results = [{"status": "ok"}] for worker in (tm_worker, dy_worker, jd_worker): with self.subTest(worker=worker.__name__): self.assertEqual( worker.combined_result_exit_code(results, collection_ok=False), 2, ) if __name__ == "__main__": unittest.main()