v0.3.8-pre.006

This commit is contained in:
2026-09-03 16:26:18 +02:00
parent 62d6cf9dac
commit 3a38914be7
36 changed files with 1300 additions and 167 deletions

View File

@@ -1,13 +1,12 @@
// file: crates/ksp-app-store-desk/tests/dependency_boundary.rs
// version: 2
// version: 3
//! Dependency-boundary tests for the Store Desk scaffold.
//! Dependency-boundary tests for the Store Desk application.
#[test]
fn pre_002_manifest_keeps_store_and_transport_runtime_dependencies_out_of_scaffold() {
fn pre_006_manifest_uses_store_facade_without_physical_or_transport_dependencies() {
let manifest = include_str!("../Cargo.toml");
for forbidden in [
"ksp-store-lib",
"ksp-store-api",
"ksp-store-postgres-lib",
"ksp-onchain-transport-lib",
@@ -18,18 +17,26 @@ fn pre_002_manifest_keeps_store_and_transport_runtime_dependencies_out_of_scaffo
"tokio-postgres",
"deadpool-postgres",
] {
assert!(!manifest.contains(forbidden), "forbidden pre.002 dependency present: {forbidden}");
assert!(!manifest.contains(forbidden), "forbidden Store Desk dependency present: {forbidden}");
}
for required in ["ksp-config-lib", "ksp-core-lib", "ksp-logging-lib", "tauri-plugin-tracing"] {
assert!(manifest.contains(required), "required scaffold dependency missing: {required}");
for required in ["ksp-config-lib", "ksp-core-lib", "ksp-logging-lib", "ksp-store-lib", "tauri-plugin-tracing"] {
assert!(manifest.contains(required), "required Store Desk dependency missing: {required}");
}
}
#[test]
fn pre_002_sources_expose_no_sql_or_physical_store_escape_hatch() {
let sources =
[include_str!("../src/app_state.rs"), include_str!("../src/bootstrap.rs"), include_str!("../src/tauri.rs"), include_str!("../src/lib.rs")].join("\n");
for forbidden in ["Store::open", "tokio_postgres", "deadpool_postgres", "SELECT ", "INSERT ", "UPDATE ", "DELETE ", "ksp_store_api", "ksp_store_postgres"] {
assert!(!sources.contains(forbidden), "pre.002 scaffold leaked forbidden Store/runtime surface: {forbidden}");
fn pre_006_store_open_is_owned_by_store_runtime_and_never_escapes_to_physical_sql() {
let bootstrap = include_str!("../src/bootstrap.rs");
let store_runtime = include_str!("../src/store_runtime.rs");
let app_state = include_str!("../src/app_state.rs");
let tauri = include_str!("../src/tauri.rs");
assert!(!bootstrap.contains("Store::open"));
assert!(store_runtime.contains("ksp_store_lib::Store::open"));
assert!(store_runtime.contains("store.runtime_snapshot()"));
assert!(store_runtime.contains("store.health().await"));
assert!(store_runtime.contains("store.close().await"));
let sources = [bootstrap, store_runtime, app_state, tauri].join("\n");
for forbidden in ["tokio_postgres", "deadpool_postgres", "SELECT ", "INSERT ", "UPDATE ", "DELETE ", "ksp_store_api", "ksp_store_postgres"] {
assert!(!sources.contains(forbidden), "Store Desk leaked forbidden physical Store surface: {forbidden}");
}
}

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-store-desk/tests/desktop_contract.rs
// version: 2
// version: 3
//! Desktop template and frontend contract tests for the Store Desk scaffold.
@@ -80,7 +80,7 @@ fn pre_002_binary_assets_reuse_the_ksp_desktop_template_byte_exact() {
}
#[test]
fn pre_002_shell_exposes_only_planned_store_desk_views_and_empty_table_skeletons() {
fn pre_006_shell_exposes_planned_views_store_overview_and_unconnected_raw_table_skeletons() {
let html = include_str!("../frontend/main.html");
for view in ["overview", "transactions", "accounts", "diagnostics"] {
assert!(html.contains(&format!("data-view=\"{view}\"")));
@@ -88,11 +88,16 @@ fn pre_002_shell_exposes_only_planned_store_desk_views_and_empty_table_skeletons
}
assert!(html.contains("id=\"rawTransactionsTable\""));
assert!(html.contains("id=\"rawAccountsTable\""));
assert!(html.contains("Aucune capability Store n'est encore invoquée"));
for overview_id in ["refreshOverview", "overviewStoreProfile", "overviewStoreTarget", "overviewStoreHealth", "overviewStorePool", "overviewStoreMigration"]
{
assert!(html.contains(&format!("id=\"{overview_id}\"")), "missing Store Overview field: {overview_id}");
}
assert!(html.contains("jusqu'à pre.007"));
assert!(html.contains("jusqu'à pre.008"));
}
#[test]
fn pre_002_datatables_are_scaffold_only_with_one_pager_owner_and_no_store_pager() {
fn pre_006_datatables_remain_unconnected_with_one_pager_owner_and_no_store_pager() {
let source = include_str!("../frontend/ts/main.ts");
assert!(source.contains("datatables.net-bs5"));
assert!(source.contains("paging: true"));
@@ -104,3 +109,61 @@ fn pre_002_datatables_are_scaffold_only_with_one_pager_owner_and_no_store_pager(
assert!(!html.contains(forbidden), "second Store pager marker present: {forbidden}");
}
}
#[test]
fn pre_006_composite_and_packaged_resources_cover_store_desk_and_the_complete_config_registry() {
let composite = parse_json(include_str!("../../../config/composite.ksp-app-store-desk.json"));
assert!(composite.is_ok(), "Store Desk composite JSON must be valid");
if let std::result::Result::Ok(composite) = composite {
assert_eq!(composite["default_profile"], "mainnet");
let profiles = composite["profiles"].as_array();
assert!(profiles.is_some());
if let std::option::Option::Some(profiles) = profiles {
assert_eq!(profiles.len(), 3);
for profile in profiles {
let documents = profile["documents"].as_array();
assert!(documents.is_some());
if let std::option::Option::Some(documents) = documents {
assert_eq!(documents.len(), 2);
assert_eq!(documents[0]["component_id"], "logging");
assert_eq!(documents[0]["file_id"], "cfg.std.logging");
assert_eq!(documents[0]["profile_id"], "supertrace");
assert_eq!(documents[1]["component_id"], "store");
assert_eq!(documents[1]["file_id"], "cfg.std.store");
assert_eq!(documents[1]["profile_id"], profile["profile_id"]);
}
}
}
}
let tauri = parse_json(include_str!("../tauri.conf.json"));
assert!(tauri.is_ok(), "Store Desk Tauri JSON must be valid");
if let std::result::Result::Ok(tauri) = tauri {
let resources = tauri["bundle"]["resources"].as_object();
assert!(resources.is_some());
if let std::option::Option::Some(resources) = resources {
assert_eq!(resources.len(), 15);
assert!(resources.contains_key("../../config/composite.ksp-app-store-desk.json"));
assert!(resources.contains_key("../../config/std.store.json"));
assert!(resources.contains_key("../../config/schemas/std.store.schema.json"));
}
}
}
#[test]
fn pre_006_store_lifecycle_is_composite_managed_health_visible_and_bounded_on_window_close() {
let bootstrap = include_str!("../src/bootstrap.rs");
let store = include_str!("../src/store_runtime.rs");
let tauri = include_str!("../src/tauri.rs");
assert!(bootstrap.contains("FILE_ID_COMPOSITE_KSP_APP_STORE_DESK"));
assert!(bootstrap.contains("COMPOSITE_COMPONENT_ID_STORE"));
assert!(store.contains("ksp_store_lib::Store::open"));
assert!(store.contains("store.runtime_snapshot()"));
assert!(store.contains("store.health().await"));
assert!(store.contains("store.close().await"));
assert!(tauri.contains("CloseRequested"));
assert!(tauri.contains("api.prevent_close()"));
assert!(tauri.contains("begin_shutdown"));
assert!(tauri.contains("close_store().await"));
assert!(tauri.contains("app_handle.exit(0)"));
assert!(tauri.contains("store_runtime_status"));
}

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-store-desk/tests/desktop_security.rs
// version: 3
// version: 4
//! Security boundary tests for the Store Desk scaffold.
@@ -61,7 +61,22 @@ fn pre_003_store_desk_development_logging_explicitly_selects_supertrace() {
let constants = include_str!("../src/constants.rs");
let bootstrap = include_str!("../src/bootstrap.rs");
assert!(constants.contains("DEVELOPMENT_LOGGING_PROFILE: &str = \"supertrace\""));
assert!(bootstrap.contains("std::option::Option::Some(crate::DEVELOPMENT_LOGGING_PROFILE)"));
assert!(bootstrap.contains("FILE_ID_COMPOSITE_KSP_APP_STORE_DESK"));
assert!(bootstrap.contains("logging_profile.profile_id() != crate::DEVELOPMENT_LOGGING_PROFILE"));
assert!(bootstrap.contains("LogFilterLevel::Trace"));
return;
}
#[test]
fn pre_006_store_status_ipc_is_backend_neutral_and_secret_free() {
let dto = include_str!("../src/dto_common.rs");
let runtime = include_str!("../src/store_runtime.rs");
let tauri = include_str!("../src/tauri.rs");
assert!(dto.contains("StoreRuntimeStatusDto"));
assert!(runtime.contains("runtime_snapshot"));
assert!(runtime.contains("health().await"));
assert!(tauri.contains("store_runtime_status"));
for forbidden in ["connection_uri", "connectionUri", "postgresql://", "password", "RawPayload", "RawAccountState", "tokio_postgres"] {
assert!(!dto.contains(forbidden), "Store status DTO source contains forbidden field/material: {forbidden}");
}
}