// 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(")); }