Skip to content

Commit 2e2e3dc

Browse files
committed
Additional testing for recorder
1 parent 0baae9e commit 2e2e3dc

File tree

2 files changed

+240
-62
lines changed

2 files changed

+240
-62
lines changed

primitives/src/sentry.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -897,7 +897,10 @@ mod postgres {
897897
#[cfg(test)]
898898
mod test {
899899
use super::*;
900-
use crate::util::tests::prep_db::{ADDRESSES, DUMMY_IPFS};
900+
use crate::{
901+
postgres::POSTGRES_POOL,
902+
util::tests::prep_db::{ADDRESSES, DUMMY_IPFS},
903+
};
901904
use serde_json::json;
902905

903906
#[test]
@@ -922,4 +925,33 @@ mod test {
922925
serde_json::to_value(click).expect("should serialize")
923926
);
924927
}
928+
929+
#[tokio::test]
930+
pub async fn datehour_from_to_sql() {
931+
let client = POSTGRES_POOL.get().await.unwrap();
932+
let sql_type = "TIMESTAMPTZ";
933+
934+
let actual_datehour = DateHour::<Utc>::from_ymdh(2021, 1, 1, 1);
935+
936+
// from SQL
937+
let row_datehour: DateHour<Utc> = client
938+
.query_one(
939+
&*format!("SELECT '{:?}'::{}", actual_datehour, sql_type),
940+
&[],
941+
)
942+
.await
943+
.unwrap()
944+
.get(0);
945+
946+
assert_eq!(&actual_datehour, &row_datehour);
947+
948+
// to SQL
949+
let row_datehour: DateHour<Utc> = client
950+
.query_one(&*format!("SELECT $1::{}", sql_type), &[&actual_datehour])
951+
.await
952+
.unwrap()
953+
.get(0);
954+
955+
assert_eq!(&actual_datehour, &row_datehour);
956+
}
925957
}

sentry/src/analytics.rs

Lines changed: 207 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ mod test {
9898
use super::*;
9999
use primitives::{
100100
sentry::Analytics,
101-
util::tests::prep_db::{ADDRESSES, DUMMY_CAMPAIGN},
101+
util::tests::prep_db::{ADDRESSES, DUMMY_CAMPAIGN, DUMMY_IPFS},
102102
UnifiedNum,
103103
};
104104

@@ -152,76 +152,222 @@ mod test {
152152
UnifiedNum::from_u64(1_000_000),
153153
),
154154
),
155+
(
156+
"click_with_unit_and_slot".into(),
157+
(
158+
Event::Click {
159+
publisher: ADDRESSES["publisher"],
160+
ad_unit: Some(DUMMY_IPFS[0]),
161+
ad_slot: Some(DUMMY_IPFS[1]),
162+
referrer: Some("http://127.0.0.1".into()),
163+
},
164+
ADDRESSES["publisher"],
165+
UnifiedNum::from_u64(1_000_000),
166+
),
167+
),
168+
(
169+
"click_with_different_data".into(),
170+
(
171+
Event::Click {
172+
publisher: ADDRESSES["publisher"],
173+
ad_unit: Some(DUMMY_IPFS[2]),
174+
ad_slot: Some(DUMMY_IPFS[3]),
175+
referrer: Some("http://127.0.0.1".into()),
176+
},
177+
ADDRESSES["publisher"],
178+
UnifiedNum::from_u64(1_000_000),
179+
),
180+
),
181+
(
182+
"impression_with_slot_unit_and_referrer".into(),
183+
(
184+
Event::Impression {
185+
publisher: ADDRESSES["publisher"],
186+
ad_unit: Some(DUMMY_IPFS[0]),
187+
ad_slot: Some(DUMMY_IPFS[1]),
188+
referrer: Some("http://127.0.0.1".into()),
189+
},
190+
ADDRESSES["publisher"],
191+
UnifiedNum::from_u64(1_000_000),
192+
),
193+
),
155194
]
156195
.into_iter()
157196
.collect::<HashMap<String, _>>();
158197

159198
let campaign = DUMMY_CAMPAIGN.clone();
160-
let session = Session {
161-
ip: None,
162-
country: None,
163-
referrer_header: None,
164-
os: None,
165-
};
166199

