72 lines
2.5 KiB
Rust
72 lines
2.5 KiB
Rust
use std::sync::Arc;
|
|
use application::testing::{InMemoryQuotaRepository, InMemoryUsageLedgerRepository};
|
|
use application::storage::{CheckQuotaQuery, CheckQuotaHandler};
|
|
use domain::entities::{QuotaDefinition, TimePeriod, UsageLedgerEntry, UsageType};
|
|
use domain::ports::UsageLedgerRepository;
|
|
use domain::value_objects::SystemId;
|
|
|
|
#[tokio::test]
|
|
async fn returns_allowed() {
|
|
let quota_repo = Arc::new(InMemoryQuotaRepository::new());
|
|
let ledger_repo = Arc::new(InMemoryUsageLedgerRepository::new());
|
|
|
|
let user = SystemId::new();
|
|
let mut quota = QuotaDefinition::new(user);
|
|
quota.add_rule(UsageType::StorageBytes, 10_000, TimePeriod::Lifetime);
|
|
use domain::ports::QuotaRepository;
|
|
quota_repo.save("a).await.unwrap();
|
|
|
|
let handler = CheckQuotaHandler::new(quota_repo, ledger_repo);
|
|
let result = handler.execute(CheckQuotaQuery {
|
|
user_id: user,
|
|
usage_type: UsageType::StorageBytes,
|
|
requested_amount: 5_000,
|
|
}).await.unwrap();
|
|
|
|
assert!(result.allowed);
|
|
assert_eq!(result.limit, 10_000);
|
|
assert!(!result.is_unlimited);
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn returns_denied() {
|
|
let quota_repo = Arc::new(InMemoryQuotaRepository::new());
|
|
let ledger_repo = Arc::new(InMemoryUsageLedgerRepository::new());
|
|
|
|
let user = SystemId::new();
|
|
let mut quota = QuotaDefinition::new(user);
|
|
quota.add_rule(UsageType::StorageBytes, 1_000, TimePeriod::Lifetime);
|
|
use domain::ports::QuotaRepository;
|
|
quota_repo.save("a).await.unwrap();
|
|
|
|
// record existing usage
|
|
let entry = UsageLedgerEntry::new(user, UsageType::StorageBytes, 900, "prior upload");
|
|
ledger_repo.record(&entry).await.unwrap();
|
|
|
|
let handler = CheckQuotaHandler::new(quota_repo, ledger_repo);
|
|
let result = handler.execute(CheckQuotaQuery {
|
|
user_id: user,
|
|
usage_type: UsageType::StorageBytes,
|
|
requested_amount: 200,
|
|
}).await.unwrap();
|
|
|
|
assert!(!result.allowed);
|
|
assert_eq!(result.current_usage, 900);
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn returns_unlimited_when_no_quota() {
|
|
let quota_repo = Arc::new(InMemoryQuotaRepository::new());
|
|
let ledger_repo = Arc::new(InMemoryUsageLedgerRepository::new());
|
|
|
|
let handler = CheckQuotaHandler::new(quota_repo, ledger_repo);
|
|
let result = handler.execute(CheckQuotaQuery {
|
|
user_id: SystemId::new(),
|
|
usage_type: UsageType::StorageBytes,
|
|
requested_amount: 999_999,
|
|
}).await.unwrap();
|
|
|
|
assert!(result.allowed);
|
|
assert!(result.is_unlimited);
|
|
}
|