v0.2.11-pre.004
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-offchain-transport-lib/tests/dependency_boundary.rs
|
||||
// version: 4
|
||||
// version: 5
|
||||
|
||||
#![warn(missing_docs)]
|
||||
#![deny(unreachable_pub)]
|
||||
@@ -8,45 +8,54 @@
|
||||
//! Dependency, observability, hardened HTTP and module-taxonomy canaries for Off-chain Transport.
|
||||
|
||||
#[test]
|
||||
fn pre_003_manifest_adds_only_shared_http_runtime_dependencies() {
|
||||
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"));
|
||||
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("mod market_price_decimal;"));
|
||||
assert!(crate_root.contains("mod market_price_observation;"));
|
||||
assert!(crate_root.contains("mod market_price_provider;"));
|
||||
assert!(crate_root.contains("mod market_price_settings;"));
|
||||
assert!(!crate_root.contains("#[cfg(test)] // RUST-API-008: staged"));
|
||||
assert!(!crate_root.contains("pub use self::http_client::HttpRestClient"));
|
||||
let constants = include_str!("../src/constants.rs");
|
||||
assert!(constants.contains("pub(crate) const TRACING_TARGET: &str = \"ksp-offchain-transport-lib\";"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pre_003_http_client_hardening_is_explicit_and_provider_neutral() {
|
||||
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()"));
|
||||
assert!(client.contains("response.chunk().await"));
|
||||
assert!(!client.contains("coingecko"));
|
||||
assert!(!client.contains("coinmarketcap"));
|
||||
assert!(!client.contains("jupiter"));
|
||||
assert!(!client.contains("birdeye"));
|
||||
assert!(!client.contains("dexscreener"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pre_004_provider_modules_are_market_price_scoped_and_fixed_origin() {
|
||||
let crate_root = include_str!("../src/lib.rs");
|
||||
assert!(crate_root.contains("mod market_price_coingecko;"));
|
||||
assert!(crate_root.contains("mod market_price_coinmarketcap;"));
|
||||
assert!(crate_root.contains("mod market_price_coinpaprika;"));
|
||||
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");
|
||||
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!(!coingecko.contains("std::env"));
|
||||
assert!(!coinmarketcap.contains("std::env"));
|
||||
assert!(!coinpaprika.contains("std::env"));
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-offchain-transport-lib/tests/public_api.rs
|
||||
// version: 4
|
||||
// version: 5
|
||||
|
||||
#![warn(missing_docs)]
|
||||
#![deny(unreachable_pub)]
|
||||
@@ -65,10 +65,43 @@ fn public_pre_002_market_price_foundation_is_available_from_crate_root() -> ksp_
|
||||
return std::result::Result::Ok(());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn public_pre_004_aggregator_settings_and_adapters_are_available_from_crate_root() -> ksp_core_lib::Result<()> {
|
||||
let coingecko = match ksp_offchain_transport_lib::MarketPriceCoinGeckoSettings::keyless(false) {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
let coingecko_provider = match ksp_offchain_transport_lib::MarketPriceCoinGeckoProvider::new(coingecko) {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
assert_eq!(coingecko_provider.descriptor().id().as_str(), "coingecko");
|
||||
let coinmarketcap = match ksp_offchain_transport_lib::MarketPriceCoinMarketCapSettings::keyless(false) {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
let coinmarketcap_provider = match ksp_offchain_transport_lib::MarketPriceCoinMarketCapProvider::new(coinmarketcap) {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
assert_eq!(coinmarketcap_provider.descriptor().id().as_str(), "coinmarketcap");
|
||||
let coinpaprika = match ksp_offchain_transport_lib::MarketPriceCoinPaprikaSettings::new(false) {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
let coinpaprika_provider = match ksp_offchain_transport_lib::MarketPriceCoinPaprikaProvider::new(coinpaprika) {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
assert_eq!(coinpaprika_provider.descriptor().id().as_str(), "coinpaprika");
|
||||
return std::result::Result::Ok(());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn offchain_error_codes_use_owned_domain() {
|
||||
let codes = [
|
||||
ksp_offchain_transport_lib::ERROR_CODE_HTTP_ACCESS_DENIED,
|
||||
ksp_offchain_transport_lib::ERROR_CODE_HTTP_ADMISSION_DEFERRED,
|
||||
ksp_offchain_transport_lib::ERROR_CODE_HTTP_CLIENT_BUILD_FAILED,
|
||||
ksp_offchain_transport_lib::ERROR_CODE_HTTP_CONNECTION_FAILED,
|
||||
ksp_offchain_transport_lib::ERROR_CODE_HTTP_INVALID_JSON,
|
||||
@@ -82,7 +115,9 @@ fn offchain_error_codes_use_owned_domain() {
|
||||
ksp_offchain_transport_lib::ERROR_CODE_HTTP_TIMEOUT,
|
||||
ksp_offchain_transport_lib::ERROR_CODE_MARKET_PRICE_DECIMAL_INVALID,
|
||||
ksp_offchain_transport_lib::ERROR_CODE_MARKET_PRICE_PROVIDER_DESCRIPTOR_INVALID,
|
||||
ksp_offchain_transport_lib::ERROR_CODE_MARKET_PRICE_PROVIDER_DISABLED,
|
||||
ksp_offchain_transport_lib::ERROR_CODE_MARKET_PRICE_PROVIDER_ID_INVALID,
|
||||
ksp_offchain_transport_lib::ERROR_CODE_MARKET_PRICE_PROVIDER_RESPONSE_INVALID,
|
||||
ksp_offchain_transport_lib::ERROR_CODE_MARKET_PRICE_OBSERVATION_INVALID,
|
||||
ksp_offchain_transport_lib::ERROR_CODE_MARKET_PRICE_PROVIDER_SETTINGS_INVALID,
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user