cli

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

commit 20f4659909b8d65f17cd8b40f19504df09679e95
parent bb2a16356704ab439b979bc0ed73853e2bca606e
Author: triesap <tyson@radroots.org>
Date:   Sat, 25 Apr 2026 06:57:39 +0000

tests: remove ambient workspace config setup

Diffstat:
Msrc/runtime/config.rs | 83++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------
Mtests/listing.rs | 38+++++++++++++++++++-------------------
Mtests/market.rs | 6+++---
Mtests/myc_status.rs | 20++++++++++----------
Mtests/order.rs | 38+++++++++++++++++++-------------------
Mtests/relay_net.rs | 2++
Mtests/runtime_show.rs | 8+++++++-
Mtests/sync.rs | 18+++++++++---------
Mtests/workflow.rs | 10+++++-----
9 files changed, 135 insertions(+), 88 deletions(-)

diff --git a/src/runtime/config.rs b/src/runtime/config.rs @@ -1931,23 +1931,33 @@ RADROOTS_CLI_LOGGING_STDOUT=false fn user_relay_config_overrides_workspace_relay_config() { let temp = tempdir().expect("tempdir"); let workspace_root = temp.path().join("workspace"); + let repo_local_root = workspace_root.join("infra/local/runtime/radroots"); + let app_config_dir = repo_local_root.join("config/apps/cli"); let user_home = temp.path().join("home"); - fs::create_dir_all(workspace_root.join("infra/local/runtime/radroots")) - .expect("workspace config dir"); - fs::create_dir_all(user_home.join(".radroots/config/apps/cli")).expect("app config dir"); + fs::create_dir_all(&repo_local_root).expect("workspace config dir"); + fs::create_dir_all(&app_config_dir).expect("app config dir"); fs::write( - workspace_root.join("infra/local/runtime/radroots/config.toml"), + repo_local_root.join("config.toml"), "[relay]\nurls = [\"wss://relay.workspace\"]\npublish_policy = \"any\"\n", ) .expect("write workspace config"); fs::write( - user_home.join(".radroots/config/apps/cli/config.toml"), + app_config_dir.join("config.toml"), "[relay]\nurls = [\"wss://relay.user\", \"wss://relay.workspace\"]\n", ) .expect("write user config"); let env = MapEnvironment { - values: BTreeMap::new(), + values: BTreeMap::from([ + ( + "RADROOTS_CLI_PATHS_PROFILE".to_owned(), + "repo_local".to_owned(), + ), + ( + "RADROOTS_CLI_PATHS_REPO_LOCAL_ROOT".to_owned(), + repo_local_root.display().to_string(), + ), + ]), current_dir: workspace_root, path_resolver: RadrootsPathResolver::new( RadrootsPlatform::Linux, @@ -1978,23 +1988,33 @@ RADROOTS_CLI_LOGGING_STDOUT=false fn user_hyf_config_overrides_workspace_hyf_config() { let temp = tempdir().expect("tempdir"); let workspace_root = temp.path().join("workspace"); + let repo_local_root = workspace_root.join("infra/local/runtime/radroots"); + let app_config_dir = repo_local_root.join("config/apps/cli"); let user_home = temp.path().join("home"); - fs::create_dir_all(workspace_root.join("infra/local/runtime/radroots")) - .expect("workspace config dir"); - fs::create_dir_all(user_home.join(".radroots/config/apps/cli")).expect("app config dir"); + fs::create_dir_all(&repo_local_root).expect("workspace config dir"); + fs::create_dir_all(&app_config_dir).expect("app config dir"); fs::write( - workspace_root.join("infra/local/runtime/radroots/config.toml"), + repo_local_root.join("config.toml"), "[hyf]\nenabled = false\nexecutable = \"workspace-hyfd\"\n", ) .expect("write workspace config"); fs::write( - user_home.join(".radroots/config/apps/cli/config.toml"), + app_config_dir.join("config.toml"), "[hyf]\nenabled = true\nexecutable = \"user-hyfd\"\n", ) .expect("write user config"); let env = MapEnvironment { - values: BTreeMap::new(), + values: BTreeMap::from([ + ( + "RADROOTS_CLI_PATHS_PROFILE".to_owned(), + "repo_local".to_owned(), + ), + ( + "RADROOTS_CLI_PATHS_REPO_LOCAL_ROOT".to_owned(), + repo_local_root.display().to_string(), + ), + ]), current_dir: workspace_root, path_resolver: RadrootsPathResolver::new( RadrootsPlatform::Linux, @@ -2023,12 +2043,13 @@ RADROOTS_CLI_LOGGING_STDOUT=false fn user_capability_binding_overrides_workspace_binding() { let temp = tempdir().expect("tempdir"); let workspace_root = temp.path().join("workspace"); + let repo_local_root = workspace_root.join("infra/local/runtime/radroots"); + let app_config_dir = repo_local_root.join("config/apps/cli"); let user_home = temp.path().join("home"); - fs::create_dir_all(workspace_root.join("infra/local/runtime/radroots")) - .expect("workspace config dir"); - fs::create_dir_all(user_home.join(".radroots/config/apps/cli")).expect("app config dir"); + fs::create_dir_all(&repo_local_root).expect("workspace config dir"); + fs::create_dir_all(&app_config_dir).expect("app config dir"); fs::write( - workspace_root.join("infra/local/runtime/radroots/config.toml"), + repo_local_root.join("config.toml"), r#" [[capability_binding]] capability = "inference.hyf_stdio" @@ -2039,7 +2060,7 @@ target = "workspace-hyf" ) .expect("write workspace config"); fs::write( - user_home.join(".radroots/config/apps/cli/config.toml"), + app_config_dir.join("config.toml"), r#" [[capability_binding]] capability = "inference.hyf_stdio" @@ -2051,7 +2072,16 @@ target = "bin/user-hyfd" .expect("write user config"); let env = MapEnvironment { - values: BTreeMap::new(), + values: BTreeMap::from([ + ( + "RADROOTS_CLI_PATHS_PROFILE".to_owned(), + "repo_local".to_owned(), + ), + ( + "RADROOTS_CLI_PATHS_REPO_LOCAL_ROOT".to_owned(), + repo_local_root.display().to_string(), + ), + ]), current_dir: workspace_root, path_resolver: RadrootsPathResolver::new( RadrootsPlatform::Linux, @@ -2087,12 +2117,12 @@ target = "bin/user-hyfd" fn invalid_capability_binding_provider_fails() { let temp = tempdir().expect("tempdir"); let workspace_root = temp.path().join("workspace"); + let repo_local_root = workspace_root.join("infra/local/runtime/radroots"); let user_home = temp.path().join("home"); - fs::create_dir_all(workspace_root.join("infra/local/runtime/radroots")) - .expect("workspace config dir"); + fs::create_dir_all(&repo_local_root).expect("workspace config dir"); fs::create_dir_all(user_home.join(".radroots/config/apps/cli")).expect("app config dir"); fs::write( - workspace_root.join("infra/local/runtime/radroots/config.toml"), + repo_local_root.join("config.toml"), r#" [[capability_binding]] capability = "write_plane.trade_jsonrpc" @@ -2104,7 +2134,16 @@ target = "https://rpc.workspace.test/jsonrpc" .expect("write workspace config"); let env = MapEnvironment { - values: BTreeMap::new(), + values: BTreeMap::from([ + ( + "RADROOTS_CLI_PATHS_PROFILE".to_owned(), + "repo_local".to_owned(), + ), + ( + "RADROOTS_CLI_PATHS_REPO_LOCAL_ROOT".to_owned(), + repo_local_root.display().to_string(), + ), + ]), current_dir: workspace_root, path_resolver: RadrootsPathResolver::new( RadrootsPlatform::Linux, diff --git a/tests/listing.rs b/tests/listing.rs @@ -59,13 +59,13 @@ fn cli_command_in(workdir: &Path) -> Command { command } -fn write_workspace_config(workdir: &Path, contents: &str) { - let config_dir = workdir.join("infra/local/runtime/radroots"); - fs::create_dir_all(&config_dir).expect("workspace config dir"); - fs::write(config_dir.join("config.toml"), contents).expect("write workspace config"); +fn write_user_config(workdir: &Path, contents: &str) { + let config_dir = workdir.join("home/.radroots/config/apps/cli"); + fs::create_dir_all(&config_dir).expect("user config dir"); + fs::write(config_dir.join("config.toml"), contents).expect("write user config"); } -fn workspace_config_with_write_plane(extra: &str, url: &str) -> String { +fn config_with_write_plane(extra: &str, url: &str) -> String { let mut rendered = String::new(); if !extra.trim().is_empty() { rendered.push_str(extra.trim()); @@ -501,9 +501,9 @@ fn listing_publish_and_update_use_durable_bridge_publish() { other => MockRpcResponse::rpc_error(-32601, &format!("unexpected method: {other}")), } }); - write_workspace_config( + write_user_config( dir.path(), - workspace_config_with_write_plane("", server.url().as_str()).as_str(), + config_with_write_plane("", server.url().as_str()).as_str(), ); let publish_output = cli_command_in(dir.path()) @@ -652,9 +652,9 @@ fn listing_archive_and_dry_run_are_truthful() { other => MockRpcResponse::rpc_error(-32601, &format!("unexpected method: {other}")), } }); - write_workspace_config( + write_user_config( dir.path(), - workspace_config_with_write_plane("", server.url().as_str()).as_str(), + config_with_write_plane("", server.url().as_str()).as_str(), ); let archive_output = cli_command_in(dir.path()) @@ -824,9 +824,9 @@ fn listing_publish_uses_myc_binding_before_resolving_daemon_signer_session() { other => MockRpcResponse::rpc_error(-32601, &format!("unexpected method: {other}")), } }); - write_workspace_config( + write_user_config( dir.path(), - workspace_config_with_write_plane( + config_with_write_plane( format!( r#" [[capability_binding]] @@ -975,9 +975,9 @@ fn listing_publish_rejects_myc_binding_that_resolves_the_wrong_actor() { recorded.lock().expect("recorded").push(body.clone()); MockRpcResponse::rpc_error(-32601, "daemon write path should not be reached") }); - write_workspace_config( + write_user_config( dir.path(), - workspace_config_with_write_plane( + config_with_write_plane( format!( r#" [[capability_binding]] @@ -1107,9 +1107,9 @@ fn listing_publish_rejects_daemon_session_with_mismatched_myc_authority() { _ => MockRpcResponse::rpc_error(-32601, "unexpected rpc method"), } }); - write_workspace_config( + write_user_config( dir.path(), - workspace_config_with_write_plane( + config_with_write_plane( format!( r#" [[capability_binding]] @@ -1217,9 +1217,9 @@ fn listing_publish_without_matching_signer_session_exits_unconfigured() { other => MockRpcResponse::rpc_error(-32601, &format!("unexpected method: {other}")), } }); - write_workspace_config( + write_user_config( dir.path(), - workspace_config_with_write_plane("", server.url().as_str()).as_str(), + config_with_write_plane("", server.url().as_str()).as_str(), ); let publish_output = cli_command_in(dir.path()) @@ -1314,9 +1314,9 @@ fn listing_publish_rejects_requested_session_that_mismatches_seller_pubkey() { other => MockRpcResponse::rpc_error(-32601, &format!("unexpected method: {other}")), } }); - write_workspace_config( + write_user_config( dir.path(), - workspace_config_with_write_plane("", server.url().as_str()).as_str(), + config_with_write_plane("", server.url().as_str()).as_str(), ); let publish_output = cli_command_in(dir.path()) diff --git a/tests/market.rs b/tests/market.rs @@ -190,13 +190,13 @@ fn market_update_stays_honest_about_unavailable_ingest() { .expect("run local init"); assert!(init.status.success()); - let config_dir = dir.path().join("infra/local/runtime/radroots"); - fs::create_dir_all(&config_dir).expect("workspace config dir"); + let config_dir = dir.path().join("home/.radroots/config/apps/cli"); + fs::create_dir_all(&config_dir).expect("user config dir"); fs::write( config_dir.join("config.toml"), "[relay]\nurls = [\"wss://relay.one\"]\npublish_policy = \"any\"\n", ) - .expect("write workspace config"); + .expect("write user config"); let json_output = cli_command_in(dir.path()) .args(["--json", "market", "update"]) diff --git a/tests/myc_status.rs b/tests/myc_status.rs @@ -42,10 +42,10 @@ fn cli_command_in(workdir: &Path) -> Command { command } -fn write_workspace_config(workdir: &Path, contents: &str) { - let config_dir = workdir.join("infra/local/runtime/radroots"); - fs::create_dir_all(&config_dir).expect("workspace config dir"); - fs::write(config_dir.join("config.toml"), contents).expect("write workspace config"); +fn write_user_config(workdir: &Path, contents: &str) { + let config_dir = workdir.join("home/.radroots/config/apps/cli"); + fs::create_dir_all(&config_dir).expect("user config dir"); + fs::write(config_dir.join("config.toml"), contents).expect("write user config"); } #[test] @@ -201,7 +201,7 @@ fn signer_status_reports_ready_for_configured_myc_managed_account_binding() { let signer_session_ref = payload["signer_backend"]["remote_sessions"][0]["connection_id"] .as_str() .expect("signer session ref"); - write_workspace_config( + write_user_config( dir.path(), format!( r#" @@ -234,7 +234,7 @@ signer_session_ref = "{signer_session_ref}" let json: Value = serde_json::from_slice(output.stdout.as_slice()).expect("json output"); assert_eq!(json["mode"], "myc"); assert_eq!(json["state"], "ready"); - assert_eq!(json["source"], "workspace config [[capability_binding]]"); + assert_eq!(json["source"], "user config [[capability_binding]]"); assert_eq!(json["signer_account_id"], managed_account_ref); assert_eq!(json["binding"]["state"], "ready"); assert_eq!( @@ -287,7 +287,7 @@ fn signer_status_reports_unsupported_for_explicit_endpoint_binding() { dir.path(), successful_status_script(sample_status_payload(true).to_string()).as_str(), ); - write_workspace_config( + write_user_config( dir.path(), r#" [[capability_binding]] @@ -331,7 +331,7 @@ fn signer_status_reports_ambiguous_for_accountless_myc_binding() { dir.path(), successful_status_script(payload.to_string()).as_str(), ); - write_workspace_config( + write_user_config( dir.path(), r#" [[capability_binding]] @@ -377,7 +377,7 @@ fn signer_status_reports_unauthorized_for_session_without_sign_event_permission( let signer_session_ref = payload["signer_backend"]["remote_sessions"][0]["connection_id"] .as_str() .expect("signer session ref"); - write_workspace_config( + write_user_config( dir.path(), format!( r#" @@ -429,7 +429,7 @@ fn signer_status_reports_unavailable_for_missing_bound_session() { let managed_account_ref = payload["signer_backend"]["local_signer"]["account_id"] .as_str() .expect("managed account ref"); - write_workspace_config( + write_user_config( dir.path(), format!( r#" diff --git a/tests/order.rs b/tests/order.rs @@ -63,10 +63,10 @@ fn order_command_in(workdir: &Path) -> Command { command } -fn write_workspace_config(workdir: &Path, contents: &str) { - let config_dir = workdir.join("infra/local/runtime/radroots"); - fs::create_dir_all(&config_dir).expect("workspace config dir"); - fs::write(config_dir.join("config.toml"), contents).expect("write workspace config"); +fn write_user_config(workdir: &Path, contents: &str) { + let config_dir = workdir.join("home/.radroots/config/apps/cli"); + fs::create_dir_all(&config_dir).expect("user config dir"); + fs::write(config_dir.join("config.toml"), contents).expect("write user config"); } fn init_local_replica(workdir: &Path) { @@ -153,7 +153,7 @@ fn run_order_lookup_failure(seed: impl FnOnce(&Path), expected_stderr: &str) { assert_no_order_drafts(dir.path()); } -fn workspace_config_with_write_plane(extra: &str, url: &str) -> String { +fn config_with_write_plane(extra: &str, url: &str) -> String { let mut rendered = String::new(); if !extra.trim().is_empty() { rendered.push_str(extra.trim()); @@ -823,9 +823,9 @@ fn order_submit_persists_submission_metadata_and_reports_job() { other => panic!("unexpected mock rpc method {other}"), } }); - write_workspace_config( + write_user_config( dir.path(), - workspace_config_with_write_plane("", server.url().as_str()).as_str(), + config_with_write_plane("", server.url().as_str()).as_str(), ); let submit_output = order_command_in(dir.path()) @@ -939,9 +939,9 @@ fn order_submit_quiet_reports_submitted_order_id() { other => panic!("unexpected mock rpc method {other}"), } }); - write_workspace_config( + write_user_config( dir.path(), - workspace_config_with_write_plane("", server.url().as_str()).as_str(), + config_with_write_plane("", server.url().as_str()).as_str(), ); let submit_output = order_command_in(dir.path()) @@ -1036,9 +1036,9 @@ fn order_submit_watch_appends_human_watch_snapshots() { other => panic!("unexpected mock rpc method {other}"), } }); - write_workspace_config( + write_user_config( dir.path(), - workspace_config_with_write_plane("", server.url().as_str()).as_str(), + config_with_write_plane("", server.url().as_str()).as_str(), ); let output = order_command_in(dir.path()) @@ -1286,9 +1286,9 @@ fn order_submit_uses_myc_binding_before_resolving_daemon_signer_session() { other => panic!("unexpected mock rpc method {other}"), } }); - write_workspace_config( + write_user_config( dir.path(), - workspace_config_with_write_plane( + config_with_write_plane( format!( r#" [[capability_binding]] @@ -1428,9 +1428,9 @@ fn order_submit_rejects_myc_binding_that_resolves_the_wrong_actor() { }); panic!("daemon write path should not be reached"); }); - write_workspace_config( + write_user_config( dir.path(), - workspace_config_with_write_plane( + config_with_write_plane( format!( r#" [[capability_binding]] @@ -1537,9 +1537,9 @@ fn order_submit_without_unique_matching_signer_session_exits_unconfigured() { other => panic!("unexpected mock rpc method {other}"), } }); - write_workspace_config( + write_user_config( dir.path(), - workspace_config_with_write_plane("", server.url().as_str()).as_str(), + config_with_write_plane("", server.url().as_str()).as_str(), ); let submit_output = order_command_in(dir.path()) @@ -1613,9 +1613,9 @@ fn order_submit_rejects_requested_session_that_mismatches_buyer_pubkey() { other => panic!("unexpected mock rpc method {other}"), } }); - write_workspace_config( + write_user_config( dir.path(), - workspace_config_with_write_plane("", server.url().as_str()).as_str(), + config_with_write_plane("", server.url().as_str()).as_str(), ); let submit_output = order_command_in(dir.path()) diff --git a/tests/relay_net.rs b/tests/relay_net.rs @@ -50,6 +50,8 @@ fn relay_ls_json_reports_workspace_configured_relays() { .expect("write workspace config"); let output = cli_command_in(dir.path()) + .env("RADROOTS_CLI_PATHS_PROFILE", "repo_local") + .env("RADROOTS_CLI_PATHS_REPO_LOCAL_ROOT", &config_dir) .args(["--json", "relay", "ls"]) .output() .expect("run relay ls"); diff --git a/tests/runtime_show.rs b/tests/runtime_show.rs @@ -640,6 +640,8 @@ fn config_show_json_reads_workspace_relay_config() { .expect("write workspace config"); let output = runtime_show_command_in(dir.path()) + .env("RADROOTS_CLI_PATHS_PROFILE", "repo_local") + .env("RADROOTS_CLI_PATHS_REPO_LOCAL_ROOT", &config_dir) .args(["--json", "config", "show"]) .output() .expect("run config show"); @@ -665,6 +667,8 @@ fn config_show_reads_workspace_rpc_config() { .expect("write workspace config"); let output = runtime_show_command_in(dir.path()) + .env("RADROOTS_CLI_PATHS_PROFILE", "repo_local") + .env("RADROOTS_CLI_PATHS_REPO_LOCAL_ROOT", &config_dir) .args(["--json", "config", "show"]) .output() .expect("run config show"); @@ -679,7 +683,7 @@ fn config_show_reads_workspace_rpc_config() { fn config_show_reports_explicit_capability_bindings() { let dir = tempdir().expect("tempdir"); let workspace_config_dir = dir.path().join("infra/local/runtime/radroots"); - let user_config_dir = config_root(dir.path()).join("apps/cli"); + let user_config_dir = workspace_config_dir.join("config/apps/cli"); fs::create_dir_all(&workspace_config_dir).expect("workspace config dir"); fs::create_dir_all(&user_config_dir).expect("user config dir"); fs::write( @@ -726,6 +730,8 @@ target = "bin/hyfd-user" .expect("write user config"); let output = runtime_show_command_in(dir.path()) + .env("RADROOTS_CLI_PATHS_PROFILE", "repo_local") + .env("RADROOTS_CLI_PATHS_REPO_LOCAL_ROOT", &workspace_config_dir) .args(["--json", "config", "show"]) .output() .expect("run config show"); diff --git a/tests/sync.rs b/tests/sync.rs @@ -88,13 +88,13 @@ fn sync_pull_and_push_are_honestly_narrowed_until_relay_plane_lands() { .output() .expect("run local init"); assert!(init.status.success()); - let config_dir = dir.path().join("infra/local/runtime/radroots"); - fs::create_dir_all(&config_dir).expect("workspace config dir"); + let config_dir = dir.path().join("home/.radroots/config/apps/cli"); + fs::create_dir_all(&config_dir).expect("user config dir"); fs::write( config_dir.join("config.toml"), "[relay]\nurls = [\"wss://relay.one\"]\npublish_policy = \"any\"\n", ) - .expect("write workspace config"); + .expect("write user config"); let pull = cli_command_in(dir.path()) .args(["--json", "sync", "pull"]) @@ -135,13 +135,13 @@ fn sync_watch_ndjson_emits_one_frame_per_poll() { .output() .expect("run local init"); assert!(init.status.success()); - let config_dir = dir.path().join("infra/local/runtime/radroots"); - fs::create_dir_all(&config_dir).expect("workspace config dir"); + let config_dir = dir.path().join("home/.radroots/config/apps/cli"); + fs::create_dir_all(&config_dir).expect("user config dir"); fs::write( config_dir.join("config.toml"), "[relay]\nurls = [\"wss://relay.one\", \"wss://relay.two\"]\npublish_policy = \"any\"\n", ) - .expect("write workspace config"); + .expect("write user config"); let output = cli_command_in(dir.path()) .args([ @@ -174,13 +174,13 @@ fn sync_watch_human_appends_readable_snapshots_without_screen_clear() { .output() .expect("run local init"); assert!(init.status.success()); - let config_dir = dir.path().join("infra/local/runtime/radroots"); - fs::create_dir_all(&config_dir).expect("workspace config dir"); + let config_dir = dir.path().join("home/.radroots/config/apps/cli"); + fs::create_dir_all(&config_dir).expect("user config dir"); fs::write( config_dir.join("config.toml"), "[relay]\nurls = [\"wss://relay.one\", \"wss://relay.two\"]\npublish_policy = \"any\"\n", ) - .expect("write workspace config"); + .expect("write user config"); let output = cli_command_in(dir.path()) .args(["sync", "watch", "--frames", "2", "--interval-ms", "1"]) diff --git a/tests/workflow.rs b/tests/workflow.rs @@ -48,10 +48,10 @@ fn cli_command_in(workdir: &Path) -> Command { command } -fn write_workspace_config(workdir: &Path, contents: &str) { - let config_dir = workdir.join("infra/local/runtime/radroots"); - fs::create_dir_all(&config_dir).expect("workspace config dir"); - fs::write(config_dir.join("config.toml"), contents).expect("write workspace config"); +fn write_user_config(workdir: &Path, contents: &str) { + let config_dir = workdir.join("home/.radroots/config/apps/cli"); + fs::create_dir_all(&config_dir).expect("user config dir"); + fs::write(config_dir.join("config.toml"), contents).expect("write user config"); } #[test] @@ -235,7 +235,7 @@ fn status_reports_farm_publish_need_when_core_state_is_ready() { .expect("run local init"); assert!(local.status.success()); - write_workspace_config( + write_user_config( dir.path(), "[relay]\nurls = [\"wss://relay.one\"]\npublish_policy = \"any\"\n", );