feat: voice-service von lehrer nach core verschoben, Pipeline erweitert (voice, BQAS, embedding, night-scheduler)
This commit is contained in:
93
voice-service/tests/conftest.py
Normal file
93
voice-service/tests/conftest.py
Normal file
@@ -0,0 +1,93 @@
|
||||
"""
|
||||
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",
|
||||
]
|
||||
Reference in New Issue
Block a user