ls_test.go 1.5 KB

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