✨ feat(config): add date calculation for EOL queries
- introduce calculate_for_date function to allow EOL query generation for specific dates - add test cases for EOL query generation with different time spans
This commit is contained in:
committed by
Jeremiah Russell
parent
c25f925373
commit
81157e6ce9
@@ -1,6 +1,6 @@
|
|||||||
use std::{collections::BTreeSet, fmt};
|
use std::{collections::BTreeSet, fmt};
|
||||||
|
|
||||||
use chrono::{Datelike, Local, TimeDelta, TimeZone};
|
use chrono::{DateTime, Datelike, Local, TimeDelta, TimeZone};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::{MessageAge, Retention, eol_action::EolAction};
|
use crate::{MessageAge, Retention, eol_action::EolAction};
|
||||||
@@ -136,6 +136,10 @@ impl EolRule {
|
|||||||
|
|
||||||
pub(crate) fn eol_query(&self) -> Option<String> {
|
pub(crate) fn eol_query(&self) -> Option<String> {
|
||||||
let today = chrono::Local::now();
|
let today = chrono::Local::now();
|
||||||
|
self.calculate_for_date(today)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn calculate_for_date(&self, today: DateTime<Local>) -> Option<String> {
|
||||||
let message_age = MessageAge::parse(&self.retention)?;
|
let message_age = MessageAge::parse(&self.retention)?;
|
||||||
|
|
||||||
let deadline = match message_age {
|
let deadline = match message_age {
|
||||||
@@ -184,6 +188,8 @@ impl EolRule {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
|
use chrono::{Local, TimeZone};
|
||||||
|
|
||||||
use crate::{Retention, config::eol_rule::EolRule};
|
use crate::{Retention, config::eol_rule::EolRule};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -233,4 +239,52 @@ mod test {
|
|||||||
rule.to_string()
|
rule.to_string()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_eol_query_for_eol_rule_5_years() {
|
||||||
|
let retention = Retention::new(crate::MessageAge::Years(5), true);
|
||||||
|
let mut rule = EolRule::new(1);
|
||||||
|
rule.set_retention(retention);
|
||||||
|
|
||||||
|
let test_today = Local.with_ymd_and_hms(2025, 9, 15, 0, 0, 0).unwrap();
|
||||||
|
let query = rule.calculate_for_date(test_today).unwrap();
|
||||||
|
|
||||||
|
assert_eq!("before: 2020-09-15", query);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_eol_query_for_eol_rule_1_month() {
|
||||||
|
let retention = Retention::new(crate::MessageAge::Months(1), true);
|
||||||
|
let mut rule = EolRule::new(2);
|
||||||
|
rule.set_retention(retention);
|
||||||
|
|
||||||
|
let test_today = Local.with_ymd_and_hms(2025, 9, 15, 0, 0, 0).unwrap();
|
||||||
|
let query = rule.calculate_for_date(test_today).unwrap();
|
||||||
|
|
||||||
|
assert_eq!("before: 2025-08-15", query);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_eol_query_for_eol_rule_13_weeks() {
|
||||||
|
let retention = Retention::new(crate::MessageAge::Weeks(13), true);
|
||||||
|
let mut rule = EolRule::new(3);
|
||||||
|
rule.set_retention(retention);
|
||||||
|
|
||||||
|
let test_today = Local.with_ymd_and_hms(2025, 9, 15, 0, 0, 0).unwrap();
|
||||||
|
let query = rule.calculate_for_date(test_today).unwrap();
|
||||||
|
|
||||||
|
assert_eq!("before: 2025-06-16", query);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_eol_query_for_eol_rule_365_days() {
|
||||||
|
let retention = Retention::new(crate::MessageAge::Days(365), true);
|
||||||
|
let mut rule = EolRule::new(4);
|
||||||
|
rule.set_retention(retention);
|
||||||
|
|
||||||
|
let test_today = Local.with_ymd_and_hms(2025, 9, 15, 0, 0, 0).unwrap();
|
||||||
|
let query = rule.calculate_for_date(test_today).unwrap();
|
||||||
|
|
||||||
|
assert_eq!("before: 2024-09-15", query);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user