9func TestRegisterAndList(t *testing.T) {
10 // Create a temporary directory for the test
13 // Override the projects file path for testing
14 t.Setenv("XDG_DATA_HOME", tmpDir)
15 t.Setenv("CRUSH_GLOBAL_DATA", filepath.Join(tmpDir, "crush"))
17 // Test registering a project
18 err := Register("/home/user/project1", "/home/user/project1/.crush")
20 t.Fatalf("Register failed: %v", err)
24 projects, err := List()
26 t.Fatalf("List failed: %v", err)
29 if len(projects) != 1 {
30 t.Fatalf("Expected 1 project, got %d", len(projects))
33 if projects[0].Path != "/home/user/project1" {
34 t.Errorf("Expected path /home/user/project1, got %s", projects[0].Path)
37 if projects[0].DataDir != "/home/user/project1/.crush" {
38 t.Errorf("Expected data_dir /home/user/project1/.crush, got %s", projects[0].DataDir)
41 // Register another project
42 err = Register("/home/user/project2", "/home/user/project2/.crush")
44 t.Fatalf("Register failed: %v", err)
47 projects, err = List()
49 t.Fatalf("List failed: %v", err)
52 if len(projects) != 2 {
53 t.Fatalf("Expected 2 projects, got %d", len(projects))
56 // Most recent should be first
57 if projects[0].Path != "/home/user/project2" {
58 t.Errorf("Expected most recent project first, got %s", projects[0].Path)
62func TestRegisterUpdatesExisting(t *testing.T) {
64 t.Setenv("XDG_DATA_HOME", tmpDir)
65 t.Setenv("CRUSH_GLOBAL_DATA", filepath.Join(tmpDir, "crush"))
68 err := Register("/home/user/project1", "/home/user/project1/.crush")
70 t.Fatalf("Register failed: %v", err)
74 firstAccess := projects[0].LastAccessed
76 // Wait a bit and re-register
77 time.Sleep(10 * time.Millisecond)
79 err = Register("/home/user/project1", "/home/user/project1/.crush-new")
81 t.Fatalf("Register failed: %v", err)
86 if len(projects) != 1 {
87 t.Fatalf("Expected 1 project after update, got %d", len(projects))
90 if projects[0].DataDir != "/home/user/project1/.crush-new" {
91 t.Errorf("Expected updated data_dir, got %s", projects[0].DataDir)
94 if !projects[0].LastAccessed.After(firstAccess) {
95 t.Error("Expected LastAccessed to be updated")
99func TestLoadEmptyFile(t *testing.T) {
100 tmpDir := t.TempDir()
101 t.Setenv("XDG_DATA_HOME", tmpDir)
102 t.Setenv("CRUSH_GLOBAL_DATA", filepath.Join(tmpDir, "crush"))
104 // List before any projects exist
105 projects, err := List()
107 t.Fatalf("List failed: %v", err)
110 if len(projects) != 0 {
111 t.Errorf("Expected 0 projects, got %d", len(projects))
115func TestProjectsFilePath(t *testing.T) {
116 tmpDir := t.TempDir()
117 t.Setenv("XDG_DATA_HOME", tmpDir)
118 t.Setenv("CRUSH_GLOBAL_DATA", filepath.Join(tmpDir, "crush"))
120 expected := filepath.Join(tmpDir, "crush", "projects.json")
121 actual := projectsFilePath()
123 if actual != expected {
124 t.Errorf("Expected %s, got %s", expected, actual)
128func TestRegisterWithParentDataDir(t *testing.T) {
129 tmpDir := t.TempDir()
130 t.Setenv("XDG_DATA_HOME", tmpDir)
131 t.Setenv("CRUSH_GLOBAL_DATA", filepath.Join(tmpDir, "crush"))
133 // Register a project where .crush is in a parent directory.
134 // e.g., working in /home/user/monorepo/packages/app but .crush is at /home/user/monorepo/.crush
135 err := Register("/home/user/monorepo/packages/app", "/home/user/monorepo/.crush")
137 t.Fatalf("Register failed: %v", err)
140 projects, err := List()
142 t.Fatalf("List failed: %v", err)
145 if len(projects) != 1 {
146 t.Fatalf("Expected 1 project, got %d", len(projects))
149 if projects[0].Path != "/home/user/monorepo/packages/app" {
150 t.Errorf("Expected path /home/user/monorepo/packages/app, got %s", projects[0].Path)
153 if projects[0].DataDir != "/home/user/monorepo/.crush" {
154 t.Errorf("Expected data_dir /home/user/monorepo/.crush, got %s", projects[0].DataDir)
158func TestRegisterWithExternalDataDir(t *testing.T) {
159 tmpDir := t.TempDir()
160 t.Setenv("XDG_DATA_HOME", tmpDir)
161 t.Setenv("CRUSH_GLOBAL_DATA", filepath.Join(tmpDir, "crush"))
163 // Register a project where .crush is in a completely different location.
164 // e.g., project at /home/user/project but data stored at /var/data/crush/myproject
165 err := Register("/home/user/project", "/var/data/crush/myproject")
167 t.Fatalf("Register failed: %v", err)
170 projects, err := List()
172 t.Fatalf("List failed: %v", err)
175 if len(projects) != 1 {
176 t.Fatalf("Expected 1 project, got %d", len(projects))
179 if projects[0].Path != "/home/user/project" {
180 t.Errorf("Expected path /home/user/project, got %s", projects[0].Path)
183 if projects[0].DataDir != "/var/data/crush/myproject" {
184 t.Errorf("Expected data_dir /var/data/crush/myproject, got %s", projects[0].DataDir)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list