rust-okx 0.5.0

Async Rust client for the OKX v5 REST API
Documentation
use http::Method;

use crate::test_util::MockTransport;

use super::super::{
    DepositHistoryRequest, DepositLightningRequest, DepositWithdrawStatusRequest,
    FundingBillsRequest,
};
use super::signed_client;

#[tokio::test]
async fn get_deposit_history_uses_builder_query() {
    let body = r#"{"code":"0","msg":"","data":[{
        "depId":"DEP123","txId":"0xabc","ccy":"USDT","chain":"USDT-ERC20",
        "amt":"100","state":"2","ts":"1597026383085"}]}"#;
    let mock = MockTransport::new(body);
    let client = signed_client(mock.clone());
    let request = DepositHistoryRequest::new().currency("USDT").limit(5);

    let rows = client
        .funding()
        .get_deposit_history(&request)
        .await
        .unwrap();
    assert_eq!(rows[0].dep_id, "DEP123");
    assert_eq!(rows[0].ccy, "USDT");
    assert_eq!(rows[0].state, "2");

    let req = mock.captured();
    assert_eq!(req.method, Method::GET);
    assert_eq!(req.query(), Some("ccy=USDT&limit=5"));
    assert!(req.is_signed());
}

#[tokio::test]
async fn get_bills_uses_builder_query() {
    let body = r#"{"code":"0","msg":"","data":[{
        "billId":"BILL123","ccy":"USDT","balChg":"-100","bal":"900","type":"1","ts":"1597026383085"}]}"#;
    let mock = MockTransport::new(body);
    let client = signed_client(mock.clone());
    let request = FundingBillsRequest::new().currency("USDT").limit(10);

    let rows = client.funding().get_bills(&request).await.unwrap();
    assert_eq!(rows[0].bill_id, "BILL123");
    assert_eq!(rows[0].ccy, "USDT");

    let req = mock.captured();
    assert_eq!(req.method, Method::GET);
    assert_eq!(req.query(), Some("ccy=USDT&limit=10"));
    assert!(req.is_signed());
}

#[tokio::test]
async fn get_deposit_lightning_sends_signed_request() {
    let body = r#"{"code":"0","msg":"","data":[{
        "ccy":"BTC","amt":"0.001",
        "invoice":"lnbc1m1p3xnhl2pp5jptserfk3zk4qy42tlucycrfwxhydvlemu9pqr93tsuenrngzqa",
        "to":"funding"}]}"#;
    let mock = MockTransport::new(body);
    let client = signed_client(mock.clone());
    let request = DepositLightningRequest::new("BTC", "0.001");

    let rows = client
        .funding()
        .get_deposit_lightning(&request)
        .await
        .unwrap();
    assert_eq!(rows[0].ccy, "BTC");
    assert_eq!(rows[0].amt.as_str(), "0.001");
    assert!(!rows[0].invoice.is_empty());

    let req = mock.captured();
    assert_eq!(req.method, Method::GET);
    assert_eq!(req.query(), Some("ccy=BTC&amt=0.001"));
    assert!(req.is_signed());
}

#[tokio::test]
async fn get_deposit_withdraw_status_sends_signed_query() {
    let body = r#"{"code":"0","msg":"","data":[{
        "wdId":"WD123","txId":"0xabc","ccy":"USDT","chain":"USDT-ERC20",
        "to":"0x1234","state":"success"}]}"#;
    let mock = MockTransport::new(body);
    let client = signed_client(mock.clone());
    let request = DepositWithdrawStatusRequest::new()
        .withdrawal_id("WD123")
        .currency("USDT");

    let rows = client
        .funding()
        .get_deposit_withdraw_status(&request)
        .await
        .unwrap();
    assert_eq!(rows[0].wd_id, "WD123");
    assert_eq!(rows[0].state, "success");

    let req = mock.captured();
    assert_eq!(req.method, Method::GET);
    assert_eq!(req.query(), Some("wdId=WD123&ccy=USDT"));
    assert!(req.is_signed());
}