Skip to content

Commit ae2f80a

Browse files
committed
Add flag handling and related tests
1 parent 2eefe26 commit ae2f80a

File tree

4 files changed

+132
-25
lines changed

4 files changed

+132
-25
lines changed

cmd/mdefaults/flag.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"os"
6+
)
7+
8+
var (
9+
versionFlag bool
10+
vFlag bool
11+
verboseFlag bool
12+
yesFlag bool
13+
)
14+
15+
// initFlags initializes command-line flags
16+
func initFlags() {
17+
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
18+
flag.BoolVar(&versionFlag, "version", false, "Print version information")
19+
flag.BoolVar(&vFlag, "v", false, "Print version information")
20+
flag.BoolVar(&verboseFlag, "verbose", false, "Enable verbose logging")
21+
flag.BoolVar(&yesFlag, "y", false, "Automatically confirm prompts")
22+
}

cmd/mdefaults/flag_test.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"os"
6+
"testing"
7+
)
8+
9+
func TestInitFlags(t *testing.T) {
10+
// Save original args and restore after test
11+
originalArgs := os.Args
12+
defer func() { os.Args = originalArgs }()
13+
14+
// Reset flags before test
15+
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
16+
17+
// Reset flag variables
18+
versionFlag = false
19+
vFlag = false
20+
verboseFlag = false
21+
yesFlag = false
22+
23+
// Initialize flags
24+
initFlags()
25+
26+
// Test cases
27+
testCases := []struct {
28+
name string
29+
args []string
30+
flagVar *bool
31+
expected bool
32+
}{
33+
{"version flag", []string{"cmd", "-version"}, &versionFlag, true},
34+
{"v flag", []string{"cmd", "-v"}, &vFlag, true},
35+
{"verbose flag", []string{"cmd", "-verbose"}, &verboseFlag, true},
36+
{"y flag", []string{"cmd", "-y"}, &yesFlag, true},
37+
}
38+
39+
for _, tc := range testCases {
40+
t.Run(tc.name, func(t *testing.T) {
41+
// Reset flags before each test case
42+
flag.CommandLine = flag.NewFlagSet(tc.args[0], flag.ExitOnError)
43+
44+
// Reset flag variables
45+
versionFlag = false
46+
vFlag = false
47+
verboseFlag = false
48+
yesFlag = false
49+
50+
// Initialize flags
51+
initFlags()
52+
53+
// Set args and parse
54+
os.Args = tc.args
55+
flag.Parse()
56+
57+
// Check if flag is set correctly
58+
if *tc.flagVar != tc.expected {
59+
t.Errorf("Expected %v to be %v, got %v", tc.name, tc.expected, *tc.flagVar)
60+
}
61+
})
62+
}
63+
}
64+
65+
func TestFlagDefaults(t *testing.T) {
66+
// Save original args and restore after test
67+
originalArgs := os.Args
68+
defer func() { os.Args = originalArgs }()
69+
70+
// Reset flags before test
71+
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
72+
73+
// Reset flag variables
74+
versionFlag = false
75+
vFlag = false
76+
verboseFlag = false
77+
yesFlag = false
78+
79+
// Initialize flags
80+
initFlags()
81+
82+
// Set args without any flags
83+
os.Args = []string{"cmd"}
84+
flag.Parse()
85+
86+
// Check default values
87+
if versionFlag != false {
88+
t.Errorf("Expected versionFlag default to be false, got %v", versionFlag)
89+
}
90+
if vFlag != false {
91+
t.Errorf("Expected vFlag default to be false, got %v", vFlag)
92+
}
93+
if verboseFlag != false {
94+
t.Errorf("Expected verboseFlag default to be false, got %v", verboseFlag)
95+
}
96+
if yesFlag != false {
97+
t.Errorf("Expected yesFlag default to be false, got %v", yesFlag)
98+
}
99+
}

cmd/mdefaults/main.go

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,6 @@ var (
2020
architecture string
2121
)
2222

23-
func initFlags() {
24-
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
25-
flag.BoolVar(&versionFlag, "version", false, "Print version information")
26-
flag.BoolVar(&vFlag, "v", false, "Print version information")
27-
flag.BoolVar(&verboseFlag, "verbose", false, "Enable verbose logging")
28-
flag.BoolVar(&yesFlag, "y", false, "Automatically confirm prompts")
29-
}
30-
31-
var (
32-
versionFlag bool
33-
vFlag bool
34-
verboseFlag bool
35-
yesFlag bool
36-
)
37-
3823
func setupLogging() {
3924
logFile, err := os.OpenFile("mdefaults.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
4025
if err != nil {
@@ -64,7 +49,8 @@ func run() int {
6449
}
6550
configs, err := config.ReadConfigFile(fs)
6651
if err != nil {
67-
fmt.Println(err)
52+
log.Printf("Failed to read config file: %v", err)
53+
return 1
6854
}
6955

7056
if verboseFlag {
@@ -126,8 +112,8 @@ func printUsage() {
126112
}
127113

128114
func printConfigs(configs []config.Config) {
129-
for i := 0; i < len(configs); i++ {
130-
fmt.Printf("- %s %s %s\n", configs[i].Domain, configs[i].Key, *configs[i].Value)
115+
for _, cfg := range configs {
116+
fmt.Printf("- %s %s %s\n", cfg.Domain, cfg.Key, *cfg.Value)
131117
}
132118
}
133119

@@ -137,6 +123,12 @@ func handlePush(configs []config.Config) int {
137123
return 0
138124
}
139125

126+
// printVersionInfo prints the version and architecture information
127+
func printVersionInfo() {
128+
fmt.Printf("Version: %s\n", version)
129+
fmt.Printf("Architecture: %s\n", architecture)
130+
}
131+
140132
func main() {
141133
setupLogging()
142134
osType := runtime.GOOS
@@ -147,12 +139,9 @@ func main() {
147139
flag.Parse()
148140

149141
if versionFlag || vFlag {
150-
fmt.Printf("Version: %s\n", version)
151-
fmt.Printf("Architecture: %s\n", architecture)
142+
printVersionInfo()
152143
return
153144
}
154145

155-
fmt.Printf("Version: %s\n", version)
156-
fmt.Printf("Architecture: %s\n", architecture)
157146
os.Exit(run())
158147
}

cmd/mdefaults/main_test.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,6 @@ func mainWithOSType(osType string) {
146146
fmt.Printf("Architecture: %s\n", architecture)
147147
return
148148
}
149-
150-
fmt.Printf("Version: %s\n", version)
151-
fmt.Printf("Architecture: %s\n", architecture)
152149
osExit(run())
153150
}
154151

0 commit comments

Comments
 (0)