cli + tui to publish to leaflet (wip) & manage tasks, notes & watch/read lists 馃崈
charm leaflet readability golang
29
fork

Configure Feed

Select the types of activity you want to include in your feed.

at b5d8851190fc9c722d4e5dcc977e58042fbdec81 181 lines 4.1 kB view raw
1package ui 2 3import ( 4 "testing" 5 "time" 6 7 tea "github.com/charmbracelet/bubbletea" 8 "github.com/stormlightlabs/noteleaf/internal/shared" 9) 10 11type mockListModel struct { 12 showingHelp bool 13 width int 14 height int 15} 16 17func createMockListModel() *mockListModel { 18 return &mockListModel{width: 80, height: 24} 19} 20 21func (m *mockListModel) Init() tea.Cmd { 22 return nil 23} 24 25func (m *mockListModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { 26 switch msg := msg.(type) { 27 case tea.KeyMsg: 28 switch msg.String() { 29 case "?": 30 m.showingHelp = !m.showingHelp 31 case "q": 32 return m, tea.Quit 33 case "esc": 34 m.showingHelp = false 35 } 36 case tea.WindowSizeMsg: 37 m.width = msg.Width 38 m.height = msg.Height 39 } 40 return m, nil 41} 42 43func (m *mockListModel) View() string { 44 if m.showingHelp { 45 return "help: showing help content" 46 } 47 return "mock list view - normal mode" 48} 49 50func TestDataListInteractiveBehavior(t *testing.T) { 51 t.Run("Help Toggle with TUI Framework", func(t *testing.T) { 52 model := createMockListModel() 53 54 suite := NewTUITestSuite(t, model) 55 suite.Start() 56 57 if err := suite.SendKeyString("?"); err != nil { 58 t.Fatalf("Failed to send '?' key: %v", err) 59 } 60 61 if err := suite.WaitForView("help", 1*time.Second); err != nil { 62 t.Errorf("Expected help to be shown: %v", err) 63 } 64 65 if err := suite.SendKey(tea.KeyEsc); err != nil { 66 t.Fatalf("Failed to send escape key: %v", err) 67 } 68 69 if err := suite.WaitFor(func(m tea.Model) bool { 70 view := m.View() 71 return !shared.ContainsString(view, "help") 72 }, 1*time.Second); err != nil { 73 t.Errorf("Help should have been hidden: %v", err) 74 } 75 }) 76 77 t.Run("Page Navigation with TUI Framework", func(t *testing.T) { 78 model := createMockListModel() 79 80 suite := NewTUITestSuite(t, model) 81 suite.Start() 82 83 if err := suite.SendKey(tea.KeyPgDown); err != nil { 84 t.Fatalf("Failed to send page down key: %v", err) 85 } 86 87 time.Sleep(100 * time.Millisecond) 88 89 if err := suite.SendKey(tea.KeyPgUp); err != nil { 90 t.Fatalf("Failed to send page up key: %v", err) 91 } 92 93 if err := suite.SendKey(tea.KeyHome); err != nil { 94 t.Fatalf("Failed to send home key: %v", err) 95 } 96 97 if err := suite.SendKey(tea.KeyEnd); err != nil { 98 t.Fatalf("Failed to send end key: %v", err) 99 } 100 101 view := suite.GetCurrentView() 102 if len(view) == 0 { 103 t.Error("View should not be empty after navigation") 104 } 105 }) 106 107 t.Run("Quit Command with TUI Framework", func(t *testing.T) { 108 model := createMockListModel() 109 110 suite := NewTUITestSuite(t, model) 111 suite.Start() 112 113 if err := suite.SendKeyString("q"); err != nil { 114 t.Fatalf("Failed to send 'q' key: %v", err) 115 } 116 117 if err := suite.WaitFor(func(m tea.Model) bool { 118 return true 119 }, 1*time.Second); err != nil { 120 t.Errorf("Quit command should have been processed: %v", err) 121 } 122 }) 123} 124 125func TestTUIPatternMatching(t *testing.T) { 126 t.Run("Key Message Switch Cases", func(t *testing.T) { 127 model := createMockListModel() 128 suite := NewTUITestSuite(t, model) 129 suite.Start() 130 131 testKeys := []tea.KeyType{ 132 tea.KeyUp, 133 tea.KeyDown, 134 tea.KeyLeft, 135 tea.KeyRight, 136 tea.KeyEnter, 137 tea.KeySpace, 138 tea.KeyTab, 139 } 140 141 for _, keyType := range testKeys { 142 err := suite.SendKey(keyType) 143 if err != nil { 144 t.Errorf("Failed to send key %v: %v", keyType, err) 145 } 146 147 time.Sleep(50 * time.Millisecond) 148 } 149 150 view := suite.GetCurrentView() 151 if len(view) == 0 { 152 t.Error("View should not be empty after key processing") 153 } 154 }) 155 156 t.Run("Message Type Switch Cases", func(t *testing.T) { 157 model := createMockListModel() 158 suite := NewTUITestSuite(t, model) 159 suite.Start() 160 161 messages := []tea.Msg{ 162 tea.WindowSizeMsg{Width: 100, Height: 30}, 163 tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'r'}}, 164 tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'/'}}, 165 } 166 167 for _, msg := range messages { 168 err := suite.SendMessage(msg) 169 if err != nil { 170 t.Errorf("Failed to send message %T: %v", msg, err) 171 } 172 173 time.Sleep(50 * time.Millisecond) 174 } 175 176 view := suite.GetCurrentView() 177 if len(view) == 0 { 178 t.Error("View should not be empty after message processing") 179 } 180 }) 181}