blob: f5de6c75490968c53dccdfb79cce2dc7d09881f4 [file] [log] [blame]
use super::*;
use crate::{do_cmd_renew, WildcardAuditRenewal};
struct ExpireTest {
today: chrono::NaiveDate,
start: chrono::NaiveDate,
end: chrono::NaiveDate,
}
impl ExpireTest {
pub fn new(future: chrono::Duration) -> Self {
let today = mock_today();
let end = today + future;
ExpireTest {
today,
start: today,
end,
}
}
pub fn with_start(start: chrono::Duration, end: chrono::Duration) -> Self {
let today = mock_today();
let start = today + start;
let end = today + end;
ExpireTest { today, start, end }
}
pub fn test_complex<'a, F, I>(
&'a self,
args: I,
mock: MockMetadata,
f: F,
) -> (Store, Arc<BasicTestOutput>)
where
F: FnOnce(&Self, &mut crate::format::WildcardAudits),
I: IntoIterator<Item = &'a str>,
{
let _enter = TEST_RUNTIME.enter();
let metadata = mock.metadata();
let (config, mut audits, imports) = builtin_files_no_exemptions(&metadata);
f(self, &mut audits.wildcard_audits);
let mut store = Store::mock(config, audits, imports);
let cfg = mock_cfg_args(&metadata, ["cargo", "vet", "renew"].into_iter().chain(args));
let sub_args = if let Some(crate::cli::Commands::Renew(sub_args)) = &cfg.cli.command {
sub_args
} else {
unreachable!();
};
let output = BasicTestOutput::new();
do_cmd_renew(&output.clone().as_dyn(), &cfg, &mut store, sub_args);
(store, output)
}
pub fn test_simple(&self) -> chrono::NaiveDate {
let (store, _) = self.test_complex(
["--expiring"],
MockMetadata::haunted_tree(),
|me, audits| {
audits.insert(
"third-normal".into(),
vec![WildcardEntry {
who: vec!["user".to_owned().into()],
criteria: vec!["safe-to-deploy".to_owned().into()],
user_id: 1,
start: me.start.into(),
end: me.end.into(),
renew: None,
notes: None,
aggregated_from: Default::default(),
is_fresh_import: false,
}],
);
},
);
*store.audits.wildcard_audits["third-normal"][0].end
}
pub fn renew_date(&self) -> chrono::NaiveDate {
self.today + chrono::Months::new(12)
}
}
/// The renew command should update an expiring wildcard audit.
#[test]
fn renew_expiring_wildcard_audits() {
let expire = ExpireTest::new(chrono::Duration::weeks(2));
let end = expire.test_simple();
assert_eq!(end, expire.renew_date());
}
/// The renew command should update an already-expired wildcard audit.
#[test]
fn renew_already_expired_wildcard_audits() {
let expire = ExpireTest::with_start(chrono::Duration::weeks(-5), chrono::Duration::weeks(-3));
let end = expire.test_simple();
assert_eq!(end, expire.renew_date());
}
/// The renew command should not update anything if end dates are far enough in the future.
#[test]
fn renew_no_expiring_wildcard_audits() {
let expire = ExpireTest::new(chrono::Duration::weeks(7));
let end = expire.test_simple();
assert_eq!(end, expire.end);
}
/// Providing a specific crate name should only renew that crate.
#[test]
fn renew_specific_crate() {
let expire = ExpireTest::new(chrono::Duration::weeks(3));
let (store, _) =
expire.test_complex(["third-dev"], MockMetadata::haunted_tree(), |et, audits| {
audits.insert(
"third-normal".into(),
vec![WildcardEntry {
who: vec!["user".to_owned().into()],
criteria: vec!["safe-to-deploy".to_owned().into()],
user_id: 1,
start: et.start.into(),
end: et.end.into(),
renew: None,
notes: None,
aggregated_from: Default::default(),
is_fresh_import: false,
}],
);
audits.insert(
"third-dev".into(),
vec![WildcardEntry {
who: vec!["user".to_owned().into()],
criteria: vec!["safe-to-deploy".to_owned().into()],
user_id: 1,
start: et.start.into(),
end: et.end.into(),
renew: None,
notes: None,
aggregated_from: Default::default(),
is_fresh_import: false,
}],
);
});
assert_eq!(
*store.audits.wildcard_audits["third-normal"][0].end,
expire.end
);
assert_eq!(
*store.audits.wildcard_audits["third-dev"][0].end,
expire.renew_date()
);
}
/// A wildcard entry with `renew = false` shouldn't be updated by renew.
#[test]
fn renew_expiring_set_false() {
let expire = ExpireTest::new(chrono::Duration::weeks(3));
let (store, _) = expire.test_complex(
["--expiring"],
MockMetadata::haunted_tree(),
|et, audits| {
audits.insert(
"third-normal".into(),
vec![WildcardEntry {
who: vec!["user".to_owned().into()],
criteria: vec!["safe-to-deploy".to_owned().into()],
user_id: 1,
start: et.start.into(),
end: et.end.into(),
renew: Some(false),
notes: None,
aggregated_from: Default::default(),
is_fresh_import: false,
}],
);
audits.insert(
"third-dev".into(),
vec![WildcardEntry {
who: vec!["user".to_owned().into()],
criteria: vec!["safe-to-deploy".to_owned().into()],
user_id: 1,
start: et.start.into(),
end: et.end.into(),
renew: None,
notes: None,
aggregated_from: Default::default(),
is_fresh_import: false,
}],
);
},
);
assert_eq!(
*store.audits.wildcard_audits["third-normal"][0].end,
expire.end
);
assert_eq!(
*store.audits.wildcard_audits["third-dev"][0].end,
expire.renew_date()
);
}
fn wildcard_audit_renewal_test<'a, Args, Create>(test_name: &str, args: Args, create: Create)
where
Args: IntoIterator<Item = &'a str>,
Create: for<'s> FnOnce(&Config, &'s mut Store) -> WildcardAuditRenewal<'s>,
{
let _enter = TEST_RUNTIME.enter();
let metadata = MockMetadata::simple().metadata();
let (config, mut audits, imports) = builtin_files_no_exemptions(&metadata);
let today = mock_today();
use chrono::Duration;
let start = today - Duration::weeks(10);
let expired = today - Duration::weeks(1);
let expiring = today + Duration::weeks(1);
let not_expiring = today + Duration::weeks(7);
let entry = |user_id: u64, end: chrono::NaiveDate, renew: Option<bool>| -> WildcardEntry {
WildcardEntry {
who: vec!["user".to_owned().into()],
criteria: vec!["safe-to-deploy".to_owned().into()],
user_id,
start: start.into(),
end: end.into(),
renew,
notes: None,
aggregated_from: Default::default(),
is_fresh_import: false,
}
};
audits.wildcard_audits.insert(
"foo".into(),
vec![
entry(1, expired, None),
entry(2, expiring, None),
entry(3, expiring, Some(false)),
entry(4, not_expiring, Some(false)),
entry(5, expired, Some(true)),
],
);
audits.wildcard_audits.insert(
"bar".into(),
vec![entry(3, expired, Some(false)), entry(6, not_expiring, None)],
);
audits
.wildcard_audits
.insert("baz".into(), vec![entry(7, expiring, None)]);
audits
.wildcard_audits
.insert("quux".into(), vec![entry(8, expired, None)]);
let mut store = Store::mock(config, audits, imports);
let cfg = mock_cfg_args(&metadata, ["cargo", "vet", "renew"].into_iter().chain(args));
let before = store.mock_commit();
create(&cfg, &mut store).renew(today + chrono::Months::new(12));
let after = store.mock_commit();
insta::assert_snapshot!(test_name, diff_store_commits(&before, &after));
}
#[test]
fn renew_expiring_selection_logic() {
wildcard_audit_renewal_test(
"renew-expiring-selection-logic",
["--expiring"],
|cfg, store| {
let renewal = WildcardAuditRenewal::expiring(cfg, store);
assert_eq!(renewal.expired_crates(), vec!["foo", "quux"]);
assert_eq!(renewal.expiring_crates(), vec!["baz", "foo"]);
renewal
},
);
}
#[test]
fn renew_specific_selection_logic() {
wildcard_audit_renewal_test("renew-specific-selection-logic", ["foo"], |_, store| {
WildcardAuditRenewal::single_crate("foo", store).expect("store inconsistent")
});
}