package tests import ( "strings" "testing" "hosts-go/internal/core" "hosts-go/internal/tui" tea "github.com/charmbracelet/bubbletea" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestModelSelection(t *testing.T) { sample := `127.0.0.1 localhost 192.168.1.10 example.com` lines := strings.Split(sample, "\n") hf, _, err := core.ParseHostsContent(lines) require.NoError(t, err) m := tui.NewModel(hf) require.NotNil(t, m.SelectedEntry()) assert.Equal(t, "localhost", m.SelectedEntry().Hostname) // Move selection down nm, _ := m.Update(tea.KeyMsg{Type: tea.KeyDown}) m = nm.(tui.Model) assert.Equal(t, "example.com", m.SelectedEntry().Hostname) } func TestViewModeStatusBar(t *testing.T) { sample := `127.0.0.1 localhost # 192.168.1.10 example.com` lines := strings.Split(sample, "\n") hf, _, err := core.ParseHostsContent(lines) require.NoError(t, err) m := tui.NewModel(hf) nm, _ := m.Update(tea.WindowSizeMsg{Width: 80, Height: 20}) m = nm.(tui.Model) view := m.View() assert.Contains(t, view, "VIEW MODE") assert.Contains(t, view, "[✓] localhost") assert.Contains(t, view, "[ ] example.com") } func TestPaneSwitching(t *testing.T) { sample := "127.0.0.1 localhost\n192.168.1.10 example.com" lines := strings.Split(sample, "\n") hf, _, err := core.ParseHostsContent(lines) require.NoError(t, err) m := tui.NewModel(hf) // Switch focus to detail pane nm, _ := m.Update(tea.KeyMsg{Type: tea.KeyTab}) m = nm.(tui.Model) // Attempt to move down; selection should remain on first entry nm, _ = m.Update(tea.KeyMsg{Type: tea.KeyDown}) m = nm.(tui.Model) assert.Equal(t, "localhost", m.SelectedEntry().Hostname) } func TestEditModeToggleAndActivation(t *testing.T) { sample := "127.0.0.1 localhost\n192.168.1.10 example.com" lines := strings.Split(sample, "\n") hf, _, err := core.ParseHostsContent(lines) require.NoError(t, err) m := tui.NewModel(hf) // enter edit mode nm, _ := m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'e'}}) m = nm.(tui.Model) assert.Equal(t, tui.EditMode, m.Mode()) // toggle active state of first entry nm, _ = m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'a'}}) m = nm.(tui.Model) assert.False(t, m.SelectedEntry().Active) // status bar should reflect edit mode view := m.View() assert.Contains(t, view, "EDIT MODE") }