canic-cli 0.59.7

Operator CLI for Canic fleet setup, builds, evidence, catalog, backup, and restore workflows
Documentation
use super::super::compare as deploy_compare;
use super::super::output_format::CompareOutputFormat;
use super::fixtures::*;
use super::*;

fn compare_required_args() -> Vec<OsString> {
    vec![
        OsString::from("--left"),
        OsString::from("staging-check.json"),
        OsString::from("--right"),
        OsString::from("prod-check.json"),
    ]
}

#[test]
fn deploy_compare_parses_artifact_paths_and_text_format() {
    let mut args = compare_required_args();
    args.extend([
        OsString::from("--left-label"),
        OsString::from("staging"),
        OsString::from("--right-label"),
        OsString::from("prod"),
        OsString::from("--format"),
        OsString::from("text"),
    ]);
    let options = deploy_compare::DeployCompareOptions::parse(args).expect("parse deploy compare");

    assert_eq!(options.left, PathBuf::from("staging-check.json"));
    assert_eq!(options.right, PathBuf::from("prod-check.json"));
    assert_eq!(options.left_label.as_deref(), Some("staging"));
    assert_eq!(options.right_label.as_deref(), Some("prod"));
    assert_eq!(options.format, CompareOutputFormat::Text);
}

#[test]
fn deploy_compare_builder_uses_existing_check_artifacts() {
    let left = sample_authority_check();
    let mut right = sample_authority_check();
    right.plan.deployment_identity.deployment_name = "prod".to_string();

    let report = deploy_compare::build_report_from_checks(&left, &right, Some("stage"), None)
        .expect("comparison report should build");

    assert_eq!(report.report_id, "local:stage:prod:deployment-comparison");
    assert_eq!(report.left.label, "stage");
    assert_eq!(report.right.label, "prod");
    assert!(!report.identity_diff.is_empty());
    assert_eq!(report.report_digest.len(), 64);
}

#[test]
fn deploy_compare_rejects_unknown_format() {
    let mut args = compare_required_args();
    args.extend([OsString::from("--format"), OsString::from("yaml")]);
    let result = deploy_compare::DeployCompareOptions::parse(args);

    std::assert_matches!(
        result,
        Err(DeployCommandError::Usage(message))
            if message.contains("invalid deployment comparison output format: yaml")
    );
}

#[test]
fn deploy_compare_help_documents_passive_artifact_scope() {
    let help = deploy_compare::usage();

    assert!(help.contains("Compare two deployment truth check artifacts"));
    assert!(help.contains("DeploymentCheckV1 JSON artifacts"));
    assert!(help.contains("does not query live"));
    assert!(help.contains("install code"));
    assert!(help.contains("mutate deployments"));
    assert!(help.contains("embedded"));
    assert!(help.contains("revalidated"));
}

#[test]
fn deploy_compare_command_dispatches_compare() {
    let mut args = vec![OsString::from("compare")];
    args.extend(compare_required_args());
    let parsed = parse_subcommand(deploy_command(), args)
        .expect("parse deploy compare")
        .expect("compare command");

    assert_eq!(parsed.0, "compare");
    assert_eq!(parsed.1, compare_required_args());

    let options =
        deploy_compare::DeployCompareOptions::parse(parsed.1).expect("parse compare options");
    assert_eq!(options.left, PathBuf::from("staging-check.json"));
    assert_eq!(options.right, PathBuf::from("prod-check.json"));
}