cli

Command-line interface for Radroots
git clone https://radroots.dev/git/cli.git
Log | Files | Refs | README | LICENSE

commit b77059c19a55db5fe3b540ff804cc47584349e5e
parent d5773aac7e5a270a0ddf8220c0b45730d9aee165
Author: triesap <tyson@radroots.org>
Date:   Fri,  8 May 2026 03:23:53 +0000

farm: require relay for dry-run publish

- make nostr_relay farm publish dry-run validate relay input
- preserve dry-run behavior without relay network io
- add no-relay dry-run regression coverage
- keep watch-only account coverage behind a configured relay

Diffstat:
Msrc/operation_farm.rs | 2+-
Mtests/signer_runtime_modes.rs | 57++++++++++++++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/src/operation_farm.rs b/src/operation_farm.rs @@ -261,7 +261,7 @@ fn require_relay_target<P>( where P: OperationRequestPayload, { - if request.context.dry_run || !config.relay.urls.is_empty() { + if !config.relay.urls.is_empty() { return Ok(()); } diff --git a/tests/signer_runtime_modes.rs b/tests/signer_runtime_modes.rs @@ -1037,7 +1037,15 @@ fn local_farm_publish_dry_run_validates_secret_backed_account() { "pickup", ]); - let value = sandbox.json_success(&["--format", "json", "--dry-run", "farm", "publish"]); + let value = sandbox.json_success(&[ + "--format", + "json", + "--relay", + "ws://127.0.0.1:9", + "--dry-run", + "farm", + "publish", + ]); assert_eq!(value["operation_id"], "farm.publish"); assert_eq!(value["dry_run"], true); @@ -1047,6 +1055,42 @@ fn local_farm_publish_dry_run_validates_secret_backed_account() { } #[test] +fn local_farm_publish_dry_run_fails_without_configured_relay() { + let sandbox = RadrootsCliSandbox::new(); + sandbox.json_success(&["--format", "json", "account", "create"]); + sandbox.json_success(&[ + "--format", + "json", + "farm", + "create", + "--name", + "Green Farm", + "--location", + "farmstand", + "--country", + "US", + "--delivery-method", + "pickup", + ]); + + let (output, value) = + sandbox.json_output(&["--format", "json", "--dry-run", "farm", "publish"]); + + assert!(!output.status.success()); + assert_eq!(value["operation_id"], "farm.publish"); + assert_eq!(value["dry_run"], true); + assert_eq!(value["result"], serde_json::Value::Null); + assert_eq!(value["errors"][0]["code"], "network_unavailable"); + assert_eq!(value["errors"][0]["detail"]["class"], "network"); + assert_contains( + &value["errors"][0]["message"], + "requires at least one configured relay", + ); + assert_no_removed_command_reference(&value, &["farm", "publish", "--dry-run"]); + assert_no_daemon_runtime_reference(&value, &["farm", "publish", "--dry-run"]); +} + +#[test] fn local_farm_publish_fails_without_configured_relay() { let sandbox = RadrootsCliSandbox::new(); sandbox.json_success(&["--format", "json", "account", "create"]); @@ -1570,8 +1614,15 @@ fn watch_only_farm_publish_dry_run_fails_as_account_watch_only() { "pickup", ]); - let (output, value) = - sandbox.json_output(&["--format", "json", "--dry-run", "farm", "publish"]); + let (output, value) = sandbox.json_output(&[ + "--format", + "json", + "--relay", + "ws://127.0.0.1:9", + "--dry-run", + "farm", + "publish", + ]); assert!(!output.status.success()); assert_eq!(value["operation_id"], "farm.publish");