]> git.immae.eu Git - github/fretlink/terraform-provider-mailgun.git/blame - mailgun/resource_mailgun_domain_test.go
replace sleep by resource.Retry
[github/fretlink/terraform-provider-mailgun.git] / mailgun / resource_mailgun_domain_test.go
CommitLineData
40587421
AG
1package mailgun
2
3import (
4 "context"
5 "fmt"
6 "github.com/hashicorp/terraform/helper/resource"
7 "github.com/hashicorp/terraform/terraform"
7c735cfa 8 "github.com/mailgun/mailgun-go/v3"
40587421
AG
9 "os"
10 "strconv"
11 "testing"
12 "time"
1de838cb 13 "log"
40587421
AG
14)
15
16type fullDomain struct {
17 domainResponse mailgun.DomainResponse
18 domainConnection mailgun.DomainConnection
19 domainTracking mailgun.DomainTracking
20 ipAddress []string
21 credentials []mailgun.Credential
22}
23
24func getFullDomain(mg *mailgun.MailgunImpl, domainName string) (*fullDomain, error) {
5976bba0 25 ctx, cancel := context.WithTimeout(context.Background(), time.Second*120)
40587421
AG
26 defer cancel()
27 mg = mailgun.NewMailgun(domainName, mg.APIKey())
28
29 var domain fullDomain
30 var err error
31 domain.domainResponse, err = mg.GetDomain(ctx, domainName)
32 if err != nil {
33 return nil, fmt.Errorf("Error Getting mailgun domain Details for %s: Error: %s", domainName, err)
34 }
35
36 domain.domainConnection, err = mg.GetDomainConnection(ctx, domainName)
37 if err != nil {
38 return nil, fmt.Errorf("Error Getting mailgun domain connection Details for %s: Error: %s", domainName, err)
39 }
40
41 domain.domainTracking, err = mg.GetDomainTracking(ctx, domainName)
42 if err != nil {
43 return nil, fmt.Errorf("Error Getting mailgun domain tracking Details for %s: Error: %s", domainName, err)
44 }
45
5976bba0
AG
46 ipAddress, err := getIps(ctx, mg)
47
40587421
AG
48 if err != nil {
49 return nil, fmt.Errorf("Error Getting mailgun domain ips2 for %s: Error: %s", domainName, err)
50 }
51 ips := make([]string, len(ipAddress))
52 for i, r := range ipAddress {
53 ips[i] = r.IP
54
55 }
56 domain.ipAddress = ips
57 domain.credentials, err = ListCredentials(domainName, mg.APIKey())
58 if err != nil {
59 return nil, fmt.Errorf("Error Getting mailgun credentials for %s: Error: %s", domainName, err)
60 }
61 return &domain, nil
62}
63
64func TestAccMailgunDomain_basic(t *testing.T) {
65 var domain fullDomain
66
67 resource.Test(t, resource.TestCase{
68 PreCheck: func() { testAccPreCheck(t) },
69 Providers: testAccProviders,
70 CheckDestroy: testAccDomainCheckDestroy(&domain),
71 Steps: []resource.TestStep{
72 {
73 Config: interpolateTerraformTemplateDomain(testAccDomainConfig_basic),
74 Check: resource.ComposeTestCheckFunc(
75 testAccDomainCheckExists("mailgun_domain.exemple", &domain),
76 testAccDomainCheckAttributes("mailgun_domain.exemple", &domain),
77 ),
78 },
79 },
80 })
81}
82
83func TestAccMailgunDomain_withUpdate(t *testing.T) {
84 var domain fullDomain
85
86 resource.Test(t, resource.TestCase{
87 PreCheck: func() { testAccPreCheck(t) },
88 Providers: testAccProviders,
89 CheckDestroy: testAccDomainCheckDestroy(&domain),
90 Steps: []resource.TestStep{
91 {
92 Config: interpolateTerraformTemplateDomain(testAccDomainConfig_basic),
93 Check: resource.ComposeTestCheckFunc(
94 testAccDomainCheckExists("mailgun_domain.exemple", &domain),
95 testAccDomainCheckAttributes("mailgun_domain.exemple", &domain),
96 ),
97 },
98
99 {
100 Config: interpolateTerraformTemplateDomain(testAccDomainConfig_update),
101 Check: resource.ComposeTestCheckFunc(
102 testAccDomainCheckExists("mailgun_domain.exemple", &domain),
103 testAccDomainCheckAttributes("mailgun_domain.exemple", &domain),
104 ),
105 },
106 },
107 })
108}
109
70ac6365
AG
110
111func TestDomain_importBasic(t *testing.T) {
112 var domain fullDomain
113
114 resource.Test(t, resource.TestCase{
115 PreCheck: func() { testAccPreCheck(t) },
116 Providers: testAccProviders,
117 CheckDestroy: testAccDomainCheckDestroy(&domain),
118 Steps: []resource.TestStep{
119 {
120 Config: interpolateTerraformTemplateDomain(testAccDomainConfig_import),
121 Check: resource.ComposeTestCheckFunc(
122 testAccDomainCheckExists("mailgun_domain.exemple",&domain),
123 ),
124 },
125 {
126 ResourceName: "mailgun_domain.exemple",
127 ImportState: true,
128 ImportStateVerify: true,
129 },
130 },
131 })
132}
133
40587421
AG
134func testAccDomainCheckExists(rn string, domain *fullDomain) resource.TestCheckFunc {
135 return func(s *terraform.State) error {
136 rs, ok := s.RootModule().Resources[rn]
137 if !ok {
138 return fmt.Errorf("resource not found: %s", rn)
139 }
140
141 if rs.Primary.ID == "" {
142 return fmt.Errorf("domainID not set")
143 }
144
145 mg := testAccProvider.Meta().(*mailgun.MailgunImpl)
146
147 domainId := rs.Primary.ID
148
149 gotDomain, err := getFullDomain(mg, domainId)
150 if err != nil {
151 return fmt.Errorf("error getting domain: %s", err)
152 }
153
154 *domain = *gotDomain
155
156 return nil
157 }
158}
159
160func testAccDomainCheckAttributes(rn string, domain *fullDomain) resource.TestCheckFunc {
161 return func(s *terraform.State) error {
162 attrs := s.RootModule().Resources[rn].Primary.Attributes
163
164 check := func(key, stateValue, domainValue string) error {
165 if domainValue != stateValue {
166 return fmt.Errorf("different values for %s in state (%s) and in mailgun (%s)",
167 key, stateValue, domainValue)
168 }
169 return nil
170 }
171
172 for key, value := range attrs {
173 var err error
174
175 switch key {
176 case "name":
177 err = check(key, value, domain.domainResponse.Domain.Name)
178 case "smtp_password":
179 err = check(key, value, domain.domainResponse.Domain.SMTPPassword)
180 case "smtp_login":
181 err = check(key, value, domain.domainResponse.Domain.SMTPLogin)
182 case "wildcard":
183 err = check(key, value, strconv.FormatBool(domain.domainResponse.Domain.Wildcard))
184 case "state":
185 err = check(key, value, domain.domainResponse.Domain.State)
186 case "open_tracking_settings_active":
187 err = check(key, value, strconv.FormatBool(domain.domainTracking.Open.Active))
188 case "click_tracking_settings_active":
189 err = check(key, value, strconv.FormatBool(domain.domainTracking.Click.Active))
190 case "unsubscribe_tracking_settings_active":
191 err = check(key, value, strconv.FormatBool(domain.domainTracking.Unsubscribe.Active))
192 case "unsubscribe_tracking_settings_html_footer":
193 err = check(key, value, domain.domainTracking.Unsubscribe.HTMLFooter)
194 case "unsubscribe_tracking_settings_text_footer":
195 err = check(key, value, domain.domainTracking.Unsubscribe.TextFooter)
196 case "skip_verification":
197 err = check(key, value, strconv.FormatBool(domain.domainConnection.SkipVerification))
198 case "require_tls":
199 err = check(key, value, strconv.FormatBool(domain.domainConnection.RequireTLS))
200 }
201 if err != nil {
202 return err
203 }
204 }
205 return nil
206 }
207}
208
209func testAccDomainCheckDestroy(domain *fullDomain) resource.TestCheckFunc {
210 return func(s *terraform.State) error {
211 mg := testAccProvider.Meta().(*mailgun.MailgunImpl)
212 ctx, cancel := context.WithTimeout(context.Background(), time.Second*30)
213 defer cancel()
40587421 214
1de838cb
AG
215 log.Printf("[DEBUG] try to fetch destroyed domain %s",mg.Domain())
216
217 return resource.Retry(1*time.Minute, func() *resource.RetryError {
218 _, err := mg.GetDomain(ctx, domain.domainResponse.Domain.Name)
219 if err == nil {
220 log.Printf("[DEBUG] managed to fetch destroyed domain %s",mg.Domain())
221 return resource.RetryableError(err)
222 }
223
224 log.Printf("[DEBUG] failed to fetch destroyed domain %s",mg.Domain())
225
226 return nil
227 })
40587421
AG
228 }
229}
230
231func interpolateTerraformTemplateDomain(template string) string {
232 domainName := ""
233
234 if v := os.Getenv("MAILGUN_DOMAIN"); v != "" {
235 domainName = v
236 }
237
238 return fmt.Sprintf(template, domainName)
239}
240
241const testAccDomainConfig_basic = `
242resource "mailgun_domain" "exemple" {
243 name="%s"
3d14d0f6
AG
244 wildcard=true
245 credentials{
246 login="aaaaaaa"
247 password="adfshfjqdskjhgfksdgfkqgfk"
248 }
40587421
AG
249}
250`
251
252const testAccDomainConfig_update = `
253resource "mailgun_domain" "exemple" {
254 name="%s"
3d14d0f6
AG
255 credentials{
256 login="aaaaaaa"
257 password="adfshfjqdskjhgfksdgfkqgfk"
258 }
259
40587421
AG
260}
261`
70ac6365
AG
262const testAccDomainConfig_import = `
263resource "mailgun_domain" "exemple" {
264 name = "%s"
265}
266`