use tiny_counter::{EventStore, TimeUnit};
#[test]
fn reservation_commit_records_event() {
let store = EventStore::new();
let reservation = store
.limit()
.at_most("api_call", 10, TimeUnit::Hours)
.reserve("api_call")
.unwrap();
reservation.commit();
assert_eq!(store.query("api_call").last_hours(1).sum(), Some(1));
}
#[test]
fn reservation_cancel_does_not_record() {
let store = EventStore::new();
let reservation = store
.limit()
.at_most("api_call", 10, TimeUnit::Hours)
.reserve("api_call")
.unwrap();
reservation.cancel();
assert_eq!(store.query("api_call").last_hours(1).sum(), Some(0));
}
#[test]
fn reservation_auto_cancels_on_drop() {
let store = EventStore::new();
{
let _reservation = store
.limit()
.at_most("api_call", 10, TimeUnit::Hours)
.reserve("api_call")
.unwrap();
}
assert_eq!(store.query("api_call").last_hours(1).sum(), Some(0));
}
#[test]
fn reservation_prevents_over_limit() {
let store = EventStore::new();
for _ in 0..9 {
store.record("limited");
}
let reservation = store
.limit()
.at_most("limited", 10, TimeUnit::Hours)
.reserve("limited")
.unwrap();
let result = store
.limit()
.at_most("limited", 10, TimeUnit::Hours)
.reserve("limited");
assert!(result.is_err());
reservation.cancel();
let result = store
.limit()
.at_most("limited", 10, TimeUnit::Hours)
.reserve("limited");
assert!(result.is_ok());
}