Skip to content

Commit e57c93d

Browse files
arcanezarttor
authored andcommitted
tests for ReadFlags()
1 parent 63acbeb commit e57c93d

File tree

1 file changed

+200
-0
lines changed

1 file changed

+200
-0
lines changed

cmd/helmify/flags_test.go

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"flag"
6+
"io"
7+
"os"
8+
"strings"
9+
"testing"
10+
11+
"github.com/arttor/helmify/pkg/config"
12+
"github.com/stretchr/testify/assert"
13+
"github.com/stretchr/testify/require"
14+
)
15+
16+
var actualExitCode int
17+
18+
func mockExit(code int) {
19+
actualExitCode = code
20+
panic("os.Exit called") // Panicking is necessary to stop execution.
21+
}
22+
23+
func resetFlags(t *testing.T) {
24+
t.Helper()
25+
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
26+
}
27+
28+
func TestReadFlags_MutuallyExclusive(t *testing.T) {
29+
oldArgs := os.Args
30+
oldCommandLine := flag.CommandLine
31+
32+
t.Cleanup(func() {
33+
os.Args = oldArgs
34+
flag.CommandLine = oldCommandLine
35+
})
36+
37+
os.Args = []string{
38+
"helmify",
39+
"-crd-dir",
40+
"-optional-crds",
41+
}
42+
43+
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
44+
45+
_, err := ReadFlags()
46+
require.Error(t, err)
47+
require.ErrorIs(t, err, errMutuallyExclusiveCRDs)
48+
require.Equal(t, errMutuallyExclusiveCRDs.Error(), err.Error())
49+
}
50+
51+
func TestReadFlags_Version(t *testing.T) {
52+
oldArgs := os.Args
53+
oldCommandLine := flag.CommandLine
54+
oldOsExit := osExit
55+
stdout := os.Stdout
56+
57+
t.Cleanup(func() {
58+
os.Args = oldArgs
59+
flag.CommandLine = oldCommandLine
60+
osExit = oldOsExit
61+
os.Stdout = stdout
62+
})
63+
64+
os.Args = []string{"helmify", "--version"}
65+
resetFlags(t)
66+
67+
r, w, err := os.Pipe()
68+
require.NoError(t, err)
69+
70+
osExit = mockExit
71+
os.Stdout = w
72+
73+
var capturedOutput bytes.Buffer
74+
defer func() {
75+
require.NoError(t, w.Close())
76+
_, err = io.Copy(&capturedOutput, r)
77+
require.NoError(t, err)
78+
require.NoError(t, r.Close())
79+
require.NotNil(t, recover())
80+
81+
expectedOutput := `Version: development
82+
Build Time: not set
83+
Git Commit: not set
84+
`
85+
assert.Equal(t, expectedOutput, capturedOutput.String())
86+
assert.Equal(t, 0, actualExitCode)
87+
}()
88+
_, err = ReadFlags()
89+
require.NoError(t, err)
90+
}
91+
92+
func TestReadFlags_Help(t *testing.T) {
93+
oldArgs := os.Args
94+
oldCommandLine := flag.CommandLine
95+
oldOsExit := osExit
96+
stdout := os.Stdout
97+
98+
t.Cleanup(func() {
99+
os.Args = oldArgs
100+
flag.CommandLine = oldCommandLine
101+
osExit = oldOsExit
102+
os.Stdout = stdout
103+
})
104+
105+
os.Args = []string{"helmify", "--help"}
106+
resetFlags(t)
107+
108+
r, w, err := os.Pipe()
109+
require.NoError(t, err)
110+
111+
osExit = mockExit
112+
os.Stdout = w
113+
114+
var capturedOutput bytes.Buffer
115+
defer func() {
116+
require.NoError(t, w.Close())
117+
_, err = io.Copy(&capturedOutput, r)
118+
require.NoError(t, err)
119+
require.NoError(t, r.Close())
120+
require.NotNil(t, recover())
121+
122+
var b strings.Builder
123+
b.WriteString(helpText)
124+
flag.CommandLine.SetOutput(&b)
125+
flag.PrintDefaults()
126+
127+
assert.Equal(t, b.String(), capturedOutput.String())
128+
assert.Equal(t, 0, actualExitCode)
129+
}()
130+
_, err = ReadFlags()
131+
require.NoError(t, err)
132+
}
133+
134+
func TestReadFlags_DefaultValuesMatchFlagDefaults(t *testing.T) {
135+
oldArgs := os.Args
136+
oldCommandLine := flag.CommandLine
137+
138+
t.Cleanup(func() {
139+
os.Args = oldArgs
140+
flag.CommandLine = oldCommandLine
141+
})
142+
143+
os.Args = []string{"helmify"}
144+
resetFlags(t)
145+
146+
cfg, err := ReadFlags()
147+
require.NoError(t, err)
148+
149+
stringTests := []struct {
150+
flagName string
151+
getValue func(cfg config.Config) string
152+
}{
153+
{
154+
flagName: "cert-manager-version",
155+
getValue: func(cfg config.Config) string { return cfg.CertManagerVersion },
156+
},
157+
}
158+
159+
boolToStr := func(b bool) string {
160+
if b {
161+
return "true"
162+
}
163+
return "false"
164+
}
165+
166+
boolTests := []struct {
167+
flagName string
168+
getValue func(cfg config.Config) bool
169+
}{
170+
{"v", func(cfg config.Config) bool { return cfg.Verbose }},
171+
{"vv", func(cfg config.Config) bool { return cfg.VeryVerbose }},
172+
{"r", func(cfg config.Config) bool { return cfg.FilesRecursively }},
173+
174+
{"crd-dir", func(cfg config.Config) bool { return cfg.Crd }},
175+
{"optional-crds", func(cfg config.Config) bool { return cfg.OptionalCRDs }},
176+
{"image-pull-secrets", func(cfg config.Config) bool { return cfg.ImagePullSecrets }},
177+
{"generate-defaults", func(cfg config.Config) bool { return cfg.GenerateDefaults }},
178+
{"cert-manager-as-subchart", func(cfg config.Config) bool { return cfg.CertManagerAsSubchart }},
179+
{"cert-manager-install-crd", func(cfg config.Config) bool { return cfg.CertManagerInstallCRD }},
180+
{"original-name", func(cfg config.Config) bool { return cfg.OriginalName }},
181+
{"preserve-ns", func(cfg config.Config) bool { return cfg.PreserveNs }},
182+
{"add-webhook-option", func(cfg config.Config) bool { return cfg.AddWebhookOption }},
183+
}
184+
185+
for _, tt := range stringTests {
186+
t.Run("default_"+tt.flagName, func(t *testing.T) {
187+
f := flag.Lookup(tt.flagName)
188+
require.NotNil(t, f)
189+
assert.Equal(t, f.DefValue, tt.getValue(cfg))
190+
})
191+
}
192+
193+
for _, tt := range boolTests {
194+
t.Run("default_"+tt.flagName, func(t *testing.T) {
195+
f := flag.Lookup(tt.flagName)
196+
require.NotNil(t, f)
197+
assert.Equal(t, f.DefValue, boolToStr(tt.getValue(cfg)))
198+
})
199+
}
200+
}

0 commit comments

Comments
 (0)