alpaca-data 0.25.1

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

use reqwest::Method;
use serde_json::Value;

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

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

    let service = env.data().expect("data config should exist");
    let client = Client::builder()
        .credentials(service.credentials().clone())
        .build()
        .expect("client should build from live service config");
    let recorder = SampleRecorder::from_live_env(&env);
    let request = RequestParts::new(Method::GET, "/v2/stocks/bars/latest")
        .with_operation("stocks.latest_bars.foundation")
        .with_query(vec![
            ("symbols".to_owned(), "AAPL".to_owned()),
            ("feed".to_owned(), "iex".to_owned()),
        ]);

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

    recorder
        .record_json(
            "alpaca-data",
            "stocks-latest-bars-foundation",
            response.body(),
        )
        .expect("sample recording should not fail");

    let bars = response.body()["bars"]
        .as_object()
        .expect("bars object should exist");
    assert!(bars.contains_key("AAPL"));
    assert_eq!(response.meta().status(), 200);
}