package mailgun import ( "context" "fmt" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" "github.com/mailgun/mailgun-go" "strconv" "testing" "time" ) func TestAccMailgunRoute_basic(t *testing.T) { var route mailgun.Route resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccRouteCheckDestroy(&route), Steps: []resource.TestStep{ { Config: testAccRouteConfig_basic, Check: resource.ComposeTestCheckFunc( testAccRouteCheckExists("mailgun_route.exemple", &route), testAccRouteCheckAttributes("mailgun_route.exemple", &route), ), }, }, }) } func TestAccMailgunRoute_withUpdate(t *testing.T) { var route mailgun.Route resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccRouteCheckDestroy(&route), Steps: []resource.TestStep{ { Config: testAccRouteConfig_basic, Check: resource.ComposeTestCheckFunc( testAccRouteCheckExists("mailgun_route.exemple", &route), testAccRouteCheckAttributes("mailgun_route.exemple", &route), ), }, { Config: testAccRouteConfig_update, Check: resource.ComposeTestCheckFunc( testAccRouteCheckExists("mailgun_route.exemple", &route), testAccRouteCheckAttributes("mailgun_route.exemple", &route), ), }, }, }) } func testAccRouteCheckExists(rn string, route *mailgun.Route) 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("routeID not set") } mg := testAccProvider.Meta().(*mailgun.MailgunImpl) ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) defer cancel() gotRoute, err := mg.GetRoute(ctx, rs.Primary.ID) if err != nil { return fmt.Errorf("error getting route: %s", err) } *route = gotRoute return nil } } func testAccRouteCheckAttributes(rn string, route *mailgun.Route) resource.TestCheckFunc { return func(s *terraform.State) error { attrs := s.RootModule().Resources[rn].Primary.Attributes check := func(key, stateValue, routeValue string) error { if routeValue != stateValue { return fmt.Errorf("different values for %s in state (%s) and in mailgun (%s)", key, stateValue, routeValue) } return nil } for key, value := range attrs { var err error switch key { case "priority": err = check(key, value, strconv.Itoa(route.Priority)) case "description": err = check(key, value, route.Description) case "expression": err = check(key, value, route.Expression) case "created_at": err = check(key, value, route.CreatedAt.String()) case "route_id": err = check(key, value, route.Id) case "actions": for _, k := range route.Actions { err = check(key, value, k) if err != nil { return err } } } if err != nil { return err } } return nil } } func testAccRouteCheckDestroy(route *mailgun.Route) resource.TestCheckFunc { return func(s *terraform.State) error { mg := testAccProvider.Meta().(*mailgun.MailgunImpl) ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) defer cancel() _, err := mg.GetRoute(ctx, route.Id) if err == nil { return fmt.Errorf("route still exists") } return nil } } const testAccRouteConfig_basic = ` resource "mailgun_route" "exemple" { priority=5 description="ho ho hoh" expression="match_recipient(\".*@samples.mailgun.org\")" actions=[ "forward(\"http://myhost.com/messages/\")", "stop()" ] } ` const testAccRouteConfig_update = ` resource "mailgun_route" "exemple" { priority=4 description="ho ho hohf" expression="match_recipient(\".*@samples.mailgun.org\")" actions=[ "forward(\"http://myhost.com/messages/\")", "stop()" ] } `