use std::process::{Command, Stdio};
fn s3rm_bin() -> &'static str {
env!("CARGO_BIN_EXE_s3rm")
}
fn base_command() -> Command {
let mut cmd = Command::new(s3rm_bin());
cmd.stdin(Stdio::null())
.stdout(Stdio::piped())
.stderr(Stdio::piped());
cmd.arg("--aws-config-file")
.arg("./test_data/test_config/config")
.arg("--aws-shared-credentials-file")
.arg("./test_data/test_config/credentials")
.arg("--target-access-key")
.arg("dummy")
.arg("--target-secret-access-key")
.arg("dummy");
cmd
}
#[test]
fn empty_bucket_target_exits_with_config_error() {
let output = base_command()
.arg("s3:///prefix")
.output()
.expect("failed to spawn s3rm");
assert_eq!(
output.status.code(),
Some(2),
"empty-bucket target should exit with code 2; stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
}
#[test]
fn non_interactive_without_force_exits_with_config_error() {
let output = base_command()
.arg("s3://test-bucket/prefix/")
.output()
.expect("failed to spawn s3rm");
assert_eq!(
output.status.code(),
Some(2),
"non-interactive run without --force should exit with code 2; stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("--force"),
"error should mention the --force requirement; stderr: {stderr}"
);
}
#[test]
fn dry_run_unreachable_endpoint_exits_nonzero_without_panic() {
let output = base_command()
.arg("--dry-run")
.arg("--target-endpoint-url")
.arg("https://anything.invalid")
.arg("--connect-timeout-milliseconds")
.arg("1")
.arg("--aws-max-attempts")
.arg("0")
.arg("s3://test-bucket/prefix/")
.output()
.expect("failed to spawn s3rm");
let code = output.status.code();
assert_ne!(
code,
Some(0),
"unreachable endpoint should not succeed; stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
assert_ne!(
code,
Some(101),
"listing failure should be a normal error, not an abnormal termination"
);
}