projects_test.go

  1package projects
  2
  3import (
  4	"path/filepath"
  5	"testing"
  6	"time"
  7)
  8
  9func TestRegisterAndList(t *testing.T) {
 10	// Create a temporary directory for the test
 11	tmpDir := t.TempDir()
 12
 13	// Override the projects file path for testing
 14	t.Setenv("XDG_DATA_HOME", tmpDir)
 15
 16	// Test registering a project
 17	err := Register("/home/user/project1", "/home/user/project1/.crush")
 18	if err != nil {
 19		t.Fatalf("Register failed: %v", err)
 20	}
 21
 22	// List projects
 23	projects, err := List()
 24	if err != nil {
 25		t.Fatalf("List failed: %v", err)
 26	}
 27
 28	if len(projects) != 1 {
 29		t.Fatalf("Expected 1 project, got %d", len(projects))
 30	}
 31
 32	if projects[0].Path != "/home/user/project1" {
 33		t.Errorf("Expected path /home/user/project1, got %s", projects[0].Path)
 34	}
 35
 36	if projects[0].DataDir != "/home/user/project1/.crush" {
 37		t.Errorf("Expected data_dir /home/user/project1/.crush, got %s", projects[0].DataDir)
 38	}
 39
 40	// Register another project
 41	err = Register("/home/user/project2", "/home/user/project2/.crush")
 42	if err != nil {
 43		t.Fatalf("Register failed: %v", err)
 44	}
 45
 46	projects, err = List()
 47	if err != nil {
 48		t.Fatalf("List failed: %v", err)
 49	}
 50
 51	if len(projects) != 2 {
 52		t.Fatalf("Expected 2 projects, got %d", len(projects))
 53	}
 54
 55	// Most recent should be first
 56	if projects[0].Path != "/home/user/project2" {
 57		t.Errorf("Expected most recent project first, got %s", projects[0].Path)
 58	}
 59}
 60
 61func TestRegisterUpdatesExisting(t *testing.T) {
 62	tmpDir := t.TempDir()
 63	t.Setenv("XDG_DATA_HOME", tmpDir)
 64
 65	// Register a project
 66	err := Register("/home/user/project1", "/home/user/project1/.crush")
 67	if err != nil {
 68		t.Fatalf("Register failed: %v", err)
 69	}
 70
 71	projects, _ := List()
 72	firstAccess := projects[0].LastAccessed
 73
 74	// Wait a bit and re-register
 75	time.Sleep(10 * time.Millisecond)
 76
 77	err = Register("/home/user/project1", "/home/user/project1/.crush-new")
 78	if err != nil {
 79		t.Fatalf("Register failed: %v", err)
 80	}
 81
 82	projects, _ = List()
 83
 84	if len(projects) != 1 {
 85		t.Fatalf("Expected 1 project after update, got %d", len(projects))
 86	}
 87
 88	if projects[0].DataDir != "/home/user/project1/.crush-new" {
 89		t.Errorf("Expected updated data_dir, got %s", projects[0].DataDir)
 90	}
 91
 92	if !projects[0].LastAccessed.After(firstAccess) {
 93		t.Error("Expected LastAccessed to be updated")
 94	}
 95}
 96
 97func TestLoadEmptyFile(t *testing.T) {
 98	tmpDir := t.TempDir()
 99	t.Setenv("XDG_DATA_HOME", tmpDir)
100
101	// List before any projects exist
102	projects, err := List()
103	if err != nil {
104		t.Fatalf("List failed: %v", err)
105	}
106
107	if len(projects) != 0 {
108		t.Errorf("Expected 0 projects, got %d", len(projects))
109	}
110}
111
112func TestProjectsFilePath(t *testing.T) {
113	tmpDir := t.TempDir()
114	t.Setenv("XDG_DATA_HOME", tmpDir)
115
116	expected := filepath.Join(tmpDir, "crush", "projects.json")
117	actual := projectsFilePath()
118
119	if actual != expected {
120		t.Errorf("Expected %s, got %s", expected, actual)
121	}
122}
123
124func TestRegisterWithParentDataDir(t *testing.T) {
125	tmpDir := t.TempDir()
126	t.Setenv("XDG_DATA_HOME", tmpDir)
127
128	// Register a project where .crush is in a parent directory.
129	// e.g., working in /home/user/monorepo/packages/app but .crush is at /home/user/monorepo/.crush
130	err := Register("/home/user/monorepo/packages/app", "/home/user/monorepo/.crush")
131	if err != nil {
132		t.Fatalf("Register failed: %v", err)
133	}
134
135	projects, err := List()
136	if err != nil {
137		t.Fatalf("List failed: %v", err)
138	}
139
140	if len(projects) != 1 {
141		t.Fatalf("Expected 1 project, got %d", len(projects))
142	}
143
144	if projects[0].Path != "/home/user/monorepo/packages/app" {
145		t.Errorf("Expected path /home/user/monorepo/packages/app, got %s", projects[0].Path)
146	}
147
148	if projects[0].DataDir != "/home/user/monorepo/.crush" {
149		t.Errorf("Expected data_dir /home/user/monorepo/.crush, got %s", projects[0].DataDir)
150	}
151}
152
153func TestRegisterWithExternalDataDir(t *testing.T) {
154	tmpDir := t.TempDir()
155	t.Setenv("XDG_DATA_HOME", tmpDir)
156
157	// Register a project where .crush is in a completely different location.
158	// e.g., project at /home/user/project but data stored at /var/data/crush/myproject
159	err := Register("/home/user/project", "/var/data/crush/myproject")
160	if err != nil {
161		t.Fatalf("Register failed: %v", err)
162	}
163
164	projects, err := List()
165	if err != nil {
166		t.Fatalf("List failed: %v", err)
167	}
168
169	if len(projects) != 1 {
170		t.Fatalf("Expected 1 project, got %d", len(projects))
171	}
172
173	if projects[0].Path != "/home/user/project" {
174		t.Errorf("Expected path /home/user/project, got %s", projects[0].Path)
175	}
176
177	if projects[0].DataDir != "/var/data/crush/myproject" {
178		t.Errorf("Expected data_dir /var/data/crush/myproject, got %s", projects[0].DataDir)
179	}
180}