all repos

clerk @ e2e9e2b27783c07fe5724268bf7ae828b3aacac7

missing tooling for ledger/hledger

clerk/internal/testutil/txtar/fs_test.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
tests: switch to txtar, 3 days ago
1
// Copyright 2024 The Go Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
4
5
package txtar_test
6
7
import (
8
	"io/fs"
9
	"strings"
10
	"testing"
11
	"testing/fstest"
12
13
	"olexsmir.xyz/clerk/internal/testutil/txtar"
14
)
15
16
func TestFS(t *testing.T) {
17
	fstestcases := []struct{ name, input, files string }{
18
		{
19
			name:  "empty",
20
			input: ``,
21
			files: "",
22
		},
23
		{
24
			name: "one",
25
			input: `
26
-- one.txt --
27
one
28
`,
29
			files: "one.txt",
30
		},
31
		{
32
			name: "two",
33
			input: `
34
-- one.txt --
35
one
36
-- two.txt --
37
two
38
`,
39
			files: "one.txt two.txt",
40
		},
41
		{
42
			name: "subdirectories",
43
			input: `
44
-- one.txt --
45
one
46
-- 2/two.txt --
47
two
48
-- 2/3/three.txt --
49
three
50
-- 4/four.txt --
51
four
52
`,
53
			files: "one.txt 2/two.txt 2/3/three.txt 4/four.txt",
54
		},
55
	}
56
57
	for _, tc := range fstestcases {
58
		t.Run(tc.name, func(t *testing.T) {
59
			a := txtar.Parse([]byte(tc.input))
60
			fsys, err := txtar.FS(a)
61
			if err != nil {
62
				t.Fatal(err)
63
			}
64
65
			files := strings.Fields(tc.files)
66
			if err := fstest.TestFS(fsys, files...); err != nil {
67
				t.Fatal(err)
68
			}
69
70
			for _, f := range a.Files {
71
				b, err := fs.ReadFile(fsys, f.Name)
72
				if err != nil {
73
					t.Errorf("ReadFile(%q) failed with error: %v", f.Name, err)
74
				}
75
				if got, want := string(b), string(f.Data); got != want {
76
					t.Errorf("ReadFile(%q) = %q; want %q", f.Name, got, want)
77
				}
78
			}
79
		})
80
	}
81
}
82
83
func TestInvalid(t *testing.T) {
84
	invalidtestcases := []struct{ name, want, input string }{
85
		{"unclean file names", "invalid path", `
86
-- 1/../one.txt --
87
one
88
-- 2/sub/../two.txt --
89
two
90
`},
91
		{"duplicate name", `cannot create fs.FS from txtar.Archive: duplicate path "1/2/one.txt"`, `
92
-- 1/2/one.txt --
93
one
94
-- 1/2/one.txt --
95
two
96
`},
97
		{"file conflicts with directory", `duplicate path "1/2"`, `
98
-- 1/2 --
99
one
100
-- 1/2/one.txt --
101
two
102
`},
103
	}
104
105
	for _, tc := range invalidtestcases {
106
		t.Run(tc.name, func(t *testing.T) {
107
			a := txtar.Parse([]byte(tc.input))
108
			_, err := txtar.FS(a)
109
			if err == nil {
110
				t.Fatal("txtar.FS(...) succeeded; expected an error")
111
			}
112
			if got := err.Error(); !strings.Contains(got, tc.want) || tc.want == "" {
113
				t.Errorf("txtar.FS(...) got error %q; want %q", got, tc.want)
114
			}
115
		})
116
	}
117
}
118
119
func TestModified(t *testing.T) {
120
	const input = `
121
-- one.txt --
122
one
123
`
124
	for _, mod := range []func(a *txtar.Archive){
125
		func(a *txtar.Archive) { a.Files[0].Data = []byte("other") },
126
		func(a *txtar.Archive) { a.Files[0].Name = "other" },
127
		func(a *txtar.Archive) { a.Files = nil },
128
	} {
129
		a := txtar.Parse([]byte(input))
130
		if n := len(a.Files); n != 1 {
131
			t.Fatalf("txtar.Parse(%q) got %d files; expected 1", input, n)
132
		}
133
134
		fsys, err := txtar.FS(a)
135
		if err != nil {
136
			t.Fatal(err)
137
		}
138
139
		// Confirm we can open "one.txt".
140
		_, err = fsys.Open("one.txt")
141
		if err != nil {
142
			t.Fatal(err)
143
		}
144
		// Modify a to get ErrModified when opening "one.txt".
145
		mod(a)
146
147
		_, err = fsys.Open("one.txt")
148
		if err != txtar.ErrModified {
149
			t.Errorf("Open(%q) got error %s; want ErrModified", "one.txt", err)
150
		}
151
	}
152
}
153
154
func TestReadFile(t *testing.T) {
155
	const input = `
156
-- 1/one.txt --
157
one
158
`
159
	a := txtar.Parse([]byte(input))
160
	fsys, err := txtar.FS(a)
161
	if err != nil {
162
		t.Fatal(err)
163
	}
164
	readfs := fsys.(fs.ReadFileFS)
165
	_, err = readfs.ReadFile("1")
166
	if err == nil {
167
		t.Errorf("ReadFile(%q) succeeded; expected an error when reading a directory", "1")
168
	}
169
170
	content, err := readfs.ReadFile("1/one.txt")
171
	if err != nil {
172
		t.Fatal(err)
173
	}
174
	want := "one\n"
175
	if got := string(content); want != got {
176
		t.Errorf("ReadFile(%q) = %q; want %q", "1/one.txt", got, want)
177
	}
178
}