ic-query 0.2.27

Internet Computer query CLI for NNS, SNS, and related public network metadata
Documentation
use super::*;

#[test]
fn nns_proposal_list_parses_defaults_and_json_format() {
    let defaults = NnsProposalsOptions::parse_list([]).expect("parse defaults");

    assert_eq!(defaults.network, MAINNET_NETWORK);
    assert_eq!(defaults.format, OutputFormat::Text);
    assert_eq!(
        defaults.source_endpoint,
        DEFAULT_NNS_PROPOSAL_SOURCE_ENDPOINT
    );
    assert_eq!(defaults.limit, 25);
    assert_eq!(defaults.before_proposal_id, None);
    assert_eq!(defaults.status, NnsProposalStatusFilter::Any);
    assert_eq!(defaults.reward_status, NnsProposalRewardStatusFilter::Any);
    assert_eq!(defaults.topic, NnsProposalTopicFilter::Any);
    assert_eq!(defaults.sort, NnsProposalsSort::Api);
    assert_eq!(defaults.sort_direction, NnsProposalSortDirection::Desc);
    assert_eq!(defaults.status.as_str(), NNS_PROPOSAL_STATUS_ANY_LABEL);
    assert_eq!(
        defaults.reward_status.as_str(),
        NNS_PROPOSAL_REWARD_STATUS_ANY_LABEL
    );
    assert_eq!(defaults.topic.as_str(), NNS_PROPOSAL_TOPIC_ANY_LABEL);
    assert_eq!(defaults.sort.as_str(), NNS_PROPOSAL_SORT_API_LABEL);
    assert_eq!(
        defaults.sort.direction_label(defaults.sort_direction),
        NNS_PROPOSAL_SORT_NONE_LABEL
    );
    assert!(!defaults.verbose);

    let options = NnsProposalsOptions::parse_list([
        OsString::from("--format"),
        OsString::from("json"),
        OsString::from("--source-endpoint"),
        OsString::from("https://icp-api.io"),
        OsString::from("--limit"),
        OsString::from("50"),
        OsString::from("--before"),
        OsString::from("132000"),
        OsString::from("--status"),
        OsString::from(NNS_PROPOSAL_STATUS_EXECUTED_LABEL),
        OsString::from("--reward-status"),
        OsString::from(NNS_PROPOSAL_REWARD_STATUS_SETTLED_LABEL),
        OsString::from("--topic"),
        OsString::from(NNS_PROPOSAL_TOPIC_GOVERNANCE_LABEL),
        OsString::from("--sort"),
        OsString::from(NNS_PROPOSAL_SORT_TITLE_LABEL),
        OsString::from("--asc"),
        OsString::from("--verbose"),
    ])
    .expect("parse nns proposal list");

    assert_eq!(options.format, OutputFormat::Json);
    assert_eq!(options.source_endpoint, "https://icp-api.io");
    assert_eq!(options.limit, 50);
    assert_eq!(options.before_proposal_id, Some(132_000));
    assert_eq!(options.status, NnsProposalStatusFilter::Executed);
    assert_eq!(
        options.reward_status,
        NnsProposalRewardStatusFilter::Settled
    );
    assert_eq!(options.topic, NnsProposalTopicFilter::Governance);
    assert_eq!(options.sort, NnsProposalsSort::Title);
    assert_eq!(options.sort_direction, NnsProposalSortDirection::Asc);
    assert_eq!(options.status.as_str(), NNS_PROPOSAL_STATUS_EXECUTED_LABEL);
    assert_eq!(
        options.reward_status.as_str(),
        NNS_PROPOSAL_REWARD_STATUS_SETTLED_LABEL
    );
    assert_eq!(options.topic.as_str(), NNS_PROPOSAL_TOPIC_GOVERNANCE_LABEL);
    assert_eq!(options.sort.as_str(), NNS_PROPOSAL_SORT_TITLE_LABEL);
    assert_eq!(
        options.sort.direction_label(options.sort_direction),
        NNS_PROPOSAL_SORT_ASC_LABEL
    );
    assert!(options.verbose);

    let grouped_options = NnsProposalsOptions::parse_list([
        OsString::from("--limit"),
        OsString::from("10"),
        OsString::from("--reward-status"),
        OsString::from(NNS_PROPOSAL_REWARD_STATUS_SETTLED_LABEL),
    ])
    .expect("parse nns proposal list");

    assert_eq!(grouped_options.limit, 10);
    assert_eq!(
        grouped_options.reward_status,
        NnsProposalRewardStatusFilter::Settled
    );
}

