github.com/hairyhenderson/templater@v3.5.0+incompatible/env/env_test.go (about)

     1  package env
     2  
     3  import (
     4  	"errors"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/spf13/afero"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestGetenv(t *testing.T) {
    14  	assert.Empty(t, Getenv("FOOBARBAZ"))
    15  	assert.Equal(t, os.Getenv("USER"), Getenv("USER"))
    16  	assert.Equal(t, "default value", Getenv("BLAHBLAHBLAH", "default value"))
    17  }
    18  
    19  func TestGetenvFile(t *testing.T) {
    20  	fs := afero.NewMemMapFs()
    21  	_ = fs.Mkdir("/tmp", 0777)
    22  	f, _ := fs.Create("/tmp/foo")
    23  	_, _ = f.Write([]byte("foo"))
    24  
    25  	defer os.Unsetenv("FOO_FILE")
    26  	os.Setenv("FOO_FILE", "/tmp/foo")
    27  	assert.Equal(t, "foo", getenvVFS(fs, "FOO", "bar"))
    28  
    29  	os.Setenv("FOO_FILE", "/tmp/missing")
    30  	assert.Equal(t, "bar", getenvVFS(fs, "FOO", "bar"))
    31  
    32  	_, _ = fs.Create("/tmp/unreadable")
    33  	fs = writeOnly(fs)
    34  	os.Setenv("FOO_FILE", "/tmp/unreadable")
    35  	assert.Equal(t, "bar", getenvVFS(fs, "FOO", "bar"))
    36  }
    37  
    38  func TestExpandEnv(t *testing.T) {
    39  	assert.Empty(t, ExpandEnv("${FOOBARBAZ}"))
    40  	assert.Equal(t, os.Getenv("USER"), ExpandEnv("$USER"))
    41  	assert.Equal(t, "something", ExpandEnv("something$BLAHBLAHBLAH"))
    42  	assert.Equal(t, os.Getenv("USER")+": "+os.Getenv("HOME"),
    43  		ExpandEnv("$USER: ${HOME}"))
    44  }
    45  
    46  func TestExpandEnvFile(t *testing.T) {
    47  	fs := afero.NewMemMapFs()
    48  	_ = fs.Mkdir("/tmp", 0777)
    49  	f, _ := fs.Create("/tmp/foo")
    50  	_, _ = f.Write([]byte("foo"))
    51  
    52  	defer os.Unsetenv("FOO_FILE")
    53  	os.Setenv("FOO_FILE", "/tmp/foo")
    54  	assert.Equal(t, "foo is foo", expandEnvVFS(fs, "foo is $FOO"))
    55  
    56  	os.Setenv("FOO_FILE", "/tmp/missing")
    57  	assert.Equal(t, "empty", expandEnvVFS(fs, "${FOO}empty"))
    58  
    59  	_, _ = fs.Create("/tmp/unreadable")
    60  	fs = writeOnly(fs)
    61  	os.Setenv("FOO_FILE", "/tmp/unreadable")
    62  	assert.Equal(t, "", expandEnvVFS(fs, "${FOO}"))
    63  }
    64  
    65  // Maybe extract this into a separate package sometime...
    66  // writeOnly - represents a filesystem that's writeable, but read operations fail
    67  func writeOnly(fs afero.Fs) afero.Fs {
    68  	return &woFS{fs}
    69  }
    70  
    71  type woFS struct {
    72  	afero.Fs
    73  }
    74  
    75  func (fs woFS) Remove(name string) error {
    76  	return fs.Fs.Remove(name)
    77  }
    78  
    79  func (fs woFS) Rename(oldpath, newpath string) error {
    80  	return fs.Fs.Rename(oldpath, newpath)
    81  }
    82  
    83  func (fs woFS) Mkdir(name string, perm os.FileMode) error {
    84  	return fs.Fs.Mkdir(name, perm)
    85  }
    86  
    87  func (fs woFS) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) {
    88  	f, err := fs.Fs.OpenFile(name, flag, perm)
    89  	if err != nil {
    90  		return writeOnlyFile(f), err
    91  	}
    92  	return writeOnlyFile(f), nil
    93  }
    94  
    95  func (fs woFS) ReadDir(path string) ([]os.FileInfo, error) {
    96  	return nil, ErrWriteOnly
    97  }
    98  
    99  func (fs woFS) Stat(name string) (os.FileInfo, error) {
   100  	return nil, ErrWriteOnly
   101  }
   102  
   103  func writeOnlyFile(f afero.File) afero.File {
   104  	return &woFile{f}
   105  }
   106  
   107  type woFile struct {
   108  	afero.File
   109  }
   110  
   111  // Write is disabled and returns ErrWriteOnly
   112  func (f woFile) Write(p []byte) (n int, err error) {
   113  	return f.File.Write(p)
   114  }
   115  
   116  // Read is disabled and returns ErrWriteOnly
   117  func (f woFile) Read([]byte) (n int, err error) {
   118  	return 0, ErrWriteOnly
   119  }
   120  
   121  var ErrWriteOnly = errors.New("filesystem is write-only")