brakes 0.1.1

A distributed rate limiting library
Documentation
use brakes::{
    backend::local::Memory,
    types::{token_bucket::TokenBucket, RateLimiterError},
};

#[test]
fn invalid_cache_discard() {
    use brakes::{types::fixed_window::FixedWindow, RateLimiter};
    use std::time::Duration;

    let key = "key";
    let backend = Memory::new();

    let fixed_window_limiter = RateLimiter::builder()
        .with_backend(backend.clone())
        .with_limiter(FixedWindow::new(100, Duration::from_millis(1000)))
        .with_conflict_strategy(brakes::RetryStrategy::RetryAndDeny(1))
        .build();

    let token_limiter = RateLimiter::builder()
        .with_backend(backend)
        .with_limiter(TokenBucket::new(100, Duration::from_millis(1000)))
        .with_conflict_strategy(brakes::RetryStrategy::RetryAndDeny(1))
        .with_discard_invalid_cache_entries(true)
        .build();

    assert!(fixed_window_limiter.is_ratelimited(key).is_ok());
    assert!(token_limiter.is_ratelimited(key).is_ok());
}

#[test]
fn invalid_cache_default() {
    use brakes::{types::fixed_window::FixedWindow, RateLimiter};
    use std::time::Duration;

    let key = "key";
    let backend = Memory::new();

    let fixed_window_limiter = RateLimiter::builder()
        .with_backend(backend.clone())
        .with_limiter(FixedWindow::new(100, Duration::from_millis(1000)))
        .with_conflict_strategy(brakes::RetryStrategy::RetryAndDeny(1))
        .build();

    let token_limiter = RateLimiter::builder()
        .with_backend(backend)
        .with_limiter(TokenBucket::new(100, Duration::from_millis(1000)))
        .with_conflict_strategy(brakes::RetryStrategy::RetryAndDeny(1))
        .build();

    assert!(fixed_window_limiter.is_ratelimited(key).is_ok());
    assert!(token_limiter.is_ratelimited(key).is_ok());
}

#[test]
fn invalid_cache_no_discard() {
    use brakes::{types::fixed_window::FixedWindow, RateLimiter};
    use std::time::Duration;

    let key = "key";
    let backend = Memory::new();

    let fixed_window_limiter = RateLimiter::builder()
        .with_backend(backend.clone())
        .with_limiter(FixedWindow::new(100, Duration::from_millis(1000)))
        .with_conflict_strategy(brakes::RetryStrategy::RetryAndDeny(1))
        .build();

    let token_limiter = RateLimiter::builder()
        .with_backend(backend)
        .with_limiter(TokenBucket::new(100, Duration::from_millis(1000)))
        .with_conflict_strategy(brakes::RetryStrategy::RetryAndDeny(1))
        .with_discard_invalid_cache_entries(false)
        .build();

    assert!(fixed_window_limiter.is_ratelimited(key).is_ok());

    let res = token_limiter.is_ratelimited(key);
    assert!(res.is_err());
    assert!(matches!(
        res,
        Err(RateLimiterError::WrongLimiterInstanceType)
    ));
}