use chrono::Duration;
use tiny_counter::{EventStore, TimeUnit};
#[test]
fn at_most_allows_within_limit() {
let store = EventStore::new();
for _ in 0..5 {
let result = store
.limit()
.at_most("api_call", 10, TimeUnit::Hours)
.check_and_record("api_call");
assert!(result.is_ok());
}
assert_eq!(store.query("api_call").last_hours(1).sum(), Some(5));
}
#[test]
fn at_most_rejects_over_limit() {
let store = EventStore::new();
for _ in 0..10 {
store.record("api_call");
}
let result = store
.limit()
.at_most("api_call", 10, TimeUnit::Hours)
.check_and_record("api_call");
assert!(result.is_err());
assert_eq!(store.query("api_call").last_hours(1).sum(), Some(10));
}
#[test]
fn at_most_at_exact_limit() {
let store = EventStore::new();
for _ in 0..9 {
store.record("limited");
}
let result = store
.limit()
.at_most("limited", 10, TimeUnit::Hours)
.check_and_record("limited");
assert!(result.is_ok());
let result = store
.limit()
.at_most("limited", 10, TimeUnit::Hours)
.check_and_record("limited");
assert!(result.is_err());
}
#[test]
fn at_most_multiple_time_windows() {
let store = EventStore::new();
let result = store
.limit()
.at_most("event", 10, (1, TimeUnit::Minutes))
.at_most("event", 100, (1, TimeUnit::Hours))
.check_and_record("event");
assert!(result.is_ok());
}
#[test]
fn at_most_with_duration() {
let store = EventStore::new();
let result = store
.limit()
.at_most("event", 100, Duration::days(7))
.check_and_record("event");
assert!(result.is_ok());
}