ic-query 0.93.2

Internet Computer query library for CloudEngine, NNS, SNS, ICRC, system canisters, and public network metadata
Documentation
use super::*;
use ic_platform::candid::contract::Principal;

const SUBNET: &str = "pzp6e-ekpqk-3c5x7-2h6so-njoeq-mt45d-h3h6c-q3mxf-vpeq5-fk5o7-yae";

#[test]
fn subnet_record_failure_retains_exact_pinned_subject() {
    let request = MainnetRegistryFetchRequest {
        endpoint: "https://icp-api.io".to_string(),
        fetched_at: "2026-08-20T00:00:00Z".to_string(),
        fetched_by: "test".to_string(),
    };
    let subnet = Principal::from_text(SUBNET).expect("subnet");
    let key = crate::ic_registry::subnet_record_key(SUBNET);
    let failure = CatalogReadContext::new(&request, 882_110, &()).record_failure(
        SubnetCatalogRegistryRecordSubject::subnet_record(subnet),
        Some(882_000),
        RegistryFetchError::MissingValue { key: key.clone() },
    );

    assert_eq!(failure.evidence.registry_version, Some(882_110));
    assert_eq!(
        failure.evidence.subject,
        Some(SubnetCatalogSubject::RegistryRecord(
            SubnetCatalogRegistryRecordSubject {
                kind: SubnetCatalogRegistryRecordKind::SubnetRecord,
                key,
                subnet: Some(subnet),
                canister_range_start: None,
            }
        ))
    );
    assert_eq!(
        failure.evidence.returned_registry_value_version,
        Some(882_000)
    );
    assert_eq!(
        failure.evidence.source_endpoint.as_deref(),
        Some(request.endpoint.as_str())
    );
}

#[test]
fn routing_table_and_range_failures_retain_pinned_typed_subjects() {
    let request = MainnetRegistryFetchRequest {
        endpoint: "https://icp-api.io".to_string(),
        fetched_at: "2026-08-20T00:00:00Z".to_string(),
        fetched_by: "test".to_string(),
    };
    let table_failure = CatalogReadContext::new(&request, 882_111, &()).record_failure(
        SubnetCatalogRegistryRecordSubject::legacy_routing_table(),
        None,
        RegistryFetchError::EmptyRoutingTable,
    );
    assert_eq!(table_failure.evidence.registry_version, Some(882_111));
    assert!(matches!(
        table_failure.evidence.subject,
        Some(SubnetCatalogSubject::RegistryRecord(
            SubnetCatalogRegistryRecordSubject {
                kind: SubnetCatalogRegistryRecordKind::RoutingTable,
                ..
            }
        ))
    ));

    let range_failure = routing_range_failure(
        7,
        SubnetCatalogField::RoutingRangeStart,
        RegistryFetchError::MissingField {
            field: "range.start",
        },
    );
    let mut range_failure = range_failure;
    range_failure.evidence.registry_version = Some(882_111);
    assert_eq!(range_failure.evidence.registry_version, Some(882_111));
    assert_eq!(
        range_failure.evidence.subject,
        Some(SubnetCatalogSubject::RegistryRoutingTableEntry {
            index: 7,
            field: Some(SubnetCatalogField::RoutingRangeStart),
        })
    );
}