103 lines
3.7 KiB
Python
103 lines
3.7 KiB
Python
# Copyright (c) 2025 Patrick Motsch
|
|
# All rights reserved.
|
|
"""Tests for CommCoach context retrieval (intent detection, session lookup)."""
|
|
|
|
import pytest
|
|
from datetime import datetime
|
|
|
|
from ..serviceCommcoachContextRetrieval import (
|
|
detectIntent,
|
|
RetrievalIntent,
|
|
buildSessionSummariesForPrompt,
|
|
findSessionByDate,
|
|
searchSessionsByTopic,
|
|
_parseDateFromMessage,
|
|
)
|
|
|
|
|
|
class TestDetectIntent:
|
|
def test_normal(self):
|
|
assert detectIntent("Ich habe ein Problem mit meinem Team") == RetrievalIntent.NORMAL
|
|
assert detectIntent("Wie kann ich besser delegieren?") == RetrievalIntent.NORMAL
|
|
|
|
def test_summarizeAll(self):
|
|
assert detectIntent("Fasse alles zusammen") == RetrievalIntent.SUMMARIZE_ALL
|
|
assert detectIntent("Gib mir eine Zusammenfassung des gesamten Chats") == RetrievalIntent.SUMMARIZE_ALL
|
|
|
|
def test_recallSession(self):
|
|
assert detectIntent("Was haben wir am 01.02.2026 besprochen?") == RetrievalIntent.RECALL_SESSION
|
|
assert detectIntent("Session vom 15.03.2026") == RetrievalIntent.RECALL_SESSION
|
|
|
|
def test_recallTopic(self):
|
|
assert detectIntent("Erinnerst du dich an das Thema Delegation?") == RetrievalIntent.RECALL_TOPIC
|
|
assert detectIntent("Was war das Thema von vor 5 Sessions?") == RetrievalIntent.RECALL_TOPIC
|
|
|
|
|
|
class TestParseDateFromMessage:
|
|
def test_dd_mm_yyyy(self):
|
|
d = _parseDateFromMessage("am 01.02.2026")
|
|
assert d is not None
|
|
assert d.year == 2026
|
|
assert d.month == 2
|
|
assert d.day == 1
|
|
|
|
def test_iso(self):
|
|
d = _parseDateFromMessage("2026-02-01")
|
|
assert d is not None
|
|
assert d.year == 2026
|
|
assert d.month == 2
|
|
assert d.day == 1
|
|
|
|
|
|
class TestFindSessionByDate:
|
|
def test_findsClosest(self):
|
|
sessions = [
|
|
{"id": "1", "status": "completed", "startedAt": "2026-02-01T10:00:00Z"},
|
|
{"id": "2", "status": "completed", "startedAt": "2026-02-05T10:00:00Z"},
|
|
]
|
|
target = datetime(2026, 2, 4)
|
|
found = findSessionByDate(sessions, target)
|
|
assert found is not None
|
|
assert found["id"] == "2"
|
|
|
|
def test_findsExactDate(self):
|
|
sessions = [
|
|
{"id": "1", "status": "completed", "startedAt": "2026-02-01T10:00:00Z"},
|
|
{"id": "2", "status": "completed", "startedAt": "2026-02-05T10:00:00Z"},
|
|
]
|
|
target = datetime(2026, 2, 1)
|
|
found = findSessionByDate(sessions, target)
|
|
assert found is not None
|
|
assert found["id"] == "1"
|
|
|
|
def test_returnsNoneForEmpty(self):
|
|
assert findSessionByDate([], datetime(2026, 2, 1)) is None
|
|
|
|
|
|
class TestSearchSessionsByTopic:
|
|
def test_matchesKeyTopics(self):
|
|
sessions = [
|
|
{"id": "1", "status": "completed", "summary": "Delegation besprochen", "keyTopics": '["Delegation", "Feedback"]'},
|
|
]
|
|
result = searchSessionsByTopic(sessions, "Delegation")
|
|
assert len(result) == 1
|
|
assert result[0]["id"] == "1"
|
|
|
|
def test_matchesSummary(self):
|
|
sessions = [
|
|
{"id": "1", "status": "completed", "summary": "Konflikt mit Vorgesetztem", "keyTopics": None},
|
|
]
|
|
result = searchSessionsByTopic(sessions, "Konflikt")
|
|
assert len(result) == 1
|
|
|
|
|
|
class TestBuildSessionSummariesForPrompt:
|
|
def test_excludesSession(self):
|
|
sessions = [
|
|
{"id": "1", "status": "completed", "summary": "A", "startedAt": "2026-02-01T10:00:00Z"},
|
|
{"id": "2", "status": "completed", "summary": "B", "startedAt": "2026-02-02T10:00:00Z"},
|
|
]
|
|
result = buildSessionSummariesForPrompt(sessions, excludeSessionId="2", limit=5)
|
|
assert len(result) == 1
|
|
assert result[0]["summary"] == "A"
|
|
assert result[0]["date"]
|