summaryrefslogtreecommitdiff
path: root/internal/tui/dashboard/model_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-09 22:41:07 +0200
committerPaul Buetow <paul@buetow.org>2026-03-09 22:41:07 +0200
commit1af7cf5fe51fa13e828cdef6268348ec9cd7bd7c (patch)
treef8d28d4faa627b31175c0c39164c2ea84e022e90 /internal/tui/dashboard/model_test.go
parenta4c72ad2cbe4ca857a5880675563b2ab4d24e1b5 (diff)
tui: add sortable files dashboard table modes (task 364)
Diffstat (limited to 'internal/tui/dashboard/model_test.go')
-rw-r--r--internal/tui/dashboard/model_test.go112
1 files changed, 112 insertions, 0 deletions
diff --git a/internal/tui/dashboard/model_test.go b/internal/tui/dashboard/model_test.go
index 76a60e3..aa9b774 100644
--- a/internal/tui/dashboard/model_test.go
+++ b/internal/tui/dashboard/model_test.go
@@ -503,6 +503,118 @@ func TestFilesTabEnterEmitsGlobalFilterRequest(t *testing.T) {
}
}
+func TestFilesSortKeyTogglesFlatMode(t *testing.T) {
+ m := NewModelWithConfig(nil, nil, 250, common.DefaultKeyMap())
+ m.activeTab = TabFiles
+ snap := statsengine.NewSnapshot(nil, nil, nil, nil, []statsengine.FileSnapshot{
+ {Path: "/tmp/z.log", Accesses: 9},
+ {Path: "/tmp/a.log", Accesses: 3},
+ }, nil, statsengine.HistogramSnapshot{}, statsengine.HistogramSnapshot{})
+ m.latest = &snap
+ m.filesCol = 5
+
+ next, _ := m.Update(tea.KeyPressMsg{Code: []rune{'s'}[0], Text: string([]rune{'s'})})
+ model := next.(Model)
+ if !model.filesSort.active || model.filesSort.key != fileSortKeyPath {
+ t.Fatalf("expected flat file path sort enabled, got %+v", model.filesSort)
+ }
+
+ next, _ = model.Update(tea.KeyPressMsg{Code: []rune{'s'}[0], Text: string([]rune{'s'})})
+ model = next.(Model)
+ if model.filesSort.active {
+ t.Fatalf("expected second s press to restore default file ordering")
+ }
+}
+
+func TestFilesSortEnterUsesSortedVisibleRow(t *testing.T) {
+ m := NewModelWithConfig(nil, nil, 250, common.DefaultKeyMap())
+ m.activeTab = TabFiles
+ snap := statsengine.NewSnapshot(nil, nil, nil, nil, []statsengine.FileSnapshot{
+ {Path: "/tmp/z.log", Accesses: 9},
+ {Path: "/tmp/a.log", Accesses: 3},
+ }, nil, statsengine.HistogramSnapshot{}, statsengine.HistogramSnapshot{})
+ m.latest = &snap
+ m.filesOffset = 1
+ m.filesCol = 5
+
+ next, _ := m.Update(tea.KeyPressMsg{Code: []rune{'s'}[0], Text: string([]rune{'s'})})
+ m = next.(Model)
+ next, cmd := m.Update(tea.KeyPressMsg{Code: tea.KeyEnter})
+ m = next.(Model)
+ if cmd == nil {
+ t.Fatalf("expected enter on sorted files tab to emit a filter request")
+ }
+ msg := cmd()
+ req, ok := msg.(messages.GlobalFilterRequestedMsg)
+ if !ok {
+ t.Fatalf("expected GlobalFilterRequestedMsg, got %T", msg)
+ }
+ if req.Filter.File == nil || req.Filter.File.Pattern != "/tmp/a.log" {
+ t.Fatalf("expected visible sorted row to filter /tmp/a.log, got %+v", req.Filter.File)
+ }
+}
+
+func TestFilesDirSortEnterUsesSortedVisibleRow(t *testing.T) {
+ m := NewModelWithConfig(nil, nil, 250, common.DefaultKeyMap())
+ m.activeTab = TabFiles
+ m.filesDirGrouped = true
+ snap := statsengine.NewSnapshot(nil, nil, nil, nil, []statsengine.FileSnapshot{
+ {Path: "/var/log/z.log", Accesses: 9},
+ {Path: "/tmp/a.log", Accesses: 3},
+ }, nil, statsengine.HistogramSnapshot{}, statsengine.HistogramSnapshot{})
+ m.latest = &snap
+ m.filesDirOffset = 1
+ m.filesDirCol = 6
+
+ next, _ := m.Update(tea.KeyPressMsg{Code: []rune{'s'}[0], Text: string([]rune{'s'})})
+ m = next.(Model)
+ next, cmd := m.Update(tea.KeyPressMsg{Code: tea.KeyEnter})
+ m = next.(Model)
+ if cmd == nil {
+ t.Fatalf("expected enter on sorted grouped files tab to emit a filter request")
+ }
+ msg := cmd()
+ req, ok := msg.(messages.GlobalFilterRequestedMsg)
+ if !ok {
+ t.Fatalf("expected GlobalFilterRequestedMsg, got %T", msg)
+ }
+ if req.Filter.File == nil || req.Filter.File.Pattern != "/tmp" {
+ t.Fatalf("expected visible sorted grouped row to filter /tmp, got %+v", req.Filter.File)
+ }
+}
+
+func TestFilesSortStatesPersistAcrossDirToggle(t *testing.T) {
+ m := NewModelWithConfig(nil, nil, 250, common.DefaultKeyMap())
+ m.activeTab = TabFiles
+ snap := statsengine.NewSnapshot(nil, nil, nil, nil, []statsengine.FileSnapshot{
+ {Path: "/var/log/z.log", Accesses: 9},
+ {Path: "/tmp/a.log", Accesses: 3},
+ }, nil, statsengine.HistogramSnapshot{}, statsengine.HistogramSnapshot{})
+ m.latest = &snap
+ m.filesCol = 5
+
+ next, _ := m.Update(tea.KeyPressMsg{Code: []rune{'s'}[0], Text: string([]rune{'s'})})
+ m = next.(Model)
+ next, _ = m.Update(tea.KeyPressMsg{Code: []rune{'d'}[0], Text: string([]rune{'d'})})
+ m = next.(Model)
+ m.filesDirCol = 6
+ next, _ = m.Update(tea.KeyPressMsg{Code: []rune{'s'}[0], Text: string([]rune{'s'})})
+ m = next.(Model)
+
+ if !m.filesSort.active || m.filesSort.key != fileSortKeyPath {
+ t.Fatalf("expected flat file sort state preserved, got %+v", m.filesSort)
+ }
+ if !m.filesDirSort.active || m.filesDirSort.key != fileDirSortKeyDir {
+ t.Fatalf("expected dir sort state enabled, got %+v", m.filesDirSort)
+ }
+
+ next, _ = m.Update(tea.KeyPressMsg{Code: []rune{'d'}[0], Text: string([]rune{'d'})})
+ m = next.(Model)
+ if !m.filesSort.active || m.filesSort.key != fileSortKeyPath {
+ t.Fatalf("expected flat file sort state after returning from dir mode, got %+v", m.filesSort)
+ }
+}
+
func TestStreamSpaceUnpauseSchedulesStreamTick(t *testing.T) {
rb := eventstream.NewRingBuffer()
m := NewModelWithConfig(nil, rb, 250, common.DefaultKeyMap())