projects_test.go 4.8 KB

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