"""Tests Planungs-KI Phase C3/E/F — Pfad-Vorschläge.""" from planning_exercise_path_builder import ( EvaluateStepPayload, ProgressionPathSuggestRequest, _annotate_roadmap_step, _hit_to_path_step, _pick_best_path_hit, _supplemental_exercise_ids_from_body, ) from planning_progression_roadmap import MajorStep, StageSpecArtifact class _FakeCur: def execute(self, *_args, **_kwargs): return None def fetchall(self): return [] def test_supplemental_boost_includes_slot_assignments_and_retrieval_boost(): body = ProgressionPathSuggestRequest( query="Mawashi Geri Progression", slot_assignments=[ EvaluateStepPayload(exercise_id=99, roadmap_major_step_index=0), ], retrieval_boost_exercise_ids=[42, 7], ) ids = _supplemental_exercise_ids_from_body(_FakeCur(), body) assert 99 in ids assert 42 in ids assert 7 in ids def test_pick_next_path_hit_skips_used(): hits = [{"id": 1, "title": "A", "semantic_score": 0.2}, {"id": 2, "title": "B", "semantic_score": 0.2}, {"id": 3, "title": "C", "semantic_score": 0.2}] assert _pick_best_path_hit(hits, {1})["id"] == 2 assert _pick_best_path_hit(hits, {1, 2, 3}) is None def test_hit_to_path_step_maps_variant(): step = _hit_to_path_step( { "id": 10, "title": "Test", "score": 0.8, "reasons": ["Graph"], "suggested_variant_id": 7, "suggested_variant_name": "Leicht", "variants": [{"id": 7, "variant_name": "Leicht"}], } ) assert step["exercise_id"] == 10 assert step["variant_id"] == 7 assert step["suggested_variant_name"] == "Leicht" def test_annotate_roadmap_step_adds_metadata(): spec = StageSpecArtifact(major_step_index=1, learning_goal="Grundstellung Mae Geri") major = MajorStep(index=1, phase="grundlage", learning_goal=spec.learning_goal, consolidates=["m1"]) step = _annotate_roadmap_step( {"exercise_id": 5, "title": "Test", "reasons": ["Bibliothek"]}, stage_spec=spec, major_step=major, ) assert step["roadmap_major_step_index"] == 1 assert step["roadmap_phase"] == "grundlage" assert step["roadmap_match_source"] == "stage_spec" assert any("Roadmap:" in r for r in step["reasons"]) def test_annotate_roadmap_step_adds_skill_expectations(): spec = StageSpecArtifact(major_step_index=0, learning_goal="Timing und Distanz") step = _annotate_roadmap_step( {"exercise_id": 5, "title": "Test", "reasons": []}, stage_spec=spec, major_step=None, skill_expectations={ "scope": "progression_stage", "expected_skills": [ {"skill_id": 2, "skill_name": "Timing", "weight": 0.9}, {"skill_id": 3, "skill_name": "Distanz", "weight": 0.8}, ], }, ) assert step["skill_expectations"]["expected_skills"][0]["skill_name"] == "Timing" assert any("Fähigkeiten:" in r for r in step["reasons"])