diff --git a/cmd/status/view.go b/cmd/status/view.go index 018aa8b..c868bc1 100644 --- a/cmd/status/view.go +++ b/cmd/status/view.go @@ -181,7 +181,7 @@ func renderHeader(m MetricsSnapshot, errMsg string, animFrame int, termWidth int if mole == "" { return lipgloss.JoinVertical(lipgloss.Left, headerLine, "", dangerStyle.Render("ERROR: "+errMsg)), "" } - return lipgloss.JoinVertical(lipgloss.Left, headerLine, "", mole, dangerStyle.Render("ERROR: "+errMsg)), mole + return lipgloss.JoinVertical(lipgloss.Left, headerLine, "", mole, dangerStyle.Render("ERROR: "+errMsg)), "" } if mole == "" { return headerLine, "" diff --git a/cmd/status/view_test.go b/cmd/status/view_test.go index 8aa2a35..fbde8e9 100644 --- a/cmd/status/view_test.go +++ b/cmd/status/view_test.go @@ -920,6 +920,37 @@ func TestSparkline(t *testing.T) { } } +func TestRenderHeaderErrorReturnsMoleOnce(t *testing.T) { + header, mole := renderHeader(MetricsSnapshot{}, "boom", 0, 120, false) + + if mole != "" { + t.Fatalf("renderHeader() mole return should be empty on error to avoid duplicate render, got %q", mole) + } + if !strings.Contains(header, "ERROR: boom") { + t.Fatalf("renderHeader() missing error text, got %q", header) + } + if strings.Count(header, "/\\_/\\") != 1 { + t.Fatalf("renderHeader() should contain one mole frame in error state, got %d", strings.Count(header, "/\\_/\\")) + } +} + +func TestModelViewErrorRendersSingleMole(t *testing.T) { + m := model{ + width: 120, + height: 40, + ready: true, + metrics: MetricsSnapshot{}, + errMessage: "boom", + animFrame: 0, + catHidden: false, + } + + view := m.View() + if strings.Count(view, "/\\_/\\") != 1 { + t.Fatalf("model.View() should render one mole frame in error state, got %d", strings.Count(view, "/\\_/\\")) + } +} + func stripANSI(s string) string { var result strings.Builder i := 0