shinkan-jinkendo/backend/tests/test_planning_compare_slot_diffs.py

103 lines
3.5 KiB
Python
Raw Normal View History

"""Tests Vergleichs-Diffs (triviale ID-Tausche markieren, Rematch-Vorschläge)."""
from planning_exercise_path_builder import (
_actionable_slot_diffs,
_annotate_slot_diffs,
_build_progression_compare_response,
_build_progression_slot_diffs,
_build_rematch_suggestion_diffs,
)
def test_annotate_trivial_id_swap():
diffs = [
{
"roadmap_major_step_index": 1,
"baseline_exercise_id": 10,
"baseline_title": "Rhythmuswechsel in der Kumite-Beinarbeit",
"proposed_exercise_id": 99,
"proposed_title": "Rhythmuswechsel in der Kumite-Beinarbeit",
}
]
annotated = _annotate_slot_diffs(diffs)
assert len(annotated) == 1
assert annotated[0]["trivial_id_swap"] is True
assert _actionable_slot_diffs(annotated) == []
def test_annotate_keeps_real_title_change():
diffs = [
{
"roadmap_major_step_index": 1,
"baseline_exercise_id": 10,
"baseline_title": "Alt",
"proposed_exercise_id": 99,
"proposed_title": "Neu",
}
]
annotated = _annotate_slot_diffs(diffs)
assert annotated[0]["trivial_id_swap"] is False
assert len(_actionable_slot_diffs(annotated)) == 1
def test_build_slot_diffs_then_annotate():
baseline = [
{"roadmap_major_step_index": 0, "exercise_id": 1, "title": "A"},
{"roadmap_major_step_index": 1, "exercise_id": 10, "title": "Gleich"},
]
proposed = [
{"roadmap_major_step_index": 0, "exercise_id": 1, "title": "A"},
{"roadmap_major_step_index": 1, "exercise_id": 77, "title": "Gleich"},
]
raw = _build_progression_slot_diffs(baseline, proposed)
annotated = _annotate_slot_diffs(raw)
assert len(annotated) == 1
assert annotated[0]["trivial_id_swap"] is True
assert _actionable_slot_diffs(annotated) == []
def test_rematch_suggestion_diffs_when_end_path_matches_baseline():
baseline = [
{"roadmap_major_step_index": 1, "exercise_id": None, "title": "Lernziel Slot 2"},
{"roadmap_major_step_index": 4, "exercise_id": 50, "title": "Bestehend"},
]
proposed = list(baseline)
rematch_log = [
{
"roadmap_major_step_index": 1,
"action": "replaced",
"round": 1,
"new_exercise_id": 101,
"new_title": "Rhythmuswechsel in der Kumite-Beinarbeit",
"replaced_exercise_id": None,
"replaced_title": None,
},
{
"roadmap_major_step_index": 1,
"action": "replaced",
"round": 3,
"new_exercise_id": 102,
"new_title": "Kumite Beinarbeit — vertiefung",
"replaced_exercise_id": 101,
"replaced_title": "Rhythmuswechsel in der Kumite-Beinarbeit",
},
]
diffs = _build_rematch_suggestion_diffs(baseline, rematch_log)
assert len(diffs) == 1
assert diffs[0]["proposed_exercise_id"] == 102
assert diffs[0]["from_rematch_log"] is True
compare = _build_progression_compare_response(
{"steps": baseline, "path_qa": {"overall_ok": True, "quality_score": 0.88}},
{
"steps": proposed,
"path_qa": {
"overall_ok": False,
"quality_score": 0.65,
"rematch_log": rematch_log,
},
},
)
assert compare["slot_diffs_source"] == "rematch_log"
assert compare["slot_diff_count"] == 1
assert compare["proposed_steps"][0]["exercise_id"] == 102