main 6af0a61

local_test.go RawHistoryFolder

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}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 0

    ↑↓ moveenter openesc close