ic-query 0.97.0

Internet Computer query library for CloudEngine, NNS, SNS, ICRC, system canisters, and public network metadata
Documentation
use super::*;
use crate::ic::{
    DEFAULT_ICRC_ACCOUNT_INFO_SOURCE_ENDPOINT, DEFAULT_ICRC_ANALYTICS_SOURCE_ENDPOINT,
    IcIcrcAccountSort, IcIcrcHolderSort,
};

const LEDGER: &str = "mxzaz-hqaaa-aaaar-qaada-cai";

#[test]
fn index_wire_records_preserve_raw_fields_and_optional_fee_defaults() {
    let value = serde_json::json!({
        "id": "opaque-account", "owner": "aaaaa-aa", "subaccount": "00",
        "balance": "18446744073709551616", "total_transactions": 7,
        "created_timestamp": u64::MAX, "ledger_canister_id": LEDGER,
        "latest_transaction_index": 8, "updated_at": "source-time"
    });
    let account: IcIcrcAccountSourceRow = serde_json::from_value(value.clone()).unwrap();
    assert_eq!(account.account_id, "opaque-account");
    assert_eq!(account.balance_base_units, "18446744073709551616");
    assert_eq!(account.created_at_unix_nanos, u64::MAX);
    assert_eq!(account.dashboard_updated_at, "source-time");
    assert!(!account.active_fee_collector);
    assert_eq!(
        account.fee_collector_block_ranges,
        Vec::<Vec<serde_json::Value>>::new()
    );
    let mut missing = value;
    missing.as_object_mut().unwrap().remove("owner");
    assert!(serde_json::from_value::<IcIcrcAccountSourceRow>(missing).is_err());
    let holder: IcIcrcHolderSourceRow = serde_json::from_value(serde_json::json!({
        "principal": "aaaaa-aa", "balance": "123", "total_transactions": 7,
        "created_timestamp": u64::MAX, "ledger_canister_id": LEDGER,
        "latest_transaction_index": 8, "percentage": "12.5", "value_usd": null,
        "updated_at": "source-time"
    }))
    .unwrap();
    assert_eq!(holder.balance_base_units, "123");
    assert_eq!(holder.created_at_unix_nanos, u64::MAX);
    assert_eq!(holder.percentage, serde_json::json!("12.5"));
    assert!(holder.value_usd.is_null());
}

#[test]
fn account_list_url_preserves_owner_cursor_limit_and_sort() {
    let mut query = IcIcrcAccountListQuery::new(2, IcIcrcAccountSort::BalanceDescending);
    query.owner = Some("222nw-nqiei-h4uy6-fqm54-d3slu-jveav-vqrn6-yojxi-4eug3-2ejie-vae".into());
    query.after = Some("1668734888.0,hkmli-faaaa-aaaar-qb4ba-cai".into());

    let url = account_list_url(DEFAULT_ICRC_ANALYTICS_SOURCE_ENDPOINT, LEDGER, &query)
        .expect("account-list URL");

    assert_eq!(
        url.path(),
        "/api/v2/ledgers/mxzaz-hqaaa-aaaar-qaada-cai/accounts"
    );
    assert_eq!(
        url.query(),
        Some(
            "owner=222nw-nqiei-h4uy6-fqm54-d3slu-jveav-vqrn6-yojxi-4eug3-2ejie-vae&after=1668734888.0&after=hkmli-faaaa-aaaar-qb4ba-cai&limit=2&sort_by=-balance"
        )
    );
}

#[test]
fn holder_list_and_exact_account_use_their_declared_api_versions() {
    let holder = holder_list_url(
        DEFAULT_ICRC_ANALYTICS_SOURCE_ENDPOINT,
        LEDGER,
        &IcIcrcHolderListQuery::new(20, IcIcrcHolderSort::Principal),
    )
    .expect("holder-list URL");
    let account = account_info_url(
        DEFAULT_ICRC_ACCOUNT_INFO_SOURCE_ENDPOINT,
        LEDGER,
        "222nw-nqiei-h4uy6-fqm54-d3slu-jveav-vqrn6-yojxi-4eug3-2ejie-vae",
    )
    .expect("account-info URL");

    assert_eq!(
        holder.path(),
        "/api/v2/ledgers/mxzaz-hqaaa-aaaar-qaada-cai/holders"
    );
    assert_eq!(
        account.path(),
        "/api/v1/ledgers/mxzaz-hqaaa-aaaar-qaada-cai/accounts/222nw-nqiei-h4uy6-fqm54-d3slu-jveav-vqrn6-yojxi-4eug3-2ejie-vae"
    );
}