oxihuman_core/
aggregate_root.rs1#![allow(dead_code)]
4
5pub struct AggregateRoot {
6 pub id: u64,
7 pub version: u64,
8 pub pending_events: Vec<String>,
9}
10
11pub fn new_aggregate_root(id: u64) -> AggregateRoot {
12 AggregateRoot {
13 id,
14 version: 0,
15 pending_events: Vec::new(),
16 }
17}
18
19pub fn aggregate_apply_event(a: &mut AggregateRoot, event: &str) {
20 a.pending_events.push(event.to_string());
21 a.version += 1;
22}
23
24pub fn aggregate_pending_events(a: &AggregateRoot) -> &[String] {
25 &a.pending_events
26}
27
28pub fn aggregate_clear_events(a: &mut AggregateRoot) {
29 a.pending_events.clear();
30}
31
32pub fn aggregate_version(a: &AggregateRoot) -> u64 {
33 a.version
34}
35
36pub fn aggregate_increment_version(a: &mut AggregateRoot) {
37 a.version += 1;
38}
39
40pub fn aggregate_id(a: &AggregateRoot) -> u64 {
41 a.id
42}
43
44#[cfg(test)]
45mod tests {
46 use super::*;
47
48 #[test]
49 fn test_new_aggregate() {
50 let a = new_aggregate_root(1);
52 assert_eq!(aggregate_id(&a), 1);
53 assert_eq!(aggregate_version(&a), 0);
54 assert!(aggregate_pending_events(&a).is_empty());
55 }
56
57 #[test]
58 fn test_apply_event() {
59 let mut a = new_aggregate_root(1);
61 aggregate_apply_event(&mut a, "UserCreated");
62 assert_eq!(aggregate_version(&a), 1);
63 assert_eq!(aggregate_pending_events(&a).len(), 1);
64 }
65
66 #[test]
67 fn test_clear_events() {
68 let mut a = new_aggregate_root(1);
70 aggregate_apply_event(&mut a, "ev1");
71 aggregate_clear_events(&mut a);
72 assert!(aggregate_pending_events(&a).is_empty());
73 }
74
75 #[test]
76 fn test_increment_version() {
77 let mut a = new_aggregate_root(1);
79 aggregate_increment_version(&mut a);
80 assert_eq!(aggregate_version(&a), 1);
81 }
82
83 #[test]
84 fn test_multiple_events() {
85 let mut a = new_aggregate_root(2);
87 aggregate_apply_event(&mut a, "ev1");
88 aggregate_apply_event(&mut a, "ev2");
89 aggregate_apply_event(&mut a, "ev3");
90 assert_eq!(aggregate_version(&a), 3);
91 assert_eq!(aggregate_pending_events(&a).len(), 3);
92 }
93
94 #[test]
95 fn test_version_preserved_after_clear() {
96 let mut a = new_aggregate_root(1);
98 aggregate_apply_event(&mut a, "e");
99 aggregate_clear_events(&mut a);
100 assert_eq!(aggregate_version(&a), 1);
101 }
102
103 #[test]
104 fn test_aggregate_id() {
105 let a = new_aggregate_root(42);
107 assert_eq!(aggregate_id(&a), 42);
108 }
109}