129 lines
6.6 KiB
Rust
129 lines
6.6 KiB
Rust
// file: crates/ksp-offchain-transport-lib/tests/dependency_boundary.rs
|
|
// version: 10
|
|
|
|
#![warn(missing_docs)]
|
|
#![deny(unreachable_pub)]
|
|
#![forbid(unsafe_code)]
|
|
|
|
//! Dependency, observability, hardened HTTP and module-taxonomy canaries for Off-chain Transport.
|
|
|
|
#[test]
|
|
fn pre_004_manifest_uses_only_generic_runtime_crates_and_no_provider_sdk() {
|
|
let manifest = include_str!("../Cargo.toml");
|
|
assert!(manifest.contains("chrono = { workspace = true, features = [\"std\"] }"));
|
|
assert!(manifest.contains("ksp-core-lib"));
|
|
assert!(manifest.contains("ksp-logging-lib"));
|
|
assert!(manifest.contains("reqwest = { workspace = true, features = [\"rustls\"] }"));
|
|
assert!(manifest.contains("serde"));
|
|
assert!(manifest.contains("serde_json = { workspace = true, features = [\"raw_value\"] }"));
|
|
assert!(!manifest.contains("ksp-config-lib"));
|
|
assert!(!manifest.contains("coingecko"));
|
|
assert!(!manifest.contains("coinmarketcap"));
|
|
assert!(!manifest.contains("coinpaprika"));
|
|
assert!(!manifest.contains("jupiter"));
|
|
assert!(!manifest.contains("birdeye"));
|
|
assert!(!manifest.contains("dexscreener"));
|
|
assert!(!manifest.lines().any(|line| return line.trim_start().starts_with("tracing =")));
|
|
}
|
|
|
|
#[test]
|
|
fn pre_004_http_runtime_is_production_active_but_not_a_public_generic_client() {
|
|
let crate_root = include_str!("../src/lib.rs");
|
|
assert!(crate_root.contains("mod http_admission;"));
|
|
assert!(crate_root.contains("mod http_client;"));
|
|
assert!(crate_root.contains("mod http_settings;"));
|
|
assert!(!crate_root.contains("#[cfg(test)] // RUST-API-008: staged"));
|
|
assert!(!crate_root.contains("pub use self::http_client::HttpRestClient"));
|
|
let client = include_str!("../src/http_client.rs");
|
|
assert!(client.contains(".redirect(reqwest::redirect::Policy::none())"));
|
|
assert!(client.contains(".referer(false)"));
|
|
assert!(client.contains(".retry(reqwest::retry::never())"));
|
|
assert!(client.contains(".no_proxy()"));
|
|
assert!(client.contains("error.without_url()"));
|
|
}
|
|
|
|
#[test]
|
|
fn pre_005_provider_modules_are_market_price_scoped_and_fixed_origin() {
|
|
let crate_root = include_str!("../src/lib.rs");
|
|
assert!(crate_root.contains("mod market_price_coinbase_exchange;"));
|
|
assert!(crate_root.contains("mod market_price_coingecko;"));
|
|
assert!(crate_root.contains("mod market_price_coinmarketcap;"));
|
|
assert!(crate_root.contains("mod market_price_coinpaprika;"));
|
|
assert!(crate_root.contains("mod market_price_kraken;"));
|
|
let coinbase = include_str!("../src/market_price_coinbase_exchange.rs");
|
|
let coingecko = include_str!("../src/market_price_coingecko.rs");
|
|
let coinmarketcap = include_str!("../src/market_price_coinmarketcap.rs");
|
|
let coinpaprika = include_str!("../src/market_price_coinpaprika.rs");
|
|
let kraken = include_str!("../src/market_price_kraken.rs");
|
|
assert!(coinbase.contains("https://api.exchange.coinbase.com/products/SOL-USD/ticker"));
|
|
assert!(coingecko.contains("https://api.coingecko.com/api/v3/simple/price"));
|
|
assert!(coinmarketcap.contains("https://pro-api.coinmarketcap.com/public-api/v2/simple/price"));
|
|
assert!(coinmarketcap.contains("https://pro-api.coinmarketcap.com/v2/simple/price"));
|
|
assert!(coinpaprika.contains("https://api.coinpaprika.com/v1/tickers/sol-solana"));
|
|
assert!(kraken.contains("https://api.kraken.com/0/public/Ticker"));
|
|
assert!(kraken.contains("SOLUSD"));
|
|
assert!(!coinbase.contains("std::env"));
|
|
assert!(!coingecko.contains("std::env"));
|
|
assert!(!coinmarketcap.contains("std::env"));
|
|
assert!(!coinpaprika.contains("std::env"));
|
|
assert!(!kraken.contains("std::env"));
|
|
}
|
|
|
|
#[test]
|
|
fn pre_006_jupiter_and_dexscreener_stay_market_price_scoped_fixed_origin_and_discovery_free() {
|
|
let crate_root = include_str!("../src/lib.rs");
|
|
assert!(crate_root.contains("mod market_price_dexscreener;"));
|
|
assert!(crate_root.contains("mod market_price_jupiter;"));
|
|
let dexscreener = include_str!("../src/market_price_dexscreener.rs");
|
|
let jupiter = include_str!("../src/market_price_jupiter.rs");
|
|
assert!(dexscreener.contains("https://api.dexscreener.com/latest/dex/pairs/solana"));
|
|
assert!(dexscreener.contains("Czfq3xZZDmsdGdUyrNLtRhGc47cXcZtLG4crryfu44zE") || dexscreener.contains("pair_address"));
|
|
assert!(!dexscreener.contains("latest/dex/search"));
|
|
assert!(!dexscreener.contains("token-pairs/v1"));
|
|
assert!(!dexscreener.contains("tokens/v1"));
|
|
assert!(jupiter.contains("https://api.jup.ag/price/v3"));
|
|
assert!(jupiter.contains("So11111111111111111111111111111111111111112"));
|
|
assert!(!jupiter.contains("/quote"));
|
|
assert!(!dexscreener.contains("std::env"));
|
|
assert!(!jupiter.contains("std::env"));
|
|
}
|
|
|
|
#[test]
|
|
fn pre_007_birdeye_and_registry_remain_provider_owned_generic_and_fixed_origin() {
|
|
let crate_root = include_str!("../src/lib.rs");
|
|
assert!(crate_root.contains("mod market_price_birdeye;"));
|
|
assert!(crate_root.contains("mod market_price_registry;"));
|
|
let birdeye = include_str!("../src/market_price_birdeye.rs");
|
|
let registry = include_str!("../src/market_price_registry.rs");
|
|
assert!(birdeye.contains("https://public-api.birdeye.so/defi/price"));
|
|
assert!(birdeye.contains("x-api-key"));
|
|
assert!(birdeye.contains("x-chain"));
|
|
assert!(birdeye.contains("So11111111111111111111111111111111111111112"));
|
|
assert!(!birdeye.contains("std::env"));
|
|
assert!(!registry.contains("CoinGecko"));
|
|
assert!(!registry.contains("CoinMarketCap"));
|
|
assert!(!registry.contains("CoinPaprika"));
|
|
assert!(!registry.contains("DexScreener"));
|
|
assert!(!registry.contains("Jupiter"));
|
|
assert!(!registry.contains("Kraken"));
|
|
}
|
|
|
|
#[test]
|
|
fn pre_008_refresh_service_owns_dispatch_while_registry_and_consumer_surface_stay_generic() {
|
|
let crate_root = include_str!("../src/lib.rs");
|
|
let registry = include_str!("../src/market_price_registry.rs");
|
|
let service = include_str!("../src/market_price_service.rs");
|
|
assert!(crate_root.contains("mod market_price_service;"));
|
|
assert!(crate_root.contains("pub use self::market_price_service::MarketPriceService;"));
|
|
assert!(!registry.contains("MarketPriceProviderSetup::"));
|
|
assert!(service.contains("pub async fn refresh("));
|
|
assert!(service.contains("pub async fn refresh_many("));
|
|
assert!(service.contains("pub async fn refresh_all("));
|
|
assert!(service.contains("is_refresh_eligible_at"));
|
|
assert!(!service.contains("std::thread::sleep"));
|
|
assert!(!service.contains("tokio::time::sleep"));
|
|
assert!(!service.contains("fallback_provider"));
|
|
assert!(!service.contains("fn aggregate("));
|
|
assert!(!service.contains("fn consensus("));
|
|
}
|