ls_test.go

 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}