from __future__ import annotations from dataclasses import replace from types import SimpleNamespace from fastapi.testclient import TestClient import app.main as main_module from app.config import get_settings from app.security.auth import AuthBackend class _DummyCoreService: def scan_mailbox(self, max_results: int) -> SimpleNamespace: return SimpleNamespace( scanned=max_results, linkedin=1, advertising=2, veille_techno=0, skipped=3, failed=0, ) def check_availability( self, start: str, end: str, calendar_ids: list[str] | None, ) -> SimpleNamespace: return SimpleNamespace( start=start, end=end, available=False, busy_slots=[ { "calendar_id": "primary", "start": start, "end": end, } ], checked_calendars=calendar_ids or ["primary"], ) async def _noop_task() -> None: return None def _setup_main_test_context(monkeypatch) -> None: auth_settings = replace( get_settings(), auth_mode="api_key", agent_api_key="integration-key", auth_jwt_secret="", ) monkeypatch.setattr(main_module, "auth_backend", AuthBackend(auth_settings)) monkeypatch.setattr(main_module, "core_service", _DummyCoreService()) # Prevent scheduler jobs from executing real background work during lifespan startup. monkeypatch.setattr(main_module, "_scheduled_scan", _noop_task) monkeypatch.setattr(main_module, "_scheduled_unsubscribe_digest", _noop_task) monkeypatch.setattr(main_module, "_scheduled_unsubscribe_auto", _noop_task) def test_main_scan_endpoint_with_api_key(monkeypatch) -> None: _setup_main_test_context(monkeypatch) with TestClient(main_module.app) as client: response = client.post( "/scan?max_results=15", headers={"X-API-Key": "integration-key"}, ) assert response.status_code == 200 payload = response.json() assert payload["scanned"] == 15 assert payload["linkedin"] == 1 assert payload["advertising"] == 2 def test_main_availability_endpoint_rejects_missing_key(monkeypatch) -> None: _setup_main_test_context(monkeypatch) with TestClient(main_module.app) as client: response = client.post( "/availability", json={ "start": "2026-03-10T09:00:00+01:00", "end": "2026-03-10T10:00:00+01:00", "calendar_ids": ["primary"], }, ) assert response.status_code == 401