ic-query-cli 0.26.10

Command-line wrapper for read-only Internet Computer metadata queries
Documentation
use super::*;
use crate::cli::clap::render_help;
use ic_query::subnet_catalog::SubnetKind;

#[test]
fn node_list_parses_defaults_and_json_format() {
    let defaults = parse_test_options(node_list_command(), &[], node_list_options_from_matches)
        .expect("parse defaults");

    assert_eq!(defaults.network, MAINNET_NETWORK);
    assert_eq!(defaults.format, OutputFormat::Text);
    assert_eq!(defaults.source_endpoint, DEFAULT_NNS_NODE_SOURCE_ENDPOINT);
    assert!(!defaults.verbose);

    let options = parse_test_options(
        node_list_command(),
        &[
            "--json",
            "--source-endpoint",
            "https://icp-api.io",
            "--verbose",
            "--data-center",
            "zh2",
            "--node-provider",
            "7at4h",
            "--node-operator",
            "4lp6i",
            "--subnet",
            "tdb26",
            "--kind",
            "system",
        ],
        node_list_options_from_matches,
    )
    .expect("parse node list");

    assert_eq!(options.format, OutputFormat::Json);
    assert_eq!(options.source_endpoint, "https://icp-api.io");
    assert!(options.verbose);
    assert_eq!(options.filters.data_center.as_deref(), Some("zh2"));
    assert_eq!(options.filters.node_provider.as_deref(), Some("7at4h"));
    assert_eq!(options.filters.node_operator.as_deref(), Some("4lp6i"));
    assert_eq!(options.filters.subnet.as_deref(), Some("tdb26"));
    assert_eq!(options.filters.subnet_kind, Some(SubnetKind::System));
}

#[test]
fn node_info_parses_input_and_json_format() {
    let options = parse_test_options(
        leaf_info_command(&NODE_SPEC, DEFAULT_NNS_NODE_SOURCE_ENDPOINT),
        &["ryjl", "--json", "--source-endpoint", "https://icp-api.io"],
        NnsLeafInfoOptions::from_matches,
    )
    .expect("parse node info");

    assert_eq!(options.input, "ryjl");
    assert_eq!(options.network, MAINNET_NETWORK);
    assert_eq!(options.format, OutputFormat::Json);
    assert_eq!(options.source_endpoint, "https://icp-api.io");
}

#[test]
fn node_kind_filter_parses_every_registry_kind() {
    for (value, expected) in [
        ("application", SubnetKind::Application),
        ("cloud_engine", SubnetKind::CloudEngine),
        ("system", SubnetKind::System),
        ("unknown", SubnetKind::Unknown),
    ] {
        let options = parse_test_options(
            node_list_command(),
            &["--kind", value],
            node_list_options_from_matches,
        )
        .expect("parse supported Subnet kind");

        assert_eq!(options.filters.subnet_kind, Some(expected));
    }

    assert!(
        parse_test_options(
            node_list_command(),
            &["--kind", "public"],
            node_list_options_from_matches,
        )
        .is_err()
    );
}

#[test]
fn node_refresh_parses_defaults_and_export_options() {
    let defaults = parse_test_options(
        leaf_refresh_command(&NODE_SPEC, DEFAULT_NNS_NODE_SOURCE_ENDPOINT),
        &[],
        NnsLeafRefreshOptions::from_matches,
    )
    .expect("parse refresh defaults");

    assert_eq!(defaults.network, MAINNET_NETWORK);
    assert_eq!(defaults.format, OutputFormat::Text);
    assert_eq!(defaults.source_endpoint, DEFAULT_NNS_NODE_SOURCE_ENDPOINT);
    assert_eq!(
        defaults.lock_stale_after_seconds,
        DEFAULT_NODE_REFRESH_LOCK_STALE_SECONDS
    );
    assert!(!defaults.dry_run);
    assert_eq!(defaults.output_path, None);

    let options = parse_test_options(
        leaf_refresh_command(&NODE_SPEC, DEFAULT_NNS_NODE_SOURCE_ENDPOINT),
        &[
            "--json",
            "--source-endpoint",
            "https://icp-api.io",
            "--lock-stale-after",
            "5m",
            "--dry-run",
            "--output",
            "nodes.preview.json",
        ],
        NnsLeafRefreshOptions::from_matches,
    )
    .expect("parse node refresh");

    assert_eq!(options.format, OutputFormat::Json);
    assert_eq!(options.source_endpoint, "https://icp-api.io");
    assert_eq!(options.lock_stale_after_seconds, 300);
    assert!(options.dry_run);
    assert_eq!(
        options.output_path,
        Some(PathBuf::from("nodes.preview.json"))
    );
}

#[test]
fn node_help_is_advertised_under_nns() {
    let nns = render_help(command());
    let node = render_help(node_command());
    let list = render_help(node_list_command());
    let info = render_help(leaf_info_command(
        &NODE_SPEC,
        DEFAULT_NNS_NODE_SOURCE_ENDPOINT,
    ));
    let refresh = render_help(leaf_refresh_command(
        &NODE_SPEC,
        DEFAULT_NNS_NODE_SOURCE_ENDPOINT,
    ));

    assert!(nns.contains("node"));
    assert!(node.contains("List cached mainnet NNS nodes"));
    assert!(node.contains("Show one cached mainnet NNS node"));
    assert!(node.contains("Force-refresh and cache NNS node metadata"));
    assert!(list.contains("icq nns node list"));
    assert!(list.contains("Collection mode: Cache-backed read"));
    assert!(list.contains("--verbose"));
    assert!(list.contains("--json"));
    assert!(list.contains("--data-center"));
    assert!(list.contains("--node-provider"));
    assert!(list.contains("--node-operator"));
    assert!(list.contains("--subnet"));
    assert!(list.contains("--kind"));
    assert!(info.contains("icq nns node info"));
    assert!(info.contains("node|node-prefix"));
    assert!(refresh.contains("icq nns node refresh"));
    assert!(refresh.contains("Collection mode: Forced live refresh"));
    assert!(refresh.contains("--dry-run"));
}