target_test.go

  1package screens
  2
  3import (
  4	"testing"
  5
  6	tea "charm.land/bubbletea/v2"
  7
  8	"git.secluded.site/keld/internal/ui"
  9)
 10
 11func TestTargetTitle(t *testing.T) {
 12	t.Parallel()
 13
 14	tgt := NewTarget(testStyles())
 15	if got := tgt.Title(); got != "Target directory" {
 16		t.Errorf("Title() = %q, want %q", got, "Target directory")
 17	}
 18}
 19
 20func TestTargetSelectionEmpty(t *testing.T) {
 21	t.Parallel()
 22
 23	tgt := NewTarget(testStyles())
 24	if got := tgt.Selection(); got != "" {
 25		t.Errorf("Selection() before interaction = %q, want empty", got)
 26	}
 27}
 28
 29func TestTargetKeyBindings(t *testing.T) {
 30	t.Parallel()
 31
 32	tgt := NewTarget(testStyles())
 33	bindings := tgt.KeyBindings()
 34
 35	if len(bindings) == 0 {
 36		t.Fatal("KeyBindings() returned no bindings")
 37	}
 38}
 39
 40func TestTargetEscReturnsBack(t *testing.T) {
 41	t.Parallel()
 42
 43	tgt := NewTarget(testStyles())
 44	tgt.Init()
 45	tgt.Update(tea.WindowSizeMsg{Width: 80, Height: 20})
 46
 47	_, cmd := tgt.Update(tea.KeyPressMsg{Code: tea.KeyEscape})
 48
 49	if cmd == nil {
 50		t.Fatal("expected BackCmd on Esc")
 51	}
 52	msg := cmd()
 53	if _, ok := msg.(ui.BackMsg); !ok {
 54		t.Errorf("cmd produced %T, want ui.BackMsg", msg)
 55	}
 56}
 57
 58func TestTargetCompleteReturnsDone(t *testing.T) {
 59	t.Parallel()
 60
 61	tgt := NewTarget(testStyles())
 62	tgt.Init()
 63	tgt.Update(tea.WindowSizeMsg{Width: 80, Height: 20})
 64
 65	// Type a path, then press enter.
 66	for _, ch := range "/tmp/restore" {
 67		tgt.Update(tea.KeyPressMsg{Code: ch, Text: string(ch)})
 68	}
 69
 70	var screen ui.Screen
 71	var cmd tea.Cmd
 72	screen, cmd = tgt.Update(tea.KeyPressMsg{Code: tea.KeyEnter})
 73	_, cmd = drain(screen.(*Target), cmd)
 74
 75	if cmd == nil {
 76		t.Fatal("expected DoneCmd after form completion")
 77	}
 78	msg := cmd()
 79	if _, ok := msg.(ui.DoneMsg); !ok {
 80		t.Errorf("cmd produced %T, want ui.DoneMsg", msg)
 81	}
 82}
 83
 84func TestTargetSelectionShowsPath(t *testing.T) {
 85	t.Parallel()
 86
 87	tgt := NewTarget(testStyles())
 88	tgt.Init()
 89	tgt.Update(tea.WindowSizeMsg{Width: 80, Height: 20})
 90
 91	for _, ch := range "/tmp/restore" {
 92		tgt.Update(tea.KeyPressMsg{Code: ch, Text: string(ch)})
 93	}
 94
 95	var screen ui.Screen
 96	var cmd tea.Cmd
 97	screen, cmd = tgt.Update(tea.KeyPressMsg{Code: tea.KeyEnter})
 98	tgt, _ = drain(screen.(*Target), cmd)
 99
100	if got := tgt.Selection(); got != "/tmp/restore" {
101		t.Errorf("Selection() = %q, want %q", got, "/tmp/restore")
102	}
103}
104
105func TestTargetValueReturnsPath(t *testing.T) {
106	t.Parallel()
107
108	tgt := NewTarget(testStyles())
109	tgt.Init()
110	tgt.Update(tea.WindowSizeMsg{Width: 80, Height: 20})
111
112	for _, ch := range "/tmp/restore" {
113		tgt.Update(tea.KeyPressMsg{Code: ch, Text: string(ch)})
114	}
115
116	var screen ui.Screen
117	var cmd tea.Cmd
118	screen, cmd = tgt.Update(tea.KeyPressMsg{Code: tea.KeyEnter})
119	tgt, _ = drain(screen.(*Target), cmd)
120
121	if got := tgt.Value(); got != "/tmp/restore" {
122		t.Errorf("Value() = %q, want %q", got, "/tmp/restore")
123	}
124}
125
126func TestTargetReinitAfterBack(t *testing.T) {
127	t.Parallel()
128
129	tgt := NewTarget(testStyles())
130	tgt.Init()
131	tgt.Update(tea.WindowSizeMsg{Width: 80, Height: 20})
132
133	// Complete the form.
134	for _, ch := range "/tmp/restore" {
135		tgt.Update(tea.KeyPressMsg{Code: ch, Text: string(ch)})
136	}
137	var screen ui.Screen
138	var cmd tea.Cmd
139	screen, cmd = tgt.Update(tea.KeyPressMsg{Code: tea.KeyEnter})
140	tgt, _ = drain(screen.(*Target), cmd)
141
142	// Re-init (simulates back navigation).
143	tgt.Init()
144	tgt.Update(tea.WindowSizeMsg{Width: 80, Height: 20})
145
146	// Should be functional again.
147	for _, ch := range "/var/data" {
148		tgt.Update(tea.KeyPressMsg{Code: ch, Text: string(ch)})
149	}
150	screen, cmd = tgt.Update(tea.KeyPressMsg{Code: tea.KeyEnter})
151	_, cmd = drain(screen.(*Target), cmd)
152
153	if cmd == nil {
154		t.Fatal("expected DoneCmd after re-init")
155	}
156	msg := cmd()
157	if _, ok := msg.(ui.DoneMsg); !ok {
158		t.Errorf("after re-init, cmd produced %T, want ui.DoneMsg", msg)
159	}
160}
161
162func TestTargetPreservesValueOnReinit(t *testing.T) {
163	t.Parallel()
164
165	tgt := NewTarget(testStyles())
166	tgt.Init()
167	tgt.Update(tea.WindowSizeMsg{Width: 80, Height: 20})
168
169	for _, ch := range "/tmp/restore" {
170		tgt.Update(tea.KeyPressMsg{Code: ch, Text: string(ch)})
171	}
172	var screen ui.Screen
173	var cmd tea.Cmd
174	screen, cmd = tgt.Update(tea.KeyPressMsg{Code: tea.KeyEnter})
175	tgt, _ = drain(screen.(*Target), cmd)
176
177	// Re-init should preserve the entered value.
178	tgt.Init()
179
180	if tgt.entered != "/tmp/restore" {
181		t.Errorf("after re-init, entered = %q, want %q", tgt.entered, "/tmp/restore")
182	}
183}