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
}
`