#[test]
fn nns_proposal_parses_id_and_json_format() {
    let options = NnsProposalOptions::parse_info([
        OsString::from("132411"),
        OsString::from("--format"),
        OsString::from("json"),
        OsString::from("--source-endpoint"),
        OsString::from("https://icp-api.io"),
        OsString::from("--ballots"),
        OsString::from("--verbose"),
    ])
    .expect("parse nns proposal info");

    assert_eq!(options.network, MAINNET_NETWORK);
    assert_eq!(options.format, OutputFormat::Json);
    assert_eq!(options.source_endpoint, "https://icp-api.io");
    assert_eq!(options.proposal_id, 132_411);
    assert!(options.show_ballots);
    assert!(options.verbose);

    let grouped_options = NnsProposalOptions::parse_info([
        OsString::from("132411"),
        OsString::from("--ballots"),
        OsString::from("--verbose"),
    ])
    .expect("parse nns proposal info");

    assert_eq!(grouped_options.proposal_id, 132_411);
    assert!(grouped_options.show_ballots);
    assert!(grouped_options.verbose);
}

#[test]
fn nns_proposal_help_is_advertised_under_nns() {
    let nns = usage();
    let proposal = nns_proposal_usage();
    let proposal_list = nns_proposal_list_usage();
    let proposal_info = nns_proposal_info_usage();

    assert!(nns.contains("proposal"));
    assert!(!nns.contains("\n  proposals"));
    assert!(proposal.contains("list"));
    assert!(proposal.contains("info"));
    assert!(proposal.contains("icq nns proposal list"));
    assert!(proposal.contains("icq nns proposal info 132411"));
    assert!(proposal_list.contains("icq nns proposal list"));
    assert!(proposal_list.contains("--reward-status settled"));
    assert!(proposal_info.contains("icq nns proposal info 132411"));
    assert!(proposal_list.contains("--limit 50"));
    assert!(proposal_list.contains("--before 132000"));
    assert!(proposal_list.contains("--status open"));
    assert!(proposal_list.contains("--reward-status settled"));
    assert!(proposal_list.contains("--topic governance"));
    assert!(proposal_list.contains("--sort title --asc"));
    assert!(!proposal.contains("icq nns proposal 132411"));
    assert!(proposal_info.contains("--ballots"));
    assert!(proposal_info.contains("--verbose"));
    assert!(proposal_info.contains("--format json"));
}

#[test]
fn nns_proposal_list_rejects_direction_without_local_sort() {
    let err = NnsProposalsOptions::parse_list([OsString::from("--desc")])
        .expect_err("direction without local sort rejected");

    assert!(err.to_string().contains("--desc requires --sort"));
}

#[test]
fn nns_proposal_list_local_is_rejected_with_pinned_message() {
    let err = run([
        OsString::from("proposal"),
        OsString::from("list"),
        OsString::from("--__icq-network"),
        OsString::from("local"),
    ])
    .expect_err("local rejected");

    let message = err.to_string();
    assert!(message.contains("supports only the mainnet `ic` network"));
    assert!(message.contains("icq --network ic nns proposal list"));
}

#[test]
fn nns_proposals_alias_is_rejected() {
    let err = run([
        OsString::from("proposals"),
        OsString::from("--limit"),
        OsString::from("10"),
    ])
    .expect_err("old proposals alias rejected");

    assert!(err.to_string().contains("Usage: icq nns"));
}

#[test]
fn nns_proposal_bare_id_alias_is_rejected() {
    let err = run([OsString::from("proposal"), OsString::from("132411")])
        .expect_err("bare proposal id alias rejected");

    assert!(err.to_string().contains("Usage: icq nns proposal"));
}