use limiteron::storage::{BanStorage, QuotaStorage};
use std::time::Duration;
#[tokio::test]
async fn test_memory_quota_storage() {
use limiteron::storage::MemoryStorage;
let storage = MemoryStorage::new();
let result = storage
.consume("user1", "resource1", 100, 1000, Duration::from_secs(60))
.await
.unwrap();
assert!(result.allowed);
assert_eq!(result.remaining, 900);
let result = storage
.consume("user1", "resource1", 500, 1000, Duration::from_secs(60))
.await
.unwrap();
assert!(result.allowed);
assert_eq!(result.remaining, 400);
let result = storage
.consume("user1", "resource1", 500, 1000, Duration::from_secs(60))
.await
.unwrap();
assert!(!result.allowed);
}
#[tokio::test]
async fn test_memory_ban_storage() {
use limiteron::storage::{BanRecord, BanTarget, MemoryStorage};
let storage = MemoryStorage::new();
let ban = BanRecord {
target: BanTarget::Ip("192.168.1.1".to_string()),
ban_times: 1,
duration: Duration::from_secs(60),
banned_at: chrono::Utc::now(),
expires_at: chrono::Utc::now() + chrono::Duration::seconds(60),
is_manual: false,
reason: "Test".to_string(),
};
storage.save(&ban).await.unwrap();
let result = storage
.is_banned(&BanTarget::Ip("192.168.1.1".to_string()))
.await
.unwrap();
assert!(result.is_some());
storage
.remove_ban(&BanTarget::Ip("192.168.1.1".to_string()))
.await
.unwrap();
let result = storage
.is_banned(&BanTarget::Ip("192.168.1.1".to_string()))
.await
.unwrap();
assert!(result.is_none());
}
#[tokio::test]
async fn test_memory_storage_reset() {
use limiteron::storage::{MemoryStorage, QuotaStorage};
let storage = MemoryStorage::new();
let result = storage
.consume("user1", "resource1", 500, 1000, Duration::from_secs(60))
.await
.unwrap();
assert!(result.allowed);
assert_eq!(result.remaining, 500);
storage
.reset("user1", "resource1", 1000, Duration::from_secs(60))
.await
.unwrap();
let result = storage
.consume("user1", "resource1", 1000, 1000, Duration::from_secs(60))
.await
.unwrap();
assert!(result.allowed);
assert_eq!(result.remaining, 0);
}
#[tokio::test]
async fn test_memory_storage_get_quota() {
use limiteron::storage::{MemoryStorage, QuotaStorage};
let storage = MemoryStorage::new();
let _ = storage
.consume("user1", "resource1", 300, 1000, Duration::from_secs(60))
.await
.unwrap();
let quota = storage.get_quota("user1", "resource1").await.unwrap();
assert!(quota.is_some());
assert_eq!(quota.unwrap().consumed, 300);
let quota = storage.get_quota("user2", "resource2").await.unwrap();
assert!(quota.is_none());
}