...

Source file src/github.com/kelseyhightower/envconfig/usage_test.go

Documentation: github.com/kelseyhightower/envconfig

     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.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  	// 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.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  	// 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  }
   156  

View as plain text