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