github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/cmd/nash/env_test.go (about) 1 package main_test 2 3 import ( 4 "os" 5 "path/filepath" 6 "strings" 7 "testing" 8 9 main "github.com/madlambda/nash/cmd/nash" 10 ) 11 12 // TODO: No idea on how to inject failures like empty HOME folders for now 13 14 func TestLoadNASHPATH(t *testing.T) { 15 16 defaultNashPath := filepath.Join(home(t), "nash") 17 18 runTests(t, main.NashPath, []EnvTest{ 19 { 20 name: "Exported", 21 env: map[string]string{ 22 "NASHPATH": filepath.Join("etc", "nash"), 23 }, 24 want: filepath.Join("etc", "nash"), 25 }, 26 { 27 name: "IgnoresNASHROOT", 28 env: map[string]string{ 29 "NASHROOT": "/etc/nashroot/tests", 30 "HOME": home(t), 31 }, 32 want: defaultNashPath, 33 }, 34 { 35 name: "UseUserHomeWhenUnset", 36 env: map[string]string{ 37 "NASHROOT": "/etc/nashroot/tests", 38 "HOME": home(t), 39 }, 40 want: defaultNashPath, 41 }, 42 }) 43 } 44 45 func TestLoadNASHROOT(t *testing.T) { 46 defaultNashRoot := filepath.Join(home(t), "nashroot") 47 runTests(t, main.NashRoot, []EnvTest{ 48 { 49 name: "Exported", 50 env: map[string]string{ 51 "NASHROOT": filepath.Join("etc", "nashroot"), 52 }, 53 want: filepath.Join("etc", "nashroot"), 54 }, 55 { 56 name: "IgnoresGOPATHIfSet", 57 env: map[string]string{ 58 "GOPATH": filepath.Join("go", "natel", "review"), 59 "NASHROOT": filepath.Join("nashroot", "ignoredgopath"), 60 }, 61 want: filepath.Join("nashroot", "ignoredgopath"), 62 }, 63 { 64 name: "UsesHOMEevenWhenGOPATHIsSet", 65 env: map[string]string{ 66 "HOME": home(t), 67 "GOPATH": filepath.Join("go", "path"), 68 }, 69 want: defaultNashRoot, 70 }, 71 { 72 name: "UsesUserHomeWhenNASHROOTAndGOPATHAreUnset", 73 env: map[string]string{ 74 "HOME": home(t), 75 }, 76 want: filepath.Join(home(t), "nashroot"), 77 }, 78 }) 79 } 80 81 func runTests(t *testing.T, testfunc func() (string, error), cases []EnvTest) { 82 83 t.Helper() 84 85 for _, c := range cases { 86 t.Run(c.name, func(t *testing.T) { 87 restore := clearenv(t) 88 defer restore() 89 90 export(t, c.env) 91 got, err := testfunc() 92 if err != nil { 93 t.Fatal(err) 94 } 95 if got != c.want { 96 t.Fatalf("got[%s] != want[%s]", got, c.want) 97 } 98 }) 99 } 100 } 101 102 type EnvTest struct { 103 name string 104 env map[string]string 105 want string 106 } 107 108 func clearenv(t *testing.T) func() { 109 env := os.Environ() 110 os.Clearenv() 111 112 return func() { 113 for _, envvar := range env { 114 parsed := strings.Split(envvar, "=") 115 name := parsed[0] 116 val := strings.Join(parsed[1:], "=") 117 118 err := os.Setenv(name, val) 119 if err != nil { 120 t.Fatalf("error[%s] restoring env var[%s]", err, envvar) 121 } 122 } 123 } 124 } 125 126 func export(t *testing.T, env map[string]string) { 127 t.Helper() 128 129 for name, val := range env { 130 err := os.Setenv(name, val) 131 if err != nil { 132 t.Fatal(err) 133 } 134 } 135 } 136 137 func home(t *testing.T) string { 138 t.Helper() 139 140 homedir, err := os.UserHomeDir() 141 if err != nil { 142 t.Fatal(err) 143 } 144 return homedir 145 }