summaryrefslogtreecommitdiff
path: root/file/file_test.go
blob: 215acbfe60703616e73beaa5c5230288e0802770 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package file

import (
	"os"
	"path/filepath"
	"testing"

	"github.com/spf13/afero"
	"github.com/stretchr/testify/assert"
	tfs "gotest.tools/v3/fs"
)

func TestRead(t *testing.T) {
	origfs := fs
	defer func() { fs = origfs }()
	fs = afero.NewMemMapFs()
	_ = fs.Mkdir("/tmp", 0777)
	f, _ := fs.Create("/tmp/foo")
	_, _ = f.Write([]byte("foo"))

	actual, err := Read("/tmp/foo")
	assert.NoError(t, err)
	assert.Equal(t, "foo", actual)

	_, err = Read("/tmp/bar")
	assert.Error(t, err)
}

func TestReadDir(t *testing.T) {
	origfs := fs
	defer func() { fs = origfs }()
	fs = afero.NewMemMapFs()
	fs.Mkdir("/tmp", 0777)
	fs.Create("/tmp/foo")
	fs.Create("/tmp/bar")
	fs.Create("/tmp/baz")
	fs.Mkdir("/tmp/qux", 0777)
	fs.Create("/tmp/qux/quux")

	actual, err := ReadDir("/tmp")
	assert.NoError(t, err)
	assert.Equal(t, []string{"bar", "baz", "foo", "qux"}, actual)

	_, err = ReadDir("/tmp/foo")
	assert.Error(t, err)
}

func TestWrite(t *testing.T) {
	oldwd, _ := os.Getwd()
	defer os.Chdir(oldwd)

	rootDir := tfs.NewDir(t, "gomplate-test")
	defer rootDir.Remove()

	newwd := rootDir.Join("the", "path", "we", "want")
	badwd := rootDir.Join("some", "other", "dir")
	fs.MkdirAll(newwd, 0755)
	fs.MkdirAll(badwd, 0755)
	newwd, _ = filepath.EvalSymlinks(newwd)
	badwd, _ = filepath.EvalSymlinks(badwd)

	err := os.Chdir(newwd)
	assert.NoError(t, err)

	err = Write("/foo", []byte("Hello world"))
	assert.Error(t, err)

	rel, err := filepath.Rel(newwd, badwd)
	assert.NoError(t, err)
	err = Write(rel, []byte("Hello world"))
	assert.Error(t, err)

	foopath := filepath.Join(newwd, "foo")
	err = Write(foopath, []byte("Hello world"))
	assert.NoError(t, err)

	out, err := os.ReadFile(foopath)
	assert.NoError(t, err)
	assert.Equal(t, "Hello world", string(out))

	err = Write(foopath, []byte("truncate"))
	assert.NoError(t, err)

	out, err = os.ReadFile(foopath)
	assert.NoError(t, err)
	assert.Equal(t, "truncate", string(out))

	foopath = filepath.Join(newwd, "nonexistant", "subdir", "foo")
	err = Write(foopath, []byte("Hello subdirranean world!"))
	assert.NoError(t, err)

	out, err = os.ReadFile(foopath)
	assert.NoError(t, err)
	assert.Equal(t, "Hello subdirranean world!", string(out))
}

func TestAssertPathInWD(t *testing.T) {
	oldwd, _ := os.Getwd()
	defer os.Chdir(oldwd)

	err := assertPathInWD("/tmp")
	assert.Error(t, err)

	err = assertPathInWD(filepath.Join(oldwd, "subpath"))
	assert.NoError(t, err)

	err = assertPathInWD("subpath")
	assert.NoError(t, err)

	err = assertPathInWD("./subpath")
	assert.NoError(t, err)

	err = assertPathInWD(filepath.Join("..", "bogus"))
	assert.Error(t, err)

	err = assertPathInWD(filepath.Join("..", "..", "bogus"))
	assert.Error(t, err)

	base := filepath.Base(oldwd)
	err = assertPathInWD(filepath.Join("..", base))
	assert.NoError(t, err)
}