app/format, ui/jobs_view: DisplayStats summary + Statistics detail row (T2.6, T2.7)
Add DisplayStats to format.go: returns "No runs recorded" when RunCount is zero, otherwise a one-line "N runs, M failed, last X ms, avg Y ms, max Z ms" summary. Wire a Statistics detail row into the jobs panel that refreshes via updateDetails alongside the other runtime fields. Tests: TestDisplayStats (nil/zero/normal/no-fail), TestUpdateStats (three sequential fake runs through updateStats verifying all aggregate fields), and five seed tests in runner/seed_test.go covering basic aggregation, duration-less legacy logs, maxFiles capping, missing directory, and unmatched log files. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -99,6 +99,35 @@ func TestDisplayIndex(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestDisplayStats(t *testing.T) {
|
||||
// Zero RunCount → sentinel string.
|
||||
if got := DisplayStats(nil); got != "No runs recorded" {
|
||||
t.Errorf("nil runtime = %q, want %q", got, "No runs recorded")
|
||||
}
|
||||
if got := DisplayStats(&domain.JobRuntime{}); got != "No runs recorded" {
|
||||
t.Errorf("zero runtime = %q, want %q", got, "No runs recorded")
|
||||
}
|
||||
|
||||
rt := &domain.JobRuntime{
|
||||
RunCount: 5,
|
||||
FailCount: 2,
|
||||
LastDurationMS: 450,
|
||||
AvgDurationMS: 380,
|
||||
MaxDurationMS: 520,
|
||||
}
|
||||
want := "5 runs, 2 failed, last 450 ms, avg 380 ms, max 520 ms"
|
||||
if got := DisplayStats(rt); got != want {
|
||||
t.Errorf("DisplayStats = %q, want %q", got, want)
|
||||
}
|
||||
|
||||
// Zero failures are included in the output (not hidden).
|
||||
rtNoFail := &domain.JobRuntime{RunCount: 3, FailCount: 0, LastDurationMS: 100, AvgDurationMS: 90, MaxDurationMS: 110}
|
||||
wantNoFail := "3 runs, 0 failed, last 100 ms, avg 90 ms, max 110 ms"
|
||||
if got := DisplayStats(rtNoFail); got != wantNoFail {
|
||||
t.Errorf("DisplayStats no-fail = %q, want %q", got, wantNoFail)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEventLine(t *testing.T) {
|
||||
withLog := domain.RunRecord{
|
||||
Time: "2026-06-19 12:00:00", Trigger: "Schedule", JobName: "Build",
|
||||
|
||||
Reference in New Issue
Block a user