/ tests / config_tests.rs
config_tests.rs
  1  use abundantis::config::{
  2      AbundantisConfig, CacheConfig, FileMergeMode, FileResolutionConfig, InterpolationConfig,
  3      InterpolationFeatures, MonorepoProviderType, ResolutionConfig, SourcePrecedence,
  4      WorkspaceConfig,
  5  };
  6  
  7  #[test]
  8  fn test_workspace_config_default() {
  9      let config = WorkspaceConfig::default();
 10      assert_eq!(config.provider, None);
 11      assert!(!config.cascading);
 12      assert!(config.roots.is_empty());
 13      assert_eq!(config.roots.len(), 0);
 14      assert_eq!(config.env_files.len(), 4);
 15      assert_eq!(config.ignores.len(), 5);
 16  }
 17  
 18  #[test]
 19  fn test_workspace_config_env_files_default() {
 20      let config = WorkspaceConfig::default();
 21      assert_eq!(config.env_files[0].as_str(), ".env");
 22      assert_eq!(config.env_files[1].as_str(), ".env.local");
 23      assert_eq!(config.env_files[2].as_str(), ".env.development");
 24      assert_eq!(config.env_files[3].as_str(), ".env.production");
 25  }
 26  
 27  #[test]
 28  fn test_workspace_config_ignores_default() {
 29      let config = WorkspaceConfig::default();
 30      assert!(config.ignores.contains(&"**/node_modules/**".into()));
 31      assert!(config.ignores.contains(&"**/.git/**".into()));
 32      assert!(config.ignores.contains(&"**/target/**".into()));
 33      assert!(config.ignores.contains(&"**/dist/**".into()));
 34      assert!(config.ignores.contains(&"**/build/**".into()));
 35  }
 36  
 37  #[test]
 38  fn test_resolution_config_default() {
 39      let config = ResolutionConfig::default();
 40      assert_eq!(config.precedence.len(), 2);
 41      assert_eq!(config.precedence[0], SourcePrecedence::Shell);
 42      assert_eq!(config.precedence[1], SourcePrecedence::File);
 43      assert!(config.type_check);
 44  }
 45  
 46  #[test]
 47  fn test_resolution_config_file_merge_default() {
 48      let config = ResolutionConfig::default();
 49      assert_eq!(config.files.mode, FileMergeMode::Merge);
 50      assert_eq!(config.files.order.len(), 2);
 51      assert_eq!(config.files.order[0].as_str(), ".env");
 52      assert_eq!(config.files.order[1].as_str(), ".env.local");
 53  }
 54  
 55  #[test]
 56  fn test_interpolation_config_default() {
 57      let config = InterpolationConfig::default();
 58      assert!(config.enabled);
 59      assert_eq!(config.max_depth, 64);
 60  }
 61  
 62  #[test]
 63  fn test_interpolation_features_default() {
 64      let config = InterpolationConfig::default();
 65      assert!(config.features.defaults);
 66      assert!(config.features.alternates);
 67      assert!(config.features.recursion);
 68      assert!(!config.features.commands);
 69  }
 70  
 71  #[test]
 72  fn test_cache_config_default() {
 73      let config = CacheConfig::default();
 74      assert!(config.enabled);
 75      assert_eq!(config.hot_cache_size, 1000);
 76      assert_eq!(config.ttl, std::time::Duration::from_secs(300));
 77  }
 78  
 79  #[test]
 80  fn test_abundantis_config_default() {
 81      let config = AbundantisConfig::default();
 82      assert_eq!(config.workspace.provider, None);
 83      assert!(config.interpolation.enabled);
 84      assert!(config.cache.enabled);
 85  }
 86  
 87  #[test]
 88  fn test_monorepo_provider_types() {
 89      let providers = [
 90          MonorepoProviderType::Turbo,
 91          MonorepoProviderType::Nx,
 92          MonorepoProviderType::Lerna,
 93          MonorepoProviderType::Pnpm,
 94          MonorepoProviderType::Npm,
 95          MonorepoProviderType::Yarn,
 96          MonorepoProviderType::Cargo,
 97          MonorepoProviderType::Custom,
 98      ];
 99  
100      assert_eq!(providers.len(), 8);
101  }
102  
103  #[test]
104  fn test_source_precedence_types() {
105      let precedences = [
106          SourcePrecedence::Shell,
107          SourcePrecedence::File,
108          SourcePrecedence::Remote,
109      ];
110  
111      assert_eq!(precedences.len(), 3);
112  }
113  
114  #[test]
115  fn test_file_merge_mode_types() {
116      assert_eq!(FileMergeMode::Merge, FileMergeMode::Merge);
117      assert_eq!(FileMergeMode::Override, FileMergeMode::Override);
118      assert_ne!(FileMergeMode::Merge, FileMergeMode::Override);
119  }
120  
121  #[test]
122  fn test_workspace_config_with_provider() {
123      let config = WorkspaceConfig {
124          provider: Some(MonorepoProviderType::Turbo),
125          ..Default::default()
126      };
127  
128      assert_eq!(config.provider, Some(MonorepoProviderType::Turbo));
129  }
130  
131  #[test]
132  fn test_workspace_config_with_cascading() {
133      let config = WorkspaceConfig {
134          cascading: true,
135          ..Default::default()
136      };
137  
138      assert!(config.cascading);
139  }
140  
141  #[test]
142  fn test_workspace_config_with_custom_roots() {
143      let config = WorkspaceConfig {
144          roots: vec!["apps/*".into(), "packages/*".into()],
145          ..Default::default()
146      };
147  
148      assert_eq!(config.roots.len(), 2);
149      assert_eq!(config.roots[0].as_str(), "apps/*");
150      assert_eq!(config.roots[1].as_str(), "packages/*");
151  }
152  
153  #[test]
154  fn test_workspace_config_with_env_files() {
155      let config = WorkspaceConfig {
156          env_files: vec![".env".into(), ".env.production".into()],
157          ..Default::default()
158      };
159  
160      assert_eq!(config.env_files.len(), 2);
161  }
162  
163  #[test]
164  fn test_resolution_config_with_precedence() {
165      let config = ResolutionConfig {
166          precedence: vec![SourcePrecedence::File, SourcePrecedence::Shell],
167          ..Default::default()
168      };
169  
170      assert_eq!(config.precedence.len(), 2);
171      assert_eq!(config.precedence[0], SourcePrecedence::File);
172      assert_eq!(config.precedence[1], SourcePrecedence::Shell);
173  }
174  
175  #[test]
176  fn test_resolution_config_without_type_check() {
177      let config = ResolutionConfig {
178          type_check: false,
179          ..Default::default()
180      };
181  
182      assert!(!config.type_check);
183  }
184  
185  #[test]
186  fn test_file_resolution_config_with_mode() {
187      let config = FileResolutionConfig {
188          mode: FileMergeMode::Override,
189          ..Default::default()
190      };
191  
192      assert_eq!(config.mode, FileMergeMode::Override);
193  }
194  
195  #[test]
196  fn test_file_resolution_config_with_order() {
197      let config = FileResolutionConfig {
198          order: vec![".env.production".into(), ".env".into()],
199          ..Default::default()
200      };
201  
202      assert_eq!(config.order.len(), 2);
203      assert_eq!(config.order[0].as_str(), ".env.production");
204  }
205  
206  #[test]
207  fn test_interpolation_config_disabled() {
208      let config = InterpolationConfig {
209          enabled: false,
210          ..Default::default()
211      };
212  
213      assert!(!config.enabled);
214  }
215  
216  #[test]
217  fn test_interpolation_config_with_max_depth() {
218      let config = InterpolationConfig {
219          max_depth: 100,
220          ..Default::default()
221      };
222  
223      assert_eq!(config.max_depth, 100);
224  }
225  
226  #[test]
227  fn test_interpolation_features_with_commands() {
228      let config = InterpolationFeatures {
229          commands: true,
230          ..Default::default()
231      };
232  
233      assert!(config.commands);
234  }
235  
236  #[test]
237  fn test_interpolation_features_all_enabled() {
238      let config = InterpolationFeatures {
239          defaults: true,
240          alternates: true,
241          recursion: true,
242          commands: true,
243      };
244  
245      assert!(config.defaults);
246      assert!(config.alternates);
247      assert!(config.recursion);
248      assert!(config.commands);
249  }
250  
251  #[test]
252  fn test_cache_config_disabled() {
253      let config = CacheConfig {
254          enabled: false,
255          ..Default::default()
256      };
257  
258      assert!(!config.enabled);
259  }
260  
261  #[test]
262  fn test_cache_config_with_hot_cache_size() {
263      let config = CacheConfig {
264          hot_cache_size: 500,
265          ..Default::default()
266      };
267  
268      assert_eq!(config.hot_cache_size, 500);
269  }
270  
271  #[test]
272  fn test_cache_config_with_ttl() {
273      let config = CacheConfig {
274          ttl: std::time::Duration::from_secs(600),
275          ..Default::default()
276      };
277  
278      assert_eq!(config.ttl, std::time::Duration::from_secs(600));
279  }
280  
281  #[test]
282  fn test_source_precedence_equality() {
283      assert_eq!(SourcePrecedence::Shell, SourcePrecedence::Shell);
284      assert_eq!(SourcePrecedence::File, SourcePrecedence::File);
285      assert_eq!(SourcePrecedence::Remote, SourcePrecedence::Remote);
286  
287      assert_ne!(SourcePrecedence::Shell, SourcePrecedence::File);
288      assert_ne!(SourcePrecedence::File, SourcePrecedence::Remote);
289  }
290  
291  #[test]
292  fn test_monorepo_provider_type_hash() {
293      use std::collections::HashSet;
294      let mut set = HashSet::new();
295      set.insert(MonorepoProviderType::Turbo);
296      set.insert(MonorepoProviderType::Nx);
297      set.insert(MonorepoProviderType::Lerna);
298      set.insert(MonorepoProviderType::Pnpm);
299      set.insert(MonorepoProviderType::Npm);
300      set.insert(MonorepoProviderType::Yarn);
301      set.insert(MonorepoProviderType::Cargo);
302      set.insert(MonorepoProviderType::Custom);
303  
304      assert_eq!(set.len(), 8);
305  }
306  
307  #[test]
308  fn test_config_clone() {
309      let config = AbundantisConfig::default();
310      let cloned = config.clone();
311  
312      assert_eq!(config.workspace.provider, cloned.workspace.provider);
313      assert_eq!(
314          config.interpolation.max_depth,
315          cloned.interpolation.max_depth
316      );
317  }
318  
319  #[test]
320  fn test_workspace_config_with_multiple_roots() {
321      let config = WorkspaceConfig {
322          roots: vec!["apps/*".into(), "packages/*".into(), "services/*".into()],
323          ..Default::default()
324      };
325  
326      assert_eq!(config.roots.len(), 3);
327  }
328  
329  #[test]
330  fn test_resolution_config_with_multiple_precedence() {
331      let config = ResolutionConfig {
332          precedence: vec![
333              SourcePrecedence::Remote,
334              SourcePrecedence::Shell,
335              SourcePrecedence::File,
336          ],
337          ..Default::default()
338      };
339  
340      assert_eq!(config.precedence.len(), 3);
341      assert_eq!(config.precedence[0], SourcePrecedence::Remote);
342  }
343  
344  #[test]
345  fn test_interpolation_config_zero_max_depth() {
346      let config = InterpolationConfig {
347          max_depth: 0,
348          ..Default::default()
349      };
350  
351      assert_eq!(config.max_depth, 0);
352  }
353  
354  #[test]
355  fn test_cache_config_zero_ttl() {
356      let config = CacheConfig {
357          ttl: std::time::Duration::from_secs(0),
358          ..Default::default()
359      };
360  
361      assert_eq!(config.ttl, std::time::Duration::ZERO);
362  }
363  
364  #[test]
365  fn test_interpolation_features_all_disabled() {
366      let config = InterpolationFeatures {
367          defaults: false,
368          alternates: false,
369          recursion: false,
370          commands: false,
371      };
372  
373      assert!(!config.defaults);
374      assert!(!config.alternates);
375      assert!(!config.recursion);
376      assert!(!config.commands);
377  }
378  
379  #[test]
380  fn test_file_resolution_config_multiple_order() {
381      let config = FileResolutionConfig {
382          order: vec![
383              ".env.production".into(),
384              ".env.staging".into(),
385              ".env.development".into(),
386              ".env.local".into(),
387              ".env".into(),
388          ],
389          ..Default::default()
390      };
391  
392      assert_eq!(config.order.len(), 5);
393  }
394  
395  #[test]
396  fn test_cache_config_large_hot_cache() {
397      let config = CacheConfig {
398          hot_cache_size: 10000,
399          ..Default::default()
400      };
401  
402      assert_eq!(config.hot_cache_size, 10000);
403  }
404  
405  #[test]
406  fn test_workspace_config_with_ignores() {
407      let config = WorkspaceConfig {
408          ignores: vec![
409              "**/node_modules/**".into(),
410              "**/.next/**".into(),
411              "**/dist/**".into(),
412          ],
413          ..Default::default()
414      };
415  
416      assert_eq!(config.ignores.len(), 3);
417  }
418  
419  #[test]
420  fn test_source_precedence_copy() {
421      let p1 = SourcePrecedence::Shell;
422      let p2 = p1;
423      assert_eq!(p1, p2);
424  }
425  
426  #[test]
427  fn test_monorepo_provider_copy() {
428      let p1 = MonorepoProviderType::Turbo;
429      let p2 = p1;
430      assert_eq!(p1, p2);
431  }
432  
433  #[test]
434  fn test_file_merge_mode_copy() {
435      let m1 = FileMergeMode::Merge;
436      let m2 = m1;
437      assert_eq!(m1, m2);
438  }
439  
440  #[test]
441  fn test_config_default_all_modules() {
442      let config = AbundantisConfig::default();
443      assert!(!config.workspace.env_files.is_empty());
444      assert!(!config.workspace.ignores.is_empty());
445      assert!(!config.resolution.precedence.is_empty());
446      assert!(config.interpolation.enabled);
447      assert!(config.cache.enabled);
448  }