rc-core 0.1.30

Core library for rustfs-cli S3 CLI client
Documentation
use std::time::Duration;

use rc_core::ops::{
    HealthProbe, UsageBucket, UsageReport, UsageScanRequest, UsageScope, UsageSource,
};

#[test]
fn health_probe_paths_match_rustfs_beta_10_contract() {
    assert_eq!(HealthProbe::Liveness.path(), "/health");
    assert_eq!(HealthProbe::Readiness.path(), "/health/ready");
}

#[test]
fn usage_report_totals_are_deterministic_and_saturating() {
    let mut report = UsageReport::empty(UsageSource::ClientScan, UsageScope::Cluster, None);
    report.push_bucket(UsageBucket {
        name: "zeta".to_string(),
        total_bytes: 7,
        object_count: 2,
        version_count: Some(3),
        delete_marker_count: Some(1),
        incomplete_upload_count: Some(1),
        incomplete_upload_bytes: Some(5),
    });
    report.push_bucket(UsageBucket {
        name: "alpha".to_string(),
        total_bytes: 11,
        object_count: 4,
        version_count: Some(6),
        delete_marker_count: Some(2),
        incomplete_upload_count: Some(0),
        incomplete_upload_bytes: Some(0),
    });
    report.finish();

    assert_eq!(report.total_bytes, 18);
    assert_eq!(report.object_count, 6);
    assert_eq!(report.version_count, Some(9));
    assert_eq!(report.delete_marker_count, Some(3));
    assert_eq!(report.incomplete_upload_count, Some(1));
    assert_eq!(report.incomplete_upload_bytes, Some(5));
    assert_eq!(report.buckets[0].name, "alpha");
    assert_eq!(report.buckets[1].name, "zeta");
}

#[test]
fn usage_scan_request_exposes_expensive_dimensions_explicitly() {
    let request = UsageScanRequest {
        bucket: Some("photos".to_string()),
        prefix: Some("2026/".to_string()),
        include_versions: true,
        include_incomplete_uploads: true,
    };

    assert_eq!(request.scope(), UsageScope::Prefix);
    assert!(request.requires_client_scan());
    assert_eq!(
        request.path("local"),
        Some("local/photos/2026/".to_string())
    );
    assert_eq!(Duration::from_secs(5).as_millis(), 5_000);
}