""" Pytest Configuration and Fixtures """ import pytest import asyncio import sys from typing import Generator @pytest.fixture(scope="session") def event_loop() -> Generator: """Create an instance of the default event loop for the test session.""" loop = asyncio.get_event_loop_policy().new_event_loop() yield loop loop.close() @pytest.fixture def client(): """Create test client with lifespan context manager. This ensures app.state.orchestrator and app.state.encryption are initialized. """ from fastapi.testclient import TestClient from main import app # Use context manager to trigger lifespan events (startup/shutdown) with TestClient(app) as test_client: yield test_client @pytest.fixture def valid_key_hash() -> str: """Return a valid key hash for testing.""" # SHA-256 produces 32 bytes, which is 44 chars in base64 (with padding) return "sha256:eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHg=" @pytest.fixture def sample_namespace_id() -> str: """Return a sample namespace ID for testing.""" return "ns-12345678abcdef12345678abcdef12" @pytest.fixture def sample_session_data(sample_namespace_id, valid_key_hash) -> dict: """Return sample session creation data.""" return { "namespace_id": sample_namespace_id, "key_hash": valid_key_hash, "device_type": "pwa", "client_version": "1.0.0", } @pytest.fixture def sample_task_data() -> dict: """Return sample task creation data.""" return { "type": "student_observation", "intent_text": "Notiz zu Max: heute wiederholt gestoert", "parameters": { "student_name": "Max", "observation": "wiederholt gestoert", }, } @pytest.fixture def sample_audio_bytes() -> bytes: """Return sample audio data for testing.""" import numpy as np # Generate 80ms of silence at 24kHz samples = np.zeros(1920, dtype=np.int16) # 24000 * 0.08 = 1920 samples return samples.tobytes() @pytest.fixture def sample_voice_command_texts() -> list: """Return sample voice command texts for testing.""" return [ "Notiz zu Max: heute wiederholt gestoert", "Erinner mich morgen an Hausaufgabenkontrolle", "Erstelle Arbeitsblatt mit 3 Lueckentexten", "Elternbrief wegen wiederholter Stoerungen", "Nachricht an 8a: Hausaufgaben bis Mittwoch", "10 Minuten Einstieg, 5 Aufgaben", "Vokabeltest mit Loesungen", "Ueberschriften groesser", "Alles auf eine Seite, Drucklayout A4", "Operatoren-Checkliste fuer diese Aufgabe", ]