1use crate::oracle::{MockPriceOracle, PriceOracle, PriceSource, TokenPrice};
2use rust_decimal::Decimal;
3use rust_decimal_macros::dec;
4use std::{collections::HashMap, sync::Arc};
5
6pub const DEFAULT_MOCKED_PRICE: Decimal = dec!(0.001);
7pub const DEFAULT_MOCKED_USDC_PRICE: Decimal = dec!(0.0001);
8pub const DEFAULT_MOCKED_WSOL_PRICE: Decimal = dec!(1.0);
9
10pub const USDC_DEVNET_MINT: &str = "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU";
11pub const WSOL_DEVNET_MINT: &str = "So11111111111111111111111111111111111111112";
12
13pub struct OracleUtil {}
14
15impl OracleUtil {
16 pub fn get_mock_oracle_price() -> Arc<dyn PriceOracle + Send + Sync> {
17 let mut mock = MockPriceOracle::new();
18 mock.expect_get_price()
20 .times(..) .returning(|_, mint_address| {
22 let price = match mint_address {
23 USDC_DEVNET_MINT => DEFAULT_MOCKED_USDC_PRICE, WSOL_DEVNET_MINT => DEFAULT_MOCKED_WSOL_PRICE, _ => DEFAULT_MOCKED_PRICE, };
27 Ok(TokenPrice { price, confidence: 1.0, source: PriceSource::Mock })
28 });
29
30 mock.expect_get_prices()
31 .times(..) .returning(|_, mint_addresses| {
33 let mut result = HashMap::new();
34 for mint_address in mint_addresses {
35 let price = match mint_address.as_str() {
36 USDC_DEVNET_MINT => DEFAULT_MOCKED_USDC_PRICE, WSOL_DEVNET_MINT => DEFAULT_MOCKED_WSOL_PRICE, _ => DEFAULT_MOCKED_PRICE, };
40 result.insert(
41 mint_address.clone(),
42 TokenPrice { price, confidence: 1.0, source: PriceSource::Mock },
43 );
44 }
45 Ok(result)
46 });
47 Arc::new(mock)
48 }
49}
50
51#[cfg(test)]
52mod tests {
53 use super::*;
54 use reqwest::Client;
55
56 #[tokio::test]
57 async fn test_mock_oracle_prices() {
58 let oracle = OracleUtil::get_mock_oracle_price();
59 let client = Client::new();
60
61 let usdc_price = oracle.get_price(&client, USDC_DEVNET_MINT).await.unwrap();
63 assert_eq!(usdc_price.price, DEFAULT_MOCKED_USDC_PRICE);
64 assert_eq!(usdc_price.confidence, 1.0);
65 assert_eq!(usdc_price.source, PriceSource::Mock);
66
67 let sol_price = oracle.get_price(&client, WSOL_DEVNET_MINT).await.unwrap();
69 assert_eq!(sol_price.price, DEFAULT_MOCKED_WSOL_PRICE);
70 assert_eq!(sol_price.confidence, 1.0);
71 assert_eq!(sol_price.source, PriceSource::Mock);
72
73 let unknown_price = oracle.get_price(&client, "unknown_token").await.unwrap();
75 assert_eq!(unknown_price.price, DEFAULT_MOCKED_PRICE);
76 assert_eq!(unknown_price.confidence, 1.0);
77 assert_eq!(unknown_price.source, PriceSource::Mock);
78 }
79}