#[tokio::test]
#[ignore = "requires network access"]
async fn test_quick_example() {
use finance_query::{Interval, Ticker, TimeRange};
let ticker = Ticker::builder("AAPL").logo().build().await.unwrap();
let quote = ticker.quote().await.unwrap();
println!(
"{}: ${:.2}",
quote.symbol,
quote
.regular_market_price
.as_ref()
.and_then(|v| v.raw)
.unwrap_or(0.0)
);
let chart = ticker
.chart(Interval::OneDay, TimeRange::OneMonth)
.await
.unwrap();
println!("Candles: {}", chart.candles.len());
assert!(!quote.symbol.is_empty());
assert!(!chart.candles.is_empty());
}
#[tokio::test]
#[ignore = "requires network access"]
async fn test_stock_data_and_analysis() {
use finance_query::Ticker;
let ticker = Ticker::builder("MSFT").logo().build().await.unwrap();
let quote = ticker.quote().await.unwrap(); let financials = ticker.financial_data().await.unwrap();
let options = ticker.options(None).await.unwrap();
assert!(!quote.symbol.is_empty());
let _ = financials;
let _ = options;
}
#[tokio::test]
#[ignore = "requires network access"]
async fn test_batch_operations() {
use finance_query::{Interval, Tickers, TimeRange};
let tickers = Tickers::builder(vec!["AAPL", "MSFT", "GOOGL"])
.logo()
.build()
.await
.unwrap();
let quotes = tickers.quotes().await.unwrap(); let sparks = tickers
.spark(Interval::OneDay, TimeRange::FiveDays)
.await
.unwrap();
assert!(quotes.success_count() > 0);
assert!(sparks.success_count() > 0);
}
#[tokio::test]
#[ignore = "requires network access"]
async fn test_market_discovery() {
use finance_query::{Screener, SearchOptions, finance};
let results = finance::search("Tesla", &SearchOptions::default())
.await
.unwrap();
let actives = finance::screener(Screener::MostActives, 25).await.unwrap();
let trending = finance::trending(None).await.unwrap();
let _ = results;
let _ = actives;
assert!(!trending.is_empty());
}
#[cfg(feature = "indicators")]
#[tokio::test]
#[ignore = "requires network access"]
async fn test_indicators() {
use finance_query::{Interval, Ticker, TimeRange};
let ticker = Ticker::new("AAPL").await.unwrap();
let indicators = ticker
.indicators(Interval::OneDay, TimeRange::ThreeMonths)
.await
.unwrap();
if let Some(rsi) = indicators.rsi_14 {
println!("RSI: {:.2}", rsi);
}
}
#[cfg(feature = "backtesting")]
#[tokio::test]
#[ignore = "requires network access"]
async fn test_backtesting() {
use finance_query::backtesting::SmaCrossover;
use finance_query::{Interval, Ticker, TimeRange};
let ticker = Ticker::new("AAPL").await.unwrap();
let result = ticker
.backtest(
SmaCrossover::new(10, 20),
Interval::OneDay,
TimeRange::OneYear,
None,
)
.await
.unwrap();
println!("Return: {:.2}%", result.metrics.total_return_pct);
}
#[allow(dead_code)]
fn _verify_price_update_fields(price: finance_query::streaming::PriceUpdate) {
let _: String = price.id;
let _: f32 = price.price;
let _: f32 = price.change_percent;
}
#[tokio::test]
#[ignore = "requires network access"]
async fn test_streaming_connects() {
use finance_query::streaming::PriceStream;
let stream = PriceStream::subscribe(&["AAPL", "NVDA", "TSLA"])
.await
.unwrap();
let _ = stream;
}
#[tokio::test]
#[ignore = "requires network access"]
async fn test_edgar_filings() {
use finance_query::edgar;
edgar::init("user@example.com").unwrap();
let cik = edgar::resolve_cik("AAPL").await.unwrap(); assert_eq!(cik, 320193);
let submissions = edgar::submissions(cik).await.unwrap();
if let Some(recent) = submissions.filings.as_ref().and_then(|f| f.recent.as_ref()) {
println!("Recent filings: {}", recent.form.len());
}
let facts = edgar::company_facts(cik).await.unwrap();
let _ = facts;
}
#[cfg(feature = "dataframe")]
#[tokio::test]
#[ignore = "requires network access"]
async fn test_dataframe_support() {
use finance_query::{Interval, Ticker, TimeRange};
let ticker = Ticker::new("AAPL").await.unwrap();
let chart = ticker
.chart(Interval::OneDay, TimeRange::OneMonth)
.await
.unwrap();
let df = chart.to_dataframe().unwrap();
assert!(df.height() > 0, "DataFrame should have rows");
println!("DataFrame rows: {}", df.height());
}
#[cfg(feature = "risk")]
#[tokio::test]
#[ignore = "requires network access"]
async fn test_risk_analytics() {
use finance_query::{Interval, Ticker, TimeRange};
let ticker = Ticker::new("AAPL").await.unwrap();
let summary = ticker
.risk(Interval::OneDay, TimeRange::OneYear, Some("SPY"))
.await
.unwrap();
println!("VaR 95%: {:.2}%", summary.var_95 * 100.0);
println!("Sharpe: {:.2}", summary.sharpe.unwrap_or(0.0));
println!("Max Drawdown: {:.2}%", summary.max_drawdown * 100.0);
println!("Beta vs SPY: {:.2}", summary.beta.unwrap_or(0.0));
}