lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README

commit d945d6daa1118903816316dc8b4a3c8d950a64e1
parent fb8a4c87c8d439b564a287a7a76f54f4e6346f1e
Author: triesap <tyson@radroots.org>
Date:   Sun, 12 Jul 2026 02:36:02 +0000

crate-surface: harden final-name coverage gates

Diffstat:
Mcrates/event_codec/src/order/decode.rs | 6++++++
Mcrates/event_codec/tests/coverage_edges.rs | 8++++++++
Mcrates/mesh_agent_client/tests/client.rs | 35+++++++++++++++++++++++++++++++++++
Mcrates/replica_schema/tests/query_bind_values.rs | 34++++++++++++++++++++++++++++++++++
Mcrates/runtime_store/src/models.rs | 209+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 292 insertions(+), 0 deletions(-)

diff --git a/crates/event_codec/src/order/decode.rs b/crates/event_codec/src/order/decode.rs @@ -1459,6 +1459,12 @@ mod tests { RadrootsOrderEnvelopeParseError::InvalidTag("p") ); assert_eq!( + map_tag_parse_error_for_order_envelope(crate::error::EventParseError::DuplicateTag( + "p", + )), + RadrootsOrderEnvelopeParseError::InvalidTag("p") + ); + assert_eq!( map_tag_parse_error_for_order_envelope(crate::error::EventParseError::InvalidKind { expected: "1", got: 2, diff --git a/crates/event_codec/tests/coverage_edges.rs b/crates/event_codec/tests/coverage_edges.rs @@ -30,6 +30,14 @@ fn parsed_args() -> (String, String, u32, u32, String, Vec<Vec<String>>, String) } #[test] +fn event_parse_error_duplicate_tag_code_and_display_are_stable() { + let error = EventParseError::DuplicateTag("d"); + + assert_eq!(error.code(), "duplicate_tag"); + assert_eq!(error.to_string(), "duplicate tag: d"); +} + +#[test] fn parsed_wrappers_propagate_invalid_kind_errors() { let (id, author, created_at, kind, content, tags, sig) = parsed_args(); assert_invalid_kind( diff --git a/crates/mesh_agent_client/tests/client.rs b/crates/mesh_agent_client/tests/client.rs @@ -54,6 +54,14 @@ fn mock_client_status_reports_reticulum_preview_unavailable() { } #[test] +fn default_mock_client_uses_preview_unavailable_policy() { + let client = RadrootsMockMeshAgentClient::default(); + + assert_eq!(client.scope().as_str(), RADROOTS_RETICULUM_PREVIEW_SCOPE_ID); + assert_eq!(client.policy().policy_id(), RADROOTS_MESH_PREVIEW_POLICY_ID); +} + +#[test] fn mock_client_status_can_omit_transport_rows_without_enabling_delivery() { let client = RadrootsMockMeshAgentClient::preview_unavailable(); let response = client.status(MeshAgentStatusRequest { @@ -99,6 +107,8 @@ fn mock_client_publish_never_reports_success_outcomes() { #[test] fn dto_schema_names_match_capnp_surface() { assert_eq!(MeshAgentTransportKind::Reticulum.schema_name(), "reticulum"); + assert_eq!(MeshAgentImplementation::Real.schema_name(), "real"); + assert_eq!(MeshAgentImplementation::Mock.schema_name(), "mock"); assert_eq!( MeshAgentImplementation::PreviewUnavailable.schema_name(), "previewUnavailable" @@ -107,6 +117,18 @@ fn dto_schema_names_match_capnp_surface() { assert_eq!(MeshAgentResponseStatus::Deferred.schema_name(), "deferred"); assert_eq!(MeshAgentResponseStatus::Rejected.schema_name(), "rejected"); assert_eq!( + MeshAgentTransportOutcome::Accepted.schema_name(), + "accepted" + ); + assert_eq!( + MeshAgentTransportOutcome::Delivered.schema_name(), + "delivered" + ); + assert_eq!( + MeshAgentTransportOutcome::Forwarded.schema_name(), + "forwarded" + ); + assert_eq!( MeshAgentTransportOutcome::TransportUnavailable.schema_name(), "transportUnavailable" ); @@ -114,6 +136,19 @@ fn dto_schema_names_match_capnp_surface() { MeshAgentTransportOutcome::StoredByGateway.schema_name(), "storedByGateway" ); + assert_eq!( + MeshAgentTransportOutcome::DeferredUntilImplemented.schema_name(), + "deferredUntilImplemented" + ); + assert_eq!( + MeshAgentTransportOutcome::Rejected.schema_name(), + "rejected" + ); + assert_eq!( + MeshAgentTransportOutcome::RouteUnavailable.schema_name(), + "routeUnavailable" + ); + assert_eq!(MeshAgentTransportOutcome::Timeout.schema_name(), "timeout"); } #[test] diff --git a/crates/replica_schema/tests/query_bind_values.rs b/crates/replica_schema/tests/query_bind_values.rs @@ -12,6 +12,9 @@ use radroots_replica_schema::nostr_relay::NostrRelayQueryBindValues; use radroots_replica_schema::plot::PlotQueryBindValues; use radroots_replica_schema::plot_gcs_location::PlotGcsLocationQueryBindValues; use radroots_replica_schema::plot_tag::PlotTagQueryBindValues; +use radroots_replica_schema::result::{ + ReplicaSchemaError, ReplicaSchemaResult, ReplicaSchemaResultList, ReplicaSchemaResultPass, +}; use radroots_replica_schema::trade_product::TradeProductQueryBindValues; use serde_json::Value; @@ -352,3 +355,34 @@ assert_query_bind_values!( "trade-product-id", [] ); + +#[test] +fn schema_result_wrappers_cover_constructors_and_status_labels() { + assert_eq!( + ReplicaSchemaError::from("err-a".to_string()), + ReplicaSchemaError { + err: "err-a".to_string() + } + ); + assert_eq!( + ReplicaSchemaError::new("err-b".to_string()), + ReplicaSchemaError { + err: "err-b".to_string() + } + ); + assert_eq!( + ReplicaSchemaResult::new("result-a".to_string()), + ReplicaSchemaResult { + result: "result-a".to_string() + } + ); + + let empty = ReplicaSchemaResultList::<String>::new(Vec::new()); + assert!(empty.is_empty()); + let filled = ReplicaSchemaResultList::new(vec!["row-a".to_string()]); + assert!(!filled.is_empty()); + assert_eq!(filled.results, vec!["row-a".to_string()]); + + assert_eq!(ReplicaSchemaResultPass::new(true).status_label(), "pass"); + assert_eq!(ReplicaSchemaResultPass::new(false).status_label(), "fail"); +} diff --git a/crates/runtime_store/src/models.rs b/crates/runtime_store/src/models.rs @@ -606,6 +606,204 @@ mod tests { } #[test] + fn relay_delivery_evidence_models_cover_states_validation_and_json() { + for (variant, value) in [ + (RelayDeliveryState::Pending, "pending"), + (RelayDeliveryState::Acknowledged, "acknowledged"), + (RelayDeliveryState::Observed, "observed"), + (RelayDeliveryState::Failed, "failed"), + ] { + assert_eq!(variant.as_str(), value); + } + + let failure = + RelayDeliveryFailure::new(" wss://relay-a.example ", " timeout ").expect("failure"); + assert_eq!(failure.relay_url, " wss://relay-a.example "); + assert_eq!(failure.error, " timeout "); + assert_model_error_contains(RelayDeliveryFailure::new(" ", "timeout"), "relay_url"); + assert_model_error_contains( + RelayDeliveryFailure::new("wss://relay-a.example", " "), + "relay_delivery_error", + ); + + let pending = + RelayDeliveryEvidence::pending([" wss://relay-a.example ", "wss://relay-a.example"]) + .expect("pending evidence"); + assert_eq!(pending.state, RelayDeliveryState::Pending); + assert_eq!(pending.target_relays, vec!["wss://relay-a.example"]); + assert!(pending.relay_set_fingerprint().is_some()); + pending.to_json_value().expect("pending evidence json"); + assert_model_error_contains( + RelayDeliveryEvidence::pending(Vec::<String>::new()), + "target_relays", + ); + + let acknowledged = RelayDeliveryEvidence::acknowledged( + ["wss://relay-a.example"], + ["wss://relay-a.example"], + ["wss://relay-a.example"], + Vec::new(), + ) + .expect("acknowledged evidence"); + assert_eq!(acknowledged.state, RelayDeliveryState::Acknowledged); + assert_model_error_contains( + RelayDeliveryEvidence::acknowledged( + Vec::<String>::new(), + Vec::<String>::new(), + ["wss://relay-a.example"], + Vec::new(), + ), + "target_relays", + ); + assert_model_error_contains( + RelayDeliveryEvidence::acknowledged( + ["wss://relay-a.example"], + Vec::<String>::new(), + Vec::<String>::new(), + Vec::new(), + ), + "acknowledged_relays", + ); + + let observed = RelayDeliveryEvidence::observed( + ["wss://relay-a.example"], + ["wss://relay-a.example"], + ["wss://relay-b.example"], + vec![failure.clone()], + ) + .expect("observed evidence"); + assert_eq!(observed.state, RelayDeliveryState::Observed); + assert_eq!( + observed.relay_set_fingerprint(), + Some("wss://relay-a.example\nwss://relay-b.example".to_owned()) + ); + observed.to_json_value().expect("observed evidence json"); + assert_model_error_contains( + RelayDeliveryEvidence::observed( + Vec::<String>::new(), + Vec::<String>::new(), + ["wss://relay-b.example"], + Vec::new(), + ), + "target_relays", + ); + assert_model_error_contains( + RelayDeliveryEvidence::observed( + ["wss://relay-a.example"], + Vec::<String>::new(), + Vec::<String>::new(), + Vec::new(), + ), + "observed_relays", + ); + + let failed = RelayDeliveryEvidence { + state: RelayDeliveryState::Failed, + target_relays: vec!["wss://relay-a.example".to_owned()], + connected_relays: Vec::new(), + acknowledged_relays: Vec::new(), + observed_relays: Vec::new(), + failed_relays: vec![failure], + }; + let failed_json = failed.to_json_value().expect("failed evidence json"); + assert_eq!( + RelayDeliveryEvidence::from_json_value(&failed_json).expect("failed evidence"), + failed + ); + + assert_model_error_contains( + RelayDeliveryEvidence { + state: RelayDeliveryState::Pending, + target_relays: Vec::new(), + connected_relays: Vec::new(), + acknowledged_relays: Vec::new(), + observed_relays: Vec::new(), + failed_relays: Vec::new(), + } + .to_json_value(), + "target_relays", + ); + assert_model_error_contains( + RelayDeliveryEvidence { + state: RelayDeliveryState::Acknowledged, + target_relays: vec!["wss://relay-a.example".to_owned()], + connected_relays: Vec::new(), + acknowledged_relays: Vec::new(), + observed_relays: Vec::new(), + failed_relays: Vec::new(), + } + .to_json_value(), + "acknowledged_relays", + ); + assert_model_error_contains( + RelayDeliveryEvidence { + state: RelayDeliveryState::Observed, + target_relays: vec!["wss://relay-a.example".to_owned()], + connected_relays: Vec::new(), + acknowledged_relays: Vec::new(), + observed_relays: Vec::new(), + failed_relays: Vec::new(), + } + .to_json_value(), + "observed_relays", + ); + assert_model_error_contains( + RelayDeliveryEvidence { + state: RelayDeliveryState::Failed, + target_relays: vec!["wss://relay-a.example".to_owned()], + connected_relays: Vec::new(), + acknowledged_relays: Vec::new(), + observed_relays: Vec::new(), + failed_relays: Vec::new(), + } + .to_json_value(), + "failed_relays", + ); + assert_model_error_contains( + RelayDeliveryEvidence { + state: RelayDeliveryState::Failed, + target_relays: vec!["wss://relay-a.example".to_owned()], + connected_relays: Vec::new(), + acknowledged_relays: Vec::new(), + observed_relays: Vec::new(), + failed_relays: vec![RelayDeliveryFailure { + relay_url: " ".to_owned(), + error: "timeout".to_owned(), + }], + } + .to_json_value(), + "failed_relay_url", + ); + assert_model_error_contains( + RelayDeliveryEvidence { + state: RelayDeliveryState::Failed, + target_relays: vec!["wss://relay-a.example".to_owned()], + connected_relays: Vec::new(), + acknowledged_relays: Vec::new(), + observed_relays: Vec::new(), + failed_relays: vec![RelayDeliveryFailure { + relay_url: "wss://relay-a.example".to_owned(), + error: " ".to_owned(), + }], + } + .to_json_value(), + "failed_relay_error", + ); + assert_eq!( + RelayDeliveryEvidence { + state: RelayDeliveryState::Pending, + target_relays: Vec::new(), + connected_relays: Vec::new(), + acknowledged_relays: Vec::new(), + observed_relays: Vec::new(), + failed_relays: Vec::new(), + } + .relay_set_fingerprint(), + None + ); + } + + #[test] fn local_record_input_validation_covers_success_and_error_paths() { let mut local_work = local_work_input(); local_work.validate().expect("valid local work"); @@ -754,4 +952,15 @@ mod tests { "expected error to contain {expected}, got {err}" ); } + + fn assert_model_error_contains<T>(result: Result<T, RuntimeStoreError>, expected: &str) { + let err = match result { + Ok(_) => panic!("expected validation error"), + Err(err) => err, + }; + assert!( + err.to_string().contains(expected), + "expected error to contain {expected}, got {err}" + ); + } }