use tiny_counter::EventStore;
#[test]
fn test_create_store_and_record() {
let store = EventStore::new();
store.record("user_login");
store.record("user_login");
store.record("page_view");
let login_count = store.query("user_login").last_minutes(1).sum();
let page_view_count = store.query("page_view").last_minutes(1).sum();
assert_eq!(login_count, Some(2));
assert_eq!(page_view_count, Some(1));
}
#[test]
fn test_all_time_units() {
let store = EventStore::builder()
.track_minutes(60)
.track_hours(72)
.track_days(56)
.track_weeks(52)
.track_months(12)
.track_years(4)
.build()
.unwrap();
for _ in 0..5 {
store.record("test_event");
}
assert_eq!(store.query("test_event").last_minutes(1).sum(), Some(5));
assert_eq!(store.query("test_event").last_hours(1).sum(), Some(5));
assert_eq!(store.query("test_event").last_days(1).sum(), Some(5));
assert_eq!(store.query("test_event").last_weeks(1).sum(), Some(5));
assert_eq!(store.query("test_event").last_months(1).sum(), Some(5));
assert_eq!(store.query("test_event").last_years(1).sum(), Some(5));
}
#[test]
fn test_all_aggregations() {
let store = EventStore::new();
store.record_count("event", 10);
store.record_count("event", 20);
store.record_count("event", 30);
let sum = store.query("event").last_days(1).sum();
assert_eq!(sum, Some(60));
let avg = store.query("event").last_days(1).average();
assert_eq!(avg, Some(60.0));
let avg_nonzero = store.query("event").last_days(1).average_nonzero();
assert_eq!(avg_nonzero, Some(60.0));
let count = store.query("event").last_days(1).count_nonzero();
assert_eq!(count, Some(1)); }
#[test]
fn test_record_count() {
let store = EventStore::new();
store.record_count("batch_event", 100);
let count = store.query("batch_event").last_hours(1).sum();
assert_eq!(count, Some(100));
}
#[test]
fn test_query_nonexistent_event() {
let store = EventStore::new();
let count = store.query("nonexistent").last_days(1).sum();
assert_eq!(count, None);
}
#[test]
fn test_multiple_events() {
let store = EventStore::new();
store.record("event_a");
store.record("event_b");
store.record("event_a");
store.record("event_c");
store.record("event_b");
store.record("event_a");
assert_eq!(store.query("event_a").last_days(1).sum(), Some(3));
assert_eq!(store.query("event_b").last_days(1).sum(), Some(2));
assert_eq!(store.query("event_c").last_days(1).sum(), Some(1));
}
#[test]
fn test_multi_query() {
let store = EventStore::new();
store.record_count("event1", 10);
store.record_count("event2", 20);
store.record_count("event3", 30);
let total = store
.query_many(&["event1", "event2", "event3"])
.last_days(1)
.sum();
assert_eq!(total, Some(60));
}
#[test]
fn test_ratio_query() {
let store = EventStore::new();
store.record_count("conversions", 25);
store.record_count("impressions", 100);
let ratio = store.query_ratio("conversions", "impressions").last_days(1);
assert_eq!(ratio, Some(0.25));
}
#[test]
fn test_delta_query() {
let store = EventStore::new();
store.record_count("additions", 50);
store.record_count("deletions", 30);
let delta = store
.query_delta("additions", "deletions")
.last_days(1)
.sum();
assert_eq!(delta, 20);
}
#[test]
fn test_ever_query() {
let store = EventStore::new();
store.record_count("lifetime_event", 100);
let count = store.query("lifetime_event").ever().sum();
assert_eq!(count, Some(100));
}
#[test]
fn test_last_seen() {
let store = EventStore::new();
store.record("recent_event");
let last_seen = store.query("recent_event").last_seen();
assert!(last_seen.is_some());
}
#[test]
fn test_into_buckets() {
let store = EventStore::new();
store.record_count("event", 42);
let buckets = store.query("event").last_days(7).into_buckets();
assert_eq!(buckets.len(), 7);
assert_eq!(buckets[0], 42);
}
#[test]
fn test_query_sum() {
let store = EventStore::new();
store.record("event-1");
store.record("event-1");
store.record("event-1");
assert_eq!(store.query("event-1").last_days(7).sum(), Some(3));
let result = store.query("event-1").days(7..14).sum();
assert!(result == Some(0) || result.is_none());
}
#[test]
fn test_query_average() {
let store = EventStore::new();
store.record("event-1");
store.record("event-1");
store.record("event-1");
let avg = store.query("event-1").last_days(7).average();
assert!(avg.is_some());
let avg_val = avg.unwrap();
assert!((avg_val - 0.42857142857142855).abs() < 0.001);
let avg2 = store.query("event-1").last_days(1).average();
assert!(avg2.is_some());
let avg2_val = avg2.unwrap();
assert!((avg2_val - 3.0).abs() < 0.001);
}
#[test]
fn test_query_last_seen() {
use chrono::Duration;
let store = EventStore::new();
store.record_count_ago("event-1", 1, Duration::days(10));
store.record_count_ago("event-1", 1, Duration::days(20));
let last_seen = store.query("event-1").last_seen();
assert!(last_seen.is_some());
let days_ago = last_seen.unwrap().num_days();
assert!((9..=11).contains(&days_ago)); }
#[test]
fn test_record_past_event_queries() {
use chrono::{Datelike, Duration, Utc};
let store = EventStore::builder()
.track_minutes(60)
.track_hours(72)
.track_days(56)
.track_weeks(52)
.track_months(12)
.track_years(4)
.build()
.unwrap();
let event_id = "app_launch";
let delta = Duration::days(1);
let now = Utc::now();
let then = now - delta;
store.record_count_ago(event_id, 5, delta);
fn same_week(now: chrono::DateTime<Utc>, then: chrono::DateTime<Utc>) -> bool {
let now_week_num = now.ordinal0() / 7;
let then_week_num = then.ordinal0() / 7;
now_week_num == then_week_num
}
fn same_month(now: chrono::DateTime<Utc>, then: chrono::DateTime<Utc>) -> bool {
let now_num = now.ordinal0() / 28;
let then_num = then.ordinal0() / 28;
now_num == then_num
}
fn same_year(now: chrono::DateTime<Utc>, then: chrono::DateTime<Utc>) -> bool {
now.year() == then.year()
}
assert_eq!(store.query(event_id).last_minutes(60).sum(), Some(0));
assert_eq!(store.query(event_id).last_hours(24).sum(), Some(5));
assert_eq!(store.query(event_id).last_days(56).sum(), Some(5));
if same_year(now, then) {
if same_week(now, then) {
assert_eq!(store.query(event_id).last_weeks(1).sum(), Some(5));
} else {
assert_eq!(store.query(event_id).last_weeks(2).sum(), Some(5));
}
if same_month(now, then) {
assert_eq!(store.query(event_id).last_months(1).sum(), Some(5));
} else {
assert_eq!(store.query(event_id).last_months(2).sum(), Some(5));
}
let year_sum = store.query(event_id).last_years(1).sum();
assert!(year_sum == Some(5) || year_sum == Some(0));
}
let weeks_sum = store.query(event_id).last_weeks(2).sum();
assert!(weeks_sum == Some(5) || weeks_sum == Some(0));
let months_sum = store.query(event_id).last_months(2).sum();
assert!(months_sum == Some(5) || months_sum == Some(0));
let years_sum = store.query(event_id).last_years(2).sum();
assert!(years_sum == Some(5) || years_sum == Some(0));
let last_seen = store.query(event_id).last_seen();
assert!(last_seen.is_some());
let duration_since = last_seen.unwrap();
assert!(duration_since.num_days() >= 0 && duration_since.num_days() <= 2);
}
#[test]
fn test_record_past_event_week_queries() {
use chrono::{Duration, Utc};
let store = EventStore::new();
let event_id = "app_launch";
let delta = Duration::weeks(1);
let now = Utc::now();
let _then = now - delta;
store.record_count_ago(event_id, 5, delta);
let last_seen = store.query(event_id).last_seen();
assert!(last_seen.is_some());
let duration_since = last_seen.unwrap();
assert!(duration_since.num_days() >= 6 && duration_since.num_days() <= 8);
}