v0.3.7-pre.004

This commit is contained in:
2026-09-02 11:00:20 +02:00
parent 03a94f4fb6
commit 46a4ad7487
17 changed files with 630 additions and 60 deletions

View File

@@ -1,7 +1,7 @@
// file: crates/ksp-app-backfill-desk/tests/config_composition.rs
// version: 1
// version: 2
//! Config composite contracts for Backfill Desk pre.003.
//! Config composite and Transport-readiness contracts for Backfill Desk through pre.004.
#![forbid(unsafe_code)]
#![deny(unreachable_pub)]
@@ -86,3 +86,73 @@ fn pre_003_named_profiles_keep_transport_and_store_network_selection_paired() {
}
}
}
#[test]
fn pre_004_default_composite_builds_http_pool_for_both_backfill_rpc_methods() {
let engine = workspace_engine();
assert!(engine.is_ok(), "workspace Config engine should be constructible: {engine:?}");
let engine = match engine {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let file_id = ksp_config_lib::ConfigFileId::new(ksp_config_lib::FILE_ID_COMPOSITE_KSP_APP_BACKFILL_DESK);
let file_id = match file_id {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let composite = engine.load_resolved_composite(&file_id, std::option::Option::None);
assert!(composite.is_ok(), "committed Backfill Desk composite should resolve: {composite:?}");
let composite = match composite {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let transport = composite.component("transport");
assert!(transport.is_some(), "Backfill Desk composite should expose Transport");
let transport = match transport {
std::option::Option::Some(value) => value,
std::option::Option::None => return,
};
let environment = ksp_config_lib::ConfigEnvironment::load();
assert!(environment.is_ok(), "Config environment should load for committed public devnet profile");
let environment = match environment {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let resolved = engine.resolve_transport_config_profile(transport.resolved(), &environment);
assert!(resolved.is_ok(), "composite-selected Transport should map: {resolved:?}");
let resolved = match resolved {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
assert_eq!(resolved.profile_id(), "devnet_public");
assert_eq!(resolved.selection_source(), ksp_config_lib::ConfigProfileSelectionSource::Composite);
let pool = ksp_onchain_transport_lib::HttpTransportPool::new(resolved.into_settings());
assert!(pool.is_ok(), "composite-selected Transport settings should construct an HTTP pool");
let pool = match pool {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let snapshot = pool.snapshot();
let mut clusters = snapshot
.endpoints()
.iter()
.filter_map(|endpoint| {
if endpoint.enabled() {
return std::option::Option::Some(endpoint.cluster().to_owned());
}
return std::option::Option::None;
})
.collect::<std::vec::Vec<_>>();
clusters.sort();
clusters.dedup();
assert_eq!(clusters, vec!["devnet".to_owned()]);
let role = ksp_onchain_transport_lib::HttpRoleName::new("default");
for method in ["getSignaturesForAddress", "getTransaction"] {
let descriptor = ksp_onchain_transport_lib::find_http_rpc_method(method);
assert!(descriptor.is_some(), "required Transport method {method} should exist");
if let std::option::Option::Some(descriptor) = descriptor {
let selection = pool.select_for_method(&role, descriptor);
assert!(selection.is_ok(), "role default should route {method}: {selection:?}");
}
}
}

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-backfill-desk/tests/desktop_contract.rs
// version: 3
// version: 4
//! Structural desktop contract checks for the Backfill Desk scaffold.
@@ -99,13 +99,7 @@ fn pre_002_package_dependencies_match_desk_baseline() {
fn pre_002_splash_assets_and_styles_match_existing_desk_template() {
let root = app_root();
let reference = workspace_root().join("crates/ksp-app-solprices-desk");
for relative in [
"frontend/fonts/DOS_Amazigh.ttf",
"frontend/imgs/logo.png",
"frontend/imgs/splash.png",
"icons/favicon.png",
"icons/favicon.ico",
] {
for relative in ["frontend/fonts/DOS_Amazigh.ttf", "frontend/imgs/logo.png", "frontend/imgs/splash.png", "icons/favicon.png", "icons/favicon.ico"] {
assert_eq!(read_bytes(root.join(relative).as_path()), read_bytes(reference.join(relative).as_path()), "Desk asset differs: {relative}");
}
let splash = read_text(root.join("frontend/splash.html").as_path());
@@ -113,9 +107,7 @@ fn pre_002_splash_assets_and_styles_match_existing_desk_template() {
assert!(splash.contains("Backfill Desk"));
let splash_style = read_text(root.join("frontend/sass/splash.scss").as_path());
let reference_style = read_text(reference.join("frontend/sass/splash.scss").as_path());
let normalized = splash_style
.replace("crates/ksp-app-backfill-desk", "crates/ksp-app-solprices-desk")
.replace("// version: 1", "// version: 2");
let normalized = splash_style.replace("crates/ksp-app-backfill-desk", "crates/ksp-app-solprices-desk").replace("// version: 1", "// version: 2");
assert_eq!(normalized, reference_style);
}
@@ -179,7 +171,7 @@ fn pre_003_composite_packaging_follows_atomic_config_registry_contract() {
}
#[test]
fn pre_003_bootstrap_uses_composite_logging_without_opening_transport_or_store() {
fn pre_003_bootstrap_keeps_logging_composition_separate_from_transport_runtime() {
let root = app_root();
let bootstrap = read_text(root.join("src/bootstrap.rs").as_path());
assert!(bootstrap.contains("FILE_ID_COMPOSITE_KSP_APP_BACKFILL_DESK"));
@@ -188,6 +180,23 @@ fn pre_003_bootstrap_uses_composite_logging_without_opening_transport_or_store()
assert!(bootstrap.contains("COMPOSITE_COMPONENT_ID_STORE"));
assert!(bootstrap.contains("LogFilterLevel::Trace"));
for forbidden in ["HttpTransportPool", "Store::open", "BackfillJobRuntime", "BackfillRequest"] {
assert!(!bootstrap.contains(forbidden), "pre.003 opens later runtime surface {forbidden}");
assert!(!bootstrap.contains(forbidden), "bootstrap.rs absorbs another runtime responsibility: {forbidden}");
}
}
#[test]
fn pre_004_transport_runtime_builds_pool_and_validates_both_required_rpc_methods() {
let root = app_root();
let transport = read_text(root.join("src/transport_runtime.rs").as_path());
assert!(transport.contains("HttpTransportPool::new"));
assert!(transport.contains("getSignaturesForAddress"));
assert!(transport.contains("getTransaction"));
assert!(transport.contains("select_for_method"));
assert!(transport.contains("configured_networks"));
assert!(transport.contains("compatible_backfill_roles"));
for forbidden in ["provider()", "url()", "Store::open", "BackfillJobRuntime", "BackfillRequest"] {
assert!(!transport.contains(forbidden), "pre.004 opens or projects forbidden surface {forbidden}");
}
let tauri = read_text(root.join("src/tauri.rs").as_path());
assert!(tauri.contains("backfill_options"));
}

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-backfill-desk/tests/desktop_security.rs
// version: 3
// version: 4
//! Security and dependency-boundary checks for the Backfill Desk scaffold.
@@ -43,7 +43,7 @@ fn read_text(path: &std::path::Path) -> String {
}
#[test]
fn pre_002_capability_surface_is_core_plus_tracing_only() {
fn capability_surface_remains_core_plus_tracing_while_transport_is_backend_only() {
let root = app_root();
let capability = read_text(root.join("capabilities/default.json").as_path());
assert!(capability.contains("\"core:default\""));
@@ -53,16 +53,9 @@ fn pre_002_capability_surface_is_core_plus_tracing_only() {
}
let manifest = read_text(root.join("Cargo.toml").as_path());
assert!(manifest.contains("tauri-plugin-tracing.workspace = true"));
for forbidden in [
"ksp-job-backfill-lib",
"ksp-onchain-transport-lib",
"ksp-store-lib",
"ksp-store-api",
"ksp-store-postgres-lib",
"reqwest",
"tokio-postgres",
] {
assert!(!manifest.contains(forbidden), "pre.002 opens a later-layer dependency: {forbidden}");
assert!(manifest.contains("ksp-onchain-transport-lib = { path = \"../ksp-onchain-transport-lib\" }"));
for forbidden in ["ksp-job-backfill-lib", "ksp-store-lib", "ksp-store-api", "ksp-store-postgres-lib", "reqwest", "tokio-postgres"] {
assert!(!manifest.contains(forbidden), "current Backfill Desk opens a forbidden dependency: {forbidden}");
}
}
@@ -95,7 +88,7 @@ fn pre_002_tauri_commands_remain_centralized() {
assert_eq!(count, 0, "{} declares a Tauri command outside tauri.rs", path.display());
}
}
assert_eq!(command_count, 3);
assert_eq!(command_count, 4);
}
#[test]
@@ -121,15 +114,21 @@ fn pre_002_frontend_instrumentation_avoids_business_or_secret_payloads() {
}
#[test]
fn pre_003_keeps_config_only_composition_boundary() {
fn pre_004_opens_only_config_logging_and_onchain_transport_dependencies() {
let root = app_root();
let manifest = read_text(root.join("Cargo.toml").as_path());
assert!(manifest.contains("ksp-config-lib = { path = \"../ksp-config-lib\" }"));
for forbidden in ["ksp-job-backfill-lib", "ksp-onchain-transport-lib", "ksp-store-lib", "ksp-store-api", "ksp-store-postgres-lib"] {
assert!(!manifest.contains(forbidden), "pre.003 opens a later-layer dependency: {forbidden}");
assert!(manifest.contains("ksp-onchain-transport-lib = { path = \"../ksp-onchain-transport-lib\" }"));
for forbidden in ["ksp-job-backfill-lib", "ksp-store-lib", "ksp-store-api", "ksp-store-postgres-lib"] {
assert!(!manifest.contains(forbidden), "pre.004 opens a later-layer dependency: {forbidden}");
}
let bootstrap = read_text(root.join("src/bootstrap.rs").as_path());
assert!(bootstrap.contains("LogFilterLevel::Trace"));
assert!(!bootstrap.contains("HttpTransportPool"));
assert!(!bootstrap.contains("Store::open"));
let dto = read_text(root.join("src/dto_common.rs").as_path());
assert!(dto.contains("BackfillDeskOptionsDto"));
for forbidden in ["pub(crate) provider", "endpoint_url", "pub(crate) url", "pub(crate) credential", "pub(crate) token"] {
assert!(!dto.contains(forbidden), "Transport options DTO source contains forbidden field marker {forbidden}");
}
}