1use crate::errors::{ErrorKind, NitriteError, NitriteResult};
2use crate::migration::{InstructionSet, InstructionType};
3use std::any::Any;
4use std::collections::VecDeque;
5use std::sync::atomic::AtomicBool;
6use std::sync::{Arc, Mutex};
7
8type AnyArg = Arc<dyn Any + Send + Sync>;
10type MigrateFn = Box<dyn Fn(&InstructionSet) -> NitriteResult<()> + Send + Sync>;
12
13#[derive(Clone)]
32pub struct MigrationStep {
33 pub instruction_type: InstructionType,
34 pub collection_name: Option<String>,
35 pub entity_name: Option<String>,
36 pub key: Option<String>,
37 pub arguments: MigrationArguments,
38}
39
40impl std::fmt::Debug for MigrationStep {
41 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
42 f.debug_struct("MigrationStep")
43 .field("instruction_type", &self.instruction_type)
44 .field("collection_name", &self.collection_name)
45 .field("entity_name", &self.entity_name)
46 .field("key", &self.key)
47 .field("arguments", &"<arguments>")
48 .finish()
49 }
50}
51
52#[derive(Clone)]
72pub enum MigrationArguments {
73 None,
74 Single(Arc<dyn Any + Send + Sync>),
75 Double(Arc<dyn Any + Send + Sync>, Arc<dyn Any + Send + Sync>),
76 Triple(Arc<dyn Any + Send + Sync>, Arc<dyn Any + Send + Sync>, Arc<dyn Any + Send + Sync>),
77 Quad(Arc<dyn Any + Send + Sync>, Arc<dyn Any + Send + Sync>, Arc<dyn Any + Send + Sync>, Arc<dyn Any + Send + Sync>),
78 Multiple(Vec<Arc<dyn Any + Send + Sync>>),
79}
80
81impl std::fmt::Debug for MigrationArguments {
82 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
83 match self {
84 MigrationArguments::None => write!(f, "None"),
85 MigrationArguments::Single(_) => write!(f, "Single(<value>)"),
86 MigrationArguments::Double(_, _) => write!(f, "Double(<value>, <value>)"),
87 MigrationArguments::Triple(_, _, _) => write!(f, "Triple(<value>, <value>, <value>)"),
88 MigrationArguments::Quad(_, _, _, _) => write!(f, "Quad(<value>, <value>, <value>, <value>)"),
89 MigrationArguments::Multiple(_) => write!(f, "Multiple(<values>)"),
90 }
91 }
92}
93
94impl MigrationArguments {
95 pub fn as_single<T: Any + Send + Sync + Clone + 'static>(&self) -> NitriteResult<T> {
104 match self {
105 MigrationArguments::Single(arg) => {
106 arg.downcast_ref::<T>()
107 .cloned()
108 .ok_or_else(|| NitriteError::new(
109 "Failed to downcast single argument",
110 ErrorKind::ValidationError,
111 ))
112 }
113 _ => Err(NitriteError::new(
114 "Expected single argument",
115 ErrorKind::ValidationError,
116 )),
117 }
118 }
119
120 pub fn as_double<T1, T2>(&self) -> NitriteResult<(T1, T2)>
130 where
131 T1: Any + Send + Sync + Clone + 'static,
132 T2: Any + Send + Sync + Clone + 'static,
133 {
134 match self {
135 MigrationArguments::Double(arg1, arg2) => {
136 let a = arg1.downcast_ref::<T1>()
137 .cloned()
138 .ok_or_else(|| NitriteError::new(
139 "Failed to downcast first argument",
140 ErrorKind::ValidationError,
141 ))?;
142 let b = arg2.downcast_ref::<T2>()
143 .cloned()
144 .ok_or_else(|| NitriteError::new(
145 "Failed to downcast second argument",
146 ErrorKind::ValidationError,
147 ))?;
148 Ok((a, b))
149 }
150 _ => Err(NitriteError::new(
151 "Expected double arguments",
152 ErrorKind::ValidationError,
153 )),
154 }
155 }
156
157 pub fn as_triple<T1, T2, T3>(&self) -> NitriteResult<(T1, T2, T3)>
168 where
169 T1: Any + Send + Sync + Clone + 'static,
170 T2: Any + Send + Sync + Clone + 'static,
171 T3: Any + Send + Sync + Clone + 'static,
172 {
173 match self {
174 MigrationArguments::Triple(arg1, arg2, arg3) => {
175 let a = arg1.downcast_ref::<T1>()
176 .cloned()
177 .ok_or_else(|| NitriteError::new(
178 "Failed to downcast first argument",
179 ErrorKind::ValidationError,
180 ))?;
181 let b = arg2.downcast_ref::<T2>()
182 .cloned()
183 .ok_or_else(|| NitriteError::new(
184 "Failed to downcast second argument",
185 ErrorKind::ValidationError,
186 ))?;
187 let c = arg3.downcast_ref::<T3>()
188 .cloned()
189 .ok_or_else(|| NitriteError::new(
190 "Failed to downcast third argument",
191 ErrorKind::ValidationError,
192 ))?;
193 Ok((a, b, c))
194 }
195 _ => Err(NitriteError::new(
196 "Expected triple arguments",
197 ErrorKind::ValidationError,
198 )),
199 }
200 }
201
202 pub fn as_quad<T1, T2, T3, T4>(&self) -> NitriteResult<(T1, T2, T3, T4)>
214 where
215 T1: Any + Send + Sync + Clone + 'static,
216 T2: Any + Send + Sync + Clone + 'static,
217 T3: Any + Send + Sync + Clone + 'static,
218 T4: Any + Send + Sync + Clone + 'static,
219 {
220 match self {
221 MigrationArguments::Quad(arg1, arg2, arg3, arg4) => {
222 let a = arg1.downcast_ref::<T1>()
223 .cloned()
224 .ok_or_else(|| NitriteError::new(
225 "Failed to downcast first argument",
226 ErrorKind::ValidationError,
227 ))?;
228 let b = arg2.downcast_ref::<T2>()
229 .cloned()
230 .ok_or_else(|| NitriteError::new(
231 "Failed to downcast second argument",
232 ErrorKind::ValidationError,
233 ))?;
234 let c = arg3.downcast_ref::<T3>()
235 .cloned()
236 .ok_or_else(|| NitriteError::new(
237 "Failed to downcast third argument",
238 ErrorKind::ValidationError,
239 ))?;
240 let d = arg4.downcast_ref::<T4>()
241 .cloned()
242 .ok_or_else(|| NitriteError::new(
243 "Failed to downcast fourth argument",
244 ErrorKind::ValidationError,
245 ))?;
246 Ok((a, b, c, d))
247 }
248 _ => Err(NitriteError::new(
249 "Expected quad arguments",
250 ErrorKind::ValidationError,
251 )),
252 }
253 }
254
255 pub fn as_multiple<T: Any + Send + Sync + Clone + 'static>(&self) -> NitriteResult<Vec<T>> {
264 match self {
265 MigrationArguments::Multiple(args) => {
266 args.iter()
267 .map(|arg| {
268 arg.downcast_ref::<T>()
269 .cloned()
270 .ok_or_else(|| NitriteError::new(
271 "Failed to downcast argument in multiple",
272 ErrorKind::ValidationError,
273 ))
274 })
275 .collect()
276 }
277 _ => Err(NitriteError::new(
278 "Expected multiple arguments",
279 ErrorKind::ValidationError,
280 )),
281 }
282 }
283
284 pub fn as_any_single(&self) -> NitriteResult<Arc<dyn Any + Send + Sync>> {
290 match self {
291 MigrationArguments::Single(arg) => Ok(Arc::clone(arg)),
292 _ => Err(NitriteError::new(
293 "Expected single argument",
294 ErrorKind::ValidationError,
295 )),
296 }
297 }
298
299 pub fn as_any_double(&self) -> NitriteResult<(Arc<dyn Any + Send + Sync>, Arc<dyn Any + Send + Sync>)> {
305 match self {
306 MigrationArguments::Double(arg1, arg2) => Ok((Arc::clone(arg1), Arc::clone(arg2))),
307 _ => Err(NitriteError::new(
308 "Expected double arguments",
309 ErrorKind::ValidationError,
310 )),
311 }
312 }
313
314 pub fn as_any_triple(&self) -> NitriteResult<(AnyArg, AnyArg, AnyArg)> {
320 match self {
321 MigrationArguments::Triple(arg1, arg2, arg3) => Ok((Arc::clone(arg1), Arc::clone(arg2), Arc::clone(arg3))),
322 _ => Err(NitriteError::new(
323 "Expected triple arguments",
324 ErrorKind::ValidationError,
325 )),
326 }
327 }
328
329 pub fn as_any_multiple(&self) -> NitriteResult<Vec<Arc<dyn Any + Send + Sync>>> {
335 match self {
336 MigrationArguments::Multiple(args) => Ok(args.iter().map(Arc::clone).collect()),
337 _ => Err(NitriteError::new(
338 "Expected multiple arguments",
339 ErrorKind::ValidationError,
340 )),
341 }
342 }
343
344 pub fn arg_count(&self) -> usize {
349 match self {
350 MigrationArguments::None => 0,
351 MigrationArguments::Single(_) => 1,
352 MigrationArguments::Double(_, _) => 2,
353 MigrationArguments::Triple(_, _, _) => 3,
354 MigrationArguments::Quad(_, _, _, _) => 4,
355 MigrationArguments::Multiple(args) => args.len(),
356 }
357 }
358}
359
360#[derive(Debug, Clone)]
391pub struct Migration {
392 inner: Arc<MigrationInner>,
393}
394
395impl Migration {
396 pub fn new(from_version: u32, to_version: u32, migrate: impl Fn(&InstructionSet) -> NitriteResult<()> + Send + Sync + 'static) -> Self {
411 Migration {
412 inner: Arc::new(MigrationInner {
413 from_version,
414 to_version,
415 migration_steps: Mutex::new(VecDeque::new()),
416 executed: AtomicBool::new(false),
417 migrate: Box::new(migrate),
418 }),
419 }
420 }
421
422 pub fn from_version(&self) -> u32 {
427 self.inner.from_version
428 }
429
430 pub fn to_version(&self) -> u32 {
435 self.inner.to_version
436 }
437
438 pub fn steps(&self) -> NitriteResult<Vec<MigrationStep>> {
449 let executed = self.inner.executed.load(std::sync::atomic::Ordering::SeqCst);
450
451 if !executed {
452 self.execute()?;
453 }
454
455 let steps = self.inner.migration_steps.lock()
456 .map_err(|_| NitriteError::new("Failed to acquire lock on migration_steps", ErrorKind::ValidationError))?;
457 Ok(steps.iter().cloned().collect())
458 }
459
460 pub(crate) fn execute(&self) -> NitriteResult<()> {
472 let steps = self.get_all_steps()?;
473 let instruction_set = InstructionSet::new(steps);
474 (self.inner.migrate)(&instruction_set)?;
475
476 let new_steps = instruction_set.get_steps()?;
478 let mut migration_steps = self.inner.migration_steps.lock()
479 .map_err(|_| NitriteError::new("Failed to acquire lock on migration_steps", ErrorKind::ValidationError))?;
480 migration_steps.clear();
481 for step in new_steps {
482 migration_steps.push_back(step);
483 }
484
485 self.inner.executed.store(true, std::sync::atomic::Ordering::SeqCst);
486 Ok(())
487 }
488
489 pub(crate) fn add_step(&self, step: MigrationStep) -> NitriteResult<()> {
498 let mut steps = self.inner.migration_steps.lock()
499 .map_err(|_| NitriteError::new("Failed to acquire lock on migration_steps", ErrorKind::ValidationError))?;
500 steps.push_back(step);
501 Ok(())
502 }
503
504 pub(crate) fn get_all_steps(&self) -> NitriteResult<Vec<MigrationStep>> {
510 let steps = self.inner.migration_steps.lock()
511 .map_err(|_| NitriteError::new("Failed to acquire lock on migration_steps", ErrorKind::ValidationError))?;
512 Ok(steps.iter().cloned().collect())
513 }
514}
515
516pub struct MigrationInner {
528 from_version: u32,
529 to_version: u32,
530 migration_steps: Mutex<VecDeque<MigrationStep>>,
531 executed: AtomicBool,
532 migrate: MigrateFn,
533}
534
535impl std::fmt::Debug for MigrationInner {
536 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
537 f.debug_struct("MigrationInner")
538 .field("from_version", &self.from_version)
539 .field("to_version", &self.to_version)
540 .finish()
541 }
542}
543
544#[cfg(test)]
545mod tests {
546 use super::*;
547
548 #[test]
551 fn test_migration_step_creation() {
552 let step = MigrationStep {
554 instruction_type: InstructionType::AddUser,
555 collection_name: Some("users".to_string()),
556 entity_name: Some("User".to_string()),
557 key: Some("id".to_string()),
558 arguments: MigrationArguments::None,
559 };
560
561 assert_eq!(step.instruction_type, InstructionType::AddUser);
562 assert_eq!(step.collection_name, Some("users".to_string()));
563 assert_eq!(step.entity_name, Some("User".to_string()));
564 assert_eq!(step.key, Some("id".to_string()));
565 }
566
567 #[test]
568 fn test_migration_step_with_no_optional_fields() {
569 let step = MigrationStep {
571 instruction_type: InstructionType::CustomInstruction,
572 collection_name: None,
573 entity_name: None,
574 key: None,
575 arguments: MigrationArguments::None,
576 };
577
578 assert_eq!(step.collection_name, None);
579 assert_eq!(step.entity_name, None);
580 assert_eq!(step.key, None);
581 }
582
583 #[test]
584 fn test_migration_step_clone() {
585 let step = MigrationStep {
587 instruction_type: InstructionType::DropCollection,
588 collection_name: Some("test".to_string()),
589 entity_name: None,
590 key: None,
591 arguments: MigrationArguments::None,
592 };
593
594 let cloned = step.clone();
595 assert_eq!(cloned.instruction_type, step.instruction_type);
596 assert_eq!(cloned.collection_name, step.collection_name);
597 }
598
599 #[test]
600 fn test_migration_step_debug_format() {
601 let step = MigrationStep {
603 instruction_type: InstructionType::AddUser,
604 collection_name: Some("col".to_string()),
605 entity_name: None,
606 key: None,
607 arguments: MigrationArguments::None,
608 };
609
610 let debug_str = format!("{:?}", step);
611 assert!(debug_str.contains("MigrationStep"));
612 assert!(debug_str.contains("AddUser"));
613 }
614
615 #[test]
618 fn test_migration_arguments_none() {
619 let args = MigrationArguments::None;
621 assert_eq!(args.arg_count(), 0);
622 }
623
624 #[test]
625 fn test_migration_arguments_none_debug() {
626 let args = MigrationArguments::None;
628 let debug_str = format!("{:?}", args);
629 assert_eq!(debug_str, "None");
630 }
631
632 #[test]
633 fn test_migration_arguments_none_as_single_error() {
634 let args = MigrationArguments::None;
636 let result: NitriteResult<String> = args.as_single();
637 assert!(result.is_err());
638 }
639
640 #[test]
641 fn test_migration_arguments_none_as_double_error() {
642 let args = MigrationArguments::None;
644 let result: NitriteResult<(String, String)> = args.as_double();
645 assert!(result.is_err());
646 }
647
648 #[test]
649 fn test_migration_arguments_none_as_triple_error() {
650 let args = MigrationArguments::None;
652 let result: NitriteResult<(String, String, String)> = args.as_triple();
653 assert!(result.is_err());
654 }
655
656 #[test]
657 fn test_migration_arguments_none_as_quad_error() {
658 let args = MigrationArguments::None;
660 let result: NitriteResult<(String, String, String, String)> = args.as_quad();
661 assert!(result.is_err());
662 }
663
664 #[test]
665 fn test_migration_arguments_none_as_multiple_error() {
666 let args = MigrationArguments::None;
668 let result: NitriteResult<Vec<String>> = args.as_multiple();
669 assert!(result.is_err());
670 }
671
672 #[test]
673 fn test_migration_arguments_none_as_any_single_error() {
674 let args = MigrationArguments::None;
676 let result = args.as_any_single();
677 assert!(result.is_err());
678 }
679
680 #[test]
681 fn test_migration_arguments_none_as_any_double_error() {
682 let args = MigrationArguments::None;
684 let result = args.as_any_double();
685 assert!(result.is_err());
686 }
687
688 #[test]
689 fn test_migration_arguments_none_as_any_triple_error() {
690 let args = MigrationArguments::None;
692 let result = args.as_any_triple();
693 assert!(result.is_err());
694 }
695
696 #[test]
697 fn test_migration_arguments_none_as_any_multiple_error() {
698 let args = MigrationArguments::None;
700 let result = args.as_any_multiple();
701 assert!(result.is_err());
702 }
703
704 #[test]
707 fn test_migration_arguments_single_creation() {
708 let value = Arc::new("test" as &str);
710 let args = MigrationArguments::Single(value);
711 assert_eq!(args.arg_count(), 1);
712 }
713
714 #[test]
715 fn test_migration_arguments_single_as_single_success() {
716 let value = Arc::new("test".to_string());
718 let args = MigrationArguments::Single(value);
719 let result: NitriteResult<String> = args.as_single();
720 assert!(result.is_ok());
721 assert_eq!(result.unwrap(), "test".to_string());
722 }
723
724 #[test]
725 fn test_migration_arguments_single_as_single_type_mismatch() {
726 let value = Arc::new(42i32);
728 let args = MigrationArguments::Single(value);
729 let result: NitriteResult<String> = args.as_single();
730 assert!(result.is_err());
731 }
732
733 #[test]
734 fn test_migration_arguments_single_as_double_error() {
735 let value = Arc::new("test".to_string());
737 let args = MigrationArguments::Single(value);
738 let result: NitriteResult<(String, String)> = args.as_double();
739 assert!(result.is_err());
740 }
741
742 #[test]
743 fn test_migration_arguments_single_debug() {
744 let value = Arc::new("test".to_string());
746 let args = MigrationArguments::Single(value);
747 let debug_str = format!("{:?}", args);
748 assert_eq!(debug_str, "Single(<value>)");
749 }
750
751 #[test]
752 fn test_migration_arguments_single_as_any_single_success() {
753 let value = Arc::new("test".to_string());
755 let args = MigrationArguments::Single(value.clone());
756 let result = args.as_any_single();
757 assert!(result.is_ok());
758 }
759
760 #[test]
761 fn test_migration_arguments_single_clone() {
762 let value = Arc::new("test".to_string());
764 let args = MigrationArguments::Single(value);
765 let cloned = args.clone();
766 assert_eq!(cloned.arg_count(), 1);
767 }
768
769 #[test]
772 fn test_migration_arguments_double_creation() {
773 let arg1 = Arc::new("first".to_string());
775 let arg2 = Arc::new("second".to_string());
776 let args = MigrationArguments::Double(arg1, arg2);
777 assert_eq!(args.arg_count(), 2);
778 }
779
780 #[test]
781 fn test_migration_arguments_double_as_double_success() {
782 let arg1 = Arc::new("first".to_string());
784 let arg2 = Arc::new("second".to_string());
785 let args = MigrationArguments::Double(arg1, arg2);
786 let result: NitriteResult<(String, String)> = args.as_double();
787 assert!(result.is_ok());
788 let (a, b) = result.unwrap();
789 assert_eq!(a, "first".to_string());
790 assert_eq!(b, "second".to_string());
791 }
792
793 #[test]
794 fn test_migration_arguments_double_as_double_first_type_mismatch() {
795 let arg1 = Arc::new(42i32);
797 let arg2 = Arc::new("second".to_string());
798 let args = MigrationArguments::Double(arg1, arg2);
799 let result: NitriteResult<(String, String)> = args.as_double();
800 assert!(result.is_err());
801 }
802
803 #[test]
804 fn test_migration_arguments_double_as_double_second_type_mismatch() {
805 let arg1 = Arc::new("first".to_string());
807 let arg2 = Arc::new(42i32);
808 let args = MigrationArguments::Double(arg1, arg2);
809 let result: NitriteResult<(String, String)> = args.as_double();
810 assert!(result.is_err());
811 }
812
813 #[test]
814 fn test_migration_arguments_double_as_triple_error() {
815 let arg1 = Arc::new("first".to_string());
817 let arg2 = Arc::new("second".to_string());
818 let args = MigrationArguments::Double(arg1, arg2);
819 let result: NitriteResult<(String, String, String)> = args.as_triple();
820 assert!(result.is_err());
821 }
822
823 #[test]
824 fn test_migration_arguments_double_debug() {
825 let arg1 = Arc::new("first".to_string());
827 let arg2 = Arc::new("second".to_string());
828 let args = MigrationArguments::Double(arg1, arg2);
829 let debug_str = format!("{:?}", args);
830 assert_eq!(debug_str, "Double(<value>, <value>)");
831 }
832
833 #[test]
834 fn test_migration_arguments_double_as_any_double_success() {
835 let arg1 = Arc::new("first".to_string());
837 let arg2 = Arc::new("second".to_string());
838 let args = MigrationArguments::Double(arg1.clone(), arg2.clone());
839 let result = args.as_any_double();
840 assert!(result.is_ok());
841 }
842
843 #[test]
846 fn test_migration_arguments_triple_creation() {
847 let arg1 = Arc::new("first".to_string());
849 let arg2 = Arc::new("second".to_string());
850 let arg3 = Arc::new("third".to_string());
851 let args = MigrationArguments::Triple(arg1, arg2, arg3);
852 assert_eq!(args.arg_count(), 3);
853 }
854
855 #[test]
856 fn test_migration_arguments_triple_as_triple_success() {
857 let arg1 = Arc::new("first".to_string());
859 let arg2 = Arc::new("second".to_string());
860 let arg3 = Arc::new("third".to_string());
861 let args = MigrationArguments::Triple(arg1, arg2, arg3);
862 let result: NitriteResult<(String, String, String)> = args.as_triple();
863 assert!(result.is_ok());
864 let (a, b, c) = result.unwrap();
865 assert_eq!(a, "first".to_string());
866 assert_eq!(b, "second".to_string());
867 assert_eq!(c, "third".to_string());
868 }
869
870 #[test]
871 fn test_migration_arguments_triple_as_triple_first_type_mismatch() {
872 let arg1 = Arc::new(42i32);
874 let arg2 = Arc::new("second".to_string());
875 let arg3 = Arc::new("third".to_string());
876 let args = MigrationArguments::Triple(arg1, arg2, arg3);
877 let result: NitriteResult<(String, String, String)> = args.as_triple();
878 assert!(result.is_err());
879 }
880
881 #[test]
882 fn test_migration_arguments_triple_as_triple_second_type_mismatch() {
883 let arg1 = Arc::new("first".to_string());
885 let arg2 = Arc::new(42i32);
886 let arg3 = Arc::new("third".to_string());
887 let args = MigrationArguments::Triple(arg1, arg2, arg3);
888 let result: NitriteResult<(String, String, String)> = args.as_triple();
889 assert!(result.is_err());
890 }
891
892 #[test]
893 fn test_migration_arguments_triple_as_triple_third_type_mismatch() {
894 let arg1 = Arc::new("first".to_string());
896 let arg2 = Arc::new("second".to_string());
897 let arg3 = Arc::new(42i32);
898 let args = MigrationArguments::Triple(arg1, arg2, arg3);
899 let result: NitriteResult<(String, String, String)> = args.as_triple();
900 assert!(result.is_err());
901 }
902
903 #[test]
904 fn test_migration_arguments_triple_as_quad_error() {
905 let arg1 = Arc::new("first".to_string());
907 let arg2 = Arc::new("second".to_string());
908 let arg3 = Arc::new("third".to_string());
909 let args = MigrationArguments::Triple(arg1, arg2, arg3);
910 let result: NitriteResult<(String, String, String, String)> = args.as_quad();
911 assert!(result.is_err());
912 }
913
914 #[test]
915 fn test_migration_arguments_triple_debug() {
916 let arg1 = Arc::new("first".to_string());
918 let arg2 = Arc::new("second".to_string());
919 let arg3 = Arc::new("third".to_string());
920 let args = MigrationArguments::Triple(arg1, arg2, arg3);
921 let debug_str = format!("{:?}", args);
922 assert_eq!(debug_str, "Triple(<value>, <value>, <value>)");
923 }
924
925 #[test]
926 fn test_migration_arguments_triple_as_any_triple_success() {
927 let arg1 = Arc::new("first".to_string());
929 let arg2 = Arc::new("second".to_string());
930 let arg3 = Arc::new("third".to_string());
931 let args = MigrationArguments::Triple(arg1.clone(), arg2.clone(), arg3.clone());
932 let result = args.as_any_triple();
933 assert!(result.is_ok());
934 }
935
936 #[test]
939 fn test_migration_arguments_quad_creation() {
940 let arg1 = Arc::new("first".to_string());
942 let arg2 = Arc::new("second".to_string());
943 let arg3 = Arc::new("third".to_string());
944 let arg4 = Arc::new("fourth".to_string());
945 let args = MigrationArguments::Quad(arg1, arg2, arg3, arg4);
946 assert_eq!(args.arg_count(), 4);
947 }
948
949 #[test]
950 fn test_migration_arguments_quad_as_quad_success() {
951 let arg1 = Arc::new("first".to_string());
953 let arg2 = Arc::new("second".to_string());
954 let arg3 = Arc::new("third".to_string());
955 let arg4 = Arc::new("fourth".to_string());
956 let args = MigrationArguments::Quad(arg1, arg2, arg3, arg4);
957 let result: NitriteResult<(String, String, String, String)> = args.as_quad();
958 assert!(result.is_ok());
959 let (a, b, c, d) = result.unwrap();
960 assert_eq!(a, "first".to_string());
961 assert_eq!(b, "second".to_string());
962 assert_eq!(c, "third".to_string());
963 assert_eq!(d, "fourth".to_string());
964 }
965
966 #[test]
967 fn test_migration_arguments_quad_as_quad_first_type_mismatch() {
968 let arg1 = Arc::new(42i32);
970 let arg2 = Arc::new("second".to_string());
971 let arg3 = Arc::new("third".to_string());
972 let arg4 = Arc::new("fourth".to_string());
973 let args = MigrationArguments::Quad(arg1, arg2, arg3, arg4);
974 let result: NitriteResult<(String, String, String, String)> = args.as_quad();
975 assert!(result.is_err());
976 }
977
978 #[test]
979 fn test_migration_arguments_quad_as_quad_second_type_mismatch() {
980 let arg1 = Arc::new("first".to_string());
982 let arg2 = Arc::new(42i32);
983 let arg3 = Arc::new("third".to_string());
984 let arg4 = Arc::new("fourth".to_string());
985 let args = MigrationArguments::Quad(arg1, arg2, arg3, arg4);
986 let result: NitriteResult<(String, String, String, String)> = args.as_quad();
987 assert!(result.is_err());
988 }
989
990 #[test]
991 fn test_migration_arguments_quad_as_quad_third_type_mismatch() {
992 let arg1 = Arc::new("first".to_string());
994 let arg2 = Arc::new("second".to_string());
995 let arg3 = Arc::new(42i32);
996 let arg4 = Arc::new("fourth".to_string());
997 let args = MigrationArguments::Quad(arg1, arg2, arg3, arg4);
998 let result: NitriteResult<(String, String, String, String)> = args.as_quad();
999 assert!(result.is_err());
1000 }
1001
1002 #[test]
1003 fn test_migration_arguments_quad_as_quad_fourth_type_mismatch() {
1004 let arg1 = Arc::new("first".to_string());
1006 let arg2 = Arc::new("second".to_string());
1007 let arg3 = Arc::new("third".to_string());
1008 let arg4 = Arc::new(42i32);
1009 let args = MigrationArguments::Quad(arg1, arg2, arg3, arg4);
1010 let result: NitriteResult<(String, String, String, String)> = args.as_quad();
1011 assert!(result.is_err());
1012 }
1013
1014 #[test]
1015 fn test_migration_arguments_quad_as_multiple_error() {
1016 let arg1 = Arc::new("first".to_string());
1018 let arg2 = Arc::new("second".to_string());
1019 let arg3 = Arc::new("third".to_string());
1020 let arg4 = Arc::new("fourth".to_string());
1021 let args = MigrationArguments::Quad(arg1, arg2, arg3, arg4);
1022 let result: NitriteResult<Vec<String>> = args.as_multiple();
1023 assert!(result.is_err());
1024 }
1025
1026 #[test]
1027 fn test_migration_arguments_quad_debug() {
1028 let arg1 = Arc::new("first".to_string());
1030 let arg2 = Arc::new("second".to_string());
1031 let arg3 = Arc::new("third".to_string());
1032 let arg4 = Arc::new("fourth".to_string());
1033 let args = MigrationArguments::Quad(arg1, arg2, arg3, arg4);
1034 let debug_str = format!("{:?}", args);
1035 assert_eq!(debug_str, "Quad(<value>, <value>, <value>, <value>)");
1036 }
1037
1038 #[test]
1041 fn test_migration_arguments_multiple_empty() {
1042 let args = MigrationArguments::Multiple(vec![]);
1044 assert_eq!(args.arg_count(), 0);
1045 }
1046
1047 #[test]
1048 fn test_migration_arguments_multiple_single_item() {
1049 let arg = Arc::new("value".to_string());
1051 let args = MigrationArguments::Multiple(vec![arg]);
1052 assert_eq!(args.arg_count(), 1);
1053 }
1054
1055 #[test]
1056 fn test_migration_arguments_multiple_multiple_items() {
1057 let args_vec = vec![
1059 Arc::new("first".to_string()) as Arc<dyn Any + Send + Sync>,
1060 Arc::new("second".to_string()) as Arc<dyn Any + Send + Sync>,
1061 Arc::new("third".to_string()) as Arc<dyn Any + Send + Sync>,
1062 ];
1063 let args = MigrationArguments::Multiple(args_vec);
1064 assert_eq!(args.arg_count(), 3);
1065 }
1066
1067 #[test]
1068 fn test_migration_arguments_multiple_as_multiple_success() {
1069 let args_vec = vec![
1071 Arc::new("first".to_string()) as Arc<dyn Any + Send + Sync>,
1072 Arc::new("second".to_string()) as Arc<dyn Any + Send + Sync>,
1073 ];
1074 let args = MigrationArguments::Multiple(args_vec);
1075 let result: NitriteResult<Vec<String>> = args.as_multiple();
1076 assert!(result.is_ok());
1077 let values = result.unwrap();
1078 assert_eq!(values.len(), 2);
1079 assert_eq!(values[0], "first".to_string());
1080 assert_eq!(values[1], "second".to_string());
1081 }
1082
1083 #[test]
1084 fn test_migration_arguments_multiple_as_multiple_type_mismatch() {
1085 let args_vec = vec![
1087 Arc::new(42i32) as Arc<dyn Any + Send + Sync>,
1088 ];
1089 let args = MigrationArguments::Multiple(args_vec);
1090 let result: NitriteResult<Vec<String>> = args.as_multiple();
1091 assert!(result.is_err());
1092 }
1093
1094 #[test]
1095 fn test_migration_arguments_multiple_as_single_error() {
1096 let args_vec = vec![
1098 Arc::new("value".to_string()) as Arc<dyn Any + Send + Sync>,
1099 ];
1100 let args = MigrationArguments::Multiple(args_vec);
1101 let result: NitriteResult<String> = args.as_single();
1102 assert!(result.is_err());
1103 }
1104
1105 #[test]
1106 fn test_migration_arguments_multiple_debug() {
1107 let args_vec = vec![
1109 Arc::new("first".to_string()) as Arc<dyn Any + Send + Sync>,
1110 ];
1111 let args = MigrationArguments::Multiple(args_vec);
1112 let debug_str = format!("{:?}", args);
1113 assert_eq!(debug_str, "Multiple(<values>)");
1114 }
1115
1116 #[test]
1117 fn test_migration_arguments_multiple_as_any_multiple_success() {
1118 let args_vec = vec![
1120 Arc::new("first".to_string()) as Arc<dyn Any + Send + Sync>,
1121 Arc::new("second".to_string()) as Arc<dyn Any + Send + Sync>,
1122 ];
1123 let args = MigrationArguments::Multiple(args_vec);
1124 let result = args.as_any_multiple();
1125 assert!(result.is_ok());
1126 assert_eq!(result.unwrap().len(), 2);
1127 }
1128
1129 #[test]
1132 fn test_migration_new() {
1133 let migration = Migration::new(1, 2, |_| Ok(()));
1135 assert_eq!(migration.from_version(), 1);
1136 assert_eq!(migration.to_version(), 2);
1137 }
1138
1139 #[test]
1140 fn test_migration_from_version() {
1141 let migration = Migration::new(5, 10, |_| Ok(()));
1143 assert_eq!(migration.from_version(), 5);
1144 }
1145
1146 #[test]
1147 fn test_migration_to_version() {
1148 let migration = Migration::new(3, 7, |_| Ok(()));
1150 assert_eq!(migration.to_version(), 7);
1151 }
1152
1153 #[test]
1154 fn test_migration_add_step() {
1155 let migration = Migration::new(1, 2, |_| Ok(()));
1157
1158 let step = MigrationStep {
1159 instruction_type: InstructionType::AddUser,
1160 collection_name: None,
1161 entity_name: None,
1162 key: None,
1163 arguments: MigrationArguments::None,
1164 };
1165
1166 let result = migration.add_step(step);
1167 assert!(result.is_ok());
1168 }
1169
1170 #[test]
1171 fn test_migration_get_all_steps() {
1172 let migration = Migration::new(1, 2, |_| Ok(()));
1174
1175 let step = MigrationStep {
1176 instruction_type: InstructionType::ChangePassword,
1177 collection_name: None,
1178 entity_name: None,
1179 key: None,
1180 arguments: MigrationArguments::None,
1181 };
1182
1183 migration.add_step(step).unwrap();
1184 let steps = migration.get_all_steps().unwrap();
1185 assert_eq!(steps.len(), 1);
1186 assert_eq!(steps[0].instruction_type, InstructionType::ChangePassword);
1187 }
1188
1189 #[test]
1190 fn test_migration_get_all_steps_multiple() {
1191 let migration = Migration::new(1, 2, |_| Ok(()));
1193
1194 for i in 0..3 {
1195 let step = MigrationStep {
1196 instruction_type: if i == 0 { InstructionType::AddUser } else { InstructionType::ChangePassword },
1197 collection_name: None,
1198 entity_name: None,
1199 key: None,
1200 arguments: MigrationArguments::None,
1201 };
1202 migration.add_step(step).unwrap();
1203 }
1204
1205 let steps = migration.get_all_steps().unwrap();
1206 assert_eq!(steps.len(), 3);
1207 }
1208
1209 #[test]
1210 fn test_migration_execute_success() {
1211 let migration = Migration::new(1, 2, |_| Ok(()));
1213 let result = migration.execute();
1214 assert!(result.is_ok());
1215 }
1216
1217 #[test]
1218 fn test_migration_execute_with_error() {
1219 let migration = Migration::new(1, 2, |_| {
1221 Err(NitriteError::new("Test error", ErrorKind::ValidationError))
1222 });
1223 let result = migration.execute();
1224 assert!(result.is_err());
1225 }
1226
1227 #[test]
1228 fn test_migration_steps_lazy_execution() {
1229 let executed = Arc::new(Mutex::new(false));
1231 let executed_clone = executed.clone();
1232
1233 let migration = Migration::new(1, 2, move |_| {
1234 *executed_clone.lock().unwrap() = true;
1235 Ok(())
1236 });
1237
1238 let result = migration.steps();
1239 assert!(result.is_ok());
1240 assert!(*executed.lock().unwrap());
1241 }
1242
1243 #[test]
1244 fn test_migration_steps_cached() {
1245 let call_count = Arc::new(Mutex::new(0));
1247 let call_count_clone = call_count.clone();
1248
1249 let migration = Migration::new(1, 2, move |_| {
1250 *call_count_clone.lock().unwrap() += 1;
1251 Ok(())
1252 });
1253
1254 let _ = migration.steps();
1255 let _ = migration.steps();
1256
1257 assert_eq!(*call_count.lock().unwrap(), 1);
1259 }
1260
1261 #[test]
1262 fn test_migration_steps_with_steps() {
1263 let migration = Migration::new(1, 2, |_| Ok(()));
1265
1266 let step = MigrationStep {
1267 instruction_type: InstructionType::DropCollection,
1268 collection_name: Some("users".to_string()),
1269 entity_name: None,
1270 key: None,
1271 arguments: MigrationArguments::None,
1272 };
1273
1274 migration.add_step(step).unwrap();
1275 let steps = migration.steps().unwrap();
1276 assert_eq!(steps.len(), 1);
1277 assert_eq!(steps[0].instruction_type, InstructionType::DropCollection);
1278 assert_eq!(steps[0].collection_name, Some("users".to_string()));
1279 }
1280
1281 #[test]
1282 fn test_migration_steps_returns_error() {
1283 let migration = Migration::new(1, 2, |_| {
1285 Err(NitriteError::new("Exec error", ErrorKind::ValidationError))
1286 });
1287 let result = migration.steps();
1288 assert!(result.is_err());
1289 }
1290
1291 #[test]
1292 fn test_migration_clone() {
1293 let migration = Migration::new(1, 2, |_| Ok(()));
1295 let cloned = Migration {
1296 inner: Arc::clone(&migration.inner),
1297 };
1298
1299 assert_eq!(cloned.from_version(), 1);
1300 assert_eq!(cloned.to_version(), 2);
1301 }
1302
1303 #[test]
1304 fn test_migration_debug() {
1305 let migration = Migration::new(1, 2, |_| Ok(()));
1307 let debug_str = format!("{:?}", migration);
1308 assert!(debug_str.contains("Migration"));
1309 }
1310
1311 #[test]
1312 fn test_migration_inner_debug() {
1313 let migration = Migration::new(3, 4, |_| Ok(()));
1315 let debug_str = format!("{:?}", migration);
1316 assert!(debug_str.contains("3") || debug_str.contains("4"));
1317 }
1318
1319 #[test]
1322 fn test_migration_arguments_single_with_integer() {
1323 let value = Arc::new(42i32);
1325 let args = MigrationArguments::Single(value);
1326 let result: NitriteResult<i32> = args.as_single();
1327 assert!(result.is_ok());
1328 assert_eq!(result.unwrap(), 42);
1329 }
1330
1331 #[test]
1332 fn test_migration_arguments_double_with_mixed_types() {
1333 let arg1 = Arc::new("text".to_string());
1335 let arg2 = Arc::new(100i32);
1336 let args = MigrationArguments::Double(arg1, arg2);
1337 let result: NitriteResult<(String, i32)> = args.as_double();
1338 assert!(result.is_ok());
1339 let (text, num) = result.unwrap();
1340 assert_eq!(text, "text".to_string());
1341 assert_eq!(num, 100);
1342 }
1343
1344 #[test]
1345 fn test_migration_arguments_clone() {
1346 let none_args = MigrationArguments::None;
1348 let cloned_none = none_args.clone();
1349 assert_eq!(cloned_none.arg_count(), 0);
1350
1351 let single_args = MigrationArguments::Single(Arc::new("test".to_string()));
1352 let cloned_single = single_args.clone();
1353 assert_eq!(cloned_single.arg_count(), 1);
1354 }
1355
1356 #[test]
1357 fn test_migration_step_with_all_fields() {
1358 let step = MigrationStep {
1360 instruction_type: InstructionType::CustomInstruction,
1361 collection_name: Some("col".to_string()),
1362 entity_name: Some("Entity".to_string()),
1363 key: Some("id".to_string()),
1364 arguments: MigrationArguments::Double(
1365 Arc::new("arg1".to_string()),
1366 Arc::new("arg2".to_string()),
1367 ),
1368 };
1369
1370 assert_eq!(step.collection_name, Some("col".to_string()));
1371 assert_eq!(step.entity_name, Some("Entity".to_string()));
1372 assert_eq!(step.key, Some("id".to_string()));
1373 assert_eq!(step.arguments.arg_count(), 2);
1374 }
1375
1376 #[test]
1377 fn test_migration_arguments_single_as_triple_error() {
1378 let value = Arc::new("test".to_string());
1380 let args = MigrationArguments::Single(value);
1381 let result: NitriteResult<(String, String, String)> = args.as_triple();
1382 assert!(result.is_err());
1383 }
1384
1385 #[test]
1386 fn test_migration_arguments_single_as_quad_error() {
1387 let value = Arc::new("test".to_string());
1389 let args = MigrationArguments::Single(value);
1390 let result: NitriteResult<(String, String, String, String)> = args.as_quad();
1391 assert!(result.is_err());
1392 }
1393
1394 #[test]
1395 fn test_migration_arguments_double_as_single_error() {
1396 let arg1 = Arc::new("first".to_string());
1398 let arg2 = Arc::new("second".to_string());
1399 let args = MigrationArguments::Double(arg1, arg2);
1400 let result: NitriteResult<String> = args.as_single();
1401 assert!(result.is_err());
1402 }
1403
1404 #[test]
1405 fn test_migration_arguments_triple_as_double_error() {
1406 let arg1 = Arc::new("first".to_string());
1408 let arg2 = Arc::new("second".to_string());
1409 let arg3 = Arc::new("third".to_string());
1410 let args = MigrationArguments::Triple(arg1, arg2, arg3);
1411 let result: NitriteResult<(String, String)> = args.as_double();
1412 assert!(result.is_err());
1413 }
1414
1415 #[test]
1416 fn test_migration_arguments_quad_as_single_error() {
1417 let arg1 = Arc::new("first".to_string());
1419 let arg2 = Arc::new("second".to_string());
1420 let arg3 = Arc::new("third".to_string());
1421 let arg4 = Arc::new("fourth".to_string());
1422 let args = MigrationArguments::Quad(arg1, arg2, arg3, arg4);
1423 let result: NitriteResult<String> = args.as_single();
1424 assert!(result.is_err());
1425 }
1426
1427 #[test]
1428 fn test_migration_arguments_quad_as_triple_error() {
1429 let arg1 = Arc::new("first".to_string());
1431 let arg2 = Arc::new("second".to_string());
1432 let arg3 = Arc::new("third".to_string());
1433 let arg4 = Arc::new("fourth".to_string());
1434 let args = MigrationArguments::Quad(arg1, arg2, arg3, arg4);
1435 let result: NitriteResult<(String, String, String)> = args.as_triple();
1436 assert!(result.is_err());
1437 }
1438
1439 #[test]
1440 fn test_migration_arguments_multiple_as_double_error() {
1441 let args_vec = vec![
1443 Arc::new("first".to_string()) as Arc<dyn Any + Send + Sync>,
1444 Arc::new("second".to_string()) as Arc<dyn Any + Send + Sync>,
1445 ];
1446 let args = MigrationArguments::Multiple(args_vec);
1447 let result: NitriteResult<(String, String)> = args.as_double();
1448 assert!(result.is_err());
1449 }
1450
1451 #[test]
1452 fn test_migration_arguments_multiple_partial_match() {
1453 let args_vec = vec![
1455 Arc::new("first".to_string()) as Arc<dyn Any + Send + Sync>,
1456 Arc::new(42i32) as Arc<dyn Any + Send + Sync>,
1457 Arc::new("third".to_string()) as Arc<dyn Any + Send + Sync>,
1458 ];
1459 let args = MigrationArguments::Multiple(args_vec);
1460 let result: NitriteResult<Vec<String>> = args.as_multiple();
1461 assert!(result.is_err());
1462 }
1463}