aboutsummaryrefslogtreecommitdiff
path: root/flag_test.go
blob: bed8d8d3a9902fc5c400687edf2960afa8d950a4 (plain)
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
package envflag

import (
	"flag"
	"os"
	"testing"
)

func TestParseFlagSet(t *testing.T) {
	tests := map[string]struct {
		// Flag name
		name string
		// Default value
		def string
		// Flag command values
		values []string
		opts   []Option
		// The environment
		env map[string]string

		expected string
		usage    string
	}{
		"no flags no env default": {
			name:     "testing-123",
			def:      "defaultvalue",
			expected: "defaultvalue",
		},
		"flags no env no default": {
			name:     "testing-123",
			values:   []string{"-testing-123", "passed"},
			expected: "passed",
		},
		"no flags env": {
			name:     "testing-123",
			env:      map[string]string{"TESTING_123": "fromenv"},
			expected: "fromenv",
		},
		"flags with no env": {
			name:     "testing-123",
			values:   []string{"-testing-123", "passed"},
			expected: "passed",
		},
		"flags with env": {
			// Flags take precedence
			name:     "testing-123",
			values:   []string{"-testing-123", "passed"},
			env:      map[string]string{"TESTING_123": "fromenv"},
			expected: "passed",
		},
		"no flags with env": {
			// Flags take precedence
			name:     "testing-123",
			env:      map[string]string{"TESTING_123": "fromenv"},
			expected: "fromenv",
		},
		"flags with env and suffix": {
			name:     "testing-123",
			values:   []string{"-testing-123", "passed"},
			opts:     []Option{UsageSuffixer()},
			env:      map[string]string{"TESTING_123": "fromenv"},
			expected: "passed",
		},
		"no flags with env and suffix": {
			name:     "testing-123",
			def:      "defaultvalue",
			opts:     []Option{UsageSuffixer()},
			env:      map[string]string{"TESTING_123": "fromenv"},
			expected: "fromenv",
		},
		"a variety of characters": {
			// Flags take precedence
			name:     "tes_t.ing----123",
			env:      map[string]string{"TES_T_ING_123": "fromenv"},
			expected: "fromenv",
		},
	}

	for name, tt := range tests {
		t.Run(name, func(t *testing.T) {
			fs := flag.NewFlagSet("test", flag.ExitOnError)
			for k, v := range tt.env {
				os.Setenv(k, v)
			}
			defer func() {
				for k := range tt.env {
					os.Unsetenv(k)
				}
			}()
			actual := fs.String(tt.name, tt.def, "usage")
			ParseFlagSet(fs, tt.values, tt.opts...)

			if *actual != tt.expected {
				t.Errorf("got %q, want %q", *actual, tt.expected)
			}
		})
	}

}