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) {
281282func 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+
358425func 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+
429542func testAccSecretVersionConfig_string (rName string ) string {
430543 return fmt .Sprintf (`
431544resource "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