package aws import ( "fmt" "reflect" "sort" "strconv" "testing" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" ) func TestAccAWSAvailabilityZones_basic(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, Steps: []resource.TestStep{ { Config: testAccCheckAwsAvailabilityZonesConfig, Check: resource.ComposeTestCheckFunc( testAccCheckAwsAvailabilityZonesMeta("data.aws_availability_zones.availability_zones"), ), }, }, }) } func TestAccAWSAvailabilityZones_stateFilter(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, Steps: []resource.TestStep{ { Config: testAccCheckAwsAvailabilityZonesStateConfig, Check: resource.ComposeTestCheckFunc( testAccCheckAwsAvailabilityZoneState("data.aws_availability_zones.state_filter"), ), }, }, }) } func TestResourceCheckAwsAvailabilityZones_validateStateType(t *testing.T) { _, errors := validateStateType("incorrect", "state") if len(errors) == 0 { t.Fatalf("Expected to trigger a validation error") } var testCases = []struct { Value string ErrCount int }{ { Value: "available", ErrCount: 0, }, { Value: "unavailable", ErrCount: 0, }, } for _, tc := range testCases { _, errors := validateStateType(tc.Value, "state") if len(errors) != tc.ErrCount { t.Fatalf("Expected %q not to trigger a validation error.", tc.Value) } } } func testAccCheckAwsAvailabilityZonesMeta(n string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] if !ok { return fmt.Errorf("Can't find AZ resource: %s", n) } if rs.Primary.ID == "" { return fmt.Errorf("AZ resource ID not set.") } actual, err := testAccCheckAwsAvailabilityZonesBuildAvailable(rs.Primary.Attributes) if err != nil { return err } expected := actual sort.Strings(expected) if reflect.DeepEqual(expected, actual) != true { return fmt.Errorf("AZs not sorted - expected %v, got %v", expected, actual) } return nil } } func testAccCheckAwsAvailabilityZoneState(n string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] if !ok { return fmt.Errorf("Can't find AZ resource: %s", n) } if rs.Primary.ID == "" { return fmt.Errorf("AZ resource ID not set.") } if _, ok := rs.Primary.Attributes["state"]; !ok { return fmt.Errorf("AZs state filter is missing, should be set.") } _, err := testAccCheckAwsAvailabilityZonesBuildAvailable(rs.Primary.Attributes) if err != nil { return err } return nil } } func testAccCheckAwsAvailabilityZonesBuildAvailable(attrs map[string]string) ([]string, error) { v, ok := attrs["names.#"] if !ok { return nil, fmt.Errorf("Available AZ list is missing.") } qty, err := strconv.Atoi(v) if err != nil { return nil, err } if qty < 1 { return nil, fmt.Errorf("No AZs found in region, this is probably a bug.") } zones := make([]string, qty) for n := range zones { zone, ok := attrs["names."+strconv.Itoa(n)] if !ok { return nil, fmt.Errorf("AZ list corrupt, this is definitely a bug.") } zones[n] = zone } return zones, nil } const testAccCheckAwsAvailabilityZonesConfig = ` data "aws_availability_zones" "availability_zones" { } ` const testAccCheckAwsAvailabilityZonesStateConfig = ` data "aws_availability_zones" "state_filter" { state = "available" } `