-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathcli_test.go
More file actions
169 lines (145 loc) · 3.8 KB
/
cli_test.go
File metadata and controls
169 lines (145 loc) · 3.8 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
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",
},
{
name: "Version set to (devel)",
version: "(devel)",
expectedOutput: "Version: (devel)",
},
}
// 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
got := currentVersion()
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) {
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},
{"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)
}
})
}
}