summaryrefslogtreecommitdiff
path: root/internal/tui/tui_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-13 07:23:24 +0200
committerPaul Buetow <paul@buetow.org>2026-03-13 07:23:24 +0200
commita83156ac084fdaf97e6cefc76ea3ddfd3f6a993a (patch)
tree6f586234e616d57ed0a938c98fa3b0aef9e20f6b /internal/tui/tui_test.go
parentc9d22e32dc9d8d0447beb4ffa78f47a03d0cddc4 (diff)
feat: add tui parquet recording controls
Diffstat (limited to 'internal/tui/tui_test.go')
-rw-r--r--internal/tui/tui_test.go101
1 files changed, 101 insertions, 0 deletions
diff --git a/internal/tui/tui_test.go b/internal/tui/tui_test.go
index 70e2b5b..70552fb 100644
--- a/internal/tui/tui_test.go
+++ b/internal/tui/tui_test.go
@@ -5,6 +5,7 @@ import (
"encoding/csv"
"errors"
"os"
+ "path/filepath"
"regexp"
"strings"
"testing"
@@ -709,6 +710,106 @@ func TestExportKeyOpensModalOnDashboard(t *testing.T) {
}
}
+func TestRecordKeyOpensRecordingModalOnDashboard(t *testing.T) {
+ m := NewModel(-1, func(context.Context) error { return nil })
+ m.screen = ScreenDashboard
+ m.attaching = false
+
+ next, _ := m.Update(tea.KeyPressMsg{Code: []rune{'R'}[0], Text: "R"})
+ updated := next.(Model)
+ if !updated.recordModal.Visible() {
+ t.Fatalf("expected recording modal to open on R key")
+ }
+}
+
+func TestStartRecordingUpdatesDashboardStatus(t *testing.T) {
+ m := NewModel(-1, func(context.Context) error { return nil })
+ m.screen = ScreenDashboard
+ m.attaching = false
+ m.width = 120
+ m.height = 30
+
+ path := filepath.Join(t.TempDir(), "capture.parquet")
+ if err := m.startRecording(path); err != nil {
+ t.Fatalf("startRecording() error = %v", err)
+ }
+ t.Cleanup(func() {
+ if err := m.stopRecording(); err != nil {
+ t.Fatalf("stopRecording() cleanup error = %v", err)
+ }
+ })
+
+ status := m.runtime.Recorder().Status()
+ if !status.Active {
+ t.Fatalf("expected recorder to be active after startRecording()")
+ }
+
+ view := m.View().Content
+ if !strings.Contains(view, "rec:") || !strings.Contains(view, "capture") {
+ t.Fatalf("expected dashboard view to show recording status, got %q", view)
+ }
+}
+
+func TestRecordKeyStopsActiveRecording(t *testing.T) {
+ m := NewModel(-1, func(context.Context) error { return nil })
+ m.screen = ScreenDashboard
+ m.attaching = false
+
+ path := filepath.Join(t.TempDir(), "capture.parquet")
+ if err := m.startRecording(path); err != nil {
+ t.Fatalf("startRecording() error = %v", err)
+ }
+
+ next, _ := m.Update(tea.KeyPressMsg{Code: []rune{'R'}[0], Text: "R"})
+ updated := next.(Model)
+ if updated.runtime.Recorder().Status().Active {
+ t.Fatalf("expected R key to stop active recording")
+ }
+}
+
+func TestQuitStopsActiveRecording(t *testing.T) {
+ m := NewModel(-1, func(context.Context) error { return nil })
+ m.screen = ScreenDashboard
+ m.attaching = false
+
+ path := filepath.Join(t.TempDir(), "capture.parquet")
+ if err := m.startRecording(path); err != nil {
+ t.Fatalf("startRecording() error = %v", err)
+ }
+
+ next, cmd := m.Update(tea.KeyPressMsg{Code: []rune{'q'}[0], Text: "q"})
+ updated := next.(Model)
+ if cmd == nil {
+ t.Fatalf("expected quit command")
+ }
+ if updated.runtime.Recorder().Status().Active {
+ t.Fatalf("expected quit to stop active recording")
+ }
+}
+
+func TestSelectPIDStopsActiveRecording(t *testing.T) {
+ m := NewModel(-1, func(context.Context) error { return nil })
+ m.screen = ScreenDashboard
+ m.attaching = false
+
+ path := filepath.Join(t.TempDir(), "capture.parquet")
+ if err := m.startRecording(path); err != nil {
+ t.Fatalf("startRecording() error = %v", err)
+ }
+
+ next, cmd := m.Update(tea.KeyPressMsg{Code: []rune{'p'}[0], Text: "p"})
+ updated := next.(Model)
+ if cmd == nil {
+ t.Fatalf("expected picker init command")
+ }
+ if updated.screen != ScreenPIDPicker {
+ t.Fatalf("expected p to switch to pid picker, got %v", updated.screen)
+ }
+ if updated.runtime.Recorder().Status().Active {
+ t.Fatalf("expected pid reselect to stop active recording")
+ }
+}
+
func TestFlamePauseKeyDoesNotTriggerPIDReselect(t *testing.T) {
m := NewModel(-1, func(context.Context) error { return nil })
m.screen = ScreenDashboard