v0.3.8-pre.010
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-store-desk/tests/dependency_boundary.rs
|
||||
// version: 6
|
||||
// version: 7
|
||||
|
||||
//! Dependency-boundary tests for the Store Desk application.
|
||||
|
||||
@@ -131,3 +131,34 @@ fn pre_008_account_inspection_uses_store_facade_and_new_visible_items_use_crate_
|
||||
assert!(!sources.contains(forbidden), "Store Desk account inspection crossed physical/backend-neutral boundary: {forbidden}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pre_010_observation_ui_uses_store_facade_and_new_visible_items_use_crate_root_exports() {
|
||||
let lib = include_str!("../src/lib.rs");
|
||||
let dto = include_str!("../src/dto_observation.rs");
|
||||
let runtime = include_str!("../src/store_runtime.rs");
|
||||
let app_state = include_str!("../src/app_state.rs");
|
||||
let tauri = include_str!("../src/tauri.rs");
|
||||
for expected in [
|
||||
"pub(crate) use self::dto_observation::StoreAccountObservationQueryRequestDto;",
|
||||
"pub(crate) use self::dto_observation::StoreAccountObservationQueryResponseDto;",
|
||||
"pub(crate) use self::dto_observation::StoreAccountObservationRowDto;",
|
||||
"pub(crate) use self::dto_observation::StoreObservationProvenanceDto;",
|
||||
"pub(crate) use self::dto_observation::StoreTransactionObservationQueryRequestDto;",
|
||||
"pub(crate) use self::dto_observation::StoreTransactionObservationQueryResponseDto;",
|
||||
"pub(crate) use self::dto_observation::StoreTransactionObservationRowDto;",
|
||||
] {
|
||||
assert!(lib.contains(expected), "missing pre.010 crate-root observation DTO re-export: {expected}");
|
||||
}
|
||||
assert!(dto.contains("crate::StoreObservationProvenanceDto"));
|
||||
assert!(runtime.contains("ksp_store_lib::RawTransactionObservationInspectionRead::inspect_raw_transaction_observations"));
|
||||
assert!(runtime.contains("ksp_store_lib::RawAccountObservationInspectionRead::inspect_raw_account_observations"));
|
||||
assert!(app_state.contains("request: crate::StoreTransactionObservationQueryRequestDto"));
|
||||
assert!(app_state.contains("request: crate::StoreAccountObservationQueryRequestDto"));
|
||||
assert!(tauri.contains("request: crate::StoreTransactionObservationQueryRequestDto"));
|
||||
assert!(tauri.contains("request: crate::StoreAccountObservationQueryRequestDto"));
|
||||
let sources = [runtime, app_state, tauri].join("\n");
|
||||
for forbidden in ["ksp_store_api", "ksp_store_postgres", "tokio_postgres", "deadpool_postgres", "SELECT ", "OFFSET "] {
|
||||
assert!(!sources.contains(forbidden), "Store Desk observation UI crossed physical/backend-neutral boundary: {forbidden}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-store-desk/tests/desktop_contract.rs
|
||||
// version: 8
|
||||
// version: 9
|
||||
|
||||
//! Desktop template and frontend contract tests for the Store Desk scaffold.
|
||||
|
||||
@@ -272,3 +272,58 @@ fn pre_008_account_datatable_is_server_side_copyable_and_uses_datatables_as_only
|
||||
assert!(!html.contains(forbidden), "second Store pager marker present: {forbidden}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pre_010_observations_are_server_side_inside_entity_details_with_datatables_as_only_pager() {
|
||||
let html = include_str!("../frontend/main.html");
|
||||
let frontend = include_str!("../frontend/ts/main.ts");
|
||||
let tauri = include_str!("../src/tauri.rs");
|
||||
let runtime = include_str!("../src/store_runtime.rs");
|
||||
for expected in [
|
||||
"id=\"transactionObservationsTable\"",
|
||||
"id=\"accountObservationsTable\"",
|
||||
"id=\"transactionObservationsError\"",
|
||||
"id=\"accountObservationsError\"",
|
||||
] {
|
||||
assert!(html.contains(expected), "missing pre.010 observation UI contract: {expected}");
|
||||
}
|
||||
assert!(frontend.contains("store_query_transaction_observations"));
|
||||
assert!(frontend.contains("store_query_account_observations"));
|
||||
assert!(frontend.contains("initializeTransactionObservationTable"));
|
||||
assert!(frontend.contains("initializeAccountObservationTable"));
|
||||
assert!(frontend.contains("currentTransactionObservationSignature"));
|
||||
assert!(frontend.contains("currentAccountObservationIdentity"));
|
||||
assert!(frontend.contains("stale transaction observation response ignored"));
|
||||
assert!(frontend.contains("stale account observation response ignored"));
|
||||
assert!(tauri.contains("store_query_transaction_observations"));
|
||||
assert!(tauri.contains("store_query_account_observations"));
|
||||
assert!(runtime.contains("RawSortDirection::Descending"));
|
||||
assert!(!html.contains("store-observation-pager"));
|
||||
assert!(!frontend.contains("cursor:"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pre_010_observation_rows_project_safe_provenance_and_reuse_long_text_copy_without_source_bytes() {
|
||||
let dto = include_str!("../src/dto_observation.rs");
|
||||
let frontend = include_str!("../frontend/ts/main.ts");
|
||||
for expected in [
|
||||
"source_payload_hash",
|
||||
"source_payload_size_decimal",
|
||||
"received_at_unix_millis_decimal",
|
||||
"observed_at_unix_millis_decimal",
|
||||
"capture_session_id",
|
||||
"endpoint_id",
|
||||
"filter_id",
|
||||
"transaction_signature",
|
||||
"write_version_decimal",
|
||||
] {
|
||||
assert!(dto.contains(expected), "missing safe observation metadata field: {expected}");
|
||||
}
|
||||
for forbidden in ["source_payload_bytes", "payload_preview", "data_preview", "raw_bytes"] {
|
||||
assert!(!dto.contains(forbidden), "observation DTO leaked forbidden bytes field: {forbidden}");
|
||||
}
|
||||
assert!(frontend.contains("transaction-observation-key"));
|
||||
assert!(frontend.contains("account-observation-key"));
|
||||
assert!(frontend.contains("account-observation-transaction-signature"));
|
||||
assert!(frontend.contains("renderCopyableLongText"));
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-store-desk/tests/desktop_security.rs
|
||||
// version: 9
|
||||
// version: 10
|
||||
|
||||
//! Security boundary tests for the Store Desk scaffold.
|
||||
|
||||
@@ -230,3 +230,37 @@ fn pre_008_account_copy_tracing_never_logs_identity_or_data_material() {
|
||||
assert!(!frontend.contains(forbidden), "account copy tracing leaked copied value material: {forbidden}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pre_010_observation_ipc_and_tracing_keep_entity_values_and_source_bytes_out_of_logs() {
|
||||
let dto = include_str!("../src/dto_observation.rs");
|
||||
let frontend = include_str!("../frontend/ts/main.ts");
|
||||
let tauri = include_str!("../src/tauri.rs");
|
||||
for forbidden in ["draw:", "search:", "order:", "columns:", "cursor:", "network:"] {
|
||||
assert!(!dto.contains(forbidden), "observation IPC request leaked DataTables/physical field: {forbidden}");
|
||||
}
|
||||
for forbidden in ["source_payload_bytes", "payload_preview", "data_preview", "raw_bytes"] {
|
||||
assert!(!dto.contains(forbidden), "observation IPC leaked raw/source bytes: {forbidden}");
|
||||
}
|
||||
assert!(frontend.contains(r#"Store Desk transaction observation DataTables server-side query started", { pageLength: request.limit }"#));
|
||||
assert!(frontend.contains(r#"Store Desk account observation DataTables server-side query started", { pageLength: request.limit }"#));
|
||||
assert!(!frontend.contains(r#"query started", { signature"#));
|
||||
assert!(!frontend.contains(r#"query started", { pubkey"#));
|
||||
assert!(!frontend.contains(r#"query completed", { observationKey"#));
|
||||
assert!(tauri.contains("project_command_error("store_query_transaction_observations""));
|
||||
assert!(tauri.contains("project_command_error("store_query_account_observations""));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pre_010_observation_page_hardening_rejects_hostile_draw_length_and_unsafe_exact_counts() {
|
||||
let frontend = include_str!("../frontend/ts/main.ts");
|
||||
let runtime = include_str!("../src/store_runtime.rs");
|
||||
assert!(frontend.contains("Number.isSafeInteger(page.draw)"));
|
||||
assert!(frontend.contains("Number.isSafeInteger(page.start)"));
|
||||
assert!(frontend.contains("[25, 50, 100].includes(page.length)"));
|
||||
assert!(frontend.contains("Number.MAX_SAFE_INTEGER"));
|
||||
assert!(frontend.contains("exact count exceeds frontend safe integer domain"));
|
||||
assert!(runtime.contains("inspection_page_from_request"));
|
||||
assert!(runtime.contains("request.offset.as_str(), request.limit"));
|
||||
assert!(runtime.contains("offset_text.parse::<u64>()"));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user