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  }