diff --git a/backend/jobs/__init__.py b/backend/jobs/__init__.py index 2d46e0b..b8829b1 100644 --- a/backend/jobs/__init__.py +++ b/backend/jobs/__init__.py @@ -2,5 +2,9 @@ Background jobs module. """ from jobs.scheduler import scheduler, start_scheduler, stop_scheduler +from jobs.collection_job import run_daily_collection, run_backfill -__all__ = ["scheduler", "start_scheduler", "stop_scheduler"] +__all__ = [ + "scheduler", "start_scheduler", "stop_scheduler", + "run_daily_collection", "run_backfill", +] diff --git a/backend/jobs/scheduler.py b/backend/jobs/scheduler.py index 267aa90..16d40c9 100644 --- a/backend/jobs/scheduler.py +++ b/backend/jobs/scheduler.py @@ -6,6 +6,7 @@ from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.triggers.cron import CronTrigger from jobs.snapshot_job import create_daily_snapshots +from jobs.collection_job import run_daily_collection logger = logging.getLogger(__name__) @@ -15,7 +16,21 @@ scheduler = BackgroundScheduler() def configure_jobs(): """Configure scheduled jobs.""" - # Daily snapshot at 18:30 (after market close) + # Daily data collection at 18:00 (after market close, before snapshot) + scheduler.add_job( + run_daily_collection, + trigger=CronTrigger( + hour=18, + minute=0, + day_of_week='mon-fri', + ), + id='daily_collection', + name='Collect daily market data', + replace_existing=True, + ) + logger.info("Configured daily_collection job at 18:00") + + # Daily snapshot at 18:30 (after data collection completes) scheduler.add_job( create_daily_snapshots, trigger=CronTrigger( @@ -27,7 +42,7 @@ def configure_jobs(): name='Create daily portfolio snapshots', replace_existing=True, ) - logger.info("Configured daily_snapshots job") + logger.info("Configured daily_snapshots job at 18:30") def start_scheduler(): diff --git a/backend/tests/e2e/test_collection_job.py b/backend/tests/e2e/test_collection_job.py index d02dd6b..340448b 100644 --- a/backend/tests/e2e/test_collection_job.py +++ b/backend/tests/e2e/test_collection_job.py @@ -139,3 +139,21 @@ def test_run_backfill_with_existing_data_only_fills_gaps(): # Last backward chunk should end at or before 2024-05-31 backward_chunks = [r for r in price_ranges if r[1] <= "20240531"] assert len(backward_chunks) >= 1 + + +def test_scheduler_has_daily_collection_job(): + """Scheduler should register a daily_collection job at 18:00.""" + from jobs.scheduler import configure_jobs + + from apscheduler.schedulers.background import BackgroundScheduler + test_scheduler = BackgroundScheduler() + + with patch("jobs.scheduler.scheduler", test_scheduler): + configure_jobs() + + jobs = {job.id: job for job in test_scheduler.get_jobs()} + assert "daily_collection" in jobs + + trigger = jobs["daily_collection"].trigger + trigger_str = str(trigger) + assert "18" in trigger_str # hour=18