aignt-jupiter-client 0.1.0

Jupiter API Client
Documentation
use crate::client::JupiterApiClient;
use httpmock::prelude::*;
use std::collections::HashMap;

#[tokio::test]
async fn test_new_client() {
    let client = JupiterApiClient::new();
    assert!(client.is_ok());
}

#[tokio::test]
async fn test_get_prices_v3_exact_sample() {
    let server = MockServer::start();

    let sample_response = r#"{
        "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v": {
            "createdAt": "2024-06-05T08:55:25.527Z",
            "liquidity": 4235561.009987704,
            "usdPrice": 0.9997073145154354,
            "blockId": 395374169,
            "decimals": 6,
            "priceChange24h": 0.0003915640587189741
        },
        "So11111111111111111111111111111111111111112": {
            "createdAt": "2024-06-05T08:55:25.527Z",
            "liquidity": 151608370.92457405,
            "usdPrice": 127.02993218743363,
            "blockId": 395374172,
            "decimals": 9,
            "priceChange24h": -2.231717089336497
        }
    }"#;

    let mock = server.mock(|when, then| {
        when.method(GET)
            .path("/price/v3")
            .query_param("ids", "So11111111111111111111111111111111111111112,EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
        then.status(200)
            .header("content-type", "application/json")
            .body(sample_response);
    });

    let mut client = JupiterApiClient::new().unwrap();
    client.base_url = server.base_url();

    let ids = vec![
        "So11111111111111111111111111111111111111112".to_string(),
        "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v".to_string(),
    ];
    let result = client.get_prices(&ids).await;

    mock.assert();
    assert!(result.is_ok());
    let prices = result.unwrap();
    assert_eq!(prices.len(), 2);

    let sol = prices.get("So11111111111111111111111111111111111111112").unwrap();
    assert!((sol.usd_price - 127.02993218743363).abs() < f64::EPSILON * 100.0);
    assert_eq!(sol.decimals, 9);
    assert_eq!(sol.created_at.as_deref(), Some("2024-06-05T08:55:25.527Z"));
    assert!((sol.liquidity.unwrap() - 151608370.92457405).abs() < f64::EPSILON * 100000.0);
    assert_eq!(sol.block_id, Some(395374172));
    assert!((sol.price_change_24h.unwrap() - (-2.231717089336497)).abs() < f64::EPSILON * 100.0);

    let usdc = prices.get("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v").unwrap();
    assert!((usdc.usd_price - 0.9997073145154354).abs() < f64::EPSILON);
    assert_eq!(usdc.decimals, 6);
    assert_eq!(usdc.created_at.as_deref(), Some("2024-06-05T08:55:25.527Z"));
    assert!((usdc.liquidity.unwrap() - 4235561.009987704).abs() < f64::EPSILON * 1000.0);
    assert_eq!(usdc.block_id, Some(395374169));
    assert!((usdc.price_change_24h.unwrap() - 0.0003915640587189741).abs() < f64::EPSILON);
}