]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blobdiff - statuscake/resource_statuscakessl_test.go
Merge branch 'add_ssl_tests' of github.com:alexandreFre/terraform-provider-statuscake
[github/fretlink/terraform-provider-statuscake.git] / statuscake / resource_statuscakessl_test.go
diff --git a/statuscake/resource_statuscakessl_test.go b/statuscake/resource_statuscakessl_test.go
new file mode 100644 (file)
index 0000000..fa48bad
--- /dev/null
@@ -0,0 +1,224 @@
+package statuscake
+
+import (
+       "fmt"
+       "github.com/DreamItGetIT/statuscake"
+       "github.com/hashicorp/terraform/helper/resource"
+       "github.com/hashicorp/terraform/terraform"
+       "os"
+       "strconv"
+       "testing"
+)
+
+func TestAccStatusCakeSsl_basic(t *testing.T) {
+       var ssl statuscake.Ssl
+
+       resource.Test(t, resource.TestCase{
+               PreCheck:     func() { testAccPreCheck(t) },
+               Providers:    testAccProviders,
+               CheckDestroy: testAccSslCheckDestroy(&ssl),
+               Steps: []resource.TestStep{
+                       {
+                               Config: interpolateTerraformTemplateSsl(testAccSslConfig_basic),
+                               Check: resource.ComposeTestCheckFunc(
+                                       testAccSslCheckExists("statuscake_ssl.exemple", &ssl),
+                                       testAccSslCheckAttributes("statuscake_ssl.exemple", &ssl),
+                               ),
+                       },
+               },
+       })
+}
+
+func TestAccStatusCakeSsl_withUpdate(t *testing.T) {
+       var ssl statuscake.Ssl
+
+       resource.Test(t, resource.TestCase{
+               PreCheck:     func() { testAccPreCheck(t) },
+               Providers:    testAccProviders,
+               CheckDestroy: testAccSslCheckDestroy(&ssl),
+               Steps: []resource.TestStep{
+                       {
+                               Config: interpolateTerraformTemplateSsl(testAccSslConfig_basic),
+                               Check: resource.ComposeTestCheckFunc(
+                                       testAccSslCheckExists("statuscake_ssl.exemple", &ssl),
+                                       testAccSslCheckAttributes("statuscake_ssl.exemple", &ssl),
+                               ),
+                       },
+
+                       {
+                               Config: testAccSslConfig_update,
+                               Check: resource.ComposeTestCheckFunc(
+                                       testAccSslCheckExists("statuscake_ssl.exemple", &ssl),
+                                       testAccSslCheckAttributes("statuscake_ssl.exemple", &ssl),
+                                       resource.TestCheckResourceAttr("statuscake_ssl.exemple", "checkrate", "86400"),
+                                       resource.TestCheckResourceAttr("statuscake_ssl.exemple", "domain", "https://www.exemple.com"),
+                                       resource.TestCheckResourceAttr("statuscake_ssl.exemple", "contact_groups_c", ""),
+                                       resource.TestCheckResourceAttr("statuscake_ssl.exemple", "alert_at", "18,81,2019"),
+                                       resource.TestCheckResourceAttr("statuscake_ssl.exemple", "alert_reminder", "false"),
+                                       resource.TestCheckResourceAttr("statuscake_ssl.exemple", "alert_expiry", "false"),
+                                       resource.TestCheckResourceAttr("statuscake_ssl.exemple", "alert_broken", "true"),
+                                       resource.TestCheckResourceAttr("statuscake_ssl.exemple", "alert_mixed", "false"),
+                               ),
+                       },
+               },
+       })
+}
+
+func testAccSslCheckExists(rn string, ssl *statuscake.Ssl) resource.TestCheckFunc {
+       return func(s *terraform.State) error {
+               rs, ok := s.RootModule().Resources[rn]
+               if !ok {
+                       return fmt.Errorf("resource not found: %s", rn)
+               }
+
+               if rs.Primary.ID == "" {
+                       return fmt.Errorf("SslID not set")
+               }
+
+               client := testAccProvider.Meta().(*statuscake.Client)
+               sslId := rs.Primary.ID
+
+               gotSsl, err := statuscake.NewSsls(client).Detail(sslId)
+               if err != nil {
+                       return fmt.Errorf("error getting ssl: %s", err)
+               }
+               gotSsl.LastUpdatedUtc = "0000-00-00 00:00:00" // quick fix to avoid issue with it because the state is updated before the value change but it is changed when gotSsl is created
+               *ssl = *gotSsl
+
+               return nil
+       }
+}
+
+func testAccSslCheckAttributes(rn string, ssl *statuscake.Ssl) resource.TestCheckFunc {
+       return func(s *terraform.State) error {
+               attrs := s.RootModule().Resources[rn].Primary.Attributes
+
+               check := func(key, stateValue, sslValue string) error {
+                       if sslValue != stateValue {
+                               return fmt.Errorf("different values for %s in state (%s) and in statuscake (%s)",
+                                       key, stateValue, sslValue)
+                       }
+                       return nil
+               }
+
+               for key, value := range attrs {
+                       var err error
+
+                       switch key {
+                       case "domain":
+                               err = check(key, value, ssl.Domain)
+                       case "contact_groups_c":
+                               err = check(key, value, ssl.ContactGroupsC)
+                       case "checkrate":
+                               err = check(key, value, strconv.Itoa(ssl.Checkrate))
+                       case "alert_at":
+                               err = check(key, value, ssl.AlertAt)
+                       case "alert_reminder":
+                               err = check(key, value, strconv.FormatBool(ssl.AlertReminder))
+                       case "alert_expiry":
+                               err = check(key, value, strconv.FormatBool(ssl.AlertExpiry))
+                       case "alert_broken":
+                               err = check(key, value, strconv.FormatBool(ssl.AlertBroken))
+                       case "alert_mixed":
+                               err = check(key, value, strconv.FormatBool(ssl.AlertMixed))
+                       case "last_updated_utc":
+                               err = check(key, value, ssl.LastUpdatedUtc)
+                       case "paused":
+                               err = check(key, value, strconv.FormatBool(ssl.Paused))
+                       case "issuer_cn":
+                               err = check(key, value, ssl.IssuerCn)
+                       case "contact_groups":
+                               for _, tv := range ssl.ContactGroups {
+                                       err = check(key, value, tv)
+                                       if err != nil {
+                                               return err
+                                       }
+                               }
+                       case "cert_score":
+                               err = check(key, value, ssl.CertScore)
+                       case "cert_status":
+                               err = check(key, value, ssl.CertStatus)
+                       case "cipher":
+                               err = check(key, value, ssl.Cipher)
+                       case "valid_from_utc":
+                               err = check(key, value, ssl.ValidFromUtc)
+                       case "valid_until_utc":
+                               err = check(key, value, ssl.ValidUntilUtc)
+                       case "last_reminder":
+                               err = check(key, value, strconv.Itoa(ssl.LastReminder))
+                       case "flags":
+                               for _, tv := range ssl.Flags {
+                                       err = check(key, value, strconv.FormatBool(tv))
+                                       if err != nil {
+                                               return err
+                                       }
+                               }
+
+                       case "mixed_content":
+                               for _, tv := range ssl.MixedContent {
+                                       for _, tv2 := range tv {
+                                               err = check(key, value, tv2)
+                                               if err != nil {
+                                                       return err
+                                               }
+                                       }
+                               }
+                       }
+                       if err != nil {
+                               return err
+                       }
+               }
+               return nil
+       }
+}
+
+func testAccSslCheckDestroy(ssl *statuscake.Ssl) resource.TestCheckFunc {
+       return func(s *terraform.State) error {
+               client := testAccProvider.Meta().(*statuscake.Client)
+               _, err := statuscake.NewSsls(client).Detail(ssl.ID)
+               if err == nil {
+                       return fmt.Errorf("ssl still exists")
+               }
+
+               return nil
+       }
+}
+
+func interpolateTerraformTemplateSsl(template string) string {
+       sslContactGroupId := "43402"
+
+       if v := os.Getenv("STATUSCAKE_SSL_CONTACT_GROUP_ID"); v != "" {
+               sslContactGroupId = v
+       }
+       if sslContactGroupId == "-1" {
+               sslContactGroupId = ""
+       }
+
+       return fmt.Sprintf(template, sslContactGroupId)
+}
+
+const testAccSslConfig_basic = `
+resource "statuscake_ssl" "exemple" {
+       domain = "https://www.exemple.com"
+       contact_groups_c = "%s"
+        checkrate = 3600
+        alert_at = "18,71,2019"
+        alert_reminder = true
+       alert_expiry = true
+        alert_broken = false
+        alert_mixed = true
+}
+`
+
+const testAccSslConfig_update = `
+resource "statuscake_ssl" "exemple" {
+       domain = "https://www.exemple.com"
+        contact_groups_c = ""
+        checkrate = 86400 
+        alert_at = "18,81,2019"
+        alert_reminder = false
+       alert_expiry = false
+        alert_broken = true
+        alert_mixed = false
+}
+`