* stage-3634: static model-health comparison table on Insights (#691, rodboev) * stage-3634: model-health table + pt i18n keys + per-locale test (Codex fix) * Release OY: model cost/health comparison table on Insights (#691) Self-rebased rodboev's #3634 onto v0.51.437; Nathan-approved screenshot; full Codex+Opus+suite gate. Codex fix applied: added the 4 insights_model_health_* keys to the pt locale (was English-fallback) + tightened the i18n test to a per-locale check (was a weak count>=8). Co-authored-by: rodboev <rodboev@users.noreply.github.com> --------- Co-authored-by: nesquena-hermes <agent@nesquena-hermes> Co-authored-by: rodboev <rodboev@users.noreply.github.com>
89 lines
3.5 KiB
Python
89 lines
3.5 KiB
Python
from pathlib import Path
|
|
|
|
|
|
REPO = Path(__file__).resolve().parents[1]
|
|
PANELS_JS = (REPO / "static" / "panels.js").read_text(encoding="utf-8")
|
|
I18N_JS = (REPO / "static" / "i18n.js").read_text(encoding="utf-8")
|
|
STYLE_CSS = (REPO / "static" / "style.css").read_text(encoding="utf-8")
|
|
|
|
|
|
def _function_body(src: str, signature: str) -> str:
|
|
start = src.index(signature)
|
|
brace = src.index("{", start)
|
|
depth = 0
|
|
for i in range(brace, len(src)):
|
|
if src[i] == "{":
|
|
depth += 1
|
|
elif src[i] == "}":
|
|
depth -= 1
|
|
if depth == 0:
|
|
return src[start : i + 1]
|
|
raise AssertionError(f"function body not found: {signature}")
|
|
|
|
|
|
def test_static_model_health_metadata_and_renderer_exist():
|
|
renderer = _function_body(PANELS_JS, "function _renderStaticModelHealthTable")
|
|
|
|
assert "const STATIC_MODEL_HEALTH_ROWS = [" in PANELS_JS
|
|
assert "inputCostPerM" in PANELS_JS
|
|
assert "outputCostPerM" in PANELS_JS
|
|
assert "replacement:" in PANELS_JS
|
|
assert '<details class="insights-card insights-model-health-card">' in renderer
|
|
assert "<summary>" in renderer
|
|
assert "insights-model-health-table" in renderer
|
|
assert "insights_model_health_cost_per_m" in renderer
|
|
assert "insights_model_health_replacement" in renderer
|
|
assert "insights_model_health_quality" not in renderer
|
|
assert "insights_model_health_hallucination" not in renderer
|
|
|
|
|
|
def test_render_insights_includes_static_table_before_usage_models():
|
|
render = _function_body(PANELS_JS, "function _renderInsights")
|
|
|
|
assert "const modelHealthHtml = _renderStaticModelHealthTable();" in render
|
|
assert "${modelHealthHtml}" in render
|
|
assert render.index("${modelHealthHtml}") < render.index("insights-usage-grid")
|
|
assert "modelsHtml" in render
|
|
|
|
|
|
def test_no_runtime_quality_or_hallucination_fetch_added():
|
|
load = _function_body(PANELS_JS, "async function loadInsights")
|
|
|
|
assert "quality" not in load.lower()
|
|
assert "hallucination" not in load.lower()
|
|
assert "/api/model" not in load
|
|
assert "api(`/api/insights?days=${period}`)" in load
|
|
|
|
|
|
def test_model_health_i18n_keys_exist_in_locale_blocks():
|
|
keys = [
|
|
"insights_model_health_title",
|
|
"insights_model_health_provider",
|
|
"insights_model_health_replacement",
|
|
"insights_model_health_cost_per_m",
|
|
]
|
|
# Split i18n.js into per-locale blocks (top-level " <code>: {" entries) and
|
|
# assert EVERY locale carries all four keys — a `count >= N` check silently
|
|
# tolerates a locale missing the keys (English fallback). #3634 pt gap.
|
|
import re
|
|
|
|
locale_starts = [
|
|
(m.group(1), m.start())
|
|
for m in re.finditer(r"""^ ['"]?([A-Za-z_-]+)['"]?: \{$""", I18N_JS, re.MULTILINE)
|
|
]
|
|
assert len(locale_starts) >= 13, f"expected 13+ locale blocks, found {len(locale_starts)}"
|
|
bounds = locale_starts + [("__end__", len(I18N_JS))]
|
|
for i, (code, start) in enumerate(locale_starts):
|
|
block = I18N_JS[start : bounds[i + 1][1]]
|
|
for key in keys:
|
|
assert f"{key}:" in block, f"locale '{code}' is missing {key}"
|
|
|
|
|
|
def test_model_health_table_css_is_responsive_and_contained():
|
|
assert ".insights-model-health-table" in STYLE_CSS
|
|
assert ".insights-model-health-table .insights-table-head" in STYLE_CSS
|
|
assert ".insights-model-health-card>summary" in STYLE_CSS
|
|
assert "minmax(130px,1.5fr)" in STYLE_CSS
|
|
assert "overflow-x:auto" in STYLE_CSS
|
|
assert ".insights-model-health-replacement" in STYLE_CSS
|