Skip to content

Commit 063e883

Browse files
YakDrivermattthaber
andcommitted
Add comprehensive write-only secret version testing
- Add dual verification approach (normal + write-only paths) - Add TestAccSecretsManagerSecretVersion_stringWriteOnly_stages - Add helper functions: testAccCheckSecretVersionExistsWriteOnly, testAccCheckSecretVersionWriteOnlyValueEmpty, testAccCheckSecretVersionWriteOnlyStagesEqual - Export findSecretVersionEntryByTwoPartKey for testing Based on testing approach from PR #43579 Co-authored-by: Matt Thaber <[email protected]>
1 parent bee00fd commit 063e883

File tree

2 files changed

+165
-3
lines changed

2 files changed

+165
-3
lines changed

internal/service/secretsmanager/exports_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ var (
1010
ResourceSecretRotation = resourceSecretRotation
1111
ResourceSecretVersion = resourceSecretVersion
1212

13-
FindSecretByID = findSecretByID
14-
FindSecretPolicyByID = findSecretPolicyByID
15-
FindSecretVersionByTwoPartKey = findSecretVersionByTwoPartKey
13+
FindSecretByID = findSecretByID
14+
FindSecretPolicyByID = findSecretPolicyByID
15+
FindSecretVersionByTwoPartKey = findSecretVersionByTwoPartKey
16+
FindSecretVersionEntryByTwoPartKey = findSecretVersionEntryByTwoPartKey
1617
)

internal/service/secretsmanager/secret_version_test.go

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"fmt"
99
"os"
10+
"reflect"
1011
"testing"
1112

1213
"github.com/aws/aws-sdk-go-v2/aws"
@@ -281,6 +282,7 @@ func TestAccSecretsManagerSecretVersion_multipleVersions(t *testing.T) {
281282
func TestAccSecretsManagerSecretVersion_stringWriteOnly(t *testing.T) {
282283
ctx := acctest.Context(t)
283284
var version secretsmanager.GetSecretValueOutput
285+
var versionWriteOnly secretsmanager.GetSecretValueOutput
284286
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
285287
resourceName := "aws_secretsmanager_secret_version.test"
286288
secretResourceName := "aws_secretsmanager_secret.test"
@@ -298,15 +300,19 @@ func TestAccSecretsManagerSecretVersion_stringWriteOnly(t *testing.T) {
298300
Config: testAccSecretVersionConfig_stringWriteOnly(rName, "test-secret", 1),
299301
Check: resource.ComposeTestCheckFunc(
300302
testAccCheckSecretVersionExists(ctx, resourceName, &version),
303+
testAccCheckSecretVersionExistsWriteOnly(ctx, resourceName, &versionWriteOnly),
301304
testAccCheckSecretVersionWriteOnlyValueEqual(t, &version, "test-secret"),
305+
testAccCheckSecretVersionWriteOnlyValueEmpty(t, &versionWriteOnly),
302306
resource.TestCheckResourceAttrPair(resourceName, names.AttrARN, secretResourceName, names.AttrARN),
303307
),
304308
},
305309
{
306310
Config: testAccSecretVersionConfig_stringWriteOnly(rName, "test-secret2", 2),
307311
Check: resource.ComposeTestCheckFunc(
308312
testAccCheckSecretVersionExists(ctx, resourceName, &version),
313+
testAccCheckSecretVersionExistsWriteOnly(ctx, resourceName, &versionWriteOnly),
309314
testAccCheckSecretVersionWriteOnlyValueEqual(t, &version, "test-secret2"),
315+
testAccCheckSecretVersionWriteOnlyValueEmpty(t, &versionWriteOnly),
310316
resource.TestCheckResourceAttrPair(resourceName, names.AttrARN, secretResourceName, names.AttrARN),
311317
),
312318
},
@@ -355,6 +361,67 @@ func TestAccSecretsManagerSecretVersion_stringWriteOnlyLimitedPermissions(t *tes
355361
})
356362
}
357363

