"""Tests for the '## Token 用量' section rendered by build_summary_markdown.""" from __future__ import annotations from pathlib import Path from rag_eval.reporting.summary import build_summary_markdown from rag_eval.shared.models import DatasetConfig, EvaluationResult, RuntimeConfig, Scenario def _scenario(tmp_path: Path) -> Scenario: return Scenario( scenario_name="summary-token-test", mode="offline", dataset=DatasetConfig(path=tmp_path / "dataset.csv"), judge_model="gpt-5", embedding_model="embedding-model", metrics=["faithfulness"], output_dir=tmp_path / "outputs", runtime=RuntimeConfig(batch_size=1), ) def test_summary_includes_token_usage_table(tmp_path: Path) -> None: scenario = _scenario(tmp_path) result = EvaluationResult( scenario=scenario, run_id="run-1", started_at="t0", finished_at="t1", valid_samples=[], invalid_samples=[], score_rows=[{"sample_id": "s1", "faithfulness": 0.9, "error": ""}], token_usage={ "gpt-5": {"input_tokens": 12450, "output_tokens": 3200, "calls": 60}, "Qwen/Qwen3-Embedding-4B": {"input_tokens": 45000, "output_tokens": 0, "calls": 30}, }, ) markdown = build_summary_markdown(result) assert "## Token 用量" in markdown assert "gpt-5" in markdown assert "12450" in markdown assert "Qwen/Qwen3-Embedding-4B" in markdown assert "45000" in markdown def test_summary_shows_fallback_text_when_token_usage_empty(tmp_path: Path) -> None: scenario = _scenario(tmp_path) result = EvaluationResult( scenario=scenario, run_id="run-2", started_at="t0", finished_at="t1", valid_samples=[], invalid_samples=[], score_rows=[{"sample_id": "s1", "faithfulness": 0.9, "error": ""}], ) markdown = build_summary_markdown(result) assert "## Token 用量" in markdown assert "未记录 token 用量" in markdown