- Updated `build_ai_placeholder_caption` in `placeholder_registry.py` to improve the generation of AI context captions by prioritizing descriptions and avoiding redundancy. - Introduced `format_value_with_d_modifier` in `placeholder_resolver.py` to format values with contextual information, enhancing the clarity of exported placeholder values. - Modified `export_placeholder_values` in `prompts.py` to utilize the new formatting function, ensuring that exported data includes both raw values and contextual descriptions. - Added tests for the new formatting function and updated existing tests to ensure accurate caption generation. These changes improve the contextual relevance of placeholder data and enhance the user experience when interacting with exported values.
93 lines
3.2 KiB
Python
93 lines
3.2 KiB
Python
"""Tests für {{key|d}}, 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
|
||
|
||
|
||
def test_build_ai_caption_prefers_business_meaning():
|
||
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 cap.startswith("Kurzbeschreibung")
|
||
assert "Kernbedeutung" in cap
|
||
|
||
|
||
def test_build_ai_caption_description_then_meaning_like_protein_avg():
|
||
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("Durchschn. Protein in g (30d)")
|
||
assert "Muskelerhalt" 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"
|
||
|
||
|
||
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_matches_prompt_executor():
|
||
row = {
|
||
"key": "protein_avg",
|
||
"description": "Durchschn. Protein in g (30d)",
|
||
"example": "119g/Tag",
|
||
"ai_caption": "Durchschn. Protein in g (30d). Zentral für Muskelerhalt.",
|
||
}
|
||
out = format_value_with_d_modifier("119g/Tag", row)
|
||
assert out == "119g/Tag — Durchschn. Protein in g (30d). Zentral für Muskelerhalt."
|
||
|
||
|
||
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"
|