Skip to content

Commit eb57e7b

Browse files
committed
add a lil test
1 parent 72ae0ca commit eb57e7b

File tree

3 files changed

+71
-12
lines changed

3 files changed

+71
-12
lines changed

cli/cliflag/cliflag.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,20 @@ import (
2121
"github.com/spf13/pflag"
2222
)
2323

24+
// IsSetBool returns the value of the boolean flag if it is set.
25+
// It returns false if the flag isn't set or if any error occurs attempting
26+
// to parse the value of the flag.
27+
func IsSetBool(cmd *cobra.Command, name string) bool {
28+
val, ok := IsSet(cmd, name)
29+
if !ok {
30+
return false
31+
}
32+
33+
b, err := strconv.ParseBool(val)
34+
return err == nil && b
35+
}
36+
37+
// IsSet returns the string value of the flag and whether it was set.
2438
func IsSet(cmd *cobra.Command, name string) (string, bool) {
2539
flag := cmd.Flag(name)
2640
if flag == nil {
@@ -77,6 +91,22 @@ func Uint8VarP(flagset *pflag.FlagSet, ptr *uint8, name string, shorthand string
7791
flagset.Uint8VarP(ptr, name, shorthand, uint8(vi64), fmtUsage(usage, env))
7892
}
7993

94+
func Bool(flagset *pflag.FlagSet, name, shorthand, env string, def bool, usage string) {
95+
val, ok := os.LookupEnv(env)
96+
if !ok || val == "" {
97+
flagset.BoolP(name, shorthand, def, fmtUsage(usage, env))
98+
return
99+
}
100+
101+
valb, err := strconv.ParseBool(val)
102+
if err != nil {
103+
flagset.BoolP(name, shorthand, def, fmtUsage(usage, env))
104+
return
105+
}
106+
107+
flagset.BoolP(name, shorthand, valb, fmtUsage(usage, env))
108+
}
109+
80110
// BoolVarP sets a bool flag on the given flag set.
81111
func BoolVarP(flagset *pflag.FlagSet, ptr *bool, name string, shorthand string, env string, def bool, usage string) {
82112
val, ok := os.LookupEnv(env)

cli/root.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ const (
4040
varAgentURL = "agent-url"
4141
varGlobalConfig = "global-config"
4242
varNoOpen = "no-open"
43+
varNoVersionCheck = "no-version-warning"
4344
varForceTty = "force-tty"
4445
varVerbose = "verbose"
4546
notLoggedInMessage = "You are not logged in. Try logging in using 'coder login <url>'."
4647

47-
noVersionCheckFlag = "no-version-warning"
48-
envNoVersionCheck = "CODER_NO_VERSION_WARNING"
48+
envNoVersionCheck = "CODER_NO_VERSION_WARNING"
4949
)
5050

5151
var (
@@ -59,8 +59,6 @@ func init() {
5959
}
6060

6161
func Root() *cobra.Command {
62-
var varSuppressVersion bool
63-
6462
cmd := &cobra.Command{
6563
Use: "coder",
6664
SilenceErrors: true,
@@ -69,7 +67,7 @@ func Root() *cobra.Command {
6967
`,
7068
PersistentPreRun: func(cmd *cobra.Command, args []string) {
7169
err := func() error {
72-
if varSuppressVersion {
70+
if cliflag.IsSetBool(cmd, varNoVersionCheck) {
7371
return nil
7472
}
7573

@@ -142,7 +140,7 @@ func Root() *cobra.Command {
142140
cmd.SetUsageTemplate(usageTemplate())
143141

144142
cmd.PersistentFlags().String(varURL, "", "Specify the URL to your deployment.")
145-
cliflag.BoolVarP(cmd.PersistentFlags(), &varSuppressVersion, noVersionCheckFlag, "", envNoVersionCheck, false, "Suppress warning when client and server versions do not match.")
143+
cliflag.Bool(cmd.PersistentFlags(), varNoVersionCheck, "", envNoVersionCheck, false, "Suppress warning when client and server versions do not match.")
146144
cliflag.String(cmd.PersistentFlags(), varToken, "", envSessionToken, "", fmt.Sprintf("Specify an authentication token. For security reasons setting %s is preferred.", envSessionToken))
147145
cliflag.String(cmd.PersistentFlags(), varAgentToken, "", "CODER_AGENT_TOKEN", "", "Specify an agent authentication token.")
148146
_ = cmd.PersistentFlags().MarkHidden(varAgentToken)
@@ -153,7 +151,7 @@ func Root() *cobra.Command {
153151
_ = cmd.PersistentFlags().MarkHidden(varForceTty)
154152
cmd.PersistentFlags().Bool(varNoOpen, false, "Block automatically opening URLs in the browser.")
155153
_ = cmd.PersistentFlags().MarkHidden(varNoOpen)
156-
cliflag.String(cmd.PersistentFlags(), varVerbose, "v", "CODER_VERBOSE", "", "Enable verbose output")
154+
cliflag.Bool(cmd.PersistentFlags(), varVerbose, "v", "CODER_VERBOSE", false, "Enable verbose output")
157155

158156
return cmd
159157
}
@@ -439,7 +437,7 @@ func FormatCobraError(err error, cmd *cobra.Command) string {
439437
_, _ = fmt.Fprintln(&output, httpErr.Friendly())
440438
}
441439

442-
if flag := cmd.Flag(varVerbose); flag != nil && flag.Value.String() != "" {
440+
if cliflag.IsSetBool(cmd, varVerbose) {
443441
_, _ = fmt.Fprintln(&output, err.Error())
444442
}
445443

cli/root_test.go

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,53 @@ import (
44
"bytes"
55
"testing"
66

7+
"github.com/spf13/cobra"
78
"github.com/stretchr/testify/require"
9+
"golang.org/x/xerrors"
810

911
"github.com/coder/coder/buildinfo"
1012
"github.com/coder/coder/cli"
1113
"github.com/coder/coder/cli/clitest"
14+
"github.com/coder/coder/codersdk"
1215
)
1316

1417
func TestRoot(t *testing.T) {
1518
t.Run("FormatCobraError", func(t *testing.T) {
1619
t.Parallel()
1720

18-
cmd, _ := clitest.New(t, "delete")
21+
t.Run("OK", func(t *testing.T) {
22+
t.Parallel()
1923

20-
cmd, err := cmd.ExecuteC()
21-
errStr := cli.FormatCobraError(err, cmd)
22-
require.Contains(t, errStr, "Run 'coder delete --help' for usage.")
24+
cmd, _ := clitest.New(t, "delete")
25+
26+
cmd, err := cmd.ExecuteC()
27+
errStr := cli.FormatCobraError(err, cmd)
28+
require.Contains(t, errStr, "Run 'coder delete --help' for usage.")
29+
})
30+
31+
t.Run("Verbose", func(t *testing.T) {
32+
t.Parallel()
33+
34+
cmd, _ := clitest.New(t, "--verbose")
35+
36+
cmd.RunE = func(cmd *cobra.Command, args []string) error {
37+
var err error = &codersdk.Error{
38+
Response: codersdk.Response{
39+
Message: "This is a message.",
40+
},
41+
Helper: "Try this instead.",
42+
}
43+
44+
err = xerrors.Errorf("wrap me: %w", err)
45+
46+
return err
47+
}
48+
49+
cmd, err := cmd.ExecuteC()
50+
errStr := cli.FormatCobraError(err, cmd)
51+
require.Contains(t, errStr, "This is a message. Try this instead.")
52+
require.Contains(t, errStr, err.Error())
53+
})
2354
})
2455

2556
t.Run("Version", func(t *testing.T) {

0 commit comments

Comments
 (0)