-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathcli_test.go
More file actions
194 lines (165 loc) · 4.42 KB
/
cli_test.go
File metadata and controls
194 lines (165 loc) · 4.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
package main
import (
"bytes"
"os"
"regexp"
"testing"
"github.com/digitalghost-dev/poke-cli/cmd/utils"
"github.com/digitalghost-dev/poke-cli/styling"
"github.com/stretchr/testify/assert"
)
func TestCurrentVersion(t *testing.T) {
tests := []struct {
name string
version string
expectedOutput string
}{
{
name: "Version set by ldflags",
version: "v1.0.2",
expectedOutput: "Version: v1.0.2\n",
},
{
name: "Version set to (devel)",
version: "(devel)",
expectedOutput: "Version: (devel)\n",
},
}
// Save the original version and restore it after tests
originalVersion := version
defer func() { version = originalVersion }()
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
version = tt.version
r, w, _ := os.Pipe()
oldStdout := os.Stdout
os.Stdout = w
currentVersion()
// Close the writer and restore stdout
err := w.Close()
if err != nil {
t.Fatalf("Failed to close pipe: %v", err)
}
os.Stdout = oldStdout
// Read the output from the pipe
var buf bytes.Buffer
if _, err := buf.ReadFrom(r); err != nil {
t.Fatalf("Failed to read from pipe: %v", err)
}
got := buf.String()
if got != tt.expectedOutput {
t.Errorf("Expected %q, got %q", tt.expectedOutput, got)
}
})
}
}
func captureOutput(f func()) string {
var buf bytes.Buffer
stdout := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w
f()
_ = w.Close()
os.Stdout = stdout
_, _ = buf.ReadFrom(r)
return buf.String()
}
func stripANSI(input string) string {
// Regular expression to match ANSI escape sequences
ansiRegex := regexp.MustCompile(`\x1b\[[0-9;]*m`)
return ansiRegex.ReplaceAllString(input, "")
}
func TestRunCLI(t *testing.T) {
tests := []struct {
name string
args []string
expectedOutput string
expectedCode int
}{
{
name: "Test CLI help flag",
args: []string{"--help"},
expectedOutput: utils.LoadGolden(t, "cli_help.golden"),
expectedCode: 0,
},
{
name: "Non-valid command",
args: []string{"movesets"},
expectedOutput: utils.LoadGolden(t, "cli_incorrect_command.golden"),
expectedCode: 1,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
originalArgs := os.Args
os.Args = append([]string{"poke-cli"}, tt.args...)
defer func() { os.Args = originalArgs }()
var exitCode int
output := captureOutput(func() {
exitCode = runCLI(tt.args)
})
cleanOutput := styling.StripANSI(output)
assert.Equal(t, tt.expectedOutput, cleanOutput, "Output should match expected")
assert.Equal(t, tt.expectedCode, exitCode, "Exit code should match expected")
})
}
}
// TODO: finish testing different commands?
func TestRunCLI_VariousCommands(t *testing.T) {
tests := []struct {
name string
args []string
expected int
}{
//{"Invalid command", []string{"foobar"}, 1},
{"Latest flag long", []string{"--latest"}, 0},
{"Latest flag short", []string{"-l"}, 0},
{"Version flag long", []string{"--version"}, 0},
{"Version flag short", []string{"-v"}, 0},
{"Search command with invalid args", []string{"search", "pokemon", "extra-arg"}, 1},
//{"Missing Pokémon name", []string{"pokemon"}, 1},
//{"Another invalid command", []string{"invalid"}, 1},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
exitCode := runCLI(tt.args)
if exitCode != tt.expected {
t.Errorf("expected %d, got %d for args %v", tt.expected, exitCode, tt.args)
}
})
}
}
func TestMainFunction(t *testing.T) {
originalExit := exit
defer func() { exit = originalExit }()
tests := []struct {
name string
args []string
expectedOutput string
expectedCode int
}{
{
name: "Run main command",
args: []string{"poke-cli"},
expectedOutput: "Welcome! This tool displays data related to Pokémon!",
expectedCode: 0,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
exitCode := 0
exit = func(code int) { exitCode = code }
output := captureOutput(func() {
os.Args = tt.args
main()
})
output = stripANSI(output)
if exitCode != tt.expectedCode {
t.Errorf("Expected exit code %d, got %d", tt.expectedCode, exitCode)
}
if !bytes.Contains([]byte(output), []byte(tt.expectedOutput)) {
t.Errorf("Expected output to contain %q, got %q", tt.expectedOutput, output)
}
})
}
}