v0.3.8-pre.010

This commit is contained in:
2026-09-03 21:36:34 +02:00
parent 01502678bf
commit e2e603ca6d
15 changed files with 904 additions and 35 deletions

View File

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