All checks were successful
Deploy Development / deploy (push) Successful in 44s
Test Suite / pytest-backend (push) Successful in 48s
Test Suite / lint-backend (push) Successful in 0s
Test Suite / build-frontend (push) Successful in 14s
Test Suite / k6 /health Baseline (push) Successful in 33s
Test Suite / playwright-tests (push) Successful in 1m23s
- Introduced new functions for handling exercise visibility and retrieval based on progression graph context, including `fetch_exercise_rows_by_ids_for_graph`. - Updated `_load_supplemental_exercise_rows` to incorporate graph visibility rules, improving the accuracy of exercise retrieval. - Enhanced `_run_path_step_retrieval` to utilize preloaded supplemental exercise rows, optimizing performance and clarity in path step processing. - Added `exercise_title_equivalent_to_stage_goal` function to improve title matching against learning goals, enhancing exercise relevance. - Updated tests to validate new retrieval logic and title equivalence functionality, ensuring robustness in exercise selection processes.
88 lines
3.0 KiB
Python
88 lines
3.0 KiB
Python
"""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"])
|