/ tests / memory_source_tests.rs
memory_source_tests.rs
  1  use abundantis::source::{EnvSource, MemorySource, Priority, SourceCapabilities, SourceType};
  2  
  3  #[test]
  4  fn test_memory_source_creation() {
  5      let source = MemorySource::new();
  6      assert_eq!(source.id().as_str(), "memory");
  7      assert_eq!(source.source_type(), SourceType::Memory);
  8      assert_eq!(source.priority(), Priority::MEMORY);
  9  }
 10  
 11  #[test]
 12  fn test_memory_source_default() {
 13      let source = MemorySource::default();
 14      assert_eq!(source.id().as_str(), "memory");
 15  }
 16  
 17  #[test]
 18  fn test_memory_source_capabilities() {
 19      let source = MemorySource::new();
 20      let caps = source.capabilities();
 21  
 22      assert!(caps.contains(SourceCapabilities::READ));
 23      assert!(caps.contains(SourceCapabilities::WRITE));
 24      assert!(caps.contains(SourceCapabilities::CACHEABLE));
 25      assert!(!caps.contains(SourceCapabilities::WATCH));
 26      assert!(!caps.contains(SourceCapabilities::ASYNC_ONLY));
 27  }
 28  
 29  #[test]
 30  fn test_memory_source_set() {
 31      let source = MemorySource::new();
 32  
 33      source.set("KEY1", "value1");
 34      source.set("KEY2", "value2");
 35      source.set("KEY3", "value3");
 36  
 37      let snapshot = source.load().unwrap();
 38      assert_eq!(snapshot.variables.len(), 3);
 39  
 40      let keys: Vec<_> = snapshot.variables.iter().map(|v| v.key.as_str()).collect();
 41      assert!(keys.contains(&"KEY1"));
 42      assert!(keys.contains(&"KEY2"));
 43      assert!(keys.contains(&"KEY3"));
 44  }
 45  
 46  #[test]
 47  fn test_memory_source_set_with_description() {
 48      let source = MemorySource::new();
 49  
 50      source.set_with_description("API_KEY", "secret-value", "External API key for production");
 51  
 52      let snapshot = source.load().unwrap();
 53      assert_eq!(snapshot.variables.len(), 1);
 54      assert_eq!(snapshot.variables[0].key.as_str(), "API_KEY");
 55      assert_eq!(snapshot.variables[0].raw_value.as_str(), "secret-value");
 56      assert_eq!(
 57          snapshot.variables[0].description.as_deref(),
 58          Some("External API key for production")
 59      );
 60  }
 61  
 62  #[test]
 63  fn test_memory_source_remove() {
 64      let source = MemorySource::new();
 65  
 66      source.set("KEY1", "value1");
 67      source.set("KEY2", "value2");
 68      assert_eq!(source.len(), 2);
 69  
 70      let removed = source.remove("KEY1");
 71      assert!(removed.is_some());
 72      assert_eq!(removed.unwrap().key.as_str(), "KEY1");
 73      assert_eq!(source.len(), 1);
 74  }
 75  
 76  #[test]
 77  fn test_memory_source_remove_nonexistent() {
 78      let source = MemorySource::new();
 79  
 80      source.set("KEY1", "value1");
 81  
 82      let removed = source.remove("KEY2");
 83      assert!(removed.is_none());
 84      assert_eq!(source.len(), 1);
 85  }
 86  
 87  #[test]
 88  fn test_memory_source_clear() {
 89      let source = MemorySource::new();
 90  
 91      source.set("KEY1", "value1");
 92      source.set("KEY2", "value2");
 93      source.set("KEY3", "value3");
 94      assert_eq!(source.len(), 3);
 95  
 96      source.clear();
 97      assert_eq!(source.len(), 0);
 98      assert!(source.is_empty());
 99  }
