ic-query 0.96.0

Internet Computer query library for CloudEngine, NNS, SNS, ICRC, system canisters, and public network metadata
Documentation
use super::{fixtures::*, *};

#[tokio::test(flavor = "current_thread")]
async fn node_provider_report_uses_live_governance_source() {
    let request = NnsInventoryListRequest {
        cache: test_cache_request(MAINNET_NETWORK, "uses-live-source"),
        source_endpoint: "https://icp-api.io".to_string(),
        now_unix_secs: 1_780_531_200,
    };
    let report = build_nns_node_provider_list_report_with_source_and_progress(
        &request,
        &FixtureNodeProviderSource {
            node_providers: vec![
                NnsNodeProviderRow {
                    name: None,
                    node_provider_principal: "aaaaa-aa".to_string(),
                    node_count: Some(3),
                    reward_account_hex: Some("abcd".to_string()),
                },
                NnsNodeProviderRow {
                    name: None,
                    node_provider_principal: "ryjl3-tyaaa-aaaaa-aaaba-cai".to_string(),
                    node_count: None,
                    reward_account_hex: None,
                },
            ],
        },
        &mut |_| {},
    )
    .await
    .expect("node provider report");

    assert_eq!(report.schema_version, 1);
    assert_eq!(report.provenance.network, MAINNET_NETWORK);
    assert_eq!(
        report.governance_canister_id,
        MAINNET_GOVERNANCE_CANISTER_ID
    );
    assert_eq!(
        report.provenance.registry_canister_id,
        MAINNET_REGISTRY_CANISTER_ID
    );
    assert_eq!(report.provenance.registry_version, 42);
    assert_eq!(report.provenance.fetched_at, "2026-06-04T00:00:00Z");
    assert_eq!(report.node_providers.len(), 2);
    assert_eq!(report.node_providers[0].node_provider_principal, "aaaaa-aa");
    assert_eq!(report.node_providers[0].name, None);
    assert_eq!(report.node_providers[0].node_count, Some(3));
    assert_eq!(
        report.node_providers[0].reward_account_hex.as_deref(),
        Some("abcd")
    );
}

#[tokio::test(flavor = "current_thread")]
async fn node_provider_list_rejects_local_network() {
    let request = NnsInventoryListRequest {
        cache: test_cache_request("local", "local-rejected"),
        source_endpoint: "https://icp-api.io".to_string(),
        now_unix_secs: 1,
    };

    let err = build_nns_node_provider_list_report_with_source_and_progress(
        &request,
        &FixtureNodeProviderSource {
            node_providers: Vec::new(),
        },
        &mut |_| {},
    )
    .await
    .expect_err("local rejected");

    assert!(
        matches!(err, NnsInventoryError::UnsupportedNetwork { collection: crate::nns::NnsInventoryCollection::RegistryInventory, network } if network == "local")
    );
}

#[test]
fn node_provider_inventory_validation_rejects_wrong_governance_identity() {
    let mut report = node_provider_report_fixture();
    report.governance_canister_id = "aaaaa-aa".to_string();

    let metadata = NnsNodeProviderMetadata {
        schema_version: 1,
        source: report.governance_source,
        governance_canister_id: report.governance_canister_id,
        node_providers: Vec::new(),
    };
    let reason = metadata.validate().expect_err("wrong Governance identity");

    assert!(reason.contains("governance_canister_id"));
}