/ tests / workspace_tests.rs
workspace_tests.rs
  1  use abundantis::workspace::{PackageInfo, WorkspaceContext};
  2  use std::path::PathBuf;
  3  
  4  #[test]
  5  fn test_package_info_creation() {
  6      let info = PackageInfo {
  7          root: PathBuf::from("/path/to/package"),
  8          name: Some("my-package".into()),
  9          relative_path: "packages/my-package".into(),
 10      };
 11  
 12      assert_eq!(info.root, PathBuf::from("/path/to/package"));
 13      assert_eq!(info.name.as_deref(), Some("my-package"));
 14      assert_eq!(info.relative_path.as_str(), "packages/my-package");
 15  }
 16  
 17  #[test]
 18  fn test_package_info_without_name() {
 19      let info = PackageInfo {
 20          root: PathBuf::from("/path/to/package"),
 21          name: None,
 22          relative_path: ".".into(),
 23      };
 24  
 25      assert_eq!(info.name, None);
 26      assert_eq!(info.relative_path.as_str(), ".");
 27  }
 28  
 29  #[test]
 30  fn test_workspace_context_creation() {
 31      let context = WorkspaceContext {
 32          workspace_root: PathBuf::from("/workspace"),
 33          package_root: PathBuf::from("/workspace/packages/app"),
 34          package_name: Some("app".into()),
 35          env_files: vec![
 36              PathBuf::from("/workspace/.env"),
 37              PathBuf::from("/workspace/packages/app/.env"),
 38          ],
 39      };
 40  
 41      assert_eq!(context.workspace_root, PathBuf::from("/workspace"));
 42      assert_eq!(
 43          context.package_root,
 44          PathBuf::from("/workspace/packages/app")
 45      );
 46      assert_eq!(context.package_name.as_deref(), Some("app"));
 47      assert_eq!(context.env_files.len(), 2);
 48  }
 49  
 50  #[test]
 51  fn test_workspace_context_without_package_name() {
 52      let context = WorkspaceContext {
 53          workspace_root: PathBuf::from("/workspace"),
 54          package_root: PathBuf::from("/workspace"),
 55          package_name: None,
 56          env_files: vec![PathBuf::from("/workspace/.env")],
 57      };
 58  
 59      assert_eq!(context.package_name, None);
 60      assert_eq!(context.env_files.len(), 1);
 61  }
 62  
 63  #[test]
 64  fn test_workspace_context_single_env_file() {
 65      let context = WorkspaceContext {
 66          workspace_root: PathBuf::from("/workspace"),
 67          package_root: PathBuf::from("/workspace"),
 68          package_name: None,
 69          env_files: vec![PathBuf::from("/workspace/.env")],
 70      };
 71  
 72      assert_eq!(context.env_files.len(), 1);
 73      assert_eq!(context.env_files[0], PathBuf::from("/workspace/.env"));
 74  }
 75  
 76  #[test]
 77  fn test_workspace_context_multiple_env_files() {
 78      let context = WorkspaceContext {
 79          workspace_root: PathBuf::from("/workspace"),
 80          package_root: PathBuf::from("/workspace/packages/app"),
 81          package_name: Some("app".into()),
 82          env_files: vec![
 83              PathBuf::from("/workspace/.env"),
 84              PathBuf::from("/workspace/.env.local"),
 85              PathBuf::from("/workspace/packages/app/.env"),
 86              PathBuf::from("/workspace/packages/app/.env.development"),
 87          ],
 88      };
 89  
 90      assert_eq!(context.env_files.len(), 4);
 91  }
 92  
 93  #[test]
 94  fn test_package_info_clone() {
 95      let info1 = PackageInfo {
 96          root: PathBuf::from("/path/to/package"),
 97          name: Some("my-package".into()),
 98          relative_path: "packages/my-package".into(),
 99      };
100  
101      let info2 = info1.clone();
102  
103      assert_eq!(info1.root, info2.root);
104      assert_eq!(info1.name, info2.name);
105      assert_eq!(info1.relative_path, info2.relative_path);
106  }
107  
108  #[test]
109  fn test_workspace_context_clone() {
110      let context1 = WorkspaceContext {
111          workspace_root: PathBuf::from("/workspace"),
112          package_root: PathBuf::from("/workspace/packages/app"),
113          package_name: Some("app".into()),
114          env_files: vec![PathBuf::from("/workspace/.env")],
115      };
116  
117      let context2 = context1.clone();
118  
119      assert_eq!(context1.workspace_root, context2.workspace_root);
120      assert_eq!(context1.package_root, context2.package_root);
121      assert_eq!(context1.package_name, context2.package_name);
122      assert_eq!(context1.env_files, context2.env_files);
123  }
124  
125  #[test]
126  fn test_package_info_with_complex_path() {
127      let info = PackageInfo {
128          root: PathBuf::from("/very/deep/nested/path/to/package"),
129          name: Some("nested-package".into()),
130          relative_path: "deep/nested/path/to/package".into(),
131      };
132  
133      assert!(info.root.to_str().unwrap().len() > 20);
134      assert_eq!(info.name.as_deref(), Some("nested-package"));
135  }
136  
137  #[test]
138  fn test_workspace_context_cascading_scenario() {
139      let context = WorkspaceContext {
140          workspace_root: PathBuf::from("/workspace"),
141          package_root: PathBuf::from("/workspace/packages/app"),
142          package_name: Some("app".into()),
143          env_files: vec![
144              PathBuf::from("/workspace/.env"),
145              PathBuf::from("/workspace/.env.production"),
146              PathBuf::from("/workspace/packages/app/.env"),
147              PathBuf::from("/workspace/packages/app/.env.local"),
148          ],
149      };
150  
151      assert!(context.env_files[0]
152          .to_str()
153          .unwrap()
154          .contains("/workspace/.env"));
155      assert!(context.env_files[2]
156          .to_str()
157          .unwrap()
158          .contains("packages/app"));
159  }
160  
161  #[test]
162  fn test_workspace_context_monorepo_package() {
163      let context = WorkspaceContext {
164          workspace_root: PathBuf::from("/monorepo"),
165          package_root: PathBuf::from("/monorepo/apps/web"),
166          package_name: Some("web".into()),
167          env_files: vec![
168              PathBuf::from("/monorepo/.env"),
169              PathBuf::from("/monorepo/apps/web/.env"),
170          ],
171      };
172  
173      assert_eq!(context.package_name.as_deref(), Some("web"));
174      assert_eq!(context.workspace_root, PathBuf::from("/monorepo"));
175      assert_eq!(context.package_root, PathBuf::from("/monorepo/apps/web"));
176  }
177  
178  #[test]
179  fn test_package_info_equality() {
180      let info1 = PackageInfo {
181          root: PathBuf::from("/path"),
182          name: Some("pkg".into()),
183          relative_path: ".".into(),
184      };
185  
186      let info2 = PackageInfo {
187          root: PathBuf::from("/path"),
188          name: Some("pkg".into()),
189          relative_path: ".".into(),
190      };
191  
192      assert_eq!(info1.root, info2.root);
193      assert_eq!(info1.name, info2.name);
194      assert_eq!(info1.relative_path, info2.relative_path);
195  }
196  
197  #[test]
198  fn test_package_info_inequality() {
199      let info1 = PackageInfo {
200          root: PathBuf::from("/path1"),
201          name: Some("pkg1".into()),
202          relative_path: ".".into(),
203      };
204  
205      let info2 = PackageInfo {
206          root: PathBuf::from("/path2"),
207          name: Some("pkg2".into()),
208          relative_path: ".".into(),
209      };
210  
211      assert_ne!(info1.root, info2.root);
212      assert_ne!(info1.name, info2.name);
213  }
214  
215  #[test]
216  fn test_workspace_context_equality() {
217      let context1 = WorkspaceContext {
218          workspace_root: PathBuf::from("/workspace"),
219          package_root: PathBuf::from("/workspace/pkg"),
220          package_name: Some("pkg".into()),
221          env_files: vec![PathBuf::from("/workspace/.env")],
222      };
223  
224      let context2 = WorkspaceContext {
225          workspace_root: PathBuf::from("/workspace"),
226          package_root: PathBuf::from("/workspace/pkg"),
227          package_name: Some("pkg".into()),
228          env_files: vec![PathBuf::from("/workspace/.env")],
229      };
230  
231      assert_eq!(context1.workspace_root, context2.workspace_root);
232      assert_eq!(context1.package_root, context2.package_root);
233      assert_eq!(context1.package_name, context2.package_name);
234      assert_eq!(context1.env_files, context2.env_files);
235  }
236  
237  #[test]
238  fn test_workspace_context_inequality() {
239      let context1 = WorkspaceContext {
240          workspace_root: PathBuf::from("/workspace1"),
241          package_root: PathBuf::from("/workspace1/pkg"),
242          package_name: Some("pkg1".into()),
243          env_files: vec![PathBuf::from("/workspace1/.env")],
244      };
245  
246      let context2 = WorkspaceContext {
247          workspace_root: PathBuf::from("/workspace2"),
248          package_root: PathBuf::from("/workspace2/pkg"),
249          package_name: Some("pkg2".into()),
250          env_files: vec![PathBuf::from("/workspace2/.env")],
251      };
252  
253      assert_ne!(context1.workspace_root, context2.workspace_root);
254      assert_ne!(context1.package_root, context2.package_root);
255  }
256  
257  #[test]
258  fn test_package_info_debug_format() {
259      let info = PackageInfo {
260          root: PathBuf::from("/path/to/pkg"),
261          name: Some("test-pkg".into()),
262          relative_path: "to/pkg".into(),
263      };
264  
265      let debug_str = format!("{:?}", info);
266      assert!(debug_str.contains("test-pkg"));
267      assert!(debug_str.contains("/path/to/pkg"));
268  }
269  
270  #[test]
271  fn test_workspace_context_debug_format() {
272      let context = WorkspaceContext {
273          workspace_root: PathBuf::from("/workspace"),
274          package_root: PathBuf::from("/workspace/pkg"),
275          package_name: Some("test".into()),
276          env_files: vec![PathBuf::from("/workspace/.env")],
277      };
278  
279      let debug_str = format!("{:?}", context);
280      assert!(debug_str.contains("workspace_root"));
281      assert!(debug_str.contains("package_root"));
282      assert!(debug_str.contains("test"));
283  }
284  
285  #[test]
286  fn test_package_info_with_special_name() {
287      let info = PackageInfo {
288          root: PathBuf::from("/path/pkg-with-dashes"),
289          name: Some("@scope/package-name".into()),
290          relative_path: "pkg-with-dashes".into(),
291      };
292  
293      assert_eq!(info.name.as_deref(), Some("@scope/package-name"));
294  }
295  
296  #[test]
297  fn test_workspace_context_empty_env_files() {
298      let context = WorkspaceContext {
299          workspace_root: PathBuf::from("/workspace"),
300          package_root: PathBuf::from("/workspace/pkg"),
301          package_name: Some("pkg".into()),
302          env_files: vec![],
303      };
304  
305      assert_eq!(context.env_files.len(), 0);
306  }
307  
308  #[test]
309  fn test_workspace_context_no_cascading() {
310      let context = WorkspaceContext {
311          workspace_root: PathBuf::from("/workspace"),
312          package_root: PathBuf::from("/workspace/pkg"),
313          package_name: Some("pkg".into()),
314          env_files: vec![
315              PathBuf::from("/workspace/pkg/.env"),
316              PathBuf::from("/workspace/pkg/.env.local"),
317          ],
318      };
319  
320      assert_eq!(context.env_files.len(), 2);
321      assert!(context.env_files[0].to_str().unwrap().contains("pkg/.env"));
322      assert!(!context.env_files[0]
323          .to_str()
324          .unwrap()
325          .contains("/workspace/.env"));
326  }
327  
328  #[test]
329  fn test_package_info_root_ends_with_slash() {
330      let info = PackageInfo {
331          root: PathBuf::from("/path/to/package/"),
332          name: Some("pkg".into()),
333          relative_path: "to/package".into(),
334      };
335  
336      assert!(info.root.to_str().unwrap().ends_with('/'));
337  }
338  
339  #[test]
340  fn test_workspace_context_package_root_equals_workspace() {
341      let context = WorkspaceContext {
342          workspace_root: PathBuf::from("/workspace"),
343          package_root: PathBuf::from("/workspace"),
344          package_name: None,
345          env_files: vec![PathBuf::from("/workspace/.env")],
346      };
347  
348      assert_eq!(context.workspace_root, context.package_root);
349      assert_eq!(context.package_name, None);
350  }
351  
352  #[test]
353  fn test_package_info_relative_path_dots() {
354      let info = PackageInfo {
355          root: PathBuf::from("/path/../../package"),
356          name: Some("pkg".into()),
357          relative_path: "../../package".into(),
358      };
359  
360      assert_eq!(info.relative_path.as_str(), "../../package");
361  }
362  
363  #[test]
364  fn test_workspace_context_many_env_files() {
365      let mut env_files = Vec::new();
366      for i in 0..10 {
367          env_files.push(PathBuf::from(format!("/workspace/pkg/.env.{}", i)));
368      }
369  
370      let context = WorkspaceContext {
371          workspace_root: PathBuf::from("/workspace"),
372          package_root: PathBuf::from("/workspace/pkg"),
373          package_name: Some("pkg".into()),
374          env_files,
375      };
376  
377      assert_eq!(context.env_files.len(), 10);
378  }
379  
380  #[test]
381  fn test_package_info_with_windows_path() {
382      #[cfg(windows)]
383      let info = PackageInfo {
384          root: PathBuf::from(r"C:\workspace\package"),
385          name: Some("pkg".into()),
386          relative_path: "package".into(),
387      };
388  
389      #[cfg(windows)]
390      {
391          assert_eq!(info.root, PathBuf::from(r"C:\workspace\package"));
392      }
393  }
394  
395  #[test]
396  fn test_package_info_empty_name() {
397      let info = PackageInfo {
398          root: PathBuf::from("/path/pkg"),
399          name: Some("".into()),
400          relative_path: "pkg".into(),
401      };
402  
403      assert_eq!(info.name.as_deref(), Some(""));
404  }