- Updated `resolve_placeholders` in `prompt_executor.py` to support combined modifiers for placeholders, allowing for more flexible output formats. - Enhanced `build_ai_placeholder_caption` in `placeholder_registry.py` to clarify the generation of AI context captions, focusing on descriptions and explanations. - Introduced new helper functions in `placeholder_resolver.py` to streamline the retrieval of descriptions and explanations for placeholders. - Modified tests to cover new functionality, ensuring accurate behavior for combined modifiers and improved placeholder resolution. These changes enhance the usability and clarity of placeholder outputs, providing users with richer contextual information.
105 lines
3.7 KiB
Python
105 lines
3.7 KiB
Python
"""Tests für {{key|d}}, {{key|x}}, ai_caption und Unbekannt-Erkennung."""
|
||
from placeholder_registry import (
|
||
PlaceholderMetadata,
|
||
PlaceholderType,
|
||
OutputType,
|
||
build_ai_placeholder_caption,
|
||
)
|
||
import placeholder_resolver as pr
|
||
from placeholder_resolver import format_value_with_d_modifier
|
||
from prompt_executor import resolve_placeholders
|
||
|
||
|
||
def test_build_ai_caption_is_explanation_only():
|
||
m = PlaceholderMetadata(
|
||
key="test_x",
|
||
category="Test",
|
||
description="Kurzbeschreibung",
|
||
resolver_module="m",
|
||
resolver_function="f",
|
||
semantic_contract="Lang Vertrag " * 50,
|
||
business_meaning="Kernbedeutung für die KI.",
|
||
unit="g/day",
|
||
placeholder_type=PlaceholderType.INTERPRETED,
|
||
output_type=OutputType.NUMERIC,
|
||
)
|
||
cap = build_ai_placeholder_caption(m)
|
||
assert "Kernbedeutung" in cap
|
||
assert "Kurzbeschreibung" not in cap
|
||
|
||
|
||
def test_build_ai_caption_protein_avg_no_description_prefix():
|
||
m = PlaceholderMetadata(
|
||
key="protein_avg",
|
||
category="Ernährung",
|
||
description="Durchschn. Protein in g (30d)",
|
||
resolver_module="m",
|
||
resolver_function="f",
|
||
business_meaning="Zentraler Placeholder für Muskelerhalt.",
|
||
unit="g/day",
|
||
placeholder_type=PlaceholderType.INTERPRETED,
|
||
output_type=OutputType.NUMERIC,
|
||
)
|
||
cap = build_ai_placeholder_caption(m)
|
||
assert cap.startswith("Zentraler Placeholder")
|
||
assert "Durchschn. Protein" not in cap
|
||
assert "Technischer Bezug" not in cap
|
||
|
||
|
||
def test_build_ai_caption_score_adds_scale():
|
||
m = PlaceholderMetadata(
|
||
key="test_score",
|
||
category="Test",
|
||
description="Score",
|
||
resolver_module="m",
|
||
resolver_function="f",
|
||
business_meaning="Gewichteter Gesamtscore.",
|
||
unit="Score (0-100)",
|
||
placeholder_type=PlaceholderType.SCORE,
|
||
output_type=OutputType.NUMERIC,
|
||
)
|
||
cap = build_ai_placeholder_caption(m)
|
||
assert "0–100" in cap or "0-100" in cap
|
||
assert "Gewichteter" in cap
|
||
|
||
|
||
def test_placeholder_token_regex_optional_modifier():
|
||
m0 = pr._PLACEHOLDER_TOKEN_RE.search("{{fat_avg}}")
|
||
assert m0 and m0.group(1) == "fat_avg" and m0.group(2) is None
|
||
m1 = pr._PLACEHOLDER_TOKEN_RE.search("{{fat_avg|d}}")
|
||
assert m1 and m1.group(1) == "fat_avg" and m1.group(2).strip() == "d"
|
||
m2 = pr._PLACEHOLDER_TOKEN_RE.search("{{ protein_avg | d }}")
|
||
assert m2 and m2.group(1) == "protein_avg" and m2.group(2).strip() == "d"
|
||
m3 = pr._PLACEHOLDER_TOKEN_RE.search("{{k|d,x}}")
|
||
assert m3 and m3.group(1) == "k" and m3.group(2).strip() == "d,x"
|
||
|
||
|
||
def test_get_unknown_placeholders_strips_modifier():
|
||
unk = pr.get_unknown_placeholders("{{not_a_real_key|d}}")
|
||
assert set(unk) == {"not_a_real_key"}
|
||
|
||
|
||
def test_format_value_with_d_modifier_uses_description_only():
|
||
row = {
|
||
"key": "protein_avg",
|
||
"description": "Durchschn. Protein in g (30d)",
|
||
"ai_caption": "Nur für |x",
|
||
}
|
||
out = format_value_with_d_modifier("119g/Tag", row)
|
||
assert out == "119g/Tag — Durchschn. Protein in g (30d)"
|
||
assert "Nur für |x" not in out
|
||
|
||
|
||
def test_format_value_with_d_modifier_falls_back_to_description():
|
||
row = {"description": "Nur Beschreibung", "key": "x"}
|
||
assert format_value_with_d_modifier("42", row) == "42 — Nur Beschreibung"
|
||
|
||
|
||
def test_prompt_executor_modifiers_d_x_combined():
|
||
catalog = {"E": [{"key": "p", "description": "Desc", "ai_caption": "Expl"}]}
|
||
v = {"p": "99"}
|
||
assert resolve_placeholders("{{p|d}}", v, None, catalog) == "99 — Desc"
|
||
assert resolve_placeholders("{{p|x}}", v, None, catalog) == "Expl"
|
||
assert resolve_placeholders("{{p|d,x}}", v, None, catalog) == "99 — Desc — Expl"
|
||
assert resolve_placeholders("{{p}}", v, None, catalog) == "99"
|