rust-okx 0.4.1

Async Rust client for the OKX v5 REST API
Documentation
use crate::test_util::MockTransport;
use crate::{Credentials, Error, OkxClient};

mod advanced;
mod algo;
mod orders;
mod queries;

fn signed_client(mock: MockTransport) -> OkxClient<MockTransport> {
    OkxClient::with_transport(mock)
        .credentials(Credentials::new("key", "secret", "pass"))
        .build()
}

#[tokio::test]
async fn invalid_advanced_trade_request_fails_before_transport() {
    let mock = MockTransport::new(r#"{"code":"0","msg":"","data":[]}"#);
    let client = signed_client(mock.clone());
    let request = super::AlgoOrderRequest::new("BTC-USDT-SWAP", "cross", "buy", "trigger", "1");

    let error = client.trade().place_algo_order(&request).await.unwrap_err();
    assert!(matches!(error, Error::InvalidRequest(_)));
    assert!(!mock.was_called());
}

#[tokio::test]
async fn cancel_algo_orders_enforces_documented_batch_size_before_transport() {
    let mock = MockTransport::new(r#"{"code":"0","msg":"","data":[]}"#);
    let client = signed_client(mock.clone());

    let error = client.trade().cancel_algo_orders(&[]).await.unwrap_err();
    assert!(matches!(error, Error::InvalidRequest(_)));
    assert!(!mock.was_called());

    let requests = (0..11)
        .map(|index| super::CancelAlgoOrderRequest::new(index.to_string(), "BTC-USDT"))
        .collect::<Vec<_>>();
    let error = client
        .trade()
        .cancel_algo_orders(&requests)
        .await
        .unwrap_err();
    assert!(matches!(error, Error::InvalidRequest(_)));
    assert!(!mock.was_called());
}