alpaca-trade 0.24.2

Rust client for the Alpaca Trading HTTP API
Documentation
#[path = "../../../tests/support/live/mod.rs"]
mod live_support;

use alpaca_http::RequestParts;
use reqwest::Method;
use serde_json::Value;

use crate::Client;
use live_support::{AlpacaService, LiveTestEnv, SampleRecorder};

#[tokio::test]
async fn client_foundation_uses_real_trade_paper_api() {
    let env = LiveTestEnv::load().expect("live test environment should load");
    if let Some(reason) = env.skip_reason_for_service(AlpacaService::Trade) {
        eprintln!("skipping real API test: {reason}");
        return;
    }

    let service = env.trade().expect("trade config should exist");
    let client = Client::builder()
        .credentials(service.credentials().clone())
        .base_url(service.base_url().clone())
        .build()
        .expect("client should build from live service config");
    let recorder = SampleRecorder::from_live_env(&env);
    let request =
        RequestParts::new(Method::GET, "/v2/clock").with_operation("trade.clock.foundation");

    let response = client
        .inner
        .send_json::<Value>(request)
        .await
        .expect("foundation client should read paper clock from real API");

    recorder
        .record_json("alpaca-trade", "clock-foundation", response.body())
        .expect("sample recording should not fail");

    let body = response.body();
    assert!(
        body["timestamp"]
            .as_str()
            .is_some_and(|value| !value.is_empty())
    );
    assert!(body["is_open"].is_boolean());
    assert_eq!(response.meta().status(), 200);
}