Files
breakpilot-lehrer/voice-service/tests/test_intent_router.py
Benjamin Admin 9912997187
Some checks failed
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-school (push) Successful in 25s
CI / test-go-edu-search (push) Successful in 26s
CI / test-python-klausur (push) Failing after 1m55s
CI / test-python-agent-core (push) Successful in 16s
CI / test-nodejs-website (push) Successful in 18s
refactor: Jitsi/Matrix/Voice von Core übernommen, Camunda/BPMN gelöscht, Kommunikation-Nav
- Voice-Service von Core nach Lehrer verschoben (bp-lehrer-voice-service)
- 4 Jitsi-Services + 2 Synapse-Services in docker-compose.yml aufgenommen
- Camunda komplett gelöscht: workflow pages, workflow-config.ts, bpmn-js deps
- CAMUNDA_URL aus backend-lehrer environment entfernt
- Sidebar: Kategorie "Compliance SDK" + "Katalogverwaltung" entfernt
- Sidebar: Neue Kategorie "Kommunikation" mit Video & Chat, Voice Service, Alerts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 17:01:47 +01:00

186 lines
6.6 KiB
Python

"""
Tests for Intent Router
"""
import pytest
from services.intent_router import IntentRouter
from models.task import TaskType
class TestIntentRouter:
"""Tests for intent detection."""
@pytest.fixture
def router(self):
"""Create intent router instance."""
return IntentRouter()
@pytest.mark.asyncio
async def test_detect_student_observation(self, router):
"""Test detecting student observation intent."""
text = "Notiz zu Max: heute wiederholt gestoert"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.STUDENT_OBSERVATION
assert intent.confidence > 0.5
assert "student_name" in intent.parameters or intent.is_actionable
@pytest.mark.asyncio
async def test_detect_reminder(self, router):
"""Test detecting reminder intent (without specific schedule)."""
text = "Erinner mich an den Elternsprechtag"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.REMINDER
assert intent.confidence > 0.5
@pytest.mark.asyncio
async def test_detect_reminder_schedule(self, router):
"""Test detecting scheduled reminder intent (with 'morgen')."""
text = "Erinner mich morgen an Hausaufgabenkontrolle"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.REMINDER_SCHEDULE
assert intent.confidence > 0.5
@pytest.mark.asyncio
async def test_detect_homework_check(self, router):
"""Test detecting homework check intent."""
text = "7b Mathe Hausaufgabe kontrollieren"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.HOMEWORK_CHECK
assert intent.confidence > 0.5
@pytest.mark.asyncio
async def test_detect_worksheet_generate(self, router):
"""Test detecting worksheet generation intent."""
text = "Nimm Vokabeln Lektion 4, mach 3 Lueckentexte"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.WORKSHEET_GENERATE
assert intent.confidence > 0.5
@pytest.mark.asyncio
async def test_detect_parent_letter(self, router):
"""Test detecting parent letter intent."""
text = "Neutraler Elternbrief wegen wiederholter Stoerungen"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.PARENT_LETTER
assert intent.confidence > 0.5
@pytest.mark.asyncio
async def test_detect_class_message(self, router):
"""Test detecting class message intent."""
text = "Nachricht an 8a: Hausaufgaben bis Mittwoch"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.CLASS_MESSAGE
assert intent.confidence > 0.5
@pytest.mark.asyncio
async def test_detect_quick_activity(self, router):
"""Test detecting quick activity intent."""
text = "10 Minuten Einstieg, 5 Aufgaben"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.QUICK_ACTIVITY
assert intent.confidence > 0.5
@pytest.mark.asyncio
async def test_detect_quiz_generate(self, router):
"""Test detecting quiz generation intent."""
text = "10-Minuten Vokabeltest mit Loesungen"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.QUIZ_GENERATE
assert intent.confidence > 0.5
@pytest.mark.asyncio
async def test_detect_canvas_edit(self, router):
"""Test detecting canvas edit intent."""
text = "Ueberschriften groesser, Zeilenabstand kleiner"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.CANVAS_EDIT
assert intent.confidence > 0.5
@pytest.mark.asyncio
async def test_detect_canvas_layout(self, router):
"""Test detecting canvas layout intent."""
text = "Alles auf eine Seite, Drucklayout A4"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.CANVAS_LAYOUT
assert intent.confidence > 0.5
@pytest.mark.asyncio
async def test_detect_operator_checklist(self, router):
"""Test detecting operator checklist intent."""
text = "Operatoren-Checkliste fuer diese Aufgabe"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.OPERATOR_CHECKLIST
assert intent.is_actionable is False # Query, not action
@pytest.mark.asyncio
async def test_detect_eh_passage(self, router):
"""Test detecting EH passage intent."""
text = "Erwartungshorizont-Passage zu diesem Thema"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.EH_PASSAGE
assert intent.is_actionable is False # Query, not action
@pytest.mark.asyncio
async def test_detect_task_summary(self, router):
"""Test detecting task summary intent."""
text = "Fasse alle offenen Tasks dieser Woche zusammen"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.TASK_SUMMARY
assert intent.is_actionable is False # Query, not action
@pytest.mark.asyncio
async def test_no_intent_detected(self, router):
"""Test that random text returns no intent."""
text = "Das Wetter ist heute schoen"
intent = await router.detect_intent(text)
# Should return None or low confidence intent
if intent:
assert intent.confidence < 0.5
@pytest.mark.asyncio
async def test_umlaut_normalization(self, router):
"""Test that umlauts are handled correctly."""
text = "Notiz zu Müller: braucht Förderung"
intent = await router.detect_intent(text)
assert intent is not None
assert intent.type == TaskType.STUDENT_OBSERVATION
@pytest.mark.asyncio
async def test_extract_time_parameter(self, router):
"""Test that time is extracted from text."""
text = "Erinner mich morgen 7:30 an Konferenz"
intent = await router.detect_intent(text)
assert intent is not None
if "time" in intent.parameters:
assert "7:30" in intent.parameters["time"]