use chrono::NaiveDate;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AbandonedPackageView {
pub name: String,
pub version: String,
pub last_release_date: NaiveDate,
pub days_inactive: i64,
pub is_direct: bool,
}
#[derive(Debug, Clone)]
pub struct AbandonedPackagesReport {
pub packages: Vec<AbandonedPackageView>,
pub threshold_days: u64,
}
impl Default for AbandonedPackagesReport {
fn default() -> Self {
Self {
packages: Vec::new(),
threshold_days: 730,
}
}
}
impl AbandonedPackagesReport {
pub fn total_count(&self) -> usize {
self.packages.len()
}
pub fn direct_count(&self) -> usize {
self.packages.iter().filter(|p| p.is_direct).count()
}
pub fn transitive_count(&self) -> usize {
self.packages.iter().filter(|p| !p.is_direct).count()
}
pub fn is_empty(&self) -> bool {
self.packages.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
fn make_view(name: &str, days_inactive: i64, is_direct: bool) -> AbandonedPackageView {
AbandonedPackageView {
name: name.to_string(),
version: "1.0.0".to_string(),
last_release_date: NaiveDate::from_ymd_opt(2020, 1, 1).unwrap(),
days_inactive,
is_direct,
}
}
#[test]
fn test_default_report_is_empty() {
let report = AbandonedPackagesReport::default();
assert!(report.is_empty());
assert_eq!(report.total_count(), 0);
assert_eq!(report.direct_count(), 0);
assert_eq!(report.transitive_count(), 0);
assert_eq!(report.threshold_days, 730);
}
#[test]
fn test_total_count() {
let report = AbandonedPackagesReport {
packages: vec![
make_view("a", 400, true),
make_view("b", 500, false),
make_view("c", 600, false),
],
threshold_days: 365,
};
assert_eq!(report.total_count(), 3);
assert!(!report.is_empty());
}
#[test]
fn test_direct_and_transitive_counts() {
let report = AbandonedPackagesReport {
packages: vec![
make_view("a", 400, true),
make_view("b", 500, true),
make_view("c", 600, false),
],
threshold_days: 365,
};
assert_eq!(report.direct_count(), 2);
assert_eq!(report.transitive_count(), 1);
}
#[test]
fn test_view_clone_and_eq() {
let a = make_view("requests", 800, true);
let b = a.clone();
assert_eq!(a, b);
}
#[test]
fn test_threshold_days_preserved() {
let report = AbandonedPackagesReport {
packages: vec![],
threshold_days: 730,
};
assert_eq!(report.threshold_days, 730);
}
}