diff --git a/backend/app/services/orchestrator/runner.py b/backend/app/services/orchestrator/runner.py index d021443..758f5ac 100644 --- a/backend/app/services/orchestrator/runner.py +++ b/backend/app/services/orchestrator/runner.py @@ -63,18 +63,21 @@ def run_step(step_name: str, week_start_date: Optional[date] = None) -> None: week = week_start_date or _current_week_start() db = SessionLocal() - families = db.query(FamilyProfile).all() - if not families: - logger.warning("run_step(%s): no family profiles, skipping", step_name) - return - for family in families: - run = _get_or_create_run(db, family.id, week) - try: - step_fns[step_name](run, db) - except Exception: - logger.exception( - "run_step(%s) failed for family %s", step_name, family.id - ) + try: + families = db.query(FamilyProfile).all() + if not families: + logger.warning("run_step(%s): no family profiles, skipping", step_name) + return + for family in families: + run = _get_or_create_run(db, family.id, week) + try: + step_fns[step_name](run, db) + except Exception: + logger.exception( + "run_step(%s) failed for family %s", step_name, family.id + ) + finally: + db.close() def run_week(week_start_date: Optional[date] = None) -> None: diff --git a/backend/tests/test_orchestrator.py b/backend/tests/test_orchestrator.py index f26ef62..c0ced39 100644 --- a/backend/tests/test_orchestrator.py +++ b/backend/tests/test_orchestrator.py @@ -434,9 +434,18 @@ def test_run_step_upserts_weekly_run(db, family, monkeypatch): "app.services.orchestrator.steps.ScraperService.run_scrape", lambda self, **kw: {"status": "success", "items_scraped": 0}, ) + + class _NoCloseSession: + """Proxy that delegates all attribute access to the test session + but turns close() into a no-op so the transactional fixture stays live.""" + def __getattr__(self, name): + return getattr(db, name) + def close(self): + pass + monkeypatch.setattr( "app.services.orchestrator.runner.SessionLocal", - lambda: db, + lambda: _NoCloseSession(), ) from app.services.orchestrator.runner import run_step run_step("scrape", WEEK)