internal/tui/view/list/list_test.go

package list

import (
	"testing"

	tea "github.com/charmbracelet/bubbletea"

	"mercemay.top/httptap/internal/parser"
	"mercemay.top/httptap/internal/tui/theme"
)

func sampleModel(n int) *Model {
	m := New(theme.Default())
	m.SetSize(80, 10)
	for i := 0; i < n; i++ {
		m.Append(parser.Message{StartLine: "GET /" + string(rune('a'+i)) + " HTTP/1.1"})
	}
	return &m
}

func TestListAppendAndLen(t *testing.T) {
	m := sampleModel(3)
	if m.Len() != 3 {
		t.Fatalf("Len = %d", m.Len())
	}
}

func TestListCursorNavigation(t *testing.T) {
	m := sampleModel(3)
	press := func(k string) {
		nm, _ := m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune(k)})
		*m = nm
	}
	press("j")
	if m.cursor != 1 {
		t.Errorf("cursor = %d after j", m.cursor)
	}
	press("G")
	if m.cursor != 2 {
		t.Errorf("cursor = %d after G", m.cursor)
	}
	press("g")
	if m.cursor != 0 {
		t.Errorf("cursor = %d after g", m.cursor)
	}
}

func TestListFilter(t *testing.T) {
	m := sampleModel(3)
	m.SetFilter("path=/b")
	if m.Len() != 1 {
		t.Fatalf("after filter Len = %d", m.Len())
	}
	sel, ok := m.Selected()
	if !ok || sel.StartLine != "GET /b HTTP/1.1" {
		t.Errorf("selected = %+v", sel)
	}
	m.SetFilter("")
	if m.Len() != 3 {
		t.Errorf("after clear Len = %d", m.Len())
	}
}

func TestListViewEmpty(t *testing.T) {
	m := New(theme.Default())
	m.SetSize(40, 5)
	if got := m.View(); got == "" {
		t.Error("empty-state view should not be blank")
	}
}