Skip to main content

ddd_toolkit_core/mock/
id.rs

1use crate::{domain::EntityId, port::id::IdGenerator};
2
3/// An [`IdGenerator`] that always returns the same, fixed id.
4#[derive(Debug, Clone)]
5pub struct FixedIdGenerator<Id>(pub Id);
6
7impl<Id: EntityId> IdGenerator<Id> for FixedIdGenerator<Id> {
8    fn generate(&self) -> Id {
9        self.0.clone()
10    }
11}
12
13#[cfg(test)]
14mod test {
15    use std::fmt::Display;
16
17    use crate::domain::ValueObject;
18
19    use super::*;
20
21    #[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
22    struct FooId(String);
23
24    impl ValueObject for FooId {}
25
26    impl Display for FooId {
27        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
28            write!(f, "{}", self.0)
29        }
30    }
31
32    impl EntityId for FooId {}
33
34    #[test]
35    fn generate_returns_the_fixed_id() {
36        let generator = FixedIdGenerator(FooId("id-1".to_string()));
37
38        assert_eq!(generator.generate(), FooId("id-1".to_string()));
39    }
40
41    #[test]
42    fn generate_returns_equal_id_on_repeated_calls() {
43        let generator = FixedIdGenerator(FooId("id-1".to_string()));
44
45        assert_eq!(generator.generate(), FooId("id-1".to_string()));
46        assert_eq!(generator.generate(), FooId("id-1".to_string()));
47        assert_eq!(generator.generate(), FooId("id-1".to_string()));
48    }
49
50    #[test]
51    fn inner_field_is_publicly_accessible() {
52        let mut generator = FixedIdGenerator(FooId("id-1".to_string()));
53
54        assert_eq!(generator.0, FooId("id-1".to_string()));
55
56        generator.0 = FooId("id-2".to_string());
57
58        assert_eq!(generator.generate(), FooId("id-2".to_string()));
59    }
60
61    #[test]
62    fn clone_produces_generator_returning_equal_id() {
63        let generator = FixedIdGenerator(FooId("id-1".to_string()));
64
65        let cloned = generator.clone();
66
67        assert_eq!(cloned.generate(), generator.generate());
68    }
69
70    #[test]
71    fn debug_format_contains_type_name_and_inner_id() {
72        let generator = FixedIdGenerator(FooId("id-1".to_string()));
73
74        let debug = format!("{generator:?}");
75
76        assert!(debug.contains("FixedIdGenerator"));
77        assert!(debug.contains("id-1"));
78    }
79
80    #[test]
81    fn box_dyn_id_generator_is_usable() {
82        let generator: Box<dyn IdGenerator<FooId>> =
83            Box::new(FixedIdGenerator(FooId("id-1".to_string())));
84
85        assert_eq!(generator.generate(), FooId("id-1".to_string()));
86    }
87
88    #[test]
89    fn generate_returns_id_with_empty_inner_value_as_is() {
90        let generator = FixedIdGenerator(FooId(String::new()));
91
92        assert_eq!(generator.generate(), FooId(String::new()));
93    }
94}