1package fsext
2
3import (
4 "os"
5 "path/filepath"
6 "testing"
7
8 "github.com/stretchr/testify/require"
9)
10
11func TestListDirectory(t *testing.T) {
12 tmp := t.TempDir()
13
14 testFiles := map[string]string{
15 "regular.txt": "content",
16 ".hidden": "hidden content",
17 ".gitignore": ".*\n*.log\n",
18 "subdir/file.go": "package main",
19 "subdir/.another": "more hidden",
20 "build.log": "build output",
21 }
22
23 for name, content := range testFiles {
24 fp := filepath.Join(tmp, name)
25 dir := filepath.Dir(fp)
26 require.NoError(t, os.MkdirAll(dir, 0o755))
27 require.NoError(t, os.WriteFile(fp, []byte(content), 0o644))
28 }
29
30 t.Run("no limit", func(t *testing.T) {
31 files, truncated, err := ListDirectory(tmp, nil, -1, -1)
32 require.NoError(t, err)
33 require.False(t, truncated)
34 // The .gitignore has ".*" pattern which ignores hidden files anywhere
35 // (like real git does), so subdir/.another is ignored.
36 require.Len(t, files, 3)
37 require.ElementsMatch(t, []string{
38 "regular.txt",
39 "subdir",
40 "subdir/file.go",
41 }, relPaths(t, files, tmp))
42 })
43 t.Run("limit", func(t *testing.T) {
44 files, truncated, err := ListDirectory(tmp, nil, -1, 2)
45 require.NoError(t, err)
46 require.True(t, truncated)
47 require.Len(t, files, 2)
48 })
49}
50
51func relPaths(tb testing.TB, in []string, base string) []string {
52 tb.Helper()
53 out := make([]string, 0, len(in))
54 for _, p := range in {
55 rel, err := filepath.Rel(base, p)
56 require.NoError(tb, err)
57 out = append(out, filepath.ToSlash(rel))
58 }
59 return out
60}