100  
101  #[test]
102  fn test_memory_source_is_empty() {
103      let source = MemorySource::new();
104      assert!(source.is_empty());
105  
106      source.set("KEY1", "value1");
107      assert!(!source.is_empty());
108  }
109  
110  #[test]
111  fn test_memory_source_len() {
112      let source = MemorySource::new();
113      assert_eq!(source.len(), 0);
114  
115      for i in 0..100 {
116          source.set(format!("KEY{}", i), format!("value{}", i));
117      }
118  
119      assert_eq!(source.len(), 100);
120  }
121  
122  #[test]
123  fn test_memory_source_overwrite() {
124      let source = MemorySource::new();
125  
126      source.set("KEY1", "value1");
127      source.set("KEY2", "value2");
128  
129      source.set("KEY1", "value1-updated");
130  
131      let snapshot = source.load().unwrap();
132      assert_eq!(snapshot.variables.len(), 2);
133  
134      let key1 = snapshot
135          .variables
136          .iter()
137          .find(|v| v.key.as_str() == "KEY1")
138          .unwrap();
139      assert_eq!(key1.raw_value.as_str(), "value1-updated");
140  }
141  
142  #[test]
143  fn test_memory_source_version_tracking() {
144      let source = MemorySource::new();
145  
146      let snapshot1 = source.load().unwrap();
147      let v1 = snapshot1.version.unwrap();
148  
149      source.set("KEY1", "value1");
150      let snapshot2 = source.load().unwrap();
151      let v2 = snapshot2.version.unwrap();
152  
153      assert!(v2 > v1);
154  
155      source.set("KEY2", "value2");
156      let snapshot3 = source.load().unwrap();
157      let v3 = snapshot3.version.unwrap();
158  
159      assert!(v3 > v2);
160  }
161  
162  #[test]
163  fn test_memory_source_load() {
164      let source = MemorySource::new();
165  
166      source.set("KEY1", "value1");
167      source.set("KEY2", "value2");
168      source.set("KEY3", "value3");
169  
170      let snapshot = source.load().unwrap();
171      assert_eq!(snapshot.variables.len(), 3);
172      assert_eq!(snapshot.source_id.as_str(), "memory");
173      assert!(snapshot.timestamp.elapsed().as_secs() < 1);
174      assert!(snapshot.version.is_some());
175  }
176  
177  #[test]
178  fn test_memory_source_has_changed() {
179      let source = MemorySource::new();
180  
181      assert!(source.has_changed());
182  }
183  
184  #[test]
185  fn test_memory_source_invalidate() {
186      let source = MemorySource::new();
187  
188      source.set("KEY1", "value1");
189      assert_eq!(source.len(), 1);
190  
191      source.invalidate();
192  
193      assert_eq!(source.len(), 1);
194  }
195  
196  #[test]
197  fn test_memory_source_empty_load() {
198      let source = MemorySource::new();
199  
200      let snapshot = source.load().unwrap();
201      assert_eq!(snapshot.variables.len(), 0);
202      assert_eq!(snapshot.version.unwrap(), 0);
203  }
204  
205  #[test]
206  fn test_memory_source_special_characters() {
207      let source = MemorySource::new();
208  
209      source.set("KEY-WITH-DASHES", "value");
210      source.set("KEY_WITH_UNDERSCORE", "value");
211      source.set("key.with.dots", "value");
212  
213      let snapshot = source.load().unwrap();
214      assert_eq!(snapshot.variables.len(), 3);
215  }
216  
217  #[test]
218  fn test_memory_source_large_values() {
219      let source = MemorySource::new();
220  
221      let large_value = "a".repeat(10000);
222      source.set("LARGE_KEY", large_value.clone());
223  
224      let snapshot = source.load().unwrap();
225      assert_eq!(snapshot.variables.len(), 1);
226      assert_eq!(snapshot.variables[0].raw_value.len(), 10000);
227  }
228  
229  #[test]
230  fn test_memory_source_unicode() {
231      let source = MemorySource::new();
232  
233      source.set("UNICODE_KEY", "日本語");
234      source.set("EMOJI_KEY", "🌽");
235      source.set("ARABIC_KEY", "مرحبا");
236  
237      let snapshot = source.load().unwrap();
238      assert_eq!(snapshot.variables.len(), 3);
239  }
240  
241  #[test]
242  fn test_memory_source_order_preserved() {
243      let source = MemorySource::new();
244  
245      for i in 0..10 {
246          source.set(format!("KEY{}", i), format!("value{}", i));
247      }
248  
249      let snapshot = source.load().unwrap();
250      assert_eq!(snapshot.variables.len(), 10);
251  
252      for (i, var) in snapshot.variables.iter().enumerate() {
253          assert_eq!(var.key.as_str(), format!("KEY{}", i));
254          assert_eq!(var.raw_value.as_str(), format!("value{}", i));
255      }
256  }
257  
258  #[test]
259  fn test_memory_source_many_operations() {
260      let source = MemorySource::new();
261  
262      for i in 0..1000 {
263          source.set(format!("KEY{}", i), format!("value{}", i));
264      }
265  
266      assert_eq!(source.len(), 1000);
267  
268      for i in 0..1000 {
269          if i % 2 == 0 {
270              source.remove(&format!("KEY{}", i));
271          }
272      }
273  
274      assert_eq!(source.len(), 500);
275  }
276  
277  #[test]
278  fn test_memory_source_set_after_load() {
279      let source = MemorySource::new();
280  
281      source.set("KEY1", "value1");
282      let snapshot1 = source.load().unwrap();
283      assert_eq!(snapshot1.variables.len(), 1);
284  
285      source.set("KEY2", "value2");
286      let snapshot2 = source.load().unwrap();
287      assert_eq!(snapshot2.variables.len(), 2);
288  }
289  
290  #[test]
291  fn test_memory_source_remove_and_set() {
292      let source = MemorySource::new();
293  
294      source.set("KEY1", "value1");
295      source.set("KEY2", "value2");
296  
297      source.remove("KEY1");
298      assert_eq!(source.len(), 1);
299  
300      source.set("KEY1", "new-value");
301      assert_eq!(source.len(), 2);
302  }
303  
304  #[test]
305  fn test_memory_source_clone_behavior() {
306      let source1 = MemorySource::new();
307      let source2 = MemorySource::new();
308  
309      source1.set("KEY1", "value1");
310      source2.set("KEY2", "value2");
311  
312      let snapshot1 = source1.load().unwrap();
313      let snapshot2 = source2.load().unwrap();
314  
315      assert_eq!(snapshot1.variables.len(), 1);
316      assert_eq!(snapshot2.variables.len(), 1);
317      assert_ne!(
318          snapshot1.variables[0].key.as_str(),
319          snapshot2.variables[0].key.as_str()
320      );
321  }
322  
323  #[test]
324  fn test_memory_source_metadata() {
325      let source = MemorySource::new();
326      let metadata = source.metadata();
327  
328      assert_eq!(metadata.display_name, None);
329      assert_eq!(metadata.description, None);
330      assert_eq!(metadata.error_count, 0);
331      assert!(metadata.last_refreshed.is_none());
332  }
333  
334  #[test]
335  fn test_memory_source_value_types() {
336      let source = MemorySource::new();
337  
338      source.set("STRING_KEY", "string");
339      source.set("NUMERIC_KEY", "12345");
340      source.set("EMPTY_KEY", "");
341      source.set("WHITESPACE_KEY", "   ");
342  
343      let snapshot = source.load().unwrap();
344      assert_eq!(snapshot.variables.len(), 4);
345  }
346  
347  #[test]
348  fn test_memory_source_key_case_sensitivity() {
349      let source = MemorySource::new();
350  
351      source.set("lowercase_key", "value1");
352      source.set("UPPERCASE_KEY", "value2");
353      source.set("MixedCase_Key", "value3");
354  
355      let snapshot = source.load().unwrap();
356      assert_eq!(snapshot.variables.len(), 3);
357  
358      let keys: Vec<_> = snapshot.variables.iter().map(|v| v.key.as_str()).collect();
359      assert!(keys.contains(&"lowercase_key"));
360      assert!(keys.contains(&"UPPERCASE_KEY"));
361      assert!(keys.contains(&"MixedCase_Key"));
362  }