@@ -166,11 +166,15 @@ def test_avg_ms_division_by_zero_guard(self) -> None:
166166 """A model with count=0 in duration_by_model produces avg_ms=0."""
167167 summary = _make_summary (
168168 total_requests = 0 ,
169+ total_duration_ms = 1_000 ,
169170 requests_by_model = {"some-model" : 0 },
170171 duration_by_model = {"some-model" : 100 },
171172 )
172173 output = _capture (summary )
173- assert "0ms" in output
174+ model_line = _strip_ansi (
175+ next (line for line in output .splitlines () if "some-model" in line )
176+ )
177+ assert re .search (r"(?<!\d)0ms(?!\d)" , model_line )
174178
175179 def test_total_duration_formatted (self ) -> None :
176180 summary = _make_summary (
@@ -182,6 +186,42 @@ def test_total_duration_formatted(self) -> None:
182186 # format_duration(389_114) -> "6m 29s"
183187 assert "6m 29s" in output
184188
189+ def test_per_model_table_absent_duration_defaults_to_zero_avg (self ) -> None :
190+ """Model in requests_by_model but absent from duration_by_model → 0ms avg."""
191+ summary = _make_summary (
192+ total_requests = 3 ,
193+ total_duration_ms = 1_000 ,
194+ requests_by_model = {"claude-opus-4.6" : 3 },
195+ duration_by_model = {},
196+ )
197+ output = _capture (summary )
198+ model_line = _strip_ansi (
199+ next (line for line in output .splitlines () if "claude-opus-4.6" in line )
200+ )
201+ assert "claude-opus-4.6" in model_line
202+ assert model_line .count ("0ms" ) == 2
203+
204+ def test_per_model_table_partial_duration_dict (self ) -> None :
205+ """Only one of two models has a duration entry; the other defaults to 0ms."""
206+ summary = _make_summary (
207+ total_requests = 5 ,
208+ total_duration_ms = 1_500 ,
209+ requests_by_model = {"gpt-4o-mini" : 3 , "claude-opus-4.6" : 2 },
210+ duration_by_model = {"gpt-4o-mini" : 1500 },
211+ )
212+ output = _capture (summary )
213+ gpt_line = _strip_ansi (
214+ next (line for line in output .splitlines () if "gpt-4o-mini" in line )
215+ )
216+ opus_line = _strip_ansi (
217+ next (line for line in output .splitlines () if "claude-opus-4.6" in line )
218+ )
219+ # gpt-4o-mini avg = 1500 // 3 = 500ms; total = "1s 500ms"
220+ # "500ms" appears once for avg and once inside the total format.
221+ assert gpt_line .count ("500ms" ) == 2
222+ # claude-opus-4.6 has no duration entry → 0ms avg and 0ms total
223+ assert opus_line .count ("0ms" ) == 2
224+
185225 def test_empty_requests_by_model_table_absent (self ) -> None :
186226 summary = _make_summary (total_requests = 5 , requests_by_model = {})
187227 output = _capture (summary )
0 commit comments