projects_test.go 4.4 KB

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