1package fsext
  2
  3import (
  4	"os"
  5	"path/filepath"
  6	"testing"
  7
  8	"github.com/stretchr/testify/require"
  9)
 10
 11func TestCrushIgnore(t *testing.T) {
 12	// Create a temporary directory for testing
 13	tempDir := t.TempDir()
 14
 15	// Change to temp directory
 16	oldWd, _ := os.Getwd()
 17	err := os.Chdir(tempDir)
 18	require.NoError(t, err)
 19	defer os.Chdir(oldWd)
 20
 21	// Create test files
 22	require.NoError(t, os.WriteFile("test1.txt", []byte("test"), 0o644))
 23	require.NoError(t, os.WriteFile("test2.log", []byte("test"), 0o644))
 24	require.NoError(t, os.WriteFile("test3.tmp", []byte("test"), 0o644))
 25
 26	// Create a .crushignore file that ignores .log files
 27	require.NoError(t, os.WriteFile(".crushignore", []byte("*.log\n"), 0o644))
 28
 29	dl := NewDirectoryLister(tempDir)
 30	require.True(t, dl.shouldIgnore("test2.log", nil), ".log files should be ignored")
 31	require.False(t, dl.shouldIgnore("test1.txt", nil), ".txt files should not be ignored")
 32	require.True(t, dl.shouldIgnore("test3.tmp", nil), ".tmp files should be ignored by common patterns")
 33}
 34
 35func TestShouldExcludeFile(t *testing.T) {
 36	t.Parallel()
 37
 38	// Create a temporary directory structure for testing
 39	tempDir := t.TempDir()
 40
 41	// Create directories that should be ignored
 42	nodeModules := filepath.Join(tempDir, "node_modules")
 43	target := filepath.Join(tempDir, "target")
 44	customIgnored := filepath.Join(tempDir, "custom_ignored")
 45	normalDir := filepath.Join(tempDir, "src")
 46
 47	for _, dir := range []string{nodeModules, target, customIgnored, normalDir} {
 48		if err := os.MkdirAll(dir, 0o755); err != nil {
 49			t.Fatalf("Failed to create directory %s: %v", dir, err)
 50		}
 51	}
 52
 53	// Create .gitignore file
 54	gitignoreContent := "node_modules/\ntarget/\n"
 55	if err := os.WriteFile(filepath.Join(tempDir, ".gitignore"), []byte(gitignoreContent), 0o644); err != nil {
 56		t.Fatalf("Failed to create .gitignore: %v", err)
 57	}
 58
 59	// Create .crushignore file
 60	crushignoreContent := "custom_ignored/\n"
 61	if err := os.WriteFile(filepath.Join(tempDir, ".crushignore"), []byte(crushignoreContent), 0o644); err != nil {
 62		t.Fatalf("Failed to create .crushignore: %v", err)
 63	}
 64
 65	// Test that ignored directories are properly ignored
 66	require.True(t, ShouldExcludeFile(tempDir, nodeModules), "Expected node_modules to be ignored by .gitignore")
 67	require.True(t, ShouldExcludeFile(tempDir, target), "Expected target to be ignored by .gitignore")
 68	require.True(t, ShouldExcludeFile(tempDir, customIgnored), "Expected custom_ignored to be ignored by .crushignore")
 69
 70	// Test that normal directories are not ignored
 71	require.False(t, ShouldExcludeFile(tempDir, normalDir), "Expected src directory to not be ignored")
 72
 73	// Test that the workspace root itself is not ignored
 74	require.False(t, ShouldExcludeFile(tempDir, tempDir), "Expected workspace root to not be ignored")
 75}
 76
 77func TestShouldExcludeFileHierarchical(t *testing.T) {
 78	t.Parallel()
 79
 80	// Create a nested directory structure for testing hierarchical ignore
 81	tempDir := t.TempDir()
 82
 83	// Create nested directories
 84	subDir := filepath.Join(tempDir, "subdir")
 85	nestedNormal := filepath.Join(subDir, "normal_nested")
 86
 87	for _, dir := range []string{subDir, nestedNormal} {
 88		if err := os.MkdirAll(dir, 0o755); err != nil {
 89			t.Fatalf("Failed to create directory %s: %v", dir, err)
 90		}
 91	}
 92
 93	// Create .crushignore in subdir that ignores normal_nested
 94	subCrushignore := "normal_nested/\n"
 95	if err := os.WriteFile(filepath.Join(subDir, ".crushignore"), []byte(subCrushignore), 0o644); err != nil {
 96		t.Fatalf("Failed to create subdir .crushignore: %v", err)
 97	}
 98
 99	// Test hierarchical ignore behavior - this should work because the .crushignore is in the parent directory
100	require.True(t, ShouldExcludeFile(tempDir, nestedNormal), "Expected normal_nested to be ignored by subdir .crushignore")
101	require.False(t, ShouldExcludeFile(tempDir, subDir), "Expected subdir itself to not be ignored")
102}
103
104func TestShouldExcludeFileCommonPatterns(t *testing.T) {
105	t.Parallel()
106
107	tempDir := t.TempDir()
108
109	// Create directories that should be ignored by common patterns
110	commonIgnored := []string{
111		filepath.Join(tempDir, ".git"),
112		filepath.Join(tempDir, "node_modules"),
113		filepath.Join(tempDir, "__pycache__"),
114		filepath.Join(tempDir, "target"),
115		filepath.Join(tempDir, ".vscode"),
116	}
117
118	for _, dir := range commonIgnored {
119		if err := os.MkdirAll(dir, 0o755); err != nil {
120			t.Fatalf("Failed to create directory %s: %v", dir, err)
121		}
122	}
123
124	// Test that common patterns are ignored even without explicit ignore files
125	for _, dir := range commonIgnored {
126		require.True(t, ShouldExcludeFile(tempDir, dir), "Expected %s to be ignored by common patterns", filepath.Base(dir))
127	}
128}