github.com/42z-io/confik@v0.0.2-0.20231103050132-21d8f377356c/env_test.go (about)

     1  package confik
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  )
    11  
    12  func TestParseEnvVar(t *testing.T) {
    13  	name, value, err := parseEnvVar("VARIABLE=")
    14  	assert.Nil(t, err)
    15  	assert.Equal(t, "VARIABLE", name)
    16  	assert.Equal(t, "", value)
    17  }
    18  
    19  func TestFindEnvFile(t *testing.T) {
    20  	cwd, _ := os.Getwd()
    21  	defer func() {
    22  		os.Chdir(cwd)
    23  	}()
    24  	os.Chdir("testdata/folder1/folder2/folder3")
    25  	path, err := findEnvFile()
    26  	assert.Nil(t, err)
    27  	absPath := filepath.Join(cwd, "testdata/folder1/.env")
    28  	assert.Equal(t, absPath, path)
    29  }
    30  
    31  func TestFindEnvFileNotFound(t *testing.T) {
    32  	cwd, _ := os.Getwd()
    33  	defer func() {
    34  		os.Chdir(cwd)
    35  	}()
    36  	os.Chdir("/")
    37  	path, err := findEnvFile()
    38  	assert.Nil(t, err)
    39  	assert.Equal(t, "", path)
    40  }
    41  
    42  func TestLoadEnvFileNoEnvFile(t *testing.T) {
    43  	cwd, _ := os.Getwd()
    44  	os.Chdir("/")
    45  	defer func() {
    46  		os.Chdir(cwd)
    47  	}()
    48  
    49  	kv, err := loadEnvFile(Config[testAllTypes]{})
    50  	assert.Nil(t, err)
    51  	assert.Equal(t, map[string]string{}, kv)
    52  }
    53  
    54  func TestLoadEnvFileDoesNotExist(t *testing.T) {
    55  	_, err := loadEnvFile(Config[testAllTypes]{
    56  		EnvFilePath: ".fake",
    57  	})
    58  	if assert.Error(t, err) {
    59  		assert.Equal(t, "environment file does not exist: .fake", err.Error())
    60  	}
    61  }
    62  
    63  func TestLoadEnvFileInvalid(t *testing.T) {
    64  	_, err := loadEnvFile(Config[testAllTypes]{
    65  		EnvFilePath: "testdata/.invalid",
    66  	})
    67  	if assert.Error(t, err) {
    68  		assert.Equal(t, "invalid expression in env file: INVALID", err.Error())
    69  	}
    70  }
    71  
    72  func TestParseEnvFile(t *testing.T) {
    73  	input := `
    74  // Comment
    75  TC_UNQUOTED=1
    76  	TC_QUOTED="hello world"
    77   TC_SPACES = hello world
    78  TC_LONG_NAME_1=test
    79  # Comment
    80  
    81  
    82  `
    83  	kv, err := parseEnvFile(strings.NewReader(input))
    84  	assert.Nil(t, err)
    85  	expected := map[string]string{
    86  		"TC_UNQUOTED":    "1",
    87  		"TC_QUOTED":      "hello world",
    88  		"TC_SPACES":      "hello world",
    89  		"TC_LONG_NAME_1": "test",
    90  	}
    91  	assert.Equal(t, len(expected), len(kv))
    92  	for testK, testV := range expected {
    93  		value, exists := kv[testK]
    94  		assert.True(t, exists, "expected to find key %s", testK)
    95  		assert.Equal(t, testV, value, "invalid value for key %s", testK)
    96  	}
    97  }
    98  
    99  func TestParseEnvFileInvalid(t *testing.T) {
   100  	input := "BLAH"
   101  	_, err := parseEnvFile(strings.NewReader(input))
   102  	if assert.Error(t, err) {
   103  		assert.Equal(t, "invalid expression in env file: BLAH", err.Error())
   104  	}
   105  }
   106  
   107  func BenchmarkParseEnvFile(b *testing.B) {
   108  	input := `
   109  // Comment
   110  TC_UNQUOTED=1
   111  TC_QUOTED="hello world"
   112  TC_SPACES=hello world
   113  TC_LONG_NAME_1=test
   114  # Comment
   115  
   116  
   117  `
   118  	reader := strings.NewReader(input)
   119  	for n := 0; n < b.N; n++ {
   120  		_, err := parseEnvFile(reader)
   121  		if err != nil {
   122  			panic(err)
   123  		}
   124  	}
   125  }