github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/aws/data_source_aws_availability_zones_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "reflect" 6 "sort" 7 "strconv" 8 "testing" 9 10 "github.com/hashicorp/terraform/helper/resource" 11 "github.com/hashicorp/terraform/terraform" 12 ) 13 14 func TestAccAWSAvailabilityZones_basic(t *testing.T) { 15 resource.Test(t, resource.TestCase{ 16 PreCheck: func() { testAccPreCheck(t) }, 17 Providers: testAccProviders, 18 Steps: []resource.TestStep{ 19 { 20 Config: testAccCheckAwsAvailabilityZonesConfig, 21 Check: resource.ComposeTestCheckFunc( 22 testAccCheckAwsAvailabilityZonesMeta("data.aws_availability_zones.availability_zones"), 23 ), 24 }, 25 }, 26 }) 27 } 28 29 func TestAccAWSAvailabilityZones_stateFilter(t *testing.T) { 30 resource.Test(t, resource.TestCase{ 31 PreCheck: func() { testAccPreCheck(t) }, 32 Providers: testAccProviders, 33 Steps: []resource.TestStep{ 34 { 35 Config: testAccCheckAwsAvailabilityZonesStateConfig, 36 Check: resource.ComposeTestCheckFunc( 37 testAccCheckAwsAvailabilityZoneState("data.aws_availability_zones.state_filter"), 38 ), 39 }, 40 }, 41 }) 42 } 43 44 func TestResourceCheckAwsAvailabilityZones_validateStateType(t *testing.T) { 45 _, errors := validateStateType("incorrect", "state") 46 if len(errors) == 0 { 47 t.Fatalf("Expected to trigger a validation error") 48 } 49 50 var testCases = []struct { 51 Value string 52 ErrCount int 53 }{ 54 { 55 Value: "available", 56 ErrCount: 0, 57 }, 58 { 59 Value: "unavailable", 60 ErrCount: 0, 61 }, 62 } 63 64 for _, tc := range testCases { 65 _, errors := validateStateType(tc.Value, "state") 66 if len(errors) != tc.ErrCount { 67 t.Fatalf("Expected %q not to trigger a validation error.", tc.Value) 68 } 69 } 70 } 71 72 func testAccCheckAwsAvailabilityZonesMeta(n string) resource.TestCheckFunc { 73 return func(s *terraform.State) error { 74 rs, ok := s.RootModule().Resources[n] 75 if !ok { 76 return fmt.Errorf("Can't find AZ resource: %s", n) 77 } 78 79 if rs.Primary.ID == "" { 80 return fmt.Errorf("AZ resource ID not set.") 81 } 82 83 actual, err := testAccCheckAwsAvailabilityZonesBuildAvailable(rs.Primary.Attributes) 84 if err != nil { 85 return err 86 } 87 88 expected := actual 89 sort.Strings(expected) 90 if reflect.DeepEqual(expected, actual) != true { 91 return fmt.Errorf("AZs not sorted - expected %v, got %v", expected, actual) 92 } 93 return nil 94 } 95 } 96 97 func testAccCheckAwsAvailabilityZoneState(n string) resource.TestCheckFunc { 98 return func(s *terraform.State) error { 99 rs, ok := s.RootModule().Resources[n] 100 if !ok { 101 return fmt.Errorf("Can't find AZ resource: %s", n) 102 } 103 104 if rs.Primary.ID == "" { 105 return fmt.Errorf("AZ resource ID not set.") 106 } 107 108 if _, ok := rs.Primary.Attributes["state"]; !ok { 109 return fmt.Errorf("AZs state filter is missing, should be set.") 110 } 111 112 _, err := testAccCheckAwsAvailabilityZonesBuildAvailable(rs.Primary.Attributes) 113 if err != nil { 114 return err 115 } 116 return nil 117 } 118 } 119 120 func testAccCheckAwsAvailabilityZonesBuildAvailable(attrs map[string]string) ([]string, error) { 121 v, ok := attrs["names.#"] 122 if !ok { 123 return nil, fmt.Errorf("Available AZ list is missing.") 124 } 125 qty, err := strconv.Atoi(v) 126 if err != nil { 127 return nil, err 128 } 129 if qty < 1 { 130 return nil, fmt.Errorf("No AZs found in region, this is probably a bug.") 131 } 132 zones := make([]string, qty) 133 for n := range zones { 134 zone, ok := attrs["names."+strconv.Itoa(n)] 135 if !ok { 136 return nil, fmt.Errorf("AZ list corrupt, this is definitely a bug.") 137 } 138 zones[n] = zone 139 } 140 return zones, nil 141 } 142 143 const testAccCheckAwsAvailabilityZonesConfig = ` 144 data "aws_availability_zones" "availability_zones" { } 145 ` 146 147 const testAccCheckAwsAvailabilityZonesStateConfig = ` 148 data "aws_availability_zones" "state_filter" { 149 state = "available" 150 } 151 `