#![cfg(e2e_test)]
mod common;
use common::{REGION, TestHelper, generate_bucket_name, run, s7cmd_cmd};
#[tokio::test]
async fn create_bucket_dispatch_success() {
let helper = TestHelper::new().await;
let bucket = generate_bucket_name();
let target = format!("s3://{bucket}");
let (code, stdout, stderr) = run(s7cmd_cmd().args([
"create-bucket",
"--target-profile",
"s7cmd-e2e-test",
"--target-region",
REGION,
&target,
]));
assert_eq!(
code,
Some(0),
"create-bucket must exit 0; stdout={stdout}\nstderr={stderr}"
);
assert!(helper.is_bucket_exist(&bucket).await);
helper.delete_bucket_with_cascade(&bucket).await;
}
#[tokio::test]
async fn create_bucket_dispatch_with_tagging() {
let helper = TestHelper::new().await;
let bucket = generate_bucket_name();
let target = format!("s3://{bucket}");
let (code, stdout, stderr) = run(s7cmd_cmd().args([
"create-bucket",
"--target-profile",
"s7cmd-e2e-test",
"--target-region",
REGION,
"--tagging",
"owner=team-a&env=test",
&target,
]));
assert_eq!(
code,
Some(0),
"create-bucket --tagging must exit 0; stdout={stdout}\nstderr={stderr}"
);
assert!(helper.is_bucket_exist(&bucket).await);
helper.delete_bucket_with_cascade(&bucket).await;
}
#[tokio::test]
async fn create_bucket_if_not_exists_with_existing_bucket_skips() {
let helper = TestHelper::new().await;
let bucket = generate_bucket_name();
helper.create_bucket(&bucket, REGION).await;
assert!(helper.is_bucket_exist(&bucket).await);
let target = format!("s3://{bucket}");
let (code, stdout, stderr) = run(s7cmd_cmd().args([
"create-bucket",
"--if-not-exists",
"--target-profile",
"s7cmd-e2e-test",
"--target-region",
REGION,
&target,
]));
assert_eq!(
code,
Some(0),
"create-bucket --if-not-exists on existing bucket must exit 0; stdout={stdout}\nstderr={stderr}"
);
assert!(
helper.is_bucket_exist(&bucket).await,
"bucket must still exist after the no-op create"
);
helper.delete_bucket_with_cascade(&bucket).await;
}
#[tokio::test]
async fn create_bucket_if_not_exists_with_missing_bucket_creates() {
let helper = TestHelper::new().await;
let bucket = generate_bucket_name();
let target = format!("s3://{bucket}");
let (code, stdout, stderr) = run(s7cmd_cmd().args([
"create-bucket",
"--if-not-exists",
"--target-profile",
"s7cmd-e2e-test",
"--target-region",
REGION,
&target,
]));
assert_eq!(
code,
Some(0),
"create-bucket --if-not-exists on missing bucket must exit 0; stdout={stdout}\nstderr={stderr}"
);
assert!(
helper.is_bucket_exist(&bucket).await,
"bucket must exist after fall-through CreateBucket"
);
helper.delete_bucket_with_cascade(&bucket).await;
}
#[tokio::test]
async fn create_bucket_if_not_exists_skips_tagging_on_existing_bucket() {
let helper = TestHelper::new().await;
let bucket = generate_bucket_name();
helper.create_bucket(&bucket, REGION).await;
let target = format!("s3://{bucket}");
let (code, stdout, stderr) = run(s7cmd_cmd().args([
"create-bucket",
"--if-not-exists",
"--tagging",
"owner=team-a&env=test",
"--target-profile",
"s7cmd-e2e-test",
"--target-region",
REGION,
&target,
]));
assert_eq!(
code,
Some(0),
"create-bucket --if-not-exists --tagging on existing bucket must exit 0; stdout={stdout}\nstderr={stderr}"
);
let (tag_code, _stdout, _stderr) = run(s7cmd_cmd().args([
"get-bucket-tagging",
"--target-profile",
"s7cmd-e2e-test",
"--target-region",
REGION,
&target,
]));
assert_eq!(
tag_code,
Some(4),
"get-bucket-tagging must report NotFound (4): the existing bucket must not have been retroactively tagged"
);
helper.delete_bucket_with_cascade(&bucket).await;
}
#[tokio::test]
async fn create_bucket_if_not_exists_with_missing_bucket_applies_tagging() {
let helper = TestHelper::new().await;
let bucket = generate_bucket_name();
let target = format!("s3://{bucket}");
let (code, stdout, stderr) = run(s7cmd_cmd().args([
"create-bucket",
"--if-not-exists",
"--tagging",
"stage=fresh&team=sre",
"--target-profile",
"s7cmd-e2e-test",
"--target-region",
REGION,
&target,
]));
assert_eq!(
code,
Some(0),
"create-bucket --if-not-exists --tagging on missing bucket must exit 0; stdout={stdout}\nstderr={stderr}"
);
let (tag_code, tag_stdout, _stderr) = run(s7cmd_cmd().args([
"get-bucket-tagging",
"--target-profile",
"s7cmd-e2e-test",
"--target-region",
REGION,
&target,
]));
assert_eq!(
tag_code,
Some(0),
"get-bucket-tagging must succeed on the freshly-created bucket"
);
assert!(
tag_stdout.contains("stage") && tag_stdout.contains("fresh"),
"expected seeded tag in get-bucket-tagging output: {tag_stdout}"
);
helper.delete_bucket_with_cascade(&bucket).await;
}
#[tokio::test]
async fn head_bucket_dispatch_success() {
let helper = TestHelper::new().await;
let bucket = generate_bucket_name();
helper.create_bucket(&bucket, REGION).await;
let target = format!("s3://{bucket}");
let (code, stdout, stderr) = run(s7cmd_cmd().args([
"head-bucket",
"--target-profile",
"s7cmd-e2e-test",
"--target-region",
REGION,
&target,
]));
assert_eq!(
code,
Some(0),
"head-bucket must exit 0; stdout={stdout}\nstderr={stderr}"
);
helper.delete_bucket_with_cascade(&bucket).await;
}
#[tokio::test]
async fn head_bucket_dispatch_not_found() {
let bucket = generate_bucket_name();
let target = format!("s3://{bucket}");
let (code, _stdout, _stderr) = run(s7cmd_cmd().args([
"head-bucket",
"--target-profile",
"s7cmd-e2e-test",
"--target-region",
REGION,
&target,
]));
assert_eq!(code, Some(4), "head-bucket on missing bucket must exit 4");
}
#[tokio::test]
async fn delete_bucket_dispatch_success() {
let helper = TestHelper::new().await;
let bucket = generate_bucket_name();
helper.create_bucket(&bucket, REGION).await;
let target = format!("s3://{bucket}");
let (code, stdout, stderr) = run(s7cmd_cmd().args([
"delete-bucket",
"--target-profile",
"s7cmd-e2e-test",
"--target-region",
REGION,
&target,
]));
assert_eq!(
code,
Some(0),
"delete-bucket must exit 0; stdout={stdout}\nstderr={stderr}"
);
}
#[tokio::test]
async fn delete_bucket_dispatch_error_not_empty() {
let helper = TestHelper::new().await;
let bucket = generate_bucket_name();
helper.create_bucket(&bucket, REGION).await;
helper
.put_object(&bucket, "blocker.txt", b"blocks delete".to_vec())
.await;
let target = format!("s3://{bucket}");
let (code, _stdout, _stderr) = run(s7cmd_cmd().args([
"delete-bucket",
"--target-profile",
"s7cmd-e2e-test",
"--target-region",
REGION,
&target,
]));
assert_eq!(
code,
Some(1),
"delete-bucket on non-empty bucket must exit 1"
);
helper.delete_bucket_with_cascade(&bucket).await;
}