From 81157e6ce9eb00478617f41fa64dc0d52c5cfbfe Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Sat, 11 Oct 2025 07:37:07 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(config):=20add=20date=20calcul?= =?UTF-8?q?ation=20for=20EOL=20queries?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - introduce calculate_for_date function to allow EOL query generation for specific dates - add test cases for EOL query generation with different time spans --- src/config/eol_rule.rs | 56 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/src/config/eol_rule.rs b/src/config/eol_rule.rs index 6fd6fe1..01321f8 100644 --- a/src/config/eol_rule.rs +++ b/src/config/eol_rule.rs @@ -1,6 +1,6 @@ use std::{collections::BTreeSet, fmt}; -use chrono::{Datelike, Local, TimeDelta, TimeZone}; +use chrono::{DateTime, Datelike, Local, TimeDelta, TimeZone}; use serde::{Deserialize, Serialize}; use crate::{MessageAge, Retention, eol_action::EolAction}; @@ -136,6 +136,10 @@ impl EolRule { pub(crate) fn eol_query(&self) -> Option { let today = chrono::Local::now(); + self.calculate_for_date(today) + } + + fn calculate_for_date(&self, today: DateTime) -> Option { let message_age = MessageAge::parse(&self.retention)?; let deadline = match message_age { @@ -184,6 +188,8 @@ impl EolRule { #[cfg(test)] mod test { + use chrono::{Local, TimeZone}; + use crate::{Retention, config::eol_rule::EolRule}; #[test] @@ -233,4 +239,52 @@ mod test { 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); + } }