123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- package opts
- import (
- "bufio"
- "fmt"
- "io/ioutil"
- "os"
- "reflect"
- "strings"
- "testing"
- )
- func tmpFileWithContent(content string, t *testing.T) string {
- tmpFile, err := ioutil.TempFile("", "envfile-test")
- if err != nil {
- t.Fatal(err)
- }
- defer tmpFile.Close()
- tmpFile.WriteString(content)
- return tmpFile.Name()
- }
- // Test ParseEnvFile for a file with a few well formatted lines
- func TestParseEnvFileGoodFile(t *testing.T) {
- content := `foo=bar
- baz=quux
- # comment
- _foobar=foobaz
- with.dots=working
- and_underscore=working too
- `
- // Adding a newline + a line with pure whitespace.
- // This is being done like this instead of the block above
- // because it's common for editors to trim trailing whitespace
- // from lines, which becomes annoying since that's the
- // exact thing we need to test.
- content += "\n \t "
- tmpFile := tmpFileWithContent(content, t)
- defer os.Remove(tmpFile)
- lines, err := ParseEnvFile(tmpFile)
- if err != nil {
- t.Fatal(err)
- }
- expectedLines := []string{
- "foo=bar",
- "baz=quux",
- "_foobar=foobaz",
- "with.dots=working",
- "and_underscore=working too",
- }
- if !reflect.DeepEqual(lines, expectedLines) {
- t.Fatal("lines not equal to expectedLines")
- }
- }
- // Test ParseEnvFile for an empty file
- func TestParseEnvFileEmptyFile(t *testing.T) {
- tmpFile := tmpFileWithContent("", t)
- defer os.Remove(tmpFile)
- lines, err := ParseEnvFile(tmpFile)
- if err != nil {
- t.Fatal(err)
- }
- if len(lines) != 0 {
- t.Fatal("lines not empty; expected empty")
- }
- }
- // Test ParseEnvFile for a non existent file
- func TestParseEnvFileNonExistentFile(t *testing.T) {
- _, err := ParseEnvFile("foo_bar_baz")
- if err == nil {
- t.Fatal("ParseEnvFile succeeded; expected failure")
- }
- if _, ok := err.(*os.PathError); !ok {
- t.Fatalf("Expected a PathError, got [%v]", err)
- }
- }
- // Test ParseEnvFile for a badly formatted file
- func TestParseEnvFileBadlyFormattedFile(t *testing.T) {
- content := `foo=bar
- f =quux
- `
- tmpFile := tmpFileWithContent(content, t)
- defer os.Remove(tmpFile)
- _, err := ParseEnvFile(tmpFile)
- if err == nil {
- t.Fatalf("Expected an ErrBadEnvVariable, got nothing")
- }
- if _, ok := err.(ErrBadEnvVariable); !ok {
- t.Fatalf("Expected an ErrBadEnvVariable, got [%v]", err)
- }
- expectedMessage := "poorly formatted environment: variable 'f ' has white spaces"
- if err.Error() != expectedMessage {
- t.Fatalf("Expected [%v], got [%v]", expectedMessage, err.Error())
- }
- }
- // Test ParseEnvFile for a file with a line exceeding bufio.MaxScanTokenSize
- func TestParseEnvFileLineTooLongFile(t *testing.T) {
- content := strings.Repeat("a", bufio.MaxScanTokenSize+42)
- content = fmt.Sprint("foo=", content)
- tmpFile := tmpFileWithContent(content, t)
- defer os.Remove(tmpFile)
- _, err := ParseEnvFile(tmpFile)
- if err == nil {
- t.Fatal("ParseEnvFile succeeded; expected failure")
- }
- }
- // ParseEnvFile with a random file, pass through
- func TestParseEnvFileRandomFile(t *testing.T) {
- content := `first line
- another invalid line`
- tmpFile := tmpFileWithContent(content, t)
- defer os.Remove(tmpFile)
- _, err := ParseEnvFile(tmpFile)
- if err == nil {
- t.Fatalf("Expected an ErrBadEnvVariable, got nothing")
- }
- if _, ok := err.(ErrBadEnvVariable); !ok {
- t.Fatalf("Expected an ErrBadEnvVariable, got [%v]", err)
- }
- expectedMessage := "poorly formatted environment: variable 'first line' has white spaces"
- if err.Error() != expectedMessage {
- t.Fatalf("Expected [%v], got [%v]", expectedMessage, err.Error())
- }
- }
|