167-
let input_events = vec![
168-
test_events["click_empty"].clone(),
169-
test_events["impression_empty"].clone(),
170-
];
200+
// Testing record with empty events and session
201+
{
202+
let session = Session {
203+
ip: None,
204+
country: None,
205+
referrer_header: None,
206+
os: None,
207+
};
171208

172-
record(&database.clone(), &campaign, &session, input_events.clone())
173-
.await
174-
.expect("should record");
209+
let input_events = vec![
210+
test_events["click_empty"].clone(),
211+
test_events["impression_empty"].clone(),
212+
];
175213

176-
let analytics = get_all_analytics(&database.pool)
177-
.await
178-
.expect("should get all analytics");
179-
180-
let click_analytics = analytics
181-
.iter()
182-
.find(|a| a.event_type == "CLICK")
183-
.expect("There should be a click Analytics");
184-
let impression_analytics = analytics
185-
.iter()
186-
.find(|a| a.event_type == "IMPRESSION")
187-
.expect("There should be an impression Analytics");
188-
assert_eq!(
189-
click_analytics.payout_amount,
190-
UnifiedNum::from_u64(1_000_000)
191-
);
192-
assert_eq!(click_analytics.payout_count, 1);
193-
194-
assert_eq!(
195-
impression_analytics.payout_amount,
196-
UnifiedNum::from_u64(1_000_000)
197-
);
198-
assert_eq!(impression_analytics.payout_count, 1);
199-
200-
record(&database.clone(), &campaign, &session, input_events)
214+
record(&database.clone(), &campaign, &session, input_events.clone())
215+
.await
216+
.expect("should record");
217+
218+
let analytics = get_all_analytics(&database.pool)
219+
.await
220+
.expect("should get all analytics");
221+
222+
let click_analytics = analytics
223+
.iter()
224+
.find(|a| a.event_type == "CLICK")
225+
.expect("There should be a click Analytics");
226+
let impression_analytics = analytics
227+
.iter()
228+
.find(|a| a.event_type == "IMPRESSION")
229+
.expect("There should be an impression Analytics");
230+
assert_eq!(
231+
click_analytics.payout_amount,
232+
UnifiedNum::from_u64(1_000_000)
233+
);
234+
assert_eq!(click_analytics.payout_count, 1);
235+
236+
assert_eq!(
237+
impression_analytics.payout_amount,
238+
UnifiedNum::from_u64(1_000_000)
239+
);
240+
assert_eq!(impression_analytics.payout_count, 1);
241+
242+
record(&database.clone(), &campaign, &session, input_events)
243+
.await
244+
.expect("should record");
245+
246+
let analytics = get_all_analytics(&database.pool)
247+
.await
248+
.expect("should find analytics");
249+
let click_analytics = analytics
250+
.iter()
251+
.find(|a| a.event_type == "CLICK")
252+
.expect("There should be a click event");
253+
let impression_analytics = analytics
254+
.iter()
255+
.find(|a| a.event_type == "IMPRESSION")
256+
.expect("There should be an impression event");
257+
assert_eq!(
258+
click_analytics.payout_amount,
259+
UnifiedNum::from_u64(2_000_000)
260+
);
261+
assert_eq!(click_analytics.payout_count, 2);
262+
263+
assert_eq!(
264+
impression_analytics.payout_amount,
265+
UnifiedNum::from_u64(2_000_000)
266+
);
267+
assert_eq!(impression_analytics.payout_count, 2);
268+
}
269+
270+
// Testing record with non-empty events and non-empty session
271+
{
272+
let session = Session {
273+
ip: Default::default(),
274+
country: Some("Bulgaria".into()),
275+
referrer_header: Some("http://127.0.0.1".into()),
276+
os: Some("Windows".into()),
277+
};
278+
279+
let other_session = Session {
280+
ip: Default::default(),
281+
country: Some("Japan".into()),
282+
referrer_header: Some("http://127.0.0.1".into()),
283+
os: Some("Android".into()),
284+
};
285+
286+
let input_events = vec![
287+
test_events["click_with_unit_and_slot"].clone(),
288+
test_events["click_with_different_data"].clone(),
289+
test_events["impression_with_slot_unit_and_referrer"].clone(),
290+
];
291+
292+
record(&database.clone(), &campaign, &session, input_events.clone())
293+
.await
294+
.expect("should record");
295+
296+
let analytics = get_all_analytics(&database.pool)
297+
.await
298+
.expect("should get all analytics");
299+
300+
assert_eq!(analytics.len(), 5);
301+
302+
let with_slot_and_unit: Vec<Analytics> = analytics
303+
.clone()
304+
.into_iter()
305+
.filter(|a| a.ad_unit == Some(DUMMY_IPFS[0]) && a.ad_slot == Some(DUMMY_IPFS[1]))
306+
.collect();
307+
assert_eq!(with_slot_and_unit.len(), 2);
308+
309+
let with_different_slot_and_unit: Vec<Analytics> = analytics
310+
.clone()
311+
.into_iter()
312+
.filter(|a| a.ad_unit == Some(DUMMY_IPFS[2]) && a.ad_slot == Some(DUMMY_IPFS[3]))
313+
.collect();
314+
assert_eq!(with_different_slot_and_unit.len(), 1);
315+
316+
record(
317+
&database.clone(),
318+
&campaign,
319+
&other_session,
320+
input_events.clone(),
321+
)
201322
.await
202323
.expect("should record");
324+
let analytics = get_all_analytics(&database.pool)
325+
.await
326+
.expect("should get all analytics");
203327

204-
let analytics = get_all_analytics(&database.pool)
205-
.await
206-
.expect("should find analytics");
207-
let click_analytics = analytics
208-
.iter()
209-
.find(|a| a.event_type == "CLICK")
210-
.expect("There should be a click event");
211-
let impression_analytics = analytics
212-
.iter()
213-
.find(|a| a.event_type == "IMPRESSION")
214-
.expect("There should be an impression event");
215-
assert_eq!(
216-
click_analytics.payout_amount,
217-
UnifiedNum::from_u64(2_000_000)
218-
);
219-
assert_eq!(click_analytics.payout_count, 2);
220-
221-
assert_eq!(
222-
impression_analytics.payout_amount,
223-
UnifiedNum::from_u64(2_000_000)
224-
);
225-
assert_eq!(impression_analytics.payout_count, 2);
328+
assert_eq!(analytics.len(), 8);
329+
330+
let with_slot_and_unit: Vec<Analytics> = analytics
331+
.clone()
332+
.into_iter()
333+
.filter(|a| a.ad_unit == Some(DUMMY_IPFS[0]))
334+
.collect();
335+
assert_eq!(with_slot_and_unit.len(), 4);
336+
337+
let with_different_slot_and_unit: Vec<Analytics> = analytics
338+
.clone()
339+
.into_iter()
340+
.filter(|a| a.ad_unit == Some(DUMMY_IPFS[2]) && a.ad_slot == Some(DUMMY_IPFS[3]))
341+
.collect();
342+
assert_eq!(with_different_slot_and_unit.len(), 2);
343+
344+
let with_country: Vec<Analytics> = analytics
345+
.clone()
346+
.into_iter()
347+
.filter(|a| a.country == Some("Bulgaria".into()))
348+
.collect();
349+
assert_eq!(with_country.len(), 3);
350+
351+
let with_other_country: Vec<Analytics> = analytics
352+
.clone()
353+
.into_iter()
354+
.filter(|a| a.country == Some("Japan".into()))
355+
.collect();
356+
assert_eq!(with_other_country.len(), 3);
357+
358+
let with_os: Vec<Analytics> = analytics
359+
.clone()
360+
.into_iter()
361+
.filter(|a| a.os_name == OperatingSystem::map_os("Windows"))
362+
.collect();
363+
assert_eq!(with_os.len(), 3);
364+
365+
let with_other_os: Vec<Analytics> = analytics
366+
.clone()
367+
.into_iter()
368+
.filter(|a| a.os_name == OperatingSystem::map_os("Android"))
369+
.collect();
370+
assert_eq!(with_other_os.len(), 3);
371+
}
226372
}
227373
}

0 commit comments

Comments
 (0)