diff options
Diffstat (limited to 'internal/tui/reader_test.go')
| -rw-r--r-- | internal/tui/reader_test.go | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/internal/tui/reader_test.go b/internal/tui/reader_test.go index 7bce759..da8d4d4 100644 --- a/internal/tui/reader_test.go +++ b/internal/tui/reader_test.go @@ -49,6 +49,55 @@ func win(m ReaderModel, w, h int) ReaderModel { return nm.(ReaderModel) } +func TestReaderBookmarkTagFilter(t *testing.T) { + m := enReader(t) + m.marks = []bookmarks.Bookmark{ + {ID: "1", Book: "John", Chapter: 3, Verse: 16, Tags: []string{"faith"}}, + {ID: "2", Book: "Psalms", Chapter: 23, Verse: 1, Tags: []string{"work", "prayer"}}, + {ID: "3", Book: "Matthew", Chapter: 5, Verse: 3, Tags: []string{"prayer"}}, + } + m.mode = modeBookmarks + + if got := len(m.visMarks()); got != 3 { + t.Fatalf("unfiltered visible = %d, want 3", got) + } + + // "/" enters filter input; typing narrows to the two 'prayer' bookmarks. + m = key(m, runes("/")) + if !m.markFiltering { + t.Fatal(`"/" did not enter filter input`) + } + for _, c := range []string{"p", "r", "a", "y"} { + m = key(m, runes(c)) + } + if got := len(m.visMarks()); got != 2 { + t.Fatalf(`filter "pray" visible = %d, want 2 (Psalms, Matthew)`, got) + } + + // Enter keeps the filter and leaves input mode. + m = key(m, tea.KeyMsg{Type: tea.KeyEnter}) + if m.markFiltering || m.markFilter != "pray" { + t.Fatalf("after enter: filtering=%v filter=%q", m.markFiltering, m.markFilter) + } + + // Case-insensitive substring: "WORK" matches the 'work' tag (1 bookmark). + m.markFilter = "WORK" + if got := len(m.visMarks()); got != 1 { + t.Fatalf(`filter "WORK" visible = %d, want 1`, got) + } + + // Esc clears an active filter, back to all. + m.markFilter = "work" + m.markFiltering = false + m = key(m, tea.KeyMsg{Type: tea.KeyEsc}) + if m.markFilter != "" { + t.Fatalf("esc did not clear filter, got %q", m.markFilter) + } + if got := len(m.visMarks()); got != 3 { + t.Fatalf("after clearing filter, visible = %d, want 3", got) + } +} + func TestReaderInit(t *testing.T) { m := enReader(t) if m.mode != modePick { |
