helmfile/pkg/filesystem/fs_test.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)
}