Seregon/StratoSDK

StratoSDK is a framework with a declarative approach similar to Flutter/React, written and designed entirely for Rust.

Rust/27.3 KB/No license
crates/strato-ui-core/src/telemetry/event_store_test.rs
StratoSDK / crates / strato-ui-core / src / telemetry / event_store_test.rs
1use crate::telemetry::event_store::{
2 EventPayload, EventStore, SESSION_CONTINUATION_THRESHOLD_SECONDS,
3};
4use crate::time::{get_current_time, test_offset_time};
5use chrono::{Duration, TimeZone, Utc};
6 
7#[test]
8fn test_initialize_session() {
9 test_offset_time(5);
10 let event_store = EventStore::new();
11 assert_eq!(
12 event_store.current_session_created_at,
13 Utc.timestamp_opt(5, 0).unwrap()
14 );
15}
16 
17#[test]
18fn test_event_queue_empty() {
19 let user_id = Some("user123".to_string());
20 let anonymous_id = "anon-user-xyz".to_string();
21 let mut event_store = EventStore::new();
22 event_store.record_app_active(user_id.clone(), anonymous_id.clone(), get_current_time());
23 let session_created_at_0 = event_store.current_session_created_at;
24 
25 // Queue is empty and an event comes in while session is fresh
26 event_store.events.clear();
27 test_offset_time(1);
28 event_store.record_app_active(user_id.clone(), anonymous_id.clone(), get_current_time());
29 assert_eq!(
30 event_store.events.back().unwrap().session_created_at,
31 session_created_at_0
32 );
33 
34 // Queue is empty and an event comes in while session is stale
35 event_store.events.clear();
36 let inactivity_duration = SESSION_CONTINUATION_THRESHOLD_SECONDS as i64 + 1;
37 test_offset_time(inactivity_duration);
38 let now = get_current_time();
39 event_store.record_app_active(user_id, anonymous_id, get_current_time());
40 assert_eq!(event_store.events.back().unwrap().session_created_at, now);
41}
42 
43#[test]
44fn test_app_active_after_inactivity() {
45 let user_id = Some("user123".to_string());
46 let anonymous_id = "anon-user-xyz".to_string();
47 let mut event_store = EventStore::new();
48 let inactivity_duration = SESSION_CONTINUATION_THRESHOLD_SECONDS as i64 + 1;
49 event_store.record_app_active(user_id.clone(), anonymous_id.clone(), get_current_time());
50 let session_created_at_0 = event_store.current_session_created_at;
51 
52 test_offset_time(inactivity_duration);
53 
54 event_store.record_app_active(user_id.clone(), anonymous_id.clone(), get_current_time());
55 assert_eq!(
56 event_store.events.back().unwrap().payload,
57 EventPayload::AppActive {
58 user_id: user_id.clone(),
59 anonymous_id: anonymous_id.clone()
60 }
61 );
62 let session_created_at_1 = event_store.events.back().unwrap().session_created_at;
63 assert_eq!(
64 session_created_at_1 - session_created_at_0,
65 Duration::seconds(inactivity_duration)
66 );
67 
68 test_offset_time(inactivity_duration);
69 
70 event_store.record_event(
71 user_id.clone(),
72 anonymous_id.clone(),
73 "Block Creation".into(),
74 None,
75 false, /* contains_ugc */
76 get_current_time(),
77 );
78 assert_eq!(
79 event_store.events.back().unwrap().payload,
80 EventPayload::NamedEvent {
81 user_id,
82 anonymous_id,
83 name: "Block Creation".into(),
84 value: None
85 }
86 );
87 let session_created_at_2 = event_store.events.back().unwrap().session_created_at;
88 assert_eq!(
89 session_created_at_2 - session_created_at_1,
90 Duration::seconds(inactivity_duration)
91 );
92}
93 
94#[test]
95fn test_app_active_after_activity() {
96 let user_id = Some("user123".to_string());
97 let anonymous_id = "anon-user-xyz".to_string();
98 let mut event_store = EventStore::new();
99 event_store.record_app_active(user_id.clone(), anonymous_id.clone(), get_current_time());
100 assert_eq!(event_store.events.len(), 1);
101 let timestamp_0 = event_store.events.back().unwrap().timestamp;
102 let session_created_at_0 = event_store.events.back().unwrap().session_created_at;
103 
104 // Check that the last app active event was updated
105 test_offset_time(5);
106 event_store.record_app_active(user_id.clone(), anonymous_id.clone(), get_current_time());
107 assert_eq!(event_store.events.len(), 1);
108 let timestamp_1 = event_store.events.back().unwrap().timestamp;
109 let session_created_at_1 = event_store.events.back().unwrap().session_created_at;
110 assert_eq!(session_created_at_0, session_created_at_1);
111 assert_eq!(timestamp_1 - timestamp_0, Duration::seconds(5));
112 
113 test_offset_time(5);
114 event_store.record_event(
115 user_id.clone(),
116 anonymous_id.clone(),
117 "Block Creation".into(),
118 None,
119 false, /* contains_ugc */
120 get_current_time(),
121 );
122 assert_eq!(event_store.events.len(), 2);
123 let timestamp_2 = event_store.events.back().unwrap().timestamp;
124 let session_created_at_2 = event_store.events.back().unwrap().session_created_at;
125 assert_eq!(session_created_at_1, session_created_at_2);
126 assert_eq!(timestamp_2 - timestamp_1, Duration::seconds(5));
127 
128 test_offset_time(5);
129 event_store.record_event(
130 user_id.clone(),
131 anonymous_id.clone(),
132 "Block Creation".into(),
133 None,
134 false, /* contains_ugc */
135 get_current_time(),
136 );
137 assert_eq!(event_store.events.len(), 3);
138 let timestamp_3 = event_store.events.back().unwrap().timestamp;
139 let session_created_at_3 = event_store.events.back().unwrap().session_created_at;
140 assert_eq!(session_created_at_2, session_created_at_3);
141 assert_eq!(timestamp_3 - timestamp_2, Duration::seconds(5));
142 
143 test_offset_time(5);
144 event_store.record_app_active(user_id, anonymous_id, get_current_time());
145 assert_eq!(event_store.events.len(), 4);
146 let timestamp_4 = event_store.events.back().unwrap().timestamp;
147 let session_created_at_4 = event_store.events.back().unwrap().session_created_at;
148 assert_eq!(session_created_at_3, session_created_at_4);
149 assert_eq!(timestamp_4 - timestamp_3, Duration::seconds(5));
150}
151