use eyre::Result;
use jiff::Timestamp;
use crate::config::Settings;
use crate::duration::parse_into_timestamp;
pub fn resolve_before_date(
before_date: Option<Timestamp>,
minimum_release_age: Option<&str>,
) -> Result<Option<Timestamp>> {
if let Some(before_date) = before_date {
return Ok(Some(before_date));
}
if let Some(before) = minimum_release_age {
return Ok(Some(parse_into_timestamp(before)?));
}
if let Some(before) = &Settings::get().minimum_release_age {
return Ok(Some(parse_into_timestamp(before)?));
}
Ok(None)
}
#[cfg(test)]
mod tests {
use super::resolve_before_date;
use crate::config::settings::{Settings, SettingsPartial};
use confique::Layer;
use jiff::Timestamp;
use test_log::test;
fn resolved_timestamp(
before_date: Option<Timestamp>,
minimum_release_age: Option<&str>,
) -> Option<Timestamp> {
resolve_before_date(before_date, minimum_release_age).unwrap()
}
#[test]
fn test_effective_before_date_prefers_override() {
Settings::reset(None);
let cli_before = "2024-01-02T03:04:05Z".parse().unwrap();
assert_eq!(
resolved_timestamp(Some(cli_before), Some("7d")),
Some(cli_before)
);
Settings::reset(None);
}
#[test]
fn test_effective_before_date_prefers_tool_option() {
Settings::reset(None);
assert_eq!(
resolved_timestamp(None, Some("2024-01-02")),
Some(crate::duration::parse_into_timestamp("2024-01-02").unwrap())
);
Settings::reset(None);
}
#[test]
fn test_effective_before_date_falls_back_to_global_setting() {
let mut partial = SettingsPartial::empty();
partial.minimum_release_age = Some("2024-01-03".to_string());
Settings::reset(Some(partial));
assert_eq!(
resolved_timestamp(None, None),
Some(crate::duration::parse_into_timestamp("2024-01-03").unwrap())
);
Settings::reset(None);
}
#[test]
fn test_effective_before_date_none_when_unset() {
Settings::reset(None);
assert_eq!(resolved_timestamp(None, None), None);
Settings::reset(None);
}
#[test]
fn test_effective_before_date_stable_within_process() {
Settings::reset(None);
let mut partial = SettingsPartial::empty();
partial.minimum_release_age = Some("3d".to_string());
Settings::reset(Some(partial));
let a = resolved_timestamp(None, None);
let b = resolved_timestamp(None, None);
assert_eq!(a, b);
Settings::reset(None);
}
}