2026-04-11 21:36:29 +02:00
|
|
|
|
"""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
|
2026-04-11 21:47:08 +02:00
|
|
|
|
from placeholder_resolver import format_value_with_d_modifier
|
2026-04-11 21:36:29 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
2026-04-11 21:47:08 +02:00
|
|
|
|
assert cap.startswith("Kurzbeschreibung")
|
2026-04-11 21:36:29 +02:00
|
|
|
|
assert "Kernbedeutung" in cap
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-04-11 21:47:08 +02:00
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-04-11 21:36:29 +02:00
|
|
|
|
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"}
|
2026-04-11 21:47:08 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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"
|