"""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