364+
func TestAccSecretsManagerSecretVersion_stringWriteOnly_stages(t *testing.T) {
365+
ctx := acctest.Context(t)
366+
var version secretsmanager.GetSecretValueOutput
367+
var versionWriteOnly secretsmanager.GetSecretValueOutput
368+
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
369+
resourceName := "aws_secretsmanager_secret_version.test"
370+
secretResourceName := "aws_secretsmanager_secret.test"
371+
372+
resource.ParallelTest(t, resource.TestCase{
373+
PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(ctx, t) },
374+
ErrorCheck: acctest.ErrorCheck(t, names.SecretsManagerServiceID),
375+
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
376+
tfversion.SkipBelow(tfcversion.Must(tfcversion.NewVersion("1.11.0"))),
377+
},
378+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
379+
CheckDestroy: testAccCheckSecretVersionDestroy(ctx),
380+
Steps: []resource.TestStep{
381+
{
382+
Config: testAccSecretVersionConfig_stringWriteOnly_stagesSingle(rName, "test-secret", 1),
383+
Check: resource.ComposeTestCheckFunc(
384+
testAccCheckSecretVersionExists(ctx, resourceName, &version),
385+
testAccCheckSecretVersionExistsWriteOnly(ctx, resourceName, &versionWriteOnly),
386+
testAccCheckSecretVersionWriteOnlyValueEmpty(t, &versionWriteOnly),
387+
resource.TestCheckResourceAttrPair(resourceName, names.AttrARN, secretResourceName, names.AttrARN),
388+
resource.TestCheckResourceAttr(resourceName, "version_stages.#", "2"),
389+
resource.TestCheckTypeSetElemAttr(resourceName, "version_stages.*", "AWSCURRENT"),
390+
resource.TestCheckTypeSetElemAttr(resourceName, "version_stages.*", "one"),
391+
testAccCheckSecretVersionWriteOnlyStagesEqual(t, &versionWriteOnly, []string{"one", "AWSCURRENT"}),
392+
),
393+
},
394+
{
395+
Config: testAccSecretVersionConfig_stringWriteOnly_stagesSingleUpdated(rName, "test-secret", 1),
396+
Check: resource.ComposeTestCheckFunc(
397+
testAccCheckSecretVersionExists(ctx, resourceName, &version),
398+
testAccCheckSecretVersionExistsWriteOnly(ctx, resourceName, &versionWriteOnly),
399+
testAccCheckSecretVersionWriteOnlyValueEmpty(t, &versionWriteOnly),
400+
resource.TestCheckResourceAttrPair(resourceName, names.AttrARN, secretResourceName, names.AttrARN),
401+
resource.TestCheckResourceAttr(resourceName, "version_stages.#", "2"),
402+
resource.TestCheckTypeSetElemAttr(resourceName, "version_stages.*", "AWSCURRENT"),
403+
resource.TestCheckTypeSetElemAttr(resourceName, "version_stages.*", "two"),
404+
testAccCheckSecretVersionWriteOnlyStagesEqual(t, &versionWriteOnly, []string{"AWSCURRENT", "two"}),
405+
),
406+
},
407+
{
408+
Config: testAccSecretVersionConfig_stringWriteOnly_stagesMultiple(rName, "test-secret", 1),
409+
Check: resource.ComposeTestCheckFunc(
410+
testAccCheckSecretVersionExists(ctx, resourceName, &version),
411+
testAccCheckSecretVersionExistsWriteOnly(ctx, resourceName, &versionWriteOnly),
412+
testAccCheckSecretVersionWriteOnlyValueEmpty(t, &versionWriteOnly),
413+
resource.TestCheckResourceAttrPair(resourceName, names.AttrARN, secretResourceName, names.AttrARN),
414+
resource.TestCheckResourceAttr(resourceName, "version_stages.#", "3"),
415+
resource.TestCheckTypeSetElemAttr(resourceName, "version_stages.*", "AWSCURRENT"),
416+
resource.TestCheckTypeSetElemAttr(resourceName, "version_stages.*", "two"),
417+
resource.TestCheckTypeSetElemAttr(resourceName, "version_stages.*", "one"),
418+
testAccCheckSecretVersionWriteOnlyStagesEqual(t, &versionWriteOnly, []string{"one", "AWSCURRENT", "two"}),
419+
),
420+
},
421+
},
422+
})
423+
}
424+
358425
func testAccCheckSecretVersionDestroy(ctx context.Context) resource.TestCheckFunc {
359426
return func(s *terraform.State) error {
360427
conn := acctest.Provider.Meta().(*conns.AWSClient).SecretsManagerClient(ctx)
@@ -426,6 +493,52 @@ func testAccCheckSecretVersionWriteOnlyValueEqual(t *testing.T, param *secretsma
426493
}
427494
}
428495

496+
func testAccCheckSecretVersionExistsWriteOnly(ctx context.Context, n string, v *secretsmanager.GetSecretValueOutput) resource.TestCheckFunc {
497+
return func(s *terraform.State) error {
498+
rs, ok := s.RootModule().Resources[n]
499+
if !ok {
500+
return fmt.Errorf("Not found: %s", n)
501+
}
502+
503+
conn := acctest.Provider.Meta().(*conns.AWSClient).SecretsManagerClient(ctx)
504+
505+
arn, versionEntry, err := tfsecretsmanager.FindSecretVersionEntryByTwoPartKey(ctx, conn, rs.Primary.Attributes["secret_id"], rs.Primary.Attributes["version_id"])
506+
507+
if err != nil {
508+
return err
509+
}
510+
511+
// Construct a GetSecretValueOutput-like structure from ListSecretVersionIds result
512+
result := &secretsmanager.GetSecretValueOutput{
513+
ARN: arn,
514+
VersionId: versionEntry.VersionId,
515+
VersionStages: versionEntry.VersionStages,
516+
}
517+
518+
*v = *result
519+
520+
return nil
521+
}
522+
}
523+
524+
func testAccCheckSecretVersionWriteOnlyValueEmpty(t *testing.T, param *secretsmanager.GetSecretValueOutput) resource.TestCheckFunc {
525+
return func(s *terraform.State) error {
526+
if aws.ToString(param.SecretString) != "" {
527+
t.Fatalf("Expected SecretsManger SecretString to be an empty string, but got %v", aws.ToString(param.SecretString))
528+
}
529+
return nil
530+
}
531+
}
532+
533+
func testAccCheckSecretVersionWriteOnlyStagesEqual(t *testing.T, param *secretsmanager.GetSecretValueOutput, stages []string) resource.TestCheckFunc {
534+
return func(s *terraform.State) error {
535+
if !reflect.DeepEqual(param.VersionStages, stages) {
536+
t.Fatalf("Expected SecretsManger VersionStages to be %v, but got %v", stages, param.VersionStages)
537+
}
538+
return nil
539+
}
540+
}
541+
429542
func testAccSecretVersionConfig_string(rName string) string {
430543
return fmt.Sprintf(`
431544
resource "aws_secretsmanager_secret" "test" {
@@ -597,3 +710,51 @@ resource "aws_secretsmanager_secret_version" "test3" {
597710
}
598711
`, rName)
599712
}
713+
714+
func testAccSecretVersionConfig_stringWriteOnly_stagesSingle(rName, secret string, version int) string {
715+
return fmt.Sprintf(`
716+
resource "aws_secretsmanager_secret" "test" {
717+
name = %[1]q
718+
}
719+
720+
resource "aws_secretsmanager_secret_version" "test" {
721+
secret_id = aws_secretsmanager_secret.test.id
722+
secret_string_wo = %[2]q
723+
secret_string_wo_version = %[3]d
724+
725+
version_stages = ["one", "AWSCURRENT"]
726+
}
727+
`, rName, secret, version)
728+
}
729+
730+
func testAccSecretVersionConfig_stringWriteOnly_stagesSingleUpdated(rName, secret string, version int) string {
731+
return fmt.Sprintf(`
732+
resource "aws_secretsmanager_secret" "test" {
733+
name = %[1]q
734+
}
735+
736+
resource "aws_secretsmanager_secret_version" "test" {
737+
secret_id = aws_secretsmanager_secret.test.id
738+
secret_string_wo = %[2]q
739+
secret_string_wo_version = %[3]d
740+
741+
version_stages = ["two", "AWSCURRENT"]
742+
}
743+
`, rName, secret, version)
744+
}
745+
746+
func testAccSecretVersionConfig_stringWriteOnly_stagesMultiple(rName, secret string, version int) string {
747+
return fmt.Sprintf(`
748+
resource "aws_secretsmanager_secret" "test" {
749+
name = %[1]q
750+
}
751+
752+
resource "aws_secretsmanager_secret_version" "test" {
753+
secret_id = aws_secretsmanager_secret.test.id
754+
secret_string_wo = %[2]q
755+
secret_string_wo_version = %[3]d
756+
757+
version_stages = ["one", "two", "AWSCURRENT"]
758+
}
759+
`, rName, secret, version)
760+
}

0 commit comments

Comments
 (0)