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"));
}