github.com/ChicK00o/awgo@v0.29.4/util/files_test.go (about)

     1  // Copyright (c) 2019 Dean Jackson <deanishe@deanishe.net>
     2  // MIT Licence applies http://opensource.org/licenses/MIT
     3  
     4  package util
     5  
     6  import (
     7  	"io/ioutil"
     8  	"os"
     9  	"path/filepath"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func inTempDir(fun func(dir string)) error {
    17  	curdir, err := os.Getwd()
    18  	if err != nil {
    19  		return err
    20  	}
    21  
    22  	dir, err := ioutil.TempDir("", "awgo-util-")
    23  	if err != nil {
    24  		return err
    25  	}
    26  	// TempDir() returns a symlink on my macOS :(
    27  	if dir, err = filepath.EvalSymlinks(dir); err != nil {
    28  		return err
    29  	}
    30  
    31  	defer func() {
    32  		if err := os.RemoveAll(dir); err != nil {
    33  			panic(err)
    34  		}
    35  	}()
    36  
    37  	// Change to temporary directory
    38  	if err := os.Chdir(dir); err != nil {
    39  		return err
    40  	}
    41  
    42  	// Change back after we're done
    43  	defer func() {
    44  		if err := os.Chdir(curdir); err != nil {
    45  			panic(err)
    46  		}
    47  	}()
    48  
    49  	fun(dir)
    50  
    51  	return nil
    52  }
    53  
    54  func TestMustExist(t *testing.T) {
    55  	err := inTempDir(func(dir string) {
    56  		name := "testdir"
    57  
    58  		// Create directory
    59  		s := MustExist(name)
    60  		assert.Equal(t, name, s, "unexpected dirname")
    61  
    62  		_, err := os.Stat(s)
    63  		assert.Nil(t, err, "stat dir failed")
    64  
    65  		// Check path is as expected
    66  		p := filepath.Join(dir, name)
    67  		p2, err := filepath.Abs(s)
    68  		require.Nil(t, err, "filepath.Abs failed")
    69  		assert.Equal(t, p, p2, "unexpected path")
    70  	})
    71  
    72  	require.Nil(t, err, "inTempDir failed")
    73  }
    74  
    75  func TestPathExists(t *testing.T) {
    76  	t.Parallel()
    77  
    78  	err := inTempDir(func(dir string) {
    79  		name := "existingdir"
    80  		path := filepath.Join(dir, name)
    81  		badName := "nodir"
    82  		badPath := filepath.Join(dir, badName)
    83  
    84  		require.Nil(t, os.MkdirAll(name, 0700), "MkdirAll failed")
    85  
    86  		data := []struct {
    87  			p string
    88  			x bool
    89  		}{
    90  			{dir, true},
    91  			{name, true},
    92  			{path, true},
    93  			{badName, false},
    94  			{badPath, false},
    95  		}
    96  
    97  		for _, td := range data {
    98  			assert.Equal(t, td.x, PathExists(td.p), "unexpected result")
    99  		}
   100  	})
   101  
   102  	require.Nil(t, err, "inTempDir failed")
   103  }
   104  
   105  func TestClearDirectory(t *testing.T) {
   106  	err := inTempDir(func(dir string) {
   107  		names := []string{"./root/one", "./root/two", "./root/three"}
   108  		for _, s := range names {
   109  			require.Nil(t, os.MkdirAll(s, 0700), "MkdirAll failed")
   110  		}
   111  
   112  		for _, s := range names {
   113  			_, err := os.Stat(s)
   114  			assert.Nil(t, err, "stat failed")
   115  		}
   116  		assert.Nil(t, ClearDirectory("./root"), "ClearDirectory failed")
   117  
   118  		for _, s := range names {
   119  			s := s
   120  			t.Run(s, func(t *testing.T) {
   121  				_, err := os.Stat(s)
   122  				assert.True(t, os.IsNotExist(err), "file exists")
   123  			})
   124  		}
   125  	})
   126  	require.Nil(t, err, "inTempDir failed")
   127  }
   128  
   129  func TestWriteFile(t *testing.T) {
   130  	err := inTempDir(func(dir string) {
   131  		var (
   132  			name    = "test.txt"
   133  			content = []byte(`test`)
   134  		)
   135  
   136  		require.False(t, PathExists(name), "path already exists")
   137  		require.Nil(t, WriteFile(name, content, 0600), "WriteFile failed")
   138  		require.True(t, PathExists(name), "path does not exist")
   139  
   140  		data, err := ioutil.ReadFile(name)
   141  		require.Nil(t, err, "read file failed")
   142  
   143  		assert.Equal(t, content, data, "unexpected file content")
   144  
   145  		fi, err := os.Stat(name)
   146  		require.Nil(t, err, "stat file failed")
   147  		assert.Equal(t, os.FileMode(0600), fi.Mode(), "unexpected file mode")
   148  
   149  		infos, err := ioutil.ReadDir(".")
   150  		require.Nil(t, err, "ReadDir failed")
   151  		assert.Equal(t, 1, len(infos), "unexpected no. of files")
   152  	})
   153  	require.Nil(t, err, "inTempDir failed")
   154  }