rust-okx 0.5.0

Async Rust client for the OKX v5 REST API
Documentation
use crate::test_util::MockTransport;

use super::super::{
    EasyConvertHistoryRequest, EasyConvertRequest, OneClickRepayCurrencyListRequest,
    OneClickRepayHistoryRequest, OneClickRepayRequest,
};
use super::signed_client;

#[tokio::test]
async fn get_easy_convert_currency_list_sends_signed_request() {
    let body = r#"{"code":"0","msg":"","data":[{
        "fromData":[{"fromCcy":"BTC","fromAmt":"0.00100168","usdAmt":"51.34"}],
        "toCcy":["USDT","OKB","OKS","ETH","DOT","OKT"]
    }]}"#;
    let mock = MockTransport::new(body);
    let client = signed_client(mock.clone());

    let rows = client
        .trade()
        .get_easy_convert_currency_list()
        .await
        .unwrap();
    assert_eq!(rows[0].to_ccy[0], "USDT");
    assert!(mock.captured().is_signed());
}

#[tokio::test]
async fn easy_convert_posts_signed_body() {
    let body = r#"{"code":"0","msg":"","data":[{
        "fillFromSz":"0.001","fillToSz":"51.36","fromCcy":"BTC","toCcy":"USDT",
        "status":"filled","uTime":"1654090400000"}]}"#;
    let mock = MockTransport::new(body);
    let client = signed_client(mock.clone());
    let request = EasyConvertRequest::new(["BTC"], "USDT");

    client.trade().easy_convert(&request).await.unwrap();

    let req = mock.captured();
    assert!(req.is_signed());
    let sent: serde_json::Value = serde_json::from_str(req.body_str()).unwrap();
    assert_eq!(sent["fromCcy"][0], "BTC");
    assert_eq!(sent["toCcy"], "USDT");
}

#[tokio::test]
async fn get_easy_convert_history_sends_signed_query() {
    let body = r#"{"code":"0","msg":"","data":[{
        "fillFromSz":"0.001","fillToSz":"51.36","fromCcy":"BTC","toCcy":"USDT",
        "acct":"1","status":"filled","uTime":"1654090400000"}]}"#;
    let mock = MockTransport::new(body);
    let client = signed_client(mock.clone());
    let request = EasyConvertHistoryRequest::new().after("1654090400000");

    client
        .trade()
        .get_easy_convert_history(&request)
        .await
        .unwrap();

    let req = mock.captured();
    assert!(req.is_signed());
    assert_eq!(req.query(), Some("after=1654090400000"));
}

#[tokio::test]
async fn get_one_click_repay_currency_list_sends_signed_request() {
    let body = r#"{"code":"0","msg":"","data":[{
        "debtData":[{"debtCcy":"USDT","debtAmt":"100","debtUsdAmt":"100"}],
        "debtType":"cross",
        "repayData":[{"repayCcy":"BTC","repayAmt":"0.001"}]
    }]}"#;
    let mock = MockTransport::new(body);
    let client = signed_client(mock.clone());
    let list_request = OneClickRepayCurrencyListRequest::new().debt_type("cross");

    client
        .trade()
        .get_one_click_repay_currency_list(&list_request)
        .await
        .unwrap();

    let req = mock.captured();
    assert_eq!(req.query(), Some("debtType=cross"));
    assert!(req.is_signed());
}

#[tokio::test]
async fn one_click_repay_v1_posts_signed_body() {
    let body = r#"{"code":"0","msg":"","data":[{
        "debtCcy":"USDT","repayCcy":"BTC","repayAllDebt":true,
        "fillDebtSz":"100","fillRepaySz":"0.001","status":"filled","uTime":"1654090400000","ts":"1654090400000"}]}"#;
    let mock = MockTransport::new(body);
    let client = signed_client(mock.clone());
    let request = OneClickRepayRequest::new(["USDT"], "BTC");

    client.trade().one_click_repay(&request).await.unwrap();

    let req = mock.captured();
    assert!(req.is_signed());
    assert!(req.uri.ends_with("/api/v5/trade/one-click-repay"));
}

#[tokio::test]
async fn one_click_repay_v2_posts_signed_body() {
    let body = r#"{"code":"0","msg":"","data":[{
        "debtCcy":"USDT","repayCcy":"BTC","repayAllDebt":true,
        "fillDebtSz":"100","fillRepaySz":"0.001","status":"filled","uTime":"1654090400000","ts":"1654090400000"}]}"#;
    let mock = MockTransport::new(body);
    let client = signed_client(mock.clone());
    let request = OneClickRepayRequest::v2("USDT", ["BTC"]);

    client.trade().one_click_repay_v2(&request).await.unwrap();

    let req = mock.captured();
    assert!(req.is_signed());
    assert!(req.uri.ends_with("/api/v5/trade/one-click-repay-v2"));
}

#[tokio::test]
async fn get_one_click_repay_history_sends_signed_query() {
    let body = r#"{"code":"0","msg":"","data":[{
        "debtCcy":"USDT","repayCcy":"BTC","fillDebtSz":"100","fillRepaySz":"0.001",
        "status":"filled","uTime":"1654090400000","ts":"1654090400000"}]}"#;
    let mock = MockTransport::new(body);
    let client = signed_client(mock.clone());
    let request = OneClickRepayHistoryRequest::new().after("1654090400000");

    client
        .trade()
        .get_one_click_repay_history(&request)
        .await
        .unwrap();

    let req = mock.captured();
    assert!(req.is_signed());
    assert_eq!(req.query(), Some("after=1654090400000"));
}

#[tokio::test]
async fn get_one_click_repay_history_v2_sends_signed_query() {
    let body = r#"{"code":"0","msg":"","data":[{
        "debtCcy":"USDT","repayCcy":"BTC","fillDebtSz":"100","fillRepaySz":"0.001",
        "status":"filled","uTime":"1654090400000","ts":"1654090400000"}]}"#;
    let mock = MockTransport::new(body);
    let client = signed_client(mock.clone());
    let request = OneClickRepayHistoryRequest::new().after("1654090400000");

    client
        .trade()
        .get_one_click_repay_history_v2(&request)
        .await
        .unwrap();

    let req = mock.captured();
    assert!(req.is_signed());
    assert!(req.uri.contains("one-click-repay-history-v2"));
}