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:
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");