commit 9046b9bac6fd1129c6fdd8a5ee835d7851744415
parent e0797c775856e9e58630feb811360c20c18fcebd
Author: triesap <tyson@radroots.org>
Date: Tue, 7 Jul 2026 06:27:19 +0000
transport: harden CLI transport guards
- add a transport source-boundary test for removed relay and publish proxy surfaces
- keep Reticulum preview profile and mesh output free of Nostr fallback guidance
- construct the Nostr provider test with an explicit Nostr transport profile
- validate with fmt, cli check, and the transport-filtered CLI test lane
Diffstat:
2 files changed, 40 insertions(+), 5 deletions(-)
diff --git a/src/runtime/provider.rs b/src/runtime/provider.rs
@@ -389,22 +389,25 @@ mod tests {
#[test]
fn write_plane_provider_tracks_nostr_transport_publish() {
- let config = sample_config(Vec::new(), false);
+ let mut config = sample_config(Vec::new(), false);
+ config.transport = crate::runtime::config::TransportConfig::from_nostr_relay_urls(vec![
+ "wss://relay.example.com".to_owned(),
+ ]);
let publish = publish_view(
&config,
- "unconfigured",
- Some("Nostr transport profile requires a configured Nostr relay"),
+ "ready",
+ Some("Nostr relay transport is configured for delivery"),
);
let view = resolve_write_plane_provider(&config, &publish);
assert_eq!(view.provider_runtime_id, "nostr");
assert_eq!(view.binding_model, "nostr_transport");
- assert_eq!(view.state, "unconfigured");
+ assert_eq!(view.state, "ready");
assert_eq!(
view.provenance,
ProviderProvenance::TransportProfile.as_str()
);
assert!(view.target.is_none());
- assert!(view.detail.contains("configured Nostr relay"));
+ assert!(view.detail.contains("configured for delivery"));
}
#[test]
diff --git a/tests/target_cli.rs b/tests/target_cli.rs
@@ -1376,6 +1376,38 @@ fn mesh_status_reports_reticulum_preview_unusable_state_without_fallback() {
);
}
+#[test]
+fn transport_source_boundary_rejects_removed_relay_and_publish_proxy_surfaces() {
+ let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
+
+ assert!(
+ !manifest_dir.join("src/cli/relay.rs").exists(),
+ "removed relay command module must not be reintroduced"
+ );
+
+ for relative_path in [
+ "src/runtime/transport.rs",
+ "src/runtime/sdk.rs",
+ "src/runtime/sync.rs",
+ "src/cli/transport.rs",
+ ] {
+ let source = fs::read_to_string(manifest_dir.join(relative_path)).expect("read source");
+ for forbidden in [
+ "radrootsd.publish_proxy.v1",
+ "publish.relays.resolve",
+ "\"publish.event\"",
+ "transport_kinds",
+ "allowed_relay_policy",
+ "relay_policy",
+ ] {
+ assert!(
+ !source.contains(forbidden),
+ "{relative_path} must not contain removed transport surface `{forbidden}`"
+ );
+ }
+ }
+}
+
fn help_lists(stdout: &str, command: &str) -> bool {
stdout.lines().any(|line| {
let line = line.trim_start();