use crate::lease::model::{Lease, LeaseExpiry};
#[derive(Debug, Clone, PartialEq, Eq)]
#[must_use]
pub enum ExpiryResult {
Active,
Expired,
}
impl ExpiryResult {
pub const fn is_expired(&self) -> bool {
matches!(self, Self::Expired)
}
pub const fn can_reenter_eligibility(&self) -> bool {
self.is_expired()
}
}
pub fn evaluate_expires_at(current_time: u64, lease_expiry: LeaseExpiry) -> ExpiryResult {
if current_time >= lease_expiry.expires_at() {
ExpiryResult::Expired
} else {
ExpiryResult::Active
}
}
pub fn evaluate(current_time: u64, lease: &Lease) -> ExpiryResult {
evaluate_expires_at(current_time, lease.expiry())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn lease_is_active_when_current_time_is_before_expiry() {
let current_time = 1500;
let expiry = LeaseExpiry::at(2000);
let result = evaluate_expires_at(current_time, expiry);
assert_eq!(result, ExpiryResult::Active);
assert!(!result.can_reenter_eligibility());
}
#[test]
fn lease_is_expired_when_current_time_equals_expiry() {
let current_time = 2000;
let expiry = LeaseExpiry::at(2000);
let result = evaluate_expires_at(current_time, expiry);
assert_eq!(result, ExpiryResult::Expired);
assert!(result.can_reenter_eligibility());
}
#[test]
fn lease_is_expired_when_current_time_is_after_expiry() {
let current_time = 2500;
let expiry = LeaseExpiry::at(2000);
let result = evaluate_expires_at(current_time, expiry);
assert_eq!(result, ExpiryResult::Expired);
assert!(result.can_reenter_eligibility());
}
#[test]
fn evaluate_lease_struct() {
let current_time = 2500;
let run_id = actionqueue_core::ids::RunId::new();
let owner = crate::lease::model::LeaseOwner::new("worker-1");
let expiry = LeaseExpiry::at(2000);
let lease = Lease::new(run_id, owner, expiry);
let result = evaluate(current_time, &lease);
assert_eq!(result, ExpiryResult::Expired);
}
#[test]
fn evaluation_is_deterministic() {
let current_time = 2500;
let expiry = LeaseExpiry::at(2000);
let first = evaluate_expires_at(current_time, expiry);
let second = evaluate_expires_at(current_time, expiry);
assert_eq!(first, second);
}
}