github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/digitalocean/resource_digitalocean_record_test.go (about)

     1  package digitalocean
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  	"testing"
     7  
     8  	"strings"
     9  
    10  	"github.com/digitalocean/godo"
    11  	"github.com/hashicorp/terraform/helper/acctest"
    12  	"github.com/hashicorp/terraform/helper/resource"
    13  	"github.com/hashicorp/terraform/terraform"
    14  )
    15  
    16  func TestDigitalOceanRecordConstructFqdn(t *testing.T) {
    17  	cases := []struct {
    18  		Input, Output string
    19  	}{
    20  		{"www", "www.nonexample.com"},
    21  		{"dev.www", "dev.www.nonexample.com"},
    22  		{"*", "*.nonexample.com"},
    23  		{"nonexample.com", "nonexample.com"},
    24  		{"test.nonexample.com", "test.nonexample.com"},
    25  		{"test.nonexample.com.", "test.nonexample.com"},
    26  	}
    27  
    28  	domain := "nonexample.com"
    29  	for _, tc := range cases {
    30  		actual := constructFqdn(tc.Input, domain)
    31  		if actual != tc.Output {
    32  			t.Fatalf("input: %s\noutput: %s", tc.Input, actual)
    33  		}
    34  	}
    35  }
    36  
    37  func TestAccDigitalOceanRecord_Basic(t *testing.T) {
    38  	var record godo.DomainRecord
    39  	domain := fmt.Sprintf("foobar-test-terraform-%s.com", acctest.RandString(10))
    40  
    41  	resource.Test(t, resource.TestCase{
    42  		PreCheck:     func() { testAccPreCheck(t) },
    43  		Providers:    testAccProviders,
    44  		CheckDestroy: testAccCheckDigitalOceanRecordDestroy,
    45  		Steps: []resource.TestStep{
    46  			{
    47  				Config: fmt.Sprintf(testAccCheckDigitalOceanRecordConfig_basic, domain),
    48  				Check: resource.ComposeTestCheckFunc(
    49  					testAccCheckDigitalOceanRecordExists("digitalocean_record.foobar", &record),
    50  					testAccCheckDigitalOceanRecordAttributes(&record),
    51  					resource.TestCheckResourceAttr(
    52  						"digitalocean_record.foobar", "name", "terraform"),
    53  					resource.TestCheckResourceAttr(
    54  						"digitalocean_record.foobar", "domain", domain),
    55  					resource.TestCheckResourceAttr(
    56  						"digitalocean_record.foobar", "value", "192.168.0.10"),
    57  					resource.TestCheckResourceAttr(
    58  						"digitalocean_record.foobar", "fqdn", strings.Join([]string{"terraform", domain}, ".")),
    59  				),
    60  			},
    61  		},
    62  	})
    63  }
    64  
    65  func TestAccDigitalOceanRecord_Updated(t *testing.T) {
    66  	var record godo.DomainRecord
    67  	domain := fmt.Sprintf("foobar-test-terraform-%s.com", acctest.RandString(10))
    68  
    69  	resource.Test(t, resource.TestCase{
    70  		PreCheck:     func() { testAccPreCheck(t) },
    71  		Providers:    testAccProviders,
    72  		CheckDestroy: testAccCheckDigitalOceanRecordDestroy,
    73  		Steps: []resource.TestStep{
    74  			{
    75  				Config: fmt.Sprintf(testAccCheckDigitalOceanRecordConfig_basic, domain),
    76  				Check: resource.ComposeTestCheckFunc(
    77  					testAccCheckDigitalOceanRecordExists("digitalocean_record.foobar", &record),
    78  					testAccCheckDigitalOceanRecordAttributes(&record),
    79  					resource.TestCheckResourceAttr(
    80  						"digitalocean_record.foobar", "name", "terraform"),
    81  					resource.TestCheckResourceAttr(
    82  						"digitalocean_record.foobar", "domain", domain),
    83  					resource.TestCheckResourceAttr(
    84  						"digitalocean_record.foobar", "value", "192.168.0.10"),
    85  					resource.TestCheckResourceAttr(
    86  						"digitalocean_record.foobar", "type", "A"),
    87  				),
    88  			},
    89  			{
    90  				Config: fmt.Sprintf(
    91  					testAccCheckDigitalOceanRecordConfig_new_value, domain),
    92  				Check: resource.ComposeTestCheckFunc(
    93  					testAccCheckDigitalOceanRecordExists("digitalocean_record.foobar", &record),
    94  					testAccCheckDigitalOceanRecordAttributesUpdated(&record),
    95  					resource.TestCheckResourceAttr(
    96  						"digitalocean_record.foobar", "name", "terraform"),
    97  					resource.TestCheckResourceAttr(
    98  						"digitalocean_record.foobar", "domain", domain),
    99  					resource.TestCheckResourceAttr(
   100  						"digitalocean_record.foobar", "value", "192.168.0.11"),
   101  					resource.TestCheckResourceAttr(
   102  						"digitalocean_record.foobar", "type", "A"),
   103  				),
   104  			},
   105  		},
   106  	})
   107  }
   108  
   109  func TestAccDigitalOceanRecord_HostnameValue(t *testing.T) {
   110  	var record godo.DomainRecord
   111  	domain := fmt.Sprintf("foobar-test-terraform-%s.com", acctest.RandString(10))
   112  
   113  	resource.Test(t, resource.TestCase{
   114  		PreCheck:     func() { testAccPreCheck(t) },
   115  		Providers:    testAccProviders,
   116  		CheckDestroy: testAccCheckDigitalOceanRecordDestroy,
   117  		Steps: []resource.TestStep{
   118  			{
   119  				Config: fmt.Sprintf(
   120  					testAccCheckDigitalOceanRecordConfig_cname, domain),
   121  				Check: resource.ComposeTestCheckFunc(
   122  					testAccCheckDigitalOceanRecordExists("digitalocean_record.foobar", &record),
   123  					testAccCheckDigitalOceanRecordAttributesHostname("a.foobar-test-terraform.com", &record),
   124  					resource.TestCheckResourceAttr(
   125  						"digitalocean_record.foobar", "name", "terraform"),
   126  					resource.TestCheckResourceAttr(
   127  						"digitalocean_record.foobar", "domain", domain),
   128  					resource.TestCheckResourceAttr(
   129  						"digitalocean_record.foobar", "value", "a.foobar-test-terraform.com."),
   130  					resource.TestCheckResourceAttr(
   131  						"digitalocean_record.foobar", "type", "CNAME"),
   132  				),
   133  			},
   134  		},
   135  	})
   136  }
   137  
   138  func TestAccDigitalOceanRecord_ExternalHostnameValue(t *testing.T) {
   139  	var record godo.DomainRecord
   140  	domain := fmt.Sprintf("foobar-test-terraform-%s.com", acctest.RandString(10))
   141  
   142  	resource.Test(t, resource.TestCase{
   143  		PreCheck:     func() { testAccPreCheck(t) },
   144  		Providers:    testAccProviders,
   145  		CheckDestroy: testAccCheckDigitalOceanRecordDestroy,
   146  		Steps: []resource.TestStep{
   147  			{
   148  				Config: fmt.Sprintf(
   149  					testAccCheckDigitalOceanRecordConfig_external_cname, domain),
   150  				Check: resource.ComposeTestCheckFunc(
   151  					testAccCheckDigitalOceanRecordExists("digitalocean_record.foobar", &record),
   152  					testAccCheckDigitalOceanRecordAttributesHostname("a.foobar-test-terraform.net", &record),
   153  					resource.TestCheckResourceAttr(
   154  						"digitalocean_record.foobar", "name", "terraform"),
   155  					resource.TestCheckResourceAttr(
   156  						"digitalocean_record.foobar", "domain", domain),
   157  					resource.TestCheckResourceAttr(
   158  						"digitalocean_record.foobar", "value", "a.foobar-test-terraform.net."),
   159  					resource.TestCheckResourceAttr(
   160  						"digitalocean_record.foobar", "type", "CNAME"),
   161  				),
   162  			},
   163  		},
   164  	})
   165  }
   166  
   167  func testAccCheckDigitalOceanRecordDestroy(s *terraform.State) error {
   168  	client := testAccProvider.Meta().(*godo.Client)
   169  
   170  	for _, rs := range s.RootModule().Resources {
   171  		if rs.Type != "digitalocean_record" {
   172  			continue
   173  		}
   174  		domain := rs.Primary.Attributes["domain"]
   175  		id, err := strconv.Atoi(rs.Primary.ID)
   176  		if err != nil {
   177  			return err
   178  		}
   179  
   180  		_, _, err = client.Domains.Record(domain, id)
   181  
   182  		if err == nil {
   183  			return fmt.Errorf("Record still exists")
   184  		}
   185  	}
   186  
   187  	return nil
   188  }
   189  
   190  func testAccCheckDigitalOceanRecordAttributes(record *godo.DomainRecord) resource.TestCheckFunc {
   191  	return func(s *terraform.State) error {
   192  
   193  		if record.Data != "192.168.0.10" {
   194  			return fmt.Errorf("Bad value: %s", record.Data)
   195  		}
   196  
   197  		return nil
   198  	}
   199  }
   200  
   201  func testAccCheckDigitalOceanRecordAttributesUpdated(record *godo.DomainRecord) resource.TestCheckFunc {
   202  	return func(s *terraform.State) error {
   203  
   204  		if record.Data != "192.168.0.11" {
   205  			return fmt.Errorf("Bad value: %s", record.Data)
   206  		}
   207  
   208  		return nil
   209  	}
   210  }
   211  
   212  func testAccCheckDigitalOceanRecordExists(n string, record *godo.DomainRecord) resource.TestCheckFunc {
   213  	return func(s *terraform.State) error {
   214  		rs, ok := s.RootModule().Resources[n]
   215  
   216  		if !ok {
   217  			return fmt.Errorf("Not found: %s", n)
   218  		}
   219  
   220  		if rs.Primary.ID == "" {
   221  			return fmt.Errorf("No Record ID is set")
   222  		}
   223  
   224  		client := testAccProvider.Meta().(*godo.Client)
   225  
   226  		domain := rs.Primary.Attributes["domain"]
   227  		id, err := strconv.Atoi(rs.Primary.ID)
   228  		if err != nil {
   229  			return err
   230  		}
   231  
   232  		foundRecord, _, err := client.Domains.Record(domain, id)
   233  
   234  		if err != nil {
   235  			return err
   236  		}
   237  
   238  		if strconv.Itoa(foundRecord.ID) != rs.Primary.ID {
   239  			return fmt.Errorf("Record not found")
   240  		}
   241  
   242  		*record = *foundRecord
   243  
   244  		return nil
   245  	}
   246  }
   247  
   248  func testAccCheckDigitalOceanRecordAttributesHostname(data string, record *godo.DomainRecord) resource.TestCheckFunc {
   249  	return func(s *terraform.State) error {
   250  
   251  		if record.Data != data {
   252  			return fmt.Errorf("Bad value: expected %s, got %s", data, record.Data)
   253  		}
   254  
   255  		return nil
   256  	}
   257  }
   258  
   259  const testAccCheckDigitalOceanRecordConfig_basic = `
   260  resource "digitalocean_domain" "foobar" {
   261    name       = "%s"
   262    ip_address = "192.168.0.10"
   263  }
   264  
   265  resource "digitalocean_record" "foobar" {
   266    domain = "${digitalocean_domain.foobar.name}"
   267  
   268    name  = "terraform"
   269    value = "192.168.0.10"
   270    type  = "A"
   271  }`
   272  
   273  const testAccCheckDigitalOceanRecordConfig_new_value = `
   274  resource "digitalocean_domain" "foobar" {
   275    name       = "%s"
   276    ip_address = "192.168.0.10"
   277  }
   278  
   279  resource "digitalocean_record" "foobar" {
   280    domain = "${digitalocean_domain.foobar.name}"
   281  
   282    name  = "terraform"
   283    value = "192.168.0.11"
   284    type  = "A"
   285  }`
   286  
   287  const testAccCheckDigitalOceanRecordConfig_cname = `
   288  resource "digitalocean_domain" "foobar" {
   289    name       = "%s"
   290    ip_address = "192.168.0.10"
   291  }
   292  
   293  resource "digitalocean_record" "foobar" {
   294    domain = "${digitalocean_domain.foobar.name}"
   295  
   296    name  = "terraform"
   297    value = "a.foobar-test-terraform.com."
   298    type  = "CNAME"
   299  }`
   300  
   301  const testAccCheckDigitalOceanRecordConfig_external_cname = `
   302  resource "digitalocean_domain" "foobar" {
   303    name       = "%s"
   304    ip_address = "192.168.0.10"
   305  }
   306  
   307  resource "digitalocean_record" "foobar" {
   308    domain = "${digitalocean_domain.foobar.name}"
   309  
   310    name  = "terraform"
   311    value = "a.foobar-test-terraform.net."
   312    type  = "CNAME"
   313  }`