github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/aws/resource_aws_iam_user_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/aws/aws-sdk-go/aws" 8 "github.com/aws/aws-sdk-go/aws/awserr" 9 "github.com/aws/aws-sdk-go/service/iam" 10 "github.com/hashicorp/terraform/helper/acctest" 11 "github.com/hashicorp/terraform/helper/resource" 12 "github.com/hashicorp/terraform/terraform" 13 ) 14 15 func TestValidateIamUserName(t *testing.T) { 16 validNames := []string{ 17 "test-user", 18 "test_user", 19 "testuser123", 20 "TestUser", 21 "Test-User", 22 "test.user", 23 "test.123,user", 24 "testuser@hashicorp", 25 "test+user@hashicorp.com", 26 } 27 for _, v := range validNames { 28 _, errors := validateAwsIamUserName(v, "name") 29 if len(errors) != 0 { 30 t.Fatalf("%q should be a valid IAM User name: %q", v, errors) 31 } 32 } 33 34 invalidNames := []string{ 35 "!", 36 "/", 37 " ", 38 ":", 39 ";", 40 "test name", 41 "/slash-at-the-beginning", 42 "slash-at-the-end/", 43 } 44 for _, v := range invalidNames { 45 _, errors := validateAwsIamUserName(v, "name") 46 if len(errors) == 0 { 47 t.Fatalf("%q should be an invalid IAM User name", v) 48 } 49 } 50 } 51 52 func TestAccAWSUser_basic(t *testing.T) { 53 var conf iam.GetUserOutput 54 55 name1 := fmt.Sprintf("test-user-%d", acctest.RandInt()) 56 name2 := fmt.Sprintf("test-user-%d", acctest.RandInt()) 57 path1 := "/" 58 path2 := "/path2/" 59 60 resource.Test(t, resource.TestCase{ 61 PreCheck: func() { testAccPreCheck(t) }, 62 Providers: testAccProviders, 63 CheckDestroy: testAccCheckAWSUserDestroy, 64 Steps: []resource.TestStep{ 65 resource.TestStep{ 66 Config: testAccAWSUserConfig(name1, path1), 67 Check: resource.ComposeTestCheckFunc( 68 testAccCheckAWSUserExists("aws_iam_user.user", &conf), 69 testAccCheckAWSUserAttributes(&conf, name1, "/"), 70 ), 71 }, 72 resource.TestStep{ 73 Config: testAccAWSUserConfig(name2, path2), 74 Check: resource.ComposeTestCheckFunc( 75 testAccCheckAWSUserExists("aws_iam_user.user", &conf), 76 testAccCheckAWSUserAttributes(&conf, name2, "/path2/"), 77 ), 78 }, 79 }, 80 }) 81 } 82 83 func testAccCheckAWSUserDestroy(s *terraform.State) error { 84 iamconn := testAccProvider.Meta().(*AWSClient).iamconn 85 86 for _, rs := range s.RootModule().Resources { 87 if rs.Type != "aws_iam_user" { 88 continue 89 } 90 91 // Try to get user 92 _, err := iamconn.GetUser(&iam.GetUserInput{ 93 UserName: aws.String(rs.Primary.ID), 94 }) 95 if err == nil { 96 return fmt.Errorf("still exist.") 97 } 98 99 // Verify the error is what we want 100 ec2err, ok := err.(awserr.Error) 101 if !ok { 102 return err 103 } 104 if ec2err.Code() != "NoSuchEntity" { 105 return err 106 } 107 } 108 109 return nil 110 } 111 112 func testAccCheckAWSUserExists(n string, res *iam.GetUserOutput) resource.TestCheckFunc { 113 return func(s *terraform.State) error { 114 rs, ok := s.RootModule().Resources[n] 115 if !ok { 116 return fmt.Errorf("Not found: %s", n) 117 } 118 119 if rs.Primary.ID == "" { 120 return fmt.Errorf("No User name is set") 121 } 122 123 iamconn := testAccProvider.Meta().(*AWSClient).iamconn 124 125 resp, err := iamconn.GetUser(&iam.GetUserInput{ 126 UserName: aws.String(rs.Primary.ID), 127 }) 128 if err != nil { 129 return err 130 } 131 132 *res = *resp 133 134 return nil 135 } 136 } 137 138 func testAccCheckAWSUserAttributes(user *iam.GetUserOutput, name string, path string) resource.TestCheckFunc { 139 return func(s *terraform.State) error { 140 if *user.User.UserName != name { 141 return fmt.Errorf("Bad name: %s", *user.User.UserName) 142 } 143 144 if *user.User.Path != path { 145 return fmt.Errorf("Bad path: %s", *user.User.Path) 146 } 147 148 return nil 149 } 150 } 151 152 func testAccAWSUserConfig(r, p string) string { 153 return fmt.Sprintf(` 154 resource "aws_iam_user" "user" { 155 name = "%s" 156 path = "%s" 157 }`, r, p) 158 }