github.com/unionj-cloud/go-doudou/v2@v2.3.5/toolkit/envconfig/usage_test.go (about) 1 // Copyright (c) 2016 Kelsey Hightower and others. All rights reserved. 2 // Use of this source code is governed by the MIT License that can be found in 3 // the LICENSE file. 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 // Load the expected test results from a text file 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.ReplaceAll(got, " ", ".") 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 // copy the output in a separate goroutine so printing can't block indefinitely 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 // restoring the real stdout 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.Contains(err.Error(), unknownError) { 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 // If you don't use two {{}} then you get a lieteral 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 }