shinkan-jinkendo/backend/tests/test_ai_prompt_planning_preview.py
Lars 9cee862c32
All checks were successful
Deploy Development / deploy (push) Successful in 47s
Test Suite / pytest-backend (push) Successful in 49s
Test Suite / lint-backend (push) Successful in 0s
Test Suite / build-frontend (push) Successful in 15s
Test Suite / k6 /health Baseline (push) Successful in 34s
Test Suite / playwright-tests (push) Successful in 1m26s
Implement Planning Prompt Enhancements and LLM Usage Tracking
- Added new fields for goal query, user notes, max steps, and search query in the AiPromptPreviewBody to support planning prompts.
- Integrated planning prompt handling in the preview_ai_prompt function, allowing for distinct processing of planning and exercise prompts.
- Introduced LLM usage tracking in openrouter_chat_completion and planning_exercise_suggest functions to monitor AI call metrics.
- Updated frontend components to accommodate new input fields for planning prompts, enhancing user experience and functionality.
2026-06-15 07:50:49 +02:00

90 lines
3.0 KiB
Python

"""Admin-Vorschau für Planungs-Prompt-Slugs."""
from unittest.mock import MagicMock, patch
import pytest
from ai_prompt_planning_preview import (
PLANNING_PROMPT_SLUGS,
PlanningPromptPreviewInput,
is_planning_prompt_slug,
resolve_planning_prompt_preview_variables,
)
def test_is_planning_prompt_slug():
assert is_planning_prompt_slug("planning_progression_roadmap")
assert is_planning_prompt_slug("PLANNING_EXERCISE_PATH_QA")
assert not is_planning_prompt_slug("exercise_summary")
assert not is_planning_prompt_slug("")
def test_resolve_roadmap_preview_variables():
body = PlanningPromptPreviewInput(goal_query="Mae Geri Basics", max_steps=4)
vars_map = resolve_planning_prompt_preview_variables(
MagicMock(),
"planning_progression_roadmap",
body,
)
assert vars_map["goal_query"] == "Mae Geri Basics"
assert vars_map["max_steps"] == "4"
assert "goal_analysis_json" in vars_map
assert "semantic_brief_json" in vars_map
def test_resolve_stage_spec_includes_intent_context():
body = PlanningPromptPreviewInput(user_notes="Breitensport")
vars_map = resolve_planning_prompt_preview_variables(
MagicMock(),
"planning_progression_stage_spec",
body,
)
assert "intent_context_json" in vars_map
assert "major_steps_json" in vars_map
@patch("ai_prompt_planning_preview._load_catalog_variables")
def test_resolve_search_intent_includes_catalogs(mock_catalog):
mock_catalog.return_value = {
"skills_catalog_json": "[]",
"focus_areas_catalog_json": "[]",
"training_types_catalog_json": "[]",
"style_directions_catalog_json": "[]",
"target_groups_catalog_json": "[]",
}
body = PlanningPromptPreviewInput(search_query="Mae Geri nächster Schritt")
vars_map = resolve_planning_prompt_preview_variables(
MagicMock(),
"planning_exercise_search_intent",
body,
)
assert vars_map["search_query"] == "Mae Geri nächster Schritt"
assert vars_map["skills_catalog_json"] == "[]"
def test_non_planning_slug_raises():
with pytest.raises(ValueError, match="Kein Planungs-Prompt-Slug"):
resolve_planning_prompt_preview_variables(
MagicMock(),
"exercise_summary",
PlanningPromptPreviewInput(),
)
def test_all_registered_slugs_resolve():
for slug in PLANNING_PROMPT_SLUGS:
with patch("ai_prompt_planning_preview._load_catalog_variables") as mock_catalog:
mock_catalog.return_value = {
"skills_catalog_json": "[]",
"focus_areas_catalog_json": "[]",
"training_types_catalog_json": "[]",
"style_directions_catalog_json": "[]",
"target_groups_catalog_json": "[]",
}
vars_map = resolve_planning_prompt_preview_variables(
MagicMock(),
slug,
PlanningPromptPreviewInput(),
)
assert isinstance(vars_map, dict)
assert len(vars_map) >= 1