Skip to main content
Glama
input_controller_test.go5.19 kB
package tui import ( "testing" tea "github.com/charmbracelet/bubbletea" "github.com/stretchr/testify/assert" ) func TestInputController_HandleKeyMsg(t *testing.T) { tests := []struct { name string setupModel func() *Model keyMsg tea.KeyMsg expectedView View expectHandled bool description string }{ { name: "tab_switches_view_forward", setupModel: func() *Model { m := createTestModel() m.navController.SwitchTo(ViewProcesses) return m }, keyMsg: tea.KeyMsg{Type: tea.KeyTab}, expectedView: ViewLogs, expectHandled: true, description: "Tab should switch from processes to logs view", }, { name: "shift_tab_switches_view_backward", setupModel: func() *Model { m := createTestModel() m.navController.SwitchTo(ViewLogs) return m }, keyMsg: tea.KeyMsg{Type: tea.KeyShiftTab}, expectedView: ViewProcesses, expectHandled: true, description: "Shift+Tab should switch from logs to processes view", }, { name: "slash_opens_command_menu", setupModel: func() *Model { m := createTestModel() // commandWindowController is already initialized, just hide it m.commandWindowController.HideCommandWindow() return m }, keyMsg: tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'/'}}, expectHandled: true, description: "Slash key should open command menu", }, { name: "escape_closes_dialogs", setupModel: func() *Model { m := createTestModel() // Show command window m.commandWindowController.ShowCommandWindow(make(map[string]string), nil) return m }, keyMsg: tea.KeyMsg{Type: tea.KeyEsc}, expectHandled: true, description: "Escape should close open dialogs", }, { name: "enter_in_script_selector", setupModel: func() *Model { m := createTestModel() // Switch to script selector view m.navController.SwitchTo(ViewScriptSelector) // The script selector controller should be initialized by the model return m }, keyMsg: tea.KeyMsg{Type: tea.KeyEnter}, expectHandled: true, description: "Enter should execute selected script", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { // Setup model := tt.setupModel() ic := NewInputController(model, keys, viewConfigs, false) // Execute returnedModel, cmd, handled := ic.HandleKeyMsg(tt.keyMsg) // Assert assert.Equal(t, tt.expectHandled, handled, tt.description) if tt.expectHandled { assert.NotNil(t, returnedModel, "Model should be returned when handled") // Check view change if expected if tt.expectedView != "" { currentView := model.navController.GetCurrentView() assert.Equal(t, tt.expectedView, currentView, "View should be changed correctly") } } // Command might be nil for synchronous operations _ = cmd // Acknowledge cmd existence }) } } func TestInputController_QuickScriptMode(t *testing.T) { // Setup model := createTestModel() // Switch to a view where quick script mode is available (not script selector view) model.navController.SwitchTo(ViewProcesses) ic := NewInputController(model, keys, viewConfigs, false) // Test entering quick script mode _, _, handled := ic.HandleKeyMsg(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'s'}}) // Quick script mode might not be handled in the current implementation // This test may need to be adjusted based on the actual behavior if handled && model.scriptSelectorController != nil { // If quick script mode is implemented, verify it's activated assert.True(t, handled, "Should handle 's' key for quick script mode") } } func TestInputController_CommandModeNavigation(t *testing.T) { // Setup model := createTestModel() // Show command window with some scripts scripts := map[string]string{ "start": "npm start", "test": "npm test", "build": "npm run build", } model.commandWindowController.ShowCommandWindow(scripts, nil) ic := NewInputController(model, keys, viewConfigs, false) // Test arrow down navigation _, _, handled := ic.HandleKeyMsg(tea.KeyMsg{Type: tea.KeyDown}) assert.True(t, handled, "Should handle down arrow in command mode") // Test arrow up navigation _, _, handled = ic.HandleKeyMsg(tea.KeyMsg{Type: tea.KeyUp}) assert.True(t, handled, "Should handle up arrow in command mode") } func TestInputController_SearchMode(t *testing.T) { // Setup model := createTestModel() model.navController.SwitchTo(ViewLogs) ic := NewInputController(model, keys, viewConfigs, false) // Enter search mode _, _, handled := ic.HandleKeyMsg(tea.KeyMsg{Type: tea.KeyCtrlF}) // The search functionality might be handled by the logs view controller // This test verifies that the input controller properly delegates to view controllers _ = handled // The actual search behavior is tested in logs view controller tests } // Helper function to create a test model func createTestModel() *Model { // This would need to be implemented based on your actual model initialization // For now, we'll assume there's a test helper that creates a minimal model return createTestModelWithDefaults() }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/standardbeagle/brummer'

If you have feedback or need assistance with the MCP directory API, please join our Discord server