mailgunner 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +17 -1
- data/lib/mailgunner.rb +22 -87
- data/lib/mailgunner/delivery_method.rb +38 -0
- data/lib/mailgunner/response.rb +37 -0
- data/mailgunner.gemspec +4 -2
- data/spec/mailgunner_delivery_method_spec.rb +57 -0
- data/spec/mailgunner_response_spec.rb +101 -0
- data/spec/mailgunner_spec.rb +108 -347
- metadata +42 -5
data/spec/mailgunner_spec.rb
CHANGED
@@ -1,18 +1,9 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
|
+
require 'webmock/minitest'
|
2
3
|
require 'mocha/setup'
|
3
4
|
require 'mailgunner'
|
4
|
-
require 'faux'
|
5
5
|
require 'json'
|
6
|
-
|
7
|
-
class Net::HTTPGenericRequest
|
8
|
-
def inspect
|
9
|
-
if request_body_permitted?
|
10
|
-
"<#{self.class.name} #{path} #{body}>"
|
11
|
-
else
|
12
|
-
"<#{self.class.name} #{path}>"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
6
|
+
require 'mail'
|
16
7
|
|
17
8
|
describe 'Mailgunner::Client' do
|
18
9
|
before do
|
@@ -20,6 +11,8 @@ describe 'Mailgunner::Client' do
|
|
20
11
|
|
21
12
|
@api_key = 'xxx'
|
22
13
|
|
14
|
+
@base_url = "https://api:#{@api_key}@api.mailgun.net/v2"
|
15
|
+
|
23
16
|
@client = Mailgunner::Client.new(domain: @domain, api_key: @api_key)
|
24
17
|
|
25
18
|
@address = 'user@example.com'
|
@@ -27,12 +20,6 @@ describe 'Mailgunner::Client' do
|
|
27
20
|
@encoded_address = 'user%40example.com'
|
28
21
|
end
|
29
22
|
|
30
|
-
def expect(request_class, arg)
|
31
|
-
matcher = String === arg ? responds_with(:path, arg) : arg
|
32
|
-
|
33
|
-
@client.http.expects(:request).with(all_of(instance_of(request_class), matcher)).returns(stub)
|
34
|
-
end
|
35
|
-
|
36
23
|
describe 'http method' do
|
37
24
|
it 'returns a net http object that uses ssl' do
|
38
25
|
@client.http.must_be_instance_of(Net::HTTP)
|
@@ -51,6 +38,12 @@ describe 'Mailgunner::Client' do
|
|
51
38
|
|
52
39
|
Mailgunner::Client.new(api_key: @api_key).domain.must_equal(@domain)
|
53
40
|
end
|
41
|
+
|
42
|
+
it 'defaults to nil if the MAILGUN_SMTP_LOGIN environment variable does not exist' do
|
43
|
+
ENV.delete('MAILGUN_SMTP_LOGIN')
|
44
|
+
|
45
|
+
Mailgunner::Client.new(api_key: @api_key).domain.must_be_nil
|
46
|
+
end
|
54
47
|
end
|
55
48
|
|
56
49
|
describe 'api_key method' do
|
@@ -67,7 +60,7 @@ describe 'Mailgunner::Client' do
|
|
67
60
|
|
68
61
|
describe 'validate_address method' do
|
69
62
|
it 'calls the address validate resource with the given email address and returns a response object' do
|
70
|
-
|
63
|
+
stub_request(:get, "#@base_url/address/validate?address=#@encoded_address")
|
71
64
|
|
72
65
|
@client.validate_address(@address).must_be_instance_of(Mailgunner::Response)
|
73
66
|
end
|
@@ -75,7 +68,7 @@ describe 'Mailgunner::Client' do
|
|
75
68
|
|
76
69
|
describe 'parse_addresses method' do
|
77
70
|
it 'calls the address parse resource with the given email addresses and returns a response object' do
|
78
|
-
|
71
|
+
stub_request(:get, "#@base_url/address/parse?addresses=bob%40example.com%2Ceve%40example.com")
|
79
72
|
|
80
73
|
@client.parse_addresses(['bob@example.com', 'eve@example.com']).must_be_instance_of(Mailgunner::Response)
|
81
74
|
end
|
@@ -83,15 +76,15 @@ describe 'Mailgunner::Client' do
|
|
83
76
|
|
84
77
|
describe 'send_message method' do
|
85
78
|
it 'posts to the domain messages resource and returns a response object' do
|
86
|
-
|
79
|
+
stub_request(:post, "#@base_url/#@domain/messages")
|
87
80
|
|
88
81
|
@client.send_message({}).must_be_instance_of(Mailgunner::Response)
|
89
82
|
end
|
90
83
|
|
91
84
|
it 'encodes the message attributes' do
|
92
|
-
|
85
|
+
stub_request(:post, "#@base_url/#@domain/messages").with(body: "to=#@encoded_address")
|
93
86
|
|
94
|
-
@client.
|
87
|
+
@client.send_message({to: @address})
|
95
88
|
end
|
96
89
|
|
97
90
|
it 'encodes the message attributes as multipart form data when sending attachments' do
|
@@ -99,9 +92,26 @@ describe 'Mailgunner::Client' do
|
|
99
92
|
end
|
100
93
|
end
|
101
94
|
|
95
|
+
describe 'send_mime method' do
|
96
|
+
before do
|
97
|
+
@mail = Mail.new({
|
98
|
+
to: 'alice@example.com',
|
99
|
+
from: 'bob@example.com',
|
100
|
+
subject: 'Test email',
|
101
|
+
body: 'This is a test email'
|
102
|
+
})
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'posts to the domain messages resource and returns a response object' do
|
106
|
+
stub_request(:post, "#@base_url/#@domain/messages.mime")
|
107
|
+
|
108
|
+
@client.send_mime(@mail).must_be_instance_of(Mailgunner::Response)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
102
112
|
describe 'get_domains method' do
|
103
113
|
it 'fetches the domains resource and returns a response object' do
|
104
|
-
|
114
|
+
stub_request(:get, "#@base_url/domains")
|
105
115
|
|
106
116
|
@client.get_domains.must_be_instance_of(Mailgunner::Response)
|
107
117
|
end
|
@@ -109,7 +119,7 @@ describe 'Mailgunner::Client' do
|
|
109
119
|
|
110
120
|
describe 'get_domain method' do
|
111
121
|
it 'fetches the domain resource and returns a response object' do
|
112
|
-
|
122
|
+
stub_request(:get, "#@base_url/domains/#@domain")
|
113
123
|
|
114
124
|
@client.get_domain(@domain).must_be_instance_of(Mailgunner::Response)
|
115
125
|
end
|
@@ -117,13 +127,13 @@ describe 'Mailgunner::Client' do
|
|
117
127
|
|
118
128
|
describe 'add_domain method' do
|
119
129
|
it 'posts to the domains resource and returns a response object' do
|
120
|
-
|
130
|
+
stub_request(:post, "#@base_url/domains")
|
121
131
|
|
122
132
|
@client.add_domain({}).must_be_instance_of(Mailgunner::Response)
|
123
133
|
end
|
124
134
|
|
125
135
|
it 'encodes the domain attributes' do
|
126
|
-
|
136
|
+
stub_request(:post, "#@base_url/domains").with(body: "name=#@domain")
|
127
137
|
|
128
138
|
@client.add_domain({name: @domain})
|
129
139
|
end
|
@@ -131,13 +141,13 @@ describe 'Mailgunner::Client' do
|
|
131
141
|
|
132
142
|
describe 'get_unsubscribes method' do
|
133
143
|
it 'fetches the domain unsubscribes resource and returns a response object' do
|
134
|
-
|
144
|
+
stub_request(:get, "#@base_url/#@domain/unsubscribes")
|
135
145
|
|
136
146
|
@client.get_unsubscribes.must_be_instance_of(Mailgunner::Response)
|
137
147
|
end
|
138
148
|
|
139
149
|
it 'encodes skip and limit parameters' do
|
140
|
-
|
150
|
+
stub_request(:get, "#@base_url/#@domain/unsubscribes?skip=1&limit=2")
|
141
151
|
|
142
152
|
@client.get_unsubscribes(skip: 1, limit: 2)
|
143
153
|
end
|
@@ -145,7 +155,7 @@ describe 'Mailgunner::Client' do
|
|
145
155
|
|
146
156
|
describe 'get_unsubscribe method' do
|
147
157
|
it 'fetches the unsubscribe resource with the given address and returns a response object' do
|
148
|
-
|
158
|
+
stub_request(:get, "#@base_url/#@domain/unsubscribes/#@encoded_address")
|
149
159
|
|
150
160
|
@client.get_unsubscribe(@address).must_be_instance_of(Mailgunner::Response)
|
151
161
|
end
|
@@ -153,7 +163,7 @@ describe 'Mailgunner::Client' do
|
|
153
163
|
|
154
164
|
describe 'delete_unsubscribe method' do
|
155
165
|
it 'deletes the domain unsubscribe resource with the given address and returns a response object' do
|
156
|
-
|
166
|
+
stub_request(:delete, "#@base_url/#@domain/unsubscribes/#@encoded_address")
|
157
167
|
|
158
168
|
@client.delete_unsubscribe(@address).must_be_instance_of(Mailgunner::Response)
|
159
169
|
end
|
@@ -161,13 +171,13 @@ describe 'Mailgunner::Client' do
|
|
161
171
|
|
162
172
|
describe 'add_unsubscribe method' do
|
163
173
|
it 'posts to the domain unsubscribes resource and returns a response object' do
|
164
|
-
|
174
|
+
stub_request(:post, "#@base_url/#@domain/unsubscribes")
|
165
175
|
|
166
176
|
@client.add_unsubscribe({}).must_be_instance_of(Mailgunner::Response)
|
167
177
|
end
|
168
178
|
|
169
179
|
it 'encodes the unsubscribe attributes' do
|
170
|
-
|
180
|
+
stub_request(:post, "#@base_url/#@domain/unsubscribes").with(body: "address=#@encoded_address")
|
171
181
|
|
172
182
|
@client.add_unsubscribe({address: @address})
|
173
183
|
end
|
@@ -175,13 +185,13 @@ describe 'Mailgunner::Client' do
|
|
175
185
|
|
176
186
|
describe 'get_complaints method' do
|
177
187
|
it 'fetches the domain complaints resource and returns a response object' do
|
178
|
-
|
188
|
+
stub_request(:get, "#@base_url/#@domain/complaints")
|
179
189
|
|
180
190
|
@client.get_complaints.must_be_instance_of(Mailgunner::Response)
|
181
191
|
end
|
182
192
|
|
183
193
|
it 'encodes skip and limit parameters' do
|
184
|
-
|
194
|
+
stub_request(:get, "#@base_url/#@domain/complaints?skip=1&limit=2")
|
185
195
|
|
186
196
|
@client.get_complaints(skip: 1, limit: 2)
|
187
197
|
end
|
@@ -189,7 +199,7 @@ describe 'Mailgunner::Client' do
|
|
189
199
|
|
190
200
|
describe 'get_complaint method' do
|
191
201
|
it 'fetches the complaint resource with the given address and returns a response object' do
|
192
|
-
|
202
|
+
stub_request(:get, "#@base_url/#@domain/complaints/#@encoded_address")
|
193
203
|
|
194
204
|
@client.get_complaint(@address).must_be_instance_of(Mailgunner::Response)
|
195
205
|
end
|
@@ -197,13 +207,13 @@ describe 'Mailgunner::Client' do
|
|
197
207
|
|
198
208
|
describe 'add_complaint method' do
|
199
209
|
it 'posts to the domain complaints resource and returns a response object' do
|
200
|
-
|
210
|
+
stub_request(:post, "#@base_url/#@domain/complaints")
|
201
211
|
|
202
212
|
@client.add_complaint({}).must_be_instance_of(Mailgunner::Response)
|
203
213
|
end
|
204
214
|
|
205
215
|
it 'encodes the complaint attributes' do
|
206
|
-
|
216
|
+
stub_request(:post, "#@base_url/#@domain/complaints").with(body: "address=#@encoded_address")
|
207
217
|
|
208
218
|
@client.add_complaint({address: @address})
|
209
219
|
end
|
@@ -211,7 +221,7 @@ describe 'Mailgunner::Client' do
|
|
211
221
|
|
212
222
|
describe 'delete_complaint method' do
|
213
223
|
it 'deletes the domain complaint resource with the given address and returns a response object' do
|
214
|
-
|
224
|
+
stub_request(:delete, "#@base_url/#@domain/complaints/#@encoded_address")
|
215
225
|
|
216
226
|
@client.delete_complaint(@address).must_be_instance_of(Mailgunner::Response)
|
217
227
|
end
|
@@ -219,13 +229,13 @@ describe 'Mailgunner::Client' do
|
|
219
229
|
|
220
230
|
describe 'get_bounces method' do
|
221
231
|
it 'fetches the domain bounces resource and returns a response object' do
|
222
|
-
|
232
|
+
stub_request(:get, "#@base_url/#@domain/bounces")
|
223
233
|
|
224
234
|
@client.get_bounces.must_be_instance_of(Mailgunner::Response)
|
225
235
|
end
|
226
236
|
|
227
237
|
it 'encodes skip and limit parameters' do
|
228
|
-
|
238
|
+
stub_request(:get, "#@base_url/#@domain/bounces?skip=1&limit=2")
|
229
239
|
|
230
240
|
@client.get_bounces(skip: 1, limit: 2)
|
231
241
|
end
|
@@ -233,7 +243,7 @@ describe 'Mailgunner::Client' do
|
|
233
243
|
|
234
244
|
describe 'get_bounce method' do
|
235
245
|
it 'fetches the bounce resource with the given address and returns a response object' do
|
236
|
-
|
246
|
+
stub_request(:get, "#@base_url/#@domain/bounces/#@encoded_address")
|
237
247
|
|
238
248
|
@client.get_bounce(@address).must_be_instance_of(Mailgunner::Response)
|
239
249
|
end
|
@@ -241,13 +251,13 @@ describe 'Mailgunner::Client' do
|
|
241
251
|
|
242
252
|
describe 'add_bounce method' do
|
243
253
|
it 'posts to the domain bounces resource and returns a response object' do
|
244
|
-
|
254
|
+
stub_request(:post, "#@base_url/#@domain/bounces")
|
245
255
|
|
246
256
|
@client.add_bounce({}).must_be_instance_of(Mailgunner::Response)
|
247
257
|
end
|
248
258
|
|
249
259
|
it 'encodes the bounce attributes' do
|
250
|
-
|
260
|
+
stub_request(:post, "#@base_url/#@domain/bounces").with(body: "address=#@encoded_address")
|
251
261
|
|
252
262
|
@client.add_bounce({address: @address})
|
253
263
|
end
|
@@ -255,7 +265,7 @@ describe 'Mailgunner::Client' do
|
|
255
265
|
|
256
266
|
describe 'delete_bounce method' do
|
257
267
|
it 'deletes the domain bounce resource with the given address and returns a response object' do
|
258
|
-
|
268
|
+
stub_request(:delete, "#@base_url/#@domain/bounces/#@encoded_address")
|
259
269
|
|
260
270
|
@client.delete_bounce(@address).must_be_instance_of(Mailgunner::Response)
|
261
271
|
end
|
@@ -263,73 +273,47 @@ describe 'Mailgunner::Client' do
|
|
263
273
|
|
264
274
|
describe 'get_stats method' do
|
265
275
|
it 'fetches the domain stats resource and returns a response object' do
|
266
|
-
|
276
|
+
stub_request(:get, "#@base_url/#@domain/stats")
|
267
277
|
|
268
278
|
@client.get_stats.must_be_instance_of(Mailgunner::Response)
|
269
279
|
end
|
270
280
|
|
271
281
|
it 'encodes skip and limit parameters' do
|
272
|
-
|
282
|
+
stub_request(:get, "#@base_url/#@domain/stats?skip=1&limit=2")
|
273
283
|
|
274
284
|
@client.get_stats(skip: 1, limit: 2)
|
275
285
|
end
|
276
286
|
|
277
287
|
it 'encodes an event parameter with multiple values' do
|
278
|
-
|
288
|
+
stub_request(:get, "#@base_url/#@domain/stats?event=sent&event=opened")
|
279
289
|
|
280
290
|
@client.get_stats(event: %w(sent opened))
|
281
291
|
end
|
282
292
|
end
|
283
293
|
|
284
|
-
describe 'get_log method' do
|
285
|
-
before do
|
286
|
-
Kernel.stubs(:warn)
|
287
|
-
end
|
288
|
-
|
289
|
-
it 'fetches the domain log resource and returns a response object' do
|
290
|
-
expect(Net::HTTP::Get, "/v2/#@domain/log")
|
291
|
-
|
292
|
-
@client.get_log.must_be_instance_of(Mailgunner::Response)
|
293
|
-
end
|
294
|
-
|
295
|
-
it 'encodes skip and limit parameters' do
|
296
|
-
expect(Net::HTTP::Get, "/v2/#@domain/log?skip=1&limit=2")
|
297
|
-
|
298
|
-
@client.get_log(skip: 1, limit: 2)
|
299
|
-
end
|
300
|
-
|
301
|
-
it 'emits a deprecation warning' do
|
302
|
-
Kernel.expects(:warn).with(regexp_matches(/Mailgunner::Client#get_log is deprecated/))
|
303
|
-
|
304
|
-
@client.http.stubs(:request)
|
305
|
-
|
306
|
-
@client.get_log
|
307
|
-
end
|
308
|
-
end
|
309
|
-
|
310
294
|
describe 'get_events method' do
|
311
295
|
it 'fetches the domain events resource and returns a response object' do
|
312
|
-
|
296
|
+
stub_request(:get, "#@base_url/#@domain/events")
|
313
297
|
|
314
298
|
@client.get_events.must_be_instance_of(Mailgunner::Response)
|
315
299
|
end
|
316
300
|
|
317
301
|
it 'encodes optional parameters' do
|
318
|
-
|
302
|
+
stub_request(:get, "#@base_url/#@domain/events?event=accepted&limit=10")
|
319
303
|
|
320
304
|
@client.get_events(event: 'accepted', limit: 10)
|
321
305
|
end
|
322
306
|
end
|
323
307
|
|
324
308
|
describe 'get_routes method' do
|
325
|
-
it 'fetches the
|
326
|
-
|
309
|
+
it 'fetches the routes resource and returns a response object' do
|
310
|
+
stub_request(:get, "#@base_url/routes")
|
327
311
|
|
328
312
|
@client.get_routes.must_be_instance_of(Mailgunner::Response)
|
329
313
|
end
|
330
314
|
|
331
315
|
it 'encodes skip and limit parameters' do
|
332
|
-
|
316
|
+
stub_request(:get, "#@base_url/routes?skip=1&limit=2")
|
333
317
|
|
334
318
|
@client.get_routes(skip: 1, limit: 2)
|
335
319
|
end
|
@@ -337,7 +321,7 @@ describe 'Mailgunner::Client' do
|
|
337
321
|
|
338
322
|
describe 'get_route method' do
|
339
323
|
it 'fetches the route resource with the given id and returns a response object' do
|
340
|
-
|
324
|
+
stub_request(:get, "#@base_url/routes/4f3bad2335335426750048c6")
|
341
325
|
|
342
326
|
@client.get_route('4f3bad2335335426750048c6').must_be_instance_of(Mailgunner::Response)
|
343
327
|
end
|
@@ -345,13 +329,13 @@ describe 'Mailgunner::Client' do
|
|
345
329
|
|
346
330
|
describe 'add_route method' do
|
347
331
|
it 'posts to the routes resource and returns a response object' do
|
348
|
-
|
332
|
+
stub_request(:post, "#@base_url/routes")
|
349
333
|
|
350
334
|
@client.add_route({}).must_be_instance_of(Mailgunner::Response)
|
351
335
|
end
|
352
336
|
|
353
337
|
it 'encodes the route attributes' do
|
354
|
-
|
338
|
+
stub_request(:post, "#@base_url/routes").with(body: 'description=Example+route&priority=1')
|
355
339
|
|
356
340
|
@client.add_route({description: 'Example route', priority: 1})
|
357
341
|
end
|
@@ -359,13 +343,13 @@ describe 'Mailgunner::Client' do
|
|
359
343
|
|
360
344
|
describe 'update_route method' do
|
361
345
|
it 'updates the route resource with the given id and returns a response object' do
|
362
|
-
|
346
|
+
stub_request(:put, "#@base_url/routes/4f3bad2335335426750048c6")
|
363
347
|
|
364
348
|
@client.update_route('4f3bad2335335426750048c6', {}).must_be_instance_of(Mailgunner::Response)
|
365
349
|
end
|
366
350
|
|
367
351
|
it 'encodes the route attributes' do
|
368
|
-
|
352
|
+
stub_request(:put, "#@base_url/routes/4f3bad2335335426750048c6").with(body: 'priority=10')
|
369
353
|
|
370
354
|
@client.update_route('4f3bad2335335426750048c6', {priority: 10})
|
371
355
|
end
|
@@ -373,119 +357,21 @@ describe 'Mailgunner::Client' do
|
|
373
357
|
|
374
358
|
describe 'delete_route method' do
|
375
359
|
it 'deletes the route resource with the given id and returns a response object' do
|
376
|
-
|
360
|
+
stub_request(:delete, "#@base_url/routes/4f3bad2335335426750048c6")
|
377
361
|
|
378
362
|
@client.delete_route('4f3bad2335335426750048c6').must_be_instance_of(Mailgunner::Response)
|
379
363
|
end
|
380
364
|
end
|
381
365
|
|
382
|
-
describe 'get_mailboxes method' do
|
383
|
-
before do
|
384
|
-
Kernel.stubs(:warn)
|
385
|
-
end
|
386
|
-
|
387
|
-
it 'fetches the domain mailboxes resource and returns a response object' do
|
388
|
-
expect(Net::HTTP::Get, "/v2/#@domain/mailboxes")
|
389
|
-
|
390
|
-
@client.get_mailboxes.must_be_instance_of(Mailgunner::Response)
|
391
|
-
end
|
392
|
-
|
393
|
-
it 'encodes skip and limit parameters' do
|
394
|
-
expect(Net::HTTP::Get, "/v2/#@domain/mailboxes?skip=1&limit=2")
|
395
|
-
|
396
|
-
@client.get_mailboxes(skip: 1, limit: 2)
|
397
|
-
end
|
398
|
-
|
399
|
-
it 'emits a deprecation warning' do
|
400
|
-
Kernel.expects(:warn).with(regexp_matches(/Mailgunner::Client#get_mailboxes is deprecated/))
|
401
|
-
|
402
|
-
@client.http.stubs(:request)
|
403
|
-
|
404
|
-
@client.get_mailboxes
|
405
|
-
end
|
406
|
-
end
|
407
|
-
|
408
|
-
describe 'add_mailbox method' do
|
409
|
-
before do
|
410
|
-
Kernel.stubs(:warn)
|
411
|
-
end
|
412
|
-
|
413
|
-
it 'posts to the domain mailboxes resource and returns a response object' do
|
414
|
-
expect(Net::HTTP::Post, "/v2/#@domain/mailboxes")
|
415
|
-
|
416
|
-
@client.add_mailbox({}).must_be_instance_of(Mailgunner::Response)
|
417
|
-
end
|
418
|
-
|
419
|
-
it 'encodes the mailbox attributes' do
|
420
|
-
expect(Net::HTTP::Post, responds_with(:body, 'mailbox=user'))
|
421
|
-
|
422
|
-
@client.add_mailbox({mailbox: 'user'})
|
423
|
-
end
|
424
|
-
|
425
|
-
it 'emits a deprecation warning' do
|
426
|
-
Kernel.expects(:warn).with(regexp_matches(/Mailgunner::Client#add_mailbox is deprecated/))
|
427
|
-
|
428
|
-
@client.http.stubs(:request)
|
429
|
-
|
430
|
-
@client.add_mailbox({})
|
431
|
-
end
|
432
|
-
end
|
433
|
-
|
434
|
-
describe 'update_mailbox method' do
|
435
|
-
before do
|
436
|
-
Kernel.stubs(:warn)
|
437
|
-
end
|
438
|
-
|
439
|
-
it 'updates the mailbox resource and returns a response object' do
|
440
|
-
expect(Net::HTTP::Put, "/v2/#@domain/mailboxes/user")
|
441
|
-
|
442
|
-
@client.update_mailbox('user', {}).must_be_instance_of(Mailgunner::Response)
|
443
|
-
end
|
444
|
-
|
445
|
-
it 'encodes the mailbox attributes' do
|
446
|
-
expect(Net::HTTP::Put, responds_with(:body, 'password=secret'))
|
447
|
-
|
448
|
-
@client.update_mailbox('user', {password: 'secret'})
|
449
|
-
end
|
450
|
-
|
451
|
-
it 'emits a deprecation warning' do
|
452
|
-
Kernel.expects(:warn).with(regexp_matches(/Mailgunner::Client#update_mailbox is deprecated/))
|
453
|
-
|
454
|
-
@client.http.stubs(:request)
|
455
|
-
|
456
|
-
@client.update_mailbox('user', {})
|
457
|
-
end
|
458
|
-
end
|
459
|
-
|
460
|
-
describe 'delete_mailbox method' do
|
461
|
-
before do
|
462
|
-
Kernel.stubs(:warn)
|
463
|
-
end
|
464
|
-
|
465
|
-
it 'deletes the domain mailbox resource with the given address and returns a response object' do
|
466
|
-
expect(Net::HTTP::Delete, "/v2/#@domain/mailboxes/user")
|
467
|
-
|
468
|
-
@client.delete_mailbox('user').must_be_instance_of(Mailgunner::Response)
|
469
|
-
end
|
470
|
-
|
471
|
-
it 'emits a deprecation warning' do
|
472
|
-
Kernel.expects(:warn).with(regexp_matches(/Mailgunner::Client#delete_mailbox is deprecated/))
|
473
|
-
|
474
|
-
@client.http.stubs(:request)
|
475
|
-
|
476
|
-
@client.delete_mailbox('user')
|
477
|
-
end
|
478
|
-
end
|
479
|
-
|
480
366
|
describe 'get_campaigns method' do
|
481
367
|
it 'fetches the domain campaigns resource and returns a response object' do
|
482
|
-
|
368
|
+
stub_request(:get, "#@base_url/#@domain/campaigns")
|
483
369
|
|
484
370
|
@client.get_campaigns.must_be_instance_of(Mailgunner::Response)
|
485
371
|
end
|
486
372
|
|
487
373
|
it 'encodes skip and limit parameters' do
|
488
|
-
|
374
|
+
stub_request(:get, "#@base_url/#@domain/campaigns?skip=1&limit=2")
|
489
375
|
|
490
376
|
@client.get_campaigns(skip: 1, limit: 2)
|
491
377
|
end
|
@@ -493,7 +379,7 @@ describe 'Mailgunner::Client' do
|
|
493
379
|
|
494
380
|
describe 'get_campaign method' do
|
495
381
|
it 'fetches the campaign resource with the given id and returns a response object' do
|
496
|
-
|
382
|
+
stub_request(:get, "#@base_url/#@domain/campaigns/id")
|
497
383
|
|
498
384
|
@client.get_campaign('id').must_be_instance_of(Mailgunner::Response)
|
499
385
|
end
|
@@ -501,13 +387,13 @@ describe 'Mailgunner::Client' do
|
|
501
387
|
|
502
388
|
describe 'add_campaign method' do
|
503
389
|
it 'posts to the domain campaigns resource and returns a response object' do
|
504
|
-
|
390
|
+
stub_request(:post, "#@base_url/#@domain/campaigns")
|
505
391
|
|
506
392
|
@client.add_campaign({}).must_be_instance_of(Mailgunner::Response)
|
507
393
|
end
|
508
394
|
|
509
395
|
it 'encodes the campaign attributes' do
|
510
|
-
|
396
|
+
stub_request(:post, "#@base_url/#@domain/campaigns").with(body: 'id=id')
|
511
397
|
|
512
398
|
@client.add_campaign({id: 'id'})
|
513
399
|
end
|
@@ -515,13 +401,13 @@ describe 'Mailgunner::Client' do
|
|
515
401
|
|
516
402
|
describe 'update_campaign method' do
|
517
403
|
it 'updates the campaign resource and returns a response object' do
|
518
|
-
|
404
|
+
stub_request(:put, "#@base_url/#@domain/campaigns/id")
|
519
405
|
|
520
406
|
@client.update_campaign('id', {}).must_be_instance_of(Mailgunner::Response)
|
521
407
|
end
|
522
408
|
|
523
409
|
it 'encodes the campaign attributes' do
|
524
|
-
|
410
|
+
stub_request(:put, "#@base_url/#@domain/campaigns/id").with(body: 'name=Example+Campaign')
|
525
411
|
|
526
412
|
@client.update_campaign('id', {name: 'Example Campaign'})
|
527
413
|
end
|
@@ -529,7 +415,7 @@ describe 'Mailgunner::Client' do
|
|
529
415
|
|
530
416
|
describe 'delete_campaign method' do
|
531
417
|
it 'deletes the domain campaign resource with the given id and returns a response object' do
|
532
|
-
|
418
|
+
stub_request(:delete, "#@base_url/#@domain/campaigns/id")
|
533
419
|
|
534
420
|
@client.delete_campaign('id').must_be_instance_of(Mailgunner::Response)
|
535
421
|
end
|
@@ -537,13 +423,13 @@ describe 'Mailgunner::Client' do
|
|
537
423
|
|
538
424
|
describe 'get_campaign_events method' do
|
539
425
|
it 'fetches the domain campaign events resource and returns a response object' do
|
540
|
-
|
426
|
+
stub_request(:get, "#@base_url/#@domain/campaigns/id/events")
|
541
427
|
|
542
428
|
@client.get_campaign_events('id').must_be_instance_of(Mailgunner::Response)
|
543
429
|
end
|
544
430
|
|
545
431
|
it 'encodes the optional parameters' do
|
546
|
-
|
432
|
+
stub_request(:get, "#@base_url/#@domain/campaigns/id/events?country=US&limit=100")
|
547
433
|
|
548
434
|
@client.get_campaign_events('id', country: 'US', limit: 100)
|
549
435
|
end
|
@@ -551,13 +437,13 @@ describe 'Mailgunner::Client' do
|
|
551
437
|
|
552
438
|
describe 'get_campaign_stats method' do
|
553
439
|
it 'fetches the domain campaign stats resource and returns a response object' do
|
554
|
-
|
440
|
+
stub_request(:get, "#@base_url/#@domain/campaigns/id/stats")
|
555
441
|
|
556
442
|
@client.get_campaign_stats('id').must_be_instance_of(Mailgunner::Response)
|
557
443
|
end
|
558
444
|
|
559
445
|
it 'encodes the optional parameters' do
|
560
|
-
|
446
|
+
stub_request(:get, "#@base_url/#@domain/campaigns/id/stats?groupby=dailyhour")
|
561
447
|
|
562
448
|
@client.get_campaign_stats('id', groupby: 'dailyhour')
|
563
449
|
end
|
@@ -565,13 +451,13 @@ describe 'Mailgunner::Client' do
|
|
565
451
|
|
566
452
|
describe 'get_campaign_clicks method' do
|
567
453
|
it 'fetches the domain campaign clicks resource and returns a response object' do
|
568
|
-
|
454
|
+
stub_request(:get, "#@base_url/#@domain/campaigns/id/clicks")
|
569
455
|
|
570
456
|
@client.get_campaign_clicks('id').must_be_instance_of(Mailgunner::Response)
|
571
457
|
end
|
572
458
|
|
573
459
|
it 'encodes the optional parameters' do
|
574
|
-
|
460
|
+
stub_request(:get, "#@base_url/#@domain/campaigns/id/clicks?groupby=month&limit=100")
|
575
461
|
|
576
462
|
@client.get_campaign_clicks('id', groupby: 'month', limit: 100)
|
577
463
|
end
|
@@ -579,13 +465,13 @@ describe 'Mailgunner::Client' do
|
|
579
465
|
|
580
466
|
describe 'get_campaign_opens method' do
|
581
467
|
it 'fetches the domain campaign opens resource and returns a response object' do
|
582
|
-
|
468
|
+
stub_request(:get, "#@base_url/#@domain/campaigns/id/opens")
|
583
469
|
|
584
470
|
@client.get_campaign_opens('id').must_be_instance_of(Mailgunner::Response)
|
585
471
|
end
|
586
472
|
|
587
473
|
it 'encodes the optional parameters' do
|
588
|
-
|
474
|
+
stub_request(:get, "#@base_url/#@domain/campaigns/id/opens?groupby=month&limit=100")
|
589
475
|
|
590
476
|
@client.get_campaign_opens('id', groupby: 'month', limit: 100)
|
591
477
|
end
|
@@ -593,13 +479,13 @@ describe 'Mailgunner::Client' do
|
|
593
479
|
|
594
480
|
describe 'get_campaign_unsubscribes method' do
|
595
481
|
it 'fetches the domain campaign unsubscribes resource and returns a response object' do
|
596
|
-
|
482
|
+
stub_request(:get, "#@base_url/#@domain/campaigns/id/unsubscribes")
|
597
483
|
|
598
484
|
@client.get_campaign_unsubscribes('id').must_be_instance_of(Mailgunner::Response)
|
599
485
|
end
|
600
486
|
|
601
487
|
it 'encodes the optional parameters' do
|
602
|
-
|
488
|
+
stub_request(:get, "#@base_url/#@domain/campaigns/id/unsubscribes?groupby=month&limit=100")
|
603
489
|
|
604
490
|
@client.get_campaign_unsubscribes('id', groupby: 'month', limit: 100)
|
605
491
|
end
|
@@ -607,27 +493,27 @@ describe 'Mailgunner::Client' do
|
|
607
493
|
|
608
494
|
describe 'get_campaign_complaints method' do
|
609
495
|
it 'fetches the domain campaign complaints resource and returns a response object' do
|
610
|
-
|
496
|
+
stub_request(:get, "#@base_url/#@domain/campaigns/id/complaints")
|
611
497
|
|
612
498
|
@client.get_campaign_complaints('id').must_be_instance_of(Mailgunner::Response)
|
613
499
|
end
|
614
500
|
|
615
501
|
it 'encodes the optional parameters' do
|
616
|
-
|
502
|
+
stub_request(:get, "#@base_url/#@domain/campaigns/id/complaints?groupby=month&limit=100")
|
617
503
|
|
618
504
|
@client.get_campaign_complaints('id', groupby: 'month', limit: 100)
|
619
505
|
end
|
620
506
|
end
|
621
507
|
|
622
508
|
describe 'get_lists method' do
|
623
|
-
it 'fetches the
|
624
|
-
|
509
|
+
it 'fetches the lists resource and returns a response object' do
|
510
|
+
stub_request(:get, "#@base_url/lists")
|
625
511
|
|
626
512
|
@client.get_lists.must_be_instance_of(Mailgunner::Response)
|
627
513
|
end
|
628
514
|
|
629
515
|
it 'encodes skip and limit parameters' do
|
630
|
-
|
516
|
+
stub_request(:get, "#@base_url/lists?skip=1&limit=2")
|
631
517
|
|
632
518
|
@client.get_lists(skip: 1, limit: 2)
|
633
519
|
end
|
@@ -635,21 +521,21 @@ describe 'Mailgunner::Client' do
|
|
635
521
|
|
636
522
|
describe 'get_list method' do
|
637
523
|
it 'fetches the list resource with the given address and returns a response object' do
|
638
|
-
|
524
|
+
stub_request(:get, "#@base_url/lists/developers%40mailgun.net")
|
639
525
|
|
640
526
|
@client.get_list('developers@mailgun.net').must_be_instance_of(Mailgunner::Response)
|
641
527
|
end
|
642
528
|
end
|
643
529
|
|
644
530
|
describe 'add_list method' do
|
645
|
-
it 'posts to the
|
646
|
-
|
531
|
+
it 'posts to the lists resource and returns a response object' do
|
532
|
+
stub_request(:post, "#@base_url/lists")
|
647
533
|
|
648
534
|
@client.add_list({}).must_be_instance_of(Mailgunner::Response)
|
649
535
|
end
|
650
536
|
|
651
537
|
it 'encodes the list attributes' do
|
652
|
-
|
538
|
+
stub_request(:post, "#@base_url/lists").with(body: 'address=developers%40mailgun.net')
|
653
539
|
|
654
540
|
@client.add_list({address: 'developers@mailgun.net'})
|
655
541
|
end
|
@@ -657,21 +543,21 @@ describe 'Mailgunner::Client' do
|
|
657
543
|
|
658
544
|
describe 'update_list method' do
|
659
545
|
it 'updates the list resource and returns a response object' do
|
660
|
-
|
546
|
+
stub_request(:put, "#@base_url/lists/developers%40mailgun.net")
|
661
547
|
|
662
548
|
@client.update_list('developers@mailgun.net', {}).must_be_instance_of(Mailgunner::Response)
|
663
549
|
end
|
664
550
|
|
665
551
|
it 'encodes the list attributes' do
|
666
|
-
|
552
|
+
stub_request(:put, "#@base_url/lists/developers%40mailgun.net").with(body: 'name=Example+list')
|
667
553
|
|
668
554
|
@client.update_list('developers@mailgun.net', {name: 'Example list'})
|
669
555
|
end
|
670
556
|
end
|
671
557
|
|
672
558
|
describe 'delete_list method' do
|
673
|
-
it 'deletes the
|
674
|
-
|
559
|
+
it 'deletes the list resource with the given address and returns a response object' do
|
560
|
+
stub_request(:delete, "#@base_url/lists/developers%40mailgun.net")
|
675
561
|
|
676
562
|
@client.delete_list('developers@mailgun.net').must_be_instance_of(Mailgunner::Response)
|
677
563
|
end
|
@@ -679,13 +565,13 @@ describe 'Mailgunner::Client' do
|
|
679
565
|
|
680
566
|
describe 'get_list_members method' do
|
681
567
|
it 'fetches the list members resource and returns a response object' do
|
682
|
-
|
568
|
+
stub_request(:get, "#@base_url/lists/developers%40mailgun.net/members")
|
683
569
|
|
684
570
|
@client.get_list_members('developers@mailgun.net').must_be_instance_of(Mailgunner::Response)
|
685
571
|
end
|
686
572
|
|
687
573
|
it 'encodes skip and limit parameters' do
|
688
|
-
|
574
|
+
stub_request(:get, "#@base_url/lists/developers%40mailgun.net/members?skip=1&limit=2")
|
689
575
|
|
690
576
|
@client.get_list_members('developers@mailgun.net', skip: 1, limit: 2)
|
691
577
|
end
|
@@ -693,7 +579,7 @@ describe 'Mailgunner::Client' do
|
|
693
579
|
|
694
580
|
describe 'get_list_member method' do
|
695
581
|
it 'fetches the list member resource with the given address and returns a response object' do
|
696
|
-
|
582
|
+
stub_request(:get, "#@base_url/lists/developers%40mailgun.net/members/#@encoded_address")
|
697
583
|
|
698
584
|
@client.get_list_member('developers@mailgun.net', @address).must_be_instance_of(Mailgunner::Response)
|
699
585
|
end
|
@@ -701,13 +587,13 @@ describe 'Mailgunner::Client' do
|
|
701
587
|
|
702
588
|
describe 'add_list_member method' do
|
703
589
|
it 'posts to the list members resource and returns a response object' do
|
704
|
-
|
590
|
+
stub_request(:post, "#@base_url/lists/developers%40mailgun.net/members")
|
705
591
|
|
706
592
|
@client.add_list_member('developers@mailgun.net', {}).must_be_instance_of(Mailgunner::Response)
|
707
593
|
end
|
708
594
|
|
709
595
|
it 'encodes the list attributes' do
|
710
|
-
|
596
|
+
stub_request(:post, "#@base_url/lists/developers%40mailgun.net/members").with(body: "address=#@encoded_address")
|
711
597
|
|
712
598
|
@client.add_list_member('developers@mailgun.net', {address: @address})
|
713
599
|
end
|
@@ -715,13 +601,13 @@ describe 'Mailgunner::Client' do
|
|
715
601
|
|
716
602
|
describe 'update_list_member method' do
|
717
603
|
it 'updates the list member resource with the given address and returns a response object' do
|
718
|
-
|
604
|
+
stub_request(:put, "#@base_url/lists/developers%40mailgun.net/members/#@encoded_address")
|
719
605
|
|
720
606
|
@client.update_list_member('developers@mailgun.net', @address, {}).must_be_instance_of(Mailgunner::Response)
|
721
607
|
end
|
722
608
|
|
723
609
|
it 'encodes the list member attributes' do
|
724
|
-
|
610
|
+
stub_request(:put, "#@base_url/lists/developers%40mailgun.net/members/#@encoded_address").with(body: 'subscribed=no')
|
725
611
|
|
726
612
|
@client.update_list_member('developers@mailgun.net', @address, {subscribed: 'no'})
|
727
613
|
end
|
@@ -729,7 +615,7 @@ describe 'Mailgunner::Client' do
|
|
729
615
|
|
730
616
|
describe 'delete_list_member method' do
|
731
617
|
it 'deletes the list member resource with the given address and returns a response object' do
|
732
|
-
|
618
|
+
stub_request(:delete, "#@base_url/lists/developers%40mailgun.net/members/#@encoded_address")
|
733
619
|
|
734
620
|
@client.delete_list_member('developers@mailgun.net', @address).must_be_instance_of(Mailgunner::Response)
|
735
621
|
end
|
@@ -737,142 +623,17 @@ describe 'Mailgunner::Client' do
|
|
737
623
|
|
738
624
|
describe 'get_list_stats method' do
|
739
625
|
it 'fetches the list stats resource and returns a response object' do
|
740
|
-
|
626
|
+
stub_request(:get, "#@base_url/lists/developers%40mailgun.net/stats")
|
741
627
|
|
742
628
|
@client.get_list_stats('developers@mailgun.net').must_be_instance_of(Mailgunner::Response)
|
743
629
|
end
|
744
630
|
end
|
745
631
|
|
746
|
-
describe 'json method' do
|
747
|
-
it 'emits a deprecation warning and returns the standard library json module' do
|
748
|
-
Kernel.expects(:warn).with(regexp_matches(/Mailgunner::Client#json is deprecated/))
|
749
|
-
|
750
|
-
Mailgunner::Client.new.json.must_equal(JSON)
|
751
|
-
end
|
752
|
-
end
|
753
|
-
|
754
|
-
describe 'json equals method' do
|
755
|
-
it 'emits a deprecation warning' do
|
756
|
-
Kernel.expects(:warn).with(regexp_matches(/Mailgunner::Client#json= is deprecated/))
|
757
|
-
|
758
|
-
Mailgunner::Client.new.json = nil
|
759
|
-
end
|
760
|
-
end
|
761
|
-
|
762
632
|
describe 'when initialized with a different json implementation' do
|
763
633
|
it 'emits a deprecation warning' do
|
764
634
|
Kernel.expects(:warn).with(regexp_matches(/Mailgunner::Client :json option is deprecated/))
|
765
635
|
|
766
636
|
Mailgunner::Client.new(domain: @domain, api_key: @api_key, json: stub)
|
767
637
|
end
|
768
|
-
|
769
|
-
describe 'json method' do
|
770
|
-
it 'emits a deprecation warning and returns the value passed to the constructor' do
|
771
|
-
json = stub
|
772
|
-
|
773
|
-
Kernel.expects(:warn).once
|
774
|
-
Kernel.expects(:warn).with(regexp_matches(/Mailgunner::Client#json is deprecated/))
|
775
|
-
|
776
|
-
Mailgunner::Client.new(json: json).json.must_equal(json)
|
777
|
-
end
|
778
|
-
end
|
779
|
-
end
|
780
|
-
end
|
781
|
-
|
782
|
-
describe 'Mailgunner::Response' do
|
783
|
-
before do
|
784
|
-
@http_response = mock()
|
785
|
-
|
786
|
-
@response = Mailgunner::Response.new(@http_response)
|
787
|
-
end
|
788
|
-
|
789
|
-
it 'delegates missing methods to the http response object' do
|
790
|
-
@http_response.stubs(:code).returns('200')
|
791
|
-
|
792
|
-
@response.code.must_equal('200')
|
793
|
-
end
|
794
|
-
|
795
|
-
describe 'ok query method' do
|
796
|
-
it 'returns true if the status code is 200' do
|
797
|
-
@http_response.expects(:code).returns('200')
|
798
|
-
|
799
|
-
@response.ok?.must_equal(true)
|
800
|
-
end
|
801
|
-
|
802
|
-
it 'returns false otherwise' do
|
803
|
-
@http_response.expects(:code).returns('400')
|
804
|
-
|
805
|
-
@response.ok?.must_equal(false)
|
806
|
-
end
|
807
|
-
end
|
808
|
-
|
809
|
-
describe 'client_error query method' do
|
810
|
-
it 'returns true if the status code is 4xx' do
|
811
|
-
@http_response.stubs(:code).returns(%w(400 401 402 404).sample)
|
812
|
-
|
813
|
-
@response.client_error?.must_equal(true)
|
814
|
-
end
|
815
|
-
|
816
|
-
it 'returns false otherwise' do
|
817
|
-
@http_response.stubs(:code).returns('200')
|
818
|
-
|
819
|
-
@response.client_error?.must_equal(false)
|
820
|
-
end
|
821
|
-
end
|
822
|
-
|
823
|
-
describe 'server_error query method' do
|
824
|
-
it 'returns true if the status code is 5xx' do
|
825
|
-
@http_response.stubs(:code).returns(%w(500 502 503 504).sample)
|
826
|
-
|
827
|
-
@response.server_error?.must_equal(true)
|
828
|
-
end
|
829
|
-
|
830
|
-
it 'returns false otherwise' do
|
831
|
-
@http_response.stubs(:code).returns('200')
|
832
|
-
|
833
|
-
@response.server_error?.must_equal(false)
|
834
|
-
end
|
835
|
-
end
|
836
|
-
|
837
|
-
describe 'json query method' do
|
838
|
-
it 'returns true if the response has a json content type' do
|
839
|
-
@http_response.expects(:[]).with('Content-Type').returns('application/json;charset=utf-8')
|
840
|
-
|
841
|
-
@response.json?.must_equal(true)
|
842
|
-
end
|
843
|
-
|
844
|
-
it 'returns false otherwise' do
|
845
|
-
@http_response.expects(:[]).with('Content-Type').returns('text/html')
|
846
|
-
|
847
|
-
@response.json?.must_equal(false)
|
848
|
-
end
|
849
|
-
end
|
850
|
-
|
851
|
-
describe 'object method' do
|
852
|
-
it 'decodes the response body as json and returns a hash' do
|
853
|
-
@http_response.expects(:body).returns('{"foo":"bar"}')
|
854
|
-
|
855
|
-
@response.object.must_equal({'foo' => 'bar'})
|
856
|
-
end
|
857
|
-
end
|
858
|
-
end
|
859
|
-
|
860
|
-
describe 'Mailgunner::Response initialized with an alternative json implementation' do
|
861
|
-
before do
|
862
|
-
@json = faux(JSON)
|
863
|
-
|
864
|
-
@http_response = stub
|
865
|
-
|
866
|
-
@response = Mailgunner::Response.new(@http_response, :json => @json)
|
867
|
-
end
|
868
|
-
|
869
|
-
describe 'object method' do
|
870
|
-
it 'uses the alternative json implementation to parse the response body' do
|
871
|
-
@http_response.stubs(:body).returns(response_body = '{"foo":"bar"}')
|
872
|
-
|
873
|
-
@json.expects(:parse).with(response_body)
|
874
|
-
|
875
|
-
@response.object
|
876
|
-
end
|
877
638
|
end
|
878
639
|
end
|