shinkan-jinkendo/backend/tests/test_planning_exercise_path_qa.py

44 lines
1.7 KiB
Python
Raw Normal View History

"""Tests Planungs-KI Phase E — Pfad-QA."""
from planning_exercise_path_builder import _pick_best_path_hit
from planning_exercise_semantics import build_semantic_brief
from planning_exercise_path_qa import apply_llm_path_reorder
def test_pick_best_path_hit_prefers_semantic_score():
brief = build_semantic_brief("Mae Geri Perfektion")
hits = [
{"id": 1, "title": "Mawashi", "score": 0.9, "semantic_score": 0.1},
{"id": 2, "title": "Mae Geri", "score": 0.75, "semantic_score": 0.85},
]
chosen = _pick_best_path_hit(hits, set(), semantic_brief=brief)
assert chosen["id"] == 2
def test_pick_best_path_hit_skips_off_topic_when_gate():
brief = build_semantic_brief("Mae Geri")
hits = [{"id": 1, "title": "Kumite Grundstellung", "score": 0.9, "semantic_score": 0.05}]
assert _pick_best_path_hit(hits, set(), semantic_brief=brief) is None
def test_pick_best_path_hit_skips_used():
hits = [{"id": 1, "title": "A", "score": 0.5, "semantic_score": 0.5}]
assert _pick_best_path_hit(hits, {1}) is None
def test_apply_llm_path_reorder_permutation():
steps = [{"exercise_id": 1}, {"exercise_id": 2}, {"exercise_id": 3}]
reordered, applied, notes = apply_llm_path_reorder(
steps,
{"ordered_step_indices": [0, 2, 1], "sequence_notes": ["Vertiefung vor Anwendung"]},
)
assert applied is True
assert [s["exercise_id"] for s in reordered] == [1, 3, 2]
assert notes
def test_apply_llm_path_reorder_invalid_ignored():
steps = [{"exercise_id": 1}, {"exercise_id": 2}]
reordered, applied, _ = apply_llm_path_reorder(steps, {"ordered_step_indices": [0, 0]})
assert applied is False
assert reordered == steps