256 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			256 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Go
		
	
	
	
| package filesystem
 | |
| 
 | |
| import (
 | |
| 	"io/fs"
 | |
| 	"os"
 | |
| 	"path/filepath"
 | |
| 	"strings"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 	"github.com/stretchr/testify/require"
 | |
| )
 | |
| 
 | |
| func NewTestFileSystem() FileSystem {
 | |
| 	replaceffs := FileSystem{
 | |
| 		Stat: func(s string) (os.FileInfo, error) {
 | |
| 			if strings.HasSuffix(s, "existing_file.txt") {
 | |
| 				return fileStat{mode: 0}, nil
 | |
| 			}
 | |
| 			if strings.HasSuffix(s, "existing_dir") {
 | |
| 				return fileStat{mode: fs.ModeDir}, nil
 | |
| 			}
 | |
| 			return nil, os.ErrExist
 | |
| 		},
 | |
| 		Getwd: func() (string, error) {
 | |
| 			return "/test/dir", nil
 | |
| 		},
 | |
| 		EvalSymlinks: func(s string) (string, error) {
 | |
| 			if s == "/test/dir" {
 | |
| 				return "/real/dir", nil
 | |
| 			} else {
 | |
| 				if strings.Contains(s, "missing") {
 | |
| 					return "", os.ErrExist
 | |
| 				}
 | |
| 				return s, nil
 | |
| 			}
 | |
| 		},
 | |
| 	}
 | |
| 	return *FromFileSystem(replaceffs)
 | |
| }
 | |
| 
 | |
