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}