diff --git a/tests/copilot_usage/test_vscode_report.py b/tests/copilot_usage/test_vscode_report.py index 838f77b5..97c88b47 100644 --- a/tests/copilot_usage/test_vscode_report.py +++ b/tests/copilot_usage/test_vscode_report.py @@ -166,11 +166,15 @@ def test_avg_ms_division_by_zero_guard(self) -> None: """A model with count=0 in duration_by_model produces avg_ms=0.""" summary = _make_summary( total_requests=0, + total_duration_ms=1_000, requests_by_model={"some-model": 0}, duration_by_model={"some-model": 100}, ) output = _capture(summary) - assert "0ms" in output + model_line = _strip_ansi( + next(line for line in output.splitlines() if "some-model" in line) + ) + assert re.search(r"(? None: summary = _make_summary( @@ -182,6 +186,42 @@ def test_total_duration_formatted(self) -> None: # format_duration(389_114) -> "6m 29s" assert "6m 29s" in output + def test_per_model_table_absent_duration_defaults_to_zero_avg(self) -> None: + """Model in requests_by_model but absent from duration_by_model → 0ms avg.""" + summary = _make_summary( + total_requests=3, + total_duration_ms=1_000, + requests_by_model={"claude-opus-4.6": 3}, + duration_by_model={}, + ) + output = _capture(summary) + model_line = _strip_ansi( + next(line for line in output.splitlines() if "claude-opus-4.6" in line) + ) + assert "claude-opus-4.6" in model_line + assert model_line.count("0ms") == 2 + + def test_per_model_table_partial_duration_dict(self) -> None: + """Only one of two models has a duration entry; the other defaults to 0ms.""" + summary = _make_summary( + total_requests=5, + total_duration_ms=1_500, + requests_by_model={"gpt-4o-mini": 3, "claude-opus-4.6": 2}, + duration_by_model={"gpt-4o-mini": 1500}, + ) + output = _capture(summary) + gpt_line = _strip_ansi( + next(line for line in output.splitlines() if "gpt-4o-mini" in line) + ) + opus_line = _strip_ansi( + next(line for line in output.splitlines() if "claude-opus-4.6" in line) + ) + # gpt-4o-mini avg = 1500 // 3 = 500ms; total = "1s 500ms" + # "500ms" appears once for avg and once inside the total format. + assert gpt_line.count("500ms") == 2 + # claude-opus-4.6 has no duration entry → 0ms avg and 0ms total + assert opus_line.count("0ms") == 2 + def test_empty_requests_by_model_table_absent(self) -> None: summary = _make_summary(total_requests=5, requests_by_model={}) output = _capture(summary)