use runegate::rate_limit::{EmailRateLimiter, LoginRateLimiter, RateLimitConfig, TokenRateLimiter};
use std::thread;
use std::time::Duration;
#[test]
fn test_email_rate_limiter() {
let config = RateLimitConfig {
login_rate_limit: 5,
email_cooldown: 2, token_rate_limit: 10,
enabled: true,
};
let email_limiter = EmailRateLimiter::new(&config);
let test_email = "test@example.com";
assert!(email_limiter.check_email(test_email).is_none());
let cooldown = email_limiter.check_email(test_email);
assert!(cooldown.is_some());
assert!(cooldown.unwrap() > 0);
thread::sleep(Duration::from_secs(3));
assert!(email_limiter.check_email(test_email).is_none());
}
#[test]
fn test_login_rate_limiter() {
let config = RateLimitConfig {
login_rate_limit: 3, email_cooldown: 300,
token_rate_limit: 10,
enabled: true,
};
let login_limiter = LoginRateLimiter::new(&config);
let test_ip = "192.168.1.1";
assert!(login_limiter.check_ip(test_ip));
assert!(login_limiter.check_ip(test_ip));
assert!(login_limiter.check_ip(test_ip));
assert!(!login_limiter.check_ip(test_ip));
assert!(login_limiter.check_ip("192.168.1.2"));
let disabled_config = RateLimitConfig {
enabled: false,
..config
};
let disabled_limiter = LoginRateLimiter::new(&disabled_config);
for _ in 0..10 {
assert!(disabled_limiter.check_ip(test_ip));
}
}
#[test]
fn test_token_rate_limiter() {
let config = RateLimitConfig {
login_rate_limit: 5,
email_cooldown: 300,
token_rate_limit: 4, enabled: true,
};
let token_limiter = TokenRateLimiter::new(&config);
let test_ip = "192.168.1.1";
assert!(token_limiter.check_ip(test_ip));
assert!(token_limiter.check_ip(test_ip));
assert!(token_limiter.check_ip(test_ip));
assert!(token_limiter.check_ip(test_ip));
assert!(!token_limiter.check_ip(test_ip));
}