272 lines
9.1 KiB
Bash
272 lines
9.1 KiB
Bash
#!/usr/bin/env bats
|
|
# Secrets Manager tests
|
|
|
|
setup() {
|
|
load 'test_helper/common-setup'
|
|
SECRET_NAME="bats/test/secret-$(unique_name)"
|
|
}
|
|
|
|
teardown() {
|
|
aws_cmd secretsmanager delete-secret \
|
|
--secret-id "$SECRET_NAME" \
|
|
--force-delete-without-recovery >/dev/null 2>&1 || true
|
|
}
|
|
|
|
@test "Secrets Manager: create secret" {
|
|
run aws_cmd secretsmanager create-secret \
|
|
--name "$SECRET_NAME" \
|
|
--secret-string '{"key":"value"}'
|
|
assert_success
|
|
arn=$(json_get "$output" '.ARN')
|
|
[ -n "$arn" ]
|
|
}
|
|
|
|
@test "Secrets Manager: get secret value" {
|
|
aws_cmd secretsmanager create-secret \
|
|
--name "$SECRET_NAME" \
|
|
--secret-string '{"key":"value"}' >/dev/null
|
|
|
|
run aws_cmd secretsmanager get-secret-value --secret-id "$SECRET_NAME"
|
|
assert_success
|
|
value=$(json_get "$output" '.SecretString')
|
|
[ "$value" = '{"key":"value"}' ]
|
|
}
|
|
|
|
@test "Secrets Manager: update secret" {
|
|
aws_cmd secretsmanager create-secret \
|
|
--name "$SECRET_NAME" \
|
|
--secret-string '{"key":"value"}' >/dev/null
|
|
|
|
run aws_cmd secretsmanager update-secret \
|
|
--secret-id "$SECRET_NAME" \
|
|
--secret-string '{"key":"updated"}'
|
|
assert_success
|
|
|
|
run aws_cmd secretsmanager get-secret-value --secret-id "$SECRET_NAME"
|
|
assert_success
|
|
value=$(json_get "$output" '.SecretString')
|
|
[ "$value" = '{"key":"updated"}' ]
|
|
}
|
|
|
|
@test "Secrets Manager: list secrets" {
|
|
aws_cmd secretsmanager create-secret \
|
|
--name "$SECRET_NAME" \
|
|
--secret-string '{"key":"value"}' >/dev/null
|
|
|
|
run aws_cmd secretsmanager list-secrets
|
|
assert_success
|
|
found=$(echo "$output" | jq --arg name "$SECRET_NAME" '.SecretList | any(.Name == $name)')
|
|
[ "$found" = "true" ]
|
|
}
|
|
|
|
@test "Secrets Manager: delete secret" {
|
|
aws_cmd secretsmanager create-secret \
|
|
--name "$SECRET_NAME" \
|
|
--secret-string '{"key":"value"}' >/dev/null
|
|
|
|
run aws_cmd secretsmanager delete-secret \
|
|
--secret-id "$SECRET_NAME" \
|
|
--force-delete-without-recovery
|
|
assert_success
|
|
}
|
|
|
|
# --- Secrets Manager Tagging Tests ---
|
|
|
|
@test "Secrets Manager: tag resource" {
|
|
out=$(aws_cmd secretsmanager create-secret \
|
|
--name "$SECRET_NAME" \
|
|
--secret-string '{"key":"value"}')
|
|
arn=$(json_get "$out" '.ARN')
|
|
|
|
run aws_cmd secretsmanager tag-resource \
|
|
--secret-id "$arn" \
|
|
--tags Key=Environment,Value=test Key=Project,Value=bats
|
|
assert_success
|
|
}
|
|
|
|
@test "Secrets Manager: describe secret with tags" {
|
|
out=$(aws_cmd secretsmanager create-secret \
|
|
--name "$SECRET_NAME" \
|
|
--secret-string '{"key":"value"}')
|
|
arn=$(json_get "$out" '.ARN')
|
|
|
|
aws_cmd secretsmanager tag-resource \
|
|
--secret-id "$arn" \
|
|
--tags Key=Environment,Value=test >/dev/null
|
|
|
|
run aws_cmd secretsmanager describe-secret --secret-id "$SECRET_NAME"
|
|
assert_success
|
|
found=$(echo "$output" | jq '.Tags | any(.Key == "Environment" and .Value == "test")')
|
|
[ "$found" = "true" ]
|
|
}
|
|
|
|
@test "Secrets Manager: untag resource" {
|
|
out=$(aws_cmd secretsmanager create-secret \
|
|
--name "$SECRET_NAME" \
|
|
--secret-string '{"key":"value"}')
|
|
arn=$(json_get "$out" '.ARN')
|
|
|
|
aws_cmd secretsmanager tag-resource \
|
|
--secret-id "$arn" \
|
|
--tags Key=Environment,Value=test >/dev/null
|
|
|
|
run aws_cmd secretsmanager untag-resource \
|
|
--secret-id "$arn" \
|
|
--tag-keys Environment
|
|
assert_success
|
|
|
|
# Verify tag is removed
|
|
run aws_cmd secretsmanager describe-secret --secret-id "$SECRET_NAME"
|
|
found=$(echo "$output" | jq '.Tags // [] | any(.Key == "Environment")')
|
|
[ "$found" = "false" ]
|
|
}
|
|
|
|
# --- Secrets Manager Version Stage Tests ---
|
|
|
|
@test "Secrets Manager: add custom stage to version" {
|
|
out=$(aws_cmd secretsmanager create-secret \
|
|
--name "$SECRET_NAME" \
|
|
--secret-string '{"key":"value"}')
|
|
v1=$(json_get "$out" '.VersionId')
|
|
|
|
run aws_cmd secretsmanager update-secret-version-stage \
|
|
--secret-id "$SECRET_NAME" \
|
|
--version-stage MYSTAGE \
|
|
--move-to-version-id "$v1"
|
|
assert_success
|
|
|
|
run aws_cmd secretsmanager describe-secret --secret-id "$SECRET_NAME"
|
|
assert_success
|
|
has_mystage=$(echo "$output" | jq --arg vid "$v1" '.VersionIdsToStages[$vid] | any(. == "MYSTAGE")')
|
|
[ "$has_mystage" = "true" ]
|
|
has_current=$(echo "$output" | jq --arg vid "$v1" '.VersionIdsToStages[$vid] | any(. == "AWSCURRENT")')
|
|
[ "$has_current" = "true" ]
|
|
}
|
|
|
|
@test "Secrets Manager: move custom stage between versions" {
|
|
out=$(aws_cmd secretsmanager create-secret \
|
|
--name "$SECRET_NAME" \
|
|
--secret-string '{"key":"v1"}')
|
|
v1=$(json_get "$out" '.VersionId')
|
|
|
|
out=$(aws_cmd secretsmanager update-secret \
|
|
--secret-id "$SECRET_NAME" \
|
|
--secret-string '{"key":"v2"}')
|
|
v2=$(json_get "$out" '.VersionId')
|
|
|
|
aws_cmd secretsmanager update-secret-version-stage \
|
|
--secret-id "$SECRET_NAME" \
|
|
--version-stage MYSTAGE \
|
|
--move-to-version-id "$v1" >/dev/null
|
|
|
|
run aws_cmd secretsmanager update-secret-version-stage \
|
|
--secret-id "$SECRET_NAME" \
|
|
--version-stage MYSTAGE \
|
|
--move-to-version-id "$v2" \
|
|
--remove-from-version-id "$v1"
|
|
assert_success
|
|
|
|
run aws_cmd secretsmanager describe-secret --secret-id "$SECRET_NAME"
|
|
assert_success
|
|
on_v2=$(echo "$output" | jq --arg vid "$v2" '.VersionIdsToStages[$vid] | any(. == "MYSTAGE")')
|
|
[ "$on_v2" = "true" ]
|
|
on_v1=$(echo "$output" | jq --arg vid "$v1" '(.VersionIdsToStages[$vid] // []) | any(. == "MYSTAGE")')
|
|
[ "$on_v1" = "false" ]
|
|
}
|
|
|
|
@test "Secrets Manager: move AWSCURRENT updates AWSPREVIOUS" {
|
|
out=$(aws_cmd secretsmanager create-secret \
|
|
--name "$SECRET_NAME" \
|
|
--secret-string '{"key":"v1"}')
|
|
v1=$(json_get "$out" '.VersionId')
|
|
|
|
out=$(aws_cmd secretsmanager update-secret \
|
|
--secret-id "$SECRET_NAME" \
|
|
--secret-string '{"key":"v2"}')
|
|
v2=$(json_get "$out" '.VersionId')
|
|
|
|
run aws_cmd secretsmanager update-secret-version-stage \
|
|
--secret-id "$SECRET_NAME" \
|
|
--version-stage AWSCURRENT \
|
|
--move-to-version-id "$v1" \
|
|
--remove-from-version-id "$v2"
|
|
assert_success
|
|
|
|
run aws_cmd secretsmanager describe-secret --secret-id "$SECRET_NAME"
|
|
assert_success
|
|
v1_current=$(echo "$output" | jq --arg vid "$v1" '.VersionIdsToStages[$vid] | any(. == "AWSCURRENT")')
|
|
[ "$v1_current" = "true" ]
|
|
v2_previous=$(echo "$output" | jq --arg vid "$v2" '.VersionIdsToStages[$vid] | any(. == "AWSPREVIOUS")')
|
|
[ "$v2_previous" = "true" ]
|
|
}
|
|
|
|
@test "Secrets Manager: remove custom stage from version" {
|
|
out=$(aws_cmd secretsmanager create-secret \
|
|
--name "$SECRET_NAME" \
|
|
--secret-string '{"key":"value"}')
|
|
v1=$(json_get "$out" '.VersionId')
|
|
|
|
aws_cmd secretsmanager update-secret-version-stage \
|
|
--secret-id "$SECRET_NAME" \
|
|
--version-stage MYSTAGE \
|
|
--move-to-version-id "$v1" >/dev/null
|
|
|
|
run aws_cmd secretsmanager update-secret-version-stage \
|
|
--secret-id "$SECRET_NAME" \
|
|
--version-stage MYSTAGE \
|
|
--remove-from-version-id "$v1"
|
|
assert_success
|
|
|
|
run aws_cmd secretsmanager describe-secret --secret-id "$SECRET_NAME"
|
|
assert_success
|
|
has_mystage=$(echo "$output" | jq --arg vid "$v1" '(.VersionIdsToStages[$vid] // []) | any(. == "MYSTAGE")')
|
|
[ "$has_mystage" = "false" ]
|
|
has_current=$(echo "$output" | jq --arg vid "$v1" '.VersionIdsToStages[$vid] | any(. == "AWSCURRENT")')
|
|
[ "$has_current" = "true" ]
|
|
}
|
|
|
|
# --- Batch Get Secret Value Tests ---
|
|
|
|
@test "Secrets Manager: batch-get-secret-value returns all found secrets" {
|
|
S1="${SECRET_NAME}-batch-a"
|
|
S2="${SECRET_NAME}-batch-b"
|
|
|
|
aws_cmd secretsmanager create-secret \
|
|
--name "$S1" \
|
|
--secret-string '{"key":"val-a"}' >/dev/null
|
|
aws_cmd secretsmanager create-secret \
|
|
--name "$S2" \
|
|
--secret-string '{"key":"val-b"}' >/dev/null
|
|
|
|
run aws_cmd secretsmanager batch-get-secret-value \
|
|
--secret-id-list "$S1" "$S2"
|
|
assert_success
|
|
|
|
count=$(echo "$output" | jq '.SecretValues | length')
|
|
[ "$count" = "2" ]
|
|
errors=$(echo "$output" | jq '.Errors | length')
|
|
[ "$errors" = "0" ]
|
|
|
|
aws_cmd secretsmanager delete-secret --secret-id "$S1" --force-delete-without-recovery >/dev/null 2>&1 || true
|
|
aws_cmd secretsmanager delete-secret --secret-id "$S2" --force-delete-without-recovery >/dev/null 2>&1 || true
|
|
}
|
|
|
|
@test "Secrets Manager: batch-get-secret-value with one missing returns partial Errors list" {
|
|
aws_cmd secretsmanager create-secret \
|
|
--name "$SECRET_NAME" \
|
|
--secret-string '{"key":"value"}' >/dev/null
|
|
|
|
run aws_cmd secretsmanager batch-get-secret-value \
|
|
--secret-id-list "$SECRET_NAME" "not-exists"
|
|
assert_success
|
|
|
|
values=$(echo "$output" | jq '.SecretValues | length')
|
|
[ "$values" = "1" ]
|
|
errors=$(echo "$output" | jq '.Errors | length')
|
|
[ "$errors" = "1" ]
|
|
error_code=$(echo "$output" | jq -r '.Errors[0].ErrorCode')
|
|
[ "$error_code" = "ResourceNotFoundException" ]
|
|
secret_id=$(echo "$output" | jq -r '.Errors[0].SecretId')
|
|
[ "$secret_id" = "not-exists" ]
|
|
}
|