| func TestFs_resolveSymlinks(t *testing.T) {
 | |
| 	cases := []struct {
 | |
| 		name        string
 | |
| 		symlinkPath string
 | |
| 		expected    string
 | |
| 		expectedErr error
 | |
| 	}{
 | |
| 		{
 | |
| 			name:        "existing file symlink",
 | |
| 			symlinkPath: "../existing_file.txt",
 | |
| 			expected:    "/real/existing_file.txt",
 | |
| 			expectedErr: nil,
 | |
| 		},
 | |
| 		{
 | |
| 			name:        "missing file symlink",
 | |
| 			symlinkPath: "../missing_file.txt",
 | |
| 			expected:    "",
 | |
| 			expectedErr: os.ErrExist,
 | |
| 		},
 | |
| 		{
 | |
| 			name:        "local existing file symlink",
 | |
| 			symlinkPath: "./existing_file.txt",
 | |
| 			expected:    "./existing_file.txt",
 | |
| 			expectedErr: nil,
 | |
| 		},
 | |
| 		{
 | |
| 			name:        "absolute existing file symlink",
 | |
| 			symlinkPath: "/a/b/c/existing_file.txt",
 | |
| 			expected:    "/a/b/c/existing_file.txt",
 | |
| 			expectedErr: nil,
 | |
| 		},
 | |
| 		{
 | |
| 			name:        "current directory existing file symlink",
 | |
| 			symlinkPath: "existing_file.txt",
 | |
| 			expected:    "existing_file.txt",
 | |
| 			expectedErr: nil,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	ffs := NewTestFileSystem()
 | |
| 
 | |
| 	for _, c := range cases {
 | |
| 		t.Run(c.name, func(t *testing.T) {
 | |
| 			path, err := ffs.resolveSymlinks(c.symlinkPath)
 | |
| 			if c.expectedErr != nil {
 | |
| 				require.ErrorIs(t, err, c.expectedErr)
 | |
| 			} else {
 | |
| 				require.NoError(t, err)
 | |
| 			}
 | |
| 			assert.Equal(t, c.expected, path)
 | |
| 		})
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestFs_fileExistsDefault(t *testing.T) {
 | |
| 	cases := []struct {
 | |
| 		name        string
 | |
| 		filePath    string
 | |
| 		expected    bool
 | |
| 		expectedErr error
 | |
| 	}{
 | |
| 		{
 | |
| 			name:        "existing file",
 | |
| 			filePath:    "existing_file.txt",
 | |
| 			expected:    true,
 | |
| 			expectedErr: nil,
 | |
| 		},
 | |
| 		{
 | |
| 			name:        "missing file",
 | |
| 			filePath:    "missing_file.txt",
 | |
| 			expected:    false,
 | |
| 			expectedErr: os.ErrExist,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	ffs := NewTestFileSystem()
 | |
| 
 | |
| 	for _, c := range cases {
 | |
| 		t.Run(c.name, func(t *testing.T) {
 | |
| 			exists, err := ffs.FileExists(c.filePath)
 | |
| 			if c.expectedErr != nil {
 | |
| 				require.ErrorIs(t, err, c.expectedErr)
 | |
| 			} else {
 | |
| 				require.NoError(t, err)
 | |
| 			}
 | |
| 			assert.Equal(t, c.expected, exists)
 | |
| 		})
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestFs_fileExistsAtDefault(t *testing.T) {
 | |
| 	cases := []struct {
 | |
| 		name     string
 | |
| 		filePath string
 | |
| 		expected bool
 | |
| 	}{
 | |
| 		{
 | |
| 			name:     "existing file",
 | |
| 			filePath: "existing_file.txt",
 | |
| 			expected: true,
 | |
| 		},
 | |
| 		{
 | |
| 			name:     "missing file",
 | |
| 			filePath: "missing_file.txt",
 | |
| 			expected: false,
 | |
| 		},
 | |
| 		{
 | |
| 			name:     "existing dir",
 | |
| 			filePath: "existing_dir",
 | |
| 			expected: false,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	ffs := NewTestFileSystem()
 | |
| 
 | |
| 	for _, c := range cases {
 | |
| 		t.Run(c.name, func(t *testing.T) {
 | |
| 			exists := ffs.FileExistsAt(c.filePath)
 | |
| 			assert.Equal(t, c.expected, exists)
 | |
| 		})
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestFs_directoryExistsDefault(t *testing.T) {
 | |
| 	cases := []struct {
 | |
| 		name     string
 | |
| 		dirPath  string
 | |
| 		expected bool
 | |
| 	}{
 | |
| 		{
 | |
| 			name:     "existing dir",
 | |
| 			dirPath:  "existing_dir",
 | |
| 			expected: true,
 | |
| 		},
 | |
| 		{
 | |
| 			name:     "missing dir",
 | |
| 			dirPath:  "missing_dir",
 | |
| 			expected: false,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	ffs := NewTestFileSystem()
 | |
| 
 | |
| 	for _, c := range cases {
 | |
| 		t.Run(c.name, func(t *testing.T) {
 | |
| 			exists := ffs.DirectoryExistsAt(c.dirPath)
 | |
| 			assert.Equal(t, c.expected, exists)
 | |
| 		})
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestFsTeadFile(t *testing.T) {
 | |
| 	cases := []struct {
 | |
| 		name      string
 | |
| 		content   []byte
 | |
| 		path      string
 | |
| 		wantError string
 | |
| 	}{
 | |
| 		{
 | |
| 			name:    "read file",
 | |
| 			content: []byte("hello helmfile"),
 | |
| 			path:    "helmfile.yaml",
 | |
| 		},
 | |
| 		{
 | |
| 			name:    "read file from stdin",
 | |
| 			content: []byte("hello helmfile"),
 | |
| 			path:    "-",
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	for _, c := range cases {
 | |
| 		t.Run(c.name, func(t *testing.T) {
 | |
| 			dir := t.TempDir()
 | |
| 			yamlPath := filepath.Join(dir, c.path)
 | |
| 
 | |
| 			dfs := DefaultFileSystem()
 | |
| 			tmpfile, err := os.Create(yamlPath)
 | |
| 			require.NoErrorf(t, err, "create file %s error: %v", yamlPath, err)
 | |
| 
 | |
| 			_, err = tmpfile.Write(c.content)
 | |
| 			require.NoErrorf(t, err, "write to file %s error: %v", yamlPath, err)
 | |
| 
 | |
| 			readPath := yamlPath
 | |
| 			if c.path == "-" {
 | |
| 				readPath = c.path
 | |
| 				oldOsStdin := os.Stdin
 | |
| 				defer func() { os.Stdin = oldOsStdin }()
 | |
| 				os.Stdin = tmpfile
 | |
| 			}
 | |
| 			_, err = tmpfile.Seek(0, 0)
 | |
| 			require.NoErrorf(t, err, "file %s seek error: %v", yamlPath, err)
 | |
| 
 | |
| 			want, err := dfs.readFile(readPath)
 | |
| 			require.NoErrorf(t, err, "read file %s error: %v", readPath, err)
 | |
| 			require.Equalf(t, string(c.content), string(want), "unexpected error: unexpected=%s, got=%v", string(c.content), string(want))
 | |
| 		})
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestFs_DefaultBuilder(t *testing.T) {
 | |
| 	ffs := DefaultFileSystem()
 | |
| 	assert.NotNil(t, ffs.ReadFile)
 | |
| 	assert.NotNil(t, ffs.ReadDir)
 | |
| 	assert.NotNil(t, ffs.DeleteFile)
 | |
| 	assert.NotNil(t, ffs.FileExists)
 | |
| 	assert.NotNil(t, ffs.Glob)
 | |
| 	assert.NotNil(t, ffs.FileExistsAt)
 | |
| 	assert.NotNil(t, ffs.DirectoryExistsAt)
 | |
| 	assert.NotNil(t, ffs.Stat)
 | |
| 	assert.NotNil(t, ffs.Getwd)
 | |
| 	assert.NotNil(t, ffs.Chdir)
 | |
| 	assert.NotNil(t, ffs.Abs)
 | |
| 	assert.NotNil(t, ffs.EvalSymlinks)
 | |
| }
 |