mabi-cli 1.7.0

Mabinogion - Industrial Protocol Simulator CLI
Documentation
use assert_cmd::assert::OutputAssertExt;
use predicates::str::contains;
use serde_json::Value;
use std::process::Command;

#[test]
fn version_command_reports_workspace_release_version() {
    let mut command = Command::new(env!("CARGO_BIN_EXE_mabi"));
    command
        .arg("version")
        .assert()
        .success()
        .stdout(contains(format!(
            "mabi {} (Mabinogion)",
            mabi_core::RELEASE_VERSION
        )));
}

#[test]
fn version_command_reports_runner_contract_metadata_as_json() {
    let output = Command::new(env!("CARGO_BIN_EXE_mabi"))
        .args(["--format", "json", "version"])
        .output()
        .expect("version command should run");

    assert!(
        output.status.success(),
        "version failed: {}",
        String::from_utf8_lossy(&output.stderr)
    );
    let envelope: Value = serde_json::from_slice(&output.stdout).expect("version output is JSON");
    assert_eq!(envelope["contract_version"], "local-runner-contract-v1");
    assert_eq!(envelope["envelope_version"], "cli-output-envelope-v1");
    assert_eq!(envelope["command"], "version");
    assert_eq!(envelope["status"], "success");
    assert_eq!(
        envelope["data"]["engine_version"],
        mabi_core::RELEASE_VERSION
    );
    assert_eq!(
        envelope["data"]["contract_versions"]["local_runner_contract"],
        "local-runner-contract-v1"
    );
    assert_eq!(
        envelope["data"]["contract_versions"]["runtime_contract"],
        "runtime-contract-v1"
    );
    assert_eq!(
        envelope["data"]["contract_versions"]["unified_readiness_contract"],
        "unified-readiness-contract-v1"
    );
    assert_eq!(
        envelope["data"]["contract_versions"]["run_evidence_schema"],
        "run-evidence-schema-v1"
    );
    assert_eq!(
        envelope["data"]["contract_versions"]["trial_artifact_contract"],
        "trial-artifact-contract-v1"
    );
    assert_eq!(
        envelope["data"]["contract_versions"]["version_metadata_contract"],
        "version-metadata-contract-v1"
    );
    assert_eq!(
        envelope["data"]["release_metadata"]["engine_version"],
        mabi_core::RELEASE_VERSION
    );
    assert_eq!(
        envelope["data"]["release_metadata"]["release_channel"],
        "source-build"
    );
    assert_eq!(
        envelope["data"]["release_metadata"]["compatibility_matrix_version"],
        "compatibility-matrix-v1"
    );
    assert_eq!(
        envelope["data"]["trial_compatible_metadata"]["trial_definition_owner"],
        "mabinogion-trials"
    );
    assert_eq!(
        envelope["data"]["trial_compatible_metadata"]["compatible_trial_suite_range"],
        ">=0.1.0 <1.0.0"
    );
    assert_eq!(
        envelope["data"]["trial_compatible_metadata"]["compatibility_decision_owner"],
        "mabinogion-trials-or-forge"
    );
    assert_eq!(
        envelope["data"]["registered_protocols"]
            .as_array()
            .expect("protocols array")
            .len(),
        4
    );
    for protocol in envelope["data"]["registered_protocols"]
        .as_array()
        .expect("protocols array")
    {
        assert_eq!(protocol["protocol_key"], protocol["key"]);
        assert!(
            protocol["capability_version"]
                .as_str()
                .expect("capability version should be a string")
                .ends_with("-capabilities-v1"),
            "protocol should report a capability version"
        );
        assert_eq!(
            protocol["readiness_matrix_version"],
            "protocol-readiness-matrix-v1"
        );
        assert_eq!(
            protocol["readiness_contract_version"],
            "unified-readiness-contract-v1"
        );
        assert!(
            !protocol["trial_profile_ids"]
                .as_array()
                .expect("trial profile ids should be an array")
                .is_empty(),
            "protocol should expose trial profile ids"
        );
    }
}