1package filesystem
2
3import (
4 "os"
5 "path/filepath"
6 "testing"
7)
8
9func TestLocalFileSystem_Stat(t *testing.T) {
10 fs := NewLocalFileSystem()
11 tmpDir := t.TempDir()
12
13 // Create a test file
14 testFile := filepath.Join(tmpDir, "test.txt")
15 if err := os.WriteFile(testFile, []byte("test"), 0644); err != nil {
16 t.Fatalf("failed to create test file: %v", err)
17 }
18
19 info, err := fs.Stat(testFile)
20 if err != nil {
21 t.Fatalf("expected no error, got %v", err)
22 }
23
24 if info.Name() != "test.txt" {
25 t.Errorf("expected filename test.txt, got %s", info.Name())
26 }
27}
28
29func TestLocalFileSystem_StatNotFound(t *testing.T) {
30 fs := NewLocalFileSystem()
31
32 _, err := fs.Stat("/nonexistent/path/file.txt")
33 if err == nil {
34 t.Fatal("expected error for nonexistent file")
35 }
36}
37
38func TestLocalFileSystem_ReadFile(t *testing.T) {
39 fs := NewLocalFileSystem()
40 tmpDir := t.TempDir()
41
42 testFile := filepath.Join(tmpDir, "test.txt")
43 testContent := []byte("hello world")
44 if err := os.WriteFile(testFile, testContent, 0644); err != nil {
45 t.Fatalf("failed to create test file: %v", err)
46 }
47
48 content, err := fs.ReadFile(testFile)
49 if err != nil {
50 t.Fatalf("expected no error, got %v", err)
51 }
52
53 if string(content) != "hello world" {
54 t.Errorf("expected 'hello world', got %s", string(content))
55 }
56}
57
58func TestLocalFileSystem_ReadFileNotFound(t *testing.T) {
59 fs := NewLocalFileSystem()
60
61 _, err := fs.ReadFile("/nonexistent/file.txt")
62 if err == nil {
63 t.Fatal("expected error for nonexistent file")
64 }
65}
66
67func TestLocalFileSystem_WriteFile(t *testing.T) {
68 fs := NewLocalFileSystem()
69 tmpDir := t.TempDir()
70
71 testFile := filepath.Join(tmpDir, "test.txt")
72 content := []byte("test content")
73
74 err := fs.WriteFile(testFile, content, 0644)
75 if err != nil {
76 t.Fatalf("expected no error, got %v", err)
77 }
78
79 // Verify file was created
80 data, err := os.ReadFile(testFile)
81 if err != nil {
82 t.Fatalf("failed to read file: %v", err)
83 }
84
85 if string(data) != "test content" {
86 t.Errorf("expected 'test content', got %s", string(data))
87 }
88}
89
90func TestLocalFileSystem_WriteFileOverwrite(t *testing.T) {
91 fs := NewLocalFileSystem()
92 tmpDir := t.TempDir()
93
94 testFile := filepath.Join(tmpDir, "test.txt")
95
96 // Write first time
97 if err := fs.WriteFile(testFile, []byte("first"), 0644); err != nil {
98 t.Fatalf("expected no error, got %v", err)
99 }
100
101 // Overwrite
102 if err := fs.WriteFile(testFile, []byte("second"), 0644); err != nil {
103 t.Fatalf("expected no error, got %v", err)
104 }
105
106 data, _ := os.ReadFile(testFile)
107 if string(data) != "second" {
108 t.Errorf("expected 'second', got %s", string(data))
109 }
110}
111
112func TestLocalFileSystem_Create(t *testing.T) {
113 fs := NewLocalFileSystem()
114 tmpDir := t.TempDir()
115
116 testFile := filepath.Join(tmpDir, "test.txt")
117 file, err := fs.Create(testFile)
118 if err != nil {
119 t.Fatalf("expected no error, got %v", err)
120 }
121 defer func() {
122 if err := file.Close(); err != nil {
123 t.Fatalf("failed to close file: %v", err)
124 }
125 }()
126
127 n, err := file.Write([]byte("test content"))
128 if err != nil {
129 t.Fatalf("expected no error, got %v", err)
130 }
131
132 if n != len("test content") {
133 t.Errorf("expected to write 12 bytes, got %d", n)
134 }
135
136 // Verify file exists
137 if _, err := os.Stat(testFile); os.IsNotExist(err) {
138 t.Error("expected file to exist")
139 }
140}
141
142func TestLocalFileSystem_CreateTruncates(t *testing.T) {
143 fs := NewLocalFileSystem()
144 tmpDir := t.TempDir()
145
146 testFile := filepath.Join(tmpDir, "test.txt")
147
148 // Create file with content
149 if err := os.WriteFile(testFile, []byte("old content"), 0644); err != nil {
150 t.Fatalf("failed to create test file: %v", err)
151 }
152
153 // Create again should truncate
154 file, err := fs.Create(testFile)
155 if err != nil {
156 t.Fatalf("expected no error, got %v", err)
157 }
158 if err := file.Close(); err != nil {
159 t.Fatalf("failed to close file: %v", err)
160 }
161
162 // Verify file is empty
163 info, _ := os.Stat(testFile)
164 if info.Size() != 0 {
165 t.Errorf("expected file size 0, got %d", info.Size())
166 }
167}
168
169func TestLocalFileSystem_Chmod(t *testing.T) {
170 fs := NewLocalFileSystem()
171 tmpDir := t.TempDir()
172
173 testFile := filepath.Join(tmpDir, "test.txt")
174 if err := os.WriteFile(testFile, []byte("test"), 0644); err != nil {
175 t.Fatalf("failed to create test file: %v", err)
176 }
177
178 err := fs.Chmod(testFile, 0755)
179 if err != nil {
180 t.Fatalf("expected no error, got %v", err)
181 }
182
183 info, _ := os.Stat(testFile)
184 if info.Mode()&0755 != 0755 {
185 t.Errorf("expected mode 0755, got %o", info.Mode()&0777)
186 }
187}
188
189func TestLocalFileSystem_MkdirAll(t *testing.T) {
190 fs := NewLocalFileSystem()
191 tmpDir := t.TempDir()
192
193 path := filepath.Join(tmpDir, "a", "b", "c")
194 err := fs.MkdirAll(path, 0755)
195 if err != nil {
196 t.Fatalf("expected no error, got %v", err)
197 }
198
199 info, err := os.Stat(path)
200 if err != nil {
201 t.Fatalf("expected directory to exist: %v", err)
202 }
203
204 if !info.IsDir() {
205 t.Error("expected directory")
206 }
207}
208
209func TestLocalFileSystem_RemoveAll(t *testing.T) {
210 fs := NewLocalFileSystem()
211 tmpDir := t.TempDir()
212
213 // Create directory with files
214 testDir := filepath.Join(tmpDir, "test_dir")
215 if err := os.MkdirAll(testDir, 0755); err != nil {
216 t.Fatalf("failed to create test directory: %v", err)
217 }
218
219 testFile := filepath.Join(testDir, "test.txt")
220 if err := os.WriteFile(testFile, []byte("test"), 0644); err != nil {
221 t.Fatalf("failed to create test file: %v", err)
222 }
223
224 err := fs.RemoveAll(testDir)
225 if err != nil {
226 t.Fatalf("expected no error, got %v", err)
227 }
228
229 // Verify directory was removed
230 if _, err := os.Stat(testDir); !os.IsNotExist(err) {
231 t.Error("expected directory to be removed")
232 }
233}
234
235func TestLocalFileSystem_Exists_FileExists(t *testing.T) {
236 fs := NewLocalFileSystem()
237 tmpDir := t.TempDir()
238
239 testFile := filepath.Join(tmpDir, "test.txt")
240 if err := os.WriteFile(testFile, []byte("test"), 0644); err != nil {
241 t.Fatalf("failed to create test file: %v", err)
242 }
243
244 exists, err := fs.Exists(testFile)
245 if err != nil {
246 t.Fatalf("expected no error, got %v", err)
247 }
248
249 if !exists {
250 t.Error("expected file to exist")
251 }
252}
253
254func TestLocalFileSystem_Exists_FileNotExists(t *testing.T) {
255 fs := NewLocalFileSystem()
256
257 exists, err := fs.Exists("/nonexistent/file.txt")
258 if err != nil {
259 t.Fatalf("expected no error, got %v", err)
260 }
261
262 if exists {
263 t.Error("expected file to not exist")
264 }
265}
266
267func TestLocalFileSystem_Exists_DirectoryExists(t *testing.T) {
268 fs := NewLocalFileSystem()
269 tmpDir := t.TempDir()
270
271 exists, err := fs.Exists(tmpDir)
272 if err != nil {
273 t.Fatalf("expected no error, got %v", err)
274 }
275
276 if !exists {
277 t.Error("expected directory to exist")
278 }
279}