Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 59 additions & 5 deletions crates/cli/tests/env_alias.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,18 @@ fn rc_binary() -> PathBuf {
workspace_root.join("target/release/rc")
}

fn rc_command() -> Command {
let mut command = Command::new(rc_binary());

for (key, _) in std::env::vars_os() {
if key.to_string_lossy().starts_with("RC_HOST_") {
command.env_remove(key);
}
}

command
}

fn unused_local_endpoint() -> String {
let listener = TcpListener::bind("127.0.0.1:0").expect("bind local endpoint");
let address = listener.local_addr().expect("local endpoint address");
Expand All @@ -35,7 +47,7 @@ fn unused_local_endpoint() -> String {
fn alias_list_includes_rc_host_alias_without_credentials() {
let config_dir = tempfile::tempdir().expect("create config dir");

let output = Command::new(rc_binary())
let output = rc_command()
.args(["alias", "list", "--json"])
.env("RC_CONFIG_DIR", config_dir.path())
.env(
Expand Down Expand Up @@ -69,7 +81,7 @@ fn ls_resolves_rc_host_alias_from_environment() {
let (_, endpoint_authority) = endpoint.split_once("://").expect("endpoint has scheme");
let env_alias = format!("http://ACCESS_KEY:SECRET_KEY@{endpoint_authority}");

let output = Command::new(rc_binary())
let output = rc_command()
.args(["--json", "ls", "myalias"])
.env("RC_CONFIG_DIR", config_dir.path())
.env("RC_HOST_myalias", env_alias)
Expand Down Expand Up @@ -99,7 +111,7 @@ fn ls_resolves_rc_host_alias_from_environment() {
fn alias_list_rejects_invalid_rc_host_percent_encoding_without_credentials() {
let config_dir = tempfile::tempdir().expect("create config dir");

let output = Command::new(rc_binary())
let output = rc_command()
.args(["alias", "list", "--json"])
.env("RC_CONFIG_DIR", config_dir.path())
.env(
Expand Down Expand Up @@ -137,7 +149,7 @@ fn alias_list_rejects_invalid_rc_host_percent_encoding_without_credentials() {
fn alias_list_rejects_invalid_rc_host_access_key_percent_encoding_without_credentials() {
let config_dir = tempfile::tempdir().expect("create config dir");

let output = Command::new(rc_binary())
let output = rc_command()
.args(["alias", "list", "--json"])
.env("RC_CONFIG_DIR", config_dir.path())
.env(
Expand Down Expand Up @@ -171,11 +183,53 @@ fn alias_list_rejects_invalid_rc_host_access_key_percent_encoding_without_creden
assert_eq!(payload["details"]["type"], "usage_error");
}

#[test]
fn alias_list_rejects_empty_rc_host_alias_name_as_usage_error() {
let config_dir = tempfile::tempdir().expect("create config dir");

let output = rc_command()
.args(["alias", "list", "--json"])
.env("RC_CONFIG_DIR", config_dir.path())
.env(
"RC_HOST_",
"https://ACCESS_KEY:SECRET_KEY@rustfs.local:9000",
)
.output()
.expect("run rc command");

assert_eq!(
output.status.code(),
Some(2),
"stdout: {}\nstderr: {}",
String::from_utf8_lossy(&output.stdout),
String::from_utf8_lossy(&output.stderr)
);
Comment thread
overtrue marked this conversation as resolved.
assert!(
output.stdout.is_empty(),
"usage JSON errors should be emitted on stderr"
);

let stderr = String::from_utf8(output.stderr).expect("stderr should be UTF-8");
assert!(!stderr.contains("ACCESS_KEY"));
assert!(!stderr.contains("SECRET_KEY"));

let payload: serde_json::Value = serde_json::from_str(&stderr).expect("JSON error output");
assert!(
payload["error"]
.as_str()
.expect("error message")
.contains("RC_HOST_ must include an alias name"),
"payload: {payload}"
);
assert_eq!(payload["code"], 2);
assert_eq!(payload["details"]["type"], "usage_error");
}

#[test]
fn alias_list_rejects_invalid_rc_host_scheme_without_credentials() {
let config_dir = tempfile::tempdir().expect("create config dir");

let output = Command::new(rc_binary())
let output = rc_command()
.args(["alias", "list", "--json"])
.env("RC_CONFIG_DIR", config_dir.path())
.env(
Expand Down
Loading