1
2
3
4
5 package envconfig
6
7 import (
8 "bytes"
9 "io"
10 "io/ioutil"
11 "log"
12 "os"
13 "strings"
14 "testing"
15 "text/tabwriter"
16 )
17
18 var testUsageTableResult, testUsageListResult, testUsageCustomResult, testUsageBadFormatResult string
19
20 func TestMain(m *testing.M) {
21
22
23 data, err := ioutil.ReadFile("testdata/default_table.txt")
24 if err != nil {
25 log.Fatal(err)
26 }
27 testUsageTableResult = string(data)
28
29 data, err = ioutil.ReadFile("testdata/default_list.txt")
30 if err != nil {
31 log.Fatal(err)
32 }
33 testUsageListResult = string(data)
34
35 data, err = ioutil.ReadFile("testdata/custom.txt")
36 if err != nil {
37 log.Fatal(err)
38 }
39 testUsageCustomResult = string(data)
40
41 data, err = ioutil.ReadFile("testdata/fault.txt")
42 if err != nil {
43 log.Fatal(err)
44 }
45 testUsageBadFormatResult = string(data)
46
47 retCode := m.Run()
48 os.Exit(retCode)
49 }
50
51 func compareUsage(want, got string, t *testing.T) {
52 got = strings.Replace(got, " ", ".", -1)
53 if want != got {
54 shortest := len(want)
55 if len(got) < shortest {
56 shortest = len(got)
57 }
58 if len(want) != len(got) {
59 t.Errorf("expected result length of %d, found %d", len(want), len(got))
60 }
61 for i := 0; i < shortest; i++ {
62 if want[i] != got[i] {
63 t.Errorf("difference at index %d, expected '%c' (%v), found '%c' (%v)\n",
64 i, want[i], want[i], got[i], got[i])
65 break
66 }
67 }
68 t.Errorf("Complete Expected:\n'%s'\nComplete Found:\n'%s'\n", want, got)
69 }
70 }
71
72 func TestUsageDefault(t *testing.T) {
73 var s Specification
74 os.Clearenv()
75 save := os.Stdout
76 r, w, _ := os.Pipe()
77 os.Stdout = w
78 err := Usage("env_config", &s)
79 outC := make(chan string)
80
81 go func() {
82 var buf bytes.Buffer
83 io.Copy(&buf, r)
84 outC <- buf.String()
85 }()
86 w.Close()
87 os.Stdout = save
88 out := <-outC
89
90 if err != nil {
91 t.Error(err.Error())
92 }
93 compareUsage(testUsageTableResult, out, t)
94 }
95
96 func TestUsageTable(t *testing.T) {
97 var s Specification
98 os.Clearenv()
99 buf := new(bytes.Buffer)
100 tabs := tabwriter.NewWriter(buf, 1, 0, 4, ' ', 0)
101 err := Usagef("env_config", &s, tabs, DefaultTableFormat)
102 tabs.Flush()
103 if err != nil {
104 t.Error(err.Error())
105 }
106 compareUsage(testUsageTableResult, buf.String(), t)
107 }
108
109 func TestUsageList(t *testing.T) {
110 var s Specification
111 os.Clearenv()
112 buf := new(bytes.Buffer)
113 err := Usagef("env_config", &s, buf, DefaultListFormat)
114 if err != nil {
115 t.Error(err.Error())
116 }
117 compareUsage(testUsageListResult, buf.String(), t)
118 }
119
120 func TestUsageCustomFormat(t *testing.T) {
121 var s Specification
122 os.Clearenv()
123 buf := new(bytes.Buffer)
124 err := Usagef("env_config", &s, buf, "{{range .}}{{usage_key .}}={{usage_description .}}\n{{end}}")
125 if err != nil {
126 t.Error(err.Error())
127 }
128 compareUsage(testUsageCustomResult, buf.String(), t)
129 }
130
131 func TestUsageUnknownKeyFormat(t *testing.T) {
132 var s Specification
133 unknownError := "template: envconfig:1:2: executing \"envconfig\" at <.UnknownKey>"
134 os.Clearenv()
135 buf := new(bytes.Buffer)
136 err := Usagef("env_config", &s, buf, "{{.UnknownKey}}")
137 if err == nil {
138 t.Errorf("expected 'unknown key' error, but got no error")
139 }
140 if strings.Index(err.Error(), unknownError) == -1 {
141 t.Errorf("expected '%s', but got '%s'", unknownError, err.Error())
142 }
143 }
144
145 func TestUsageBadFormat(t *testing.T) {
146 var s Specification
147 os.Clearenv()
148
149 buf := new(bytes.Buffer)
150 err := Usagef("env_config", &s, buf, "{{range .}}{.Key}\n{{end}}")
151 if err != nil {
152 t.Error(err.Error())
153 }
154 compareUsage(testUsageBadFormatResult, buf.String(), t)
155 }
156
View as plain text