package statuscake import ( "fmt" "strconv" "testing" "github.com/DreamItGetIT/statuscake" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" ) func TestAccStatusCake_basic(t *testing.T) { var test statuscake.Test resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccTestCheckDestroy(&test), Steps: []resource.TestStep{ { Config: testAccTestConfig_basic, Check: resource.ComposeTestCheckFunc( testAccTestCheckExists("statuscake_test.google", &test), testAccTestCheckAttributes("statuscake_test.google", &test), ), }, }, }) } func TestAccStatusCake_tcp(t *testing.T) { var test statuscake.Test resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccTestCheckDestroy(&test), Steps: []resource.TestStep{ { Config: testAccTestConfig_tcp, Check: resource.ComposeTestCheckFunc( testAccTestCheckExists("statuscake_test.google", &test), testAccTestCheckAttributes("statuscake_test.google", &test), ), }, }, }) } func TestAccStatusCake_withUpdate(t *testing.T) { var test statuscake.Test resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccTestCheckDestroy(&test), Steps: []resource.TestStep{ { Config: testAccTestConfig_basic, Check: resource.ComposeTestCheckFunc( testAccTestCheckExists("statuscake_test.google", &test), ), }, { Config: testAccTestConfig_update, Check: resource.ComposeTestCheckFunc( testAccTestCheckExists("statuscake_test.google", &test), testAccTestCheckAttributes("statuscake_test.google", &test), resource.TestCheckResourceAttr("statuscake_test.google", "check_rate", "500"), resource.TestCheckResourceAttr("statuscake_test.google", "paused", "true"), resource.TestCheckResourceAttr("statuscake_test.google", "timeout", "40"), resource.TestCheckResourceAttr("statuscake_test.google", "contact_id", "0"), resource.TestCheckResourceAttr("statuscake_test.google", "confirmations", "0"), ), }, }, }) } func testAccTestCheckExists(rn string, test *statuscake.Test) 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("TestID not set") } client := testAccProvider.Meta().(*statuscake.Client) testId, parseErr := strconv.Atoi(rs.Primary.ID) if parseErr != nil { return fmt.Errorf("error in statuscake test CheckExists: %s", parseErr) } gotTest, err := client.Tests().Detail(testId) if err != nil { return fmt.Errorf("error getting test: %s", err) } *test = *gotTest return nil } } func testAccTestCheckAttributes(rn string, test *statuscake.Test) resource.TestCheckFunc { return func(s *terraform.State) error { attrs := s.RootModule().Resources[rn].Primary.Attributes check := func(key, stateValue, testValue string) error { if testValue != stateValue { return fmt.Errorf("different values for %s in state (%s) and in statuscake (%s)", key, stateValue, testValue) } return nil } for key, value := range attrs { var err error switch key { case "website_name": err = check(key, value, test.WebsiteName) case "website_url": err = check(key, value, test.WebsiteURL) case "check_rate": err = check(key, value, strconv.Itoa(test.CheckRate)) case "test_type": err = check(key, value, test.TestType) case "paused": err = check(key, value, strconv.FormatBool(test.Paused)) case "timeout": err = check(key, value, strconv.Itoa(test.Timeout)) case "contact_id": err = check(key, value, strconv.Itoa(test.ContactID)) case "confirmations": err = check(key, value, strconv.Itoa(test.Confirmation)) } if err != nil { return err } } return nil } } func testAccTestCheckDestroy(test *statuscake.Test) resource.TestCheckFunc { return func(s *terraform.State) error { client := testAccProvider.Meta().(*statuscake.Client) err := client.Tests().Delete(test.TestID) if err == nil { return fmt.Errorf("test still exists") } return nil } } const testAccTestConfig_basic = ` resource "statuscake_test" "google" { website_name = "google.com" website_url = "www.google.com" test_type = "HTTP" check_rate = 300 timeout = 10 contact_id = 12345 confirmations = 1 } ` const testAccTestConfig_update = ` resource "statuscake_test" "google" { website_name = "google.com" website_url = "www.google.com" test_type = "HTTP" check_rate = 500 paused = true } ` const testAccTestConfig_tcp = ` resource "statuscake_test" "google" { website_name = "google.com" website_url = "www.google.com" test_type = "TCP" check_rate = 300 timeout = 10 contact_id = 12345 confirmations = 1 port = 80 } `