postmark 1.8.1 → 1.21.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +2 -0
  3. data/.travis.yml +8 -5
  4. data/CHANGELOG.rdoc +86 -0
  5. data/CONTRIBUTING.md +18 -0
  6. data/Gemfile +6 -5
  7. data/LICENSE +1 -1
  8. data/README.md +34 -607
  9. data/RELEASE.md +12 -0
  10. data/VERSION +1 -1
  11. data/gemfiles/Gemfile.legacy +5 -4
  12. data/lib/postmark.rb +1 -18
  13. data/lib/postmark/account_api_client.rb +55 -1
  14. data/lib/postmark/api_client.rb +145 -17
  15. data/lib/postmark/bounce.rb +0 -4
  16. data/lib/postmark/client.rb +12 -4
  17. data/lib/postmark/error.rb +127 -0
  18. data/lib/postmark/handlers/mail.rb +10 -4
  19. data/lib/postmark/helpers/message_helper.rb +4 -0
  20. data/lib/postmark/http_client.rb +20 -32
  21. data/lib/postmark/mail_message_converter.rb +18 -5
  22. data/lib/postmark/message_extensions/mail.rb +83 -8
  23. data/lib/postmark/version.rb +1 -1
  24. data/postmark.gemspec +1 -1
  25. data/postmark.png +0 -0
  26. data/spec/integration/account_api_client_spec.rb +42 -10
  27. data/spec/integration/api_client_hashes_spec.rb +32 -49
  28. data/spec/integration/api_client_messages_spec.rb +33 -52
  29. data/spec/integration/api_client_resources_spec.rb +12 -44
  30. data/spec/integration/mail_delivery_method_spec.rb +21 -23
  31. data/spec/spec_helper.rb +4 -7
  32. data/spec/support/custom_matchers.rb +44 -0
  33. data/spec/support/shared_examples.rb +16 -16
  34. data/spec/unit/postmark/account_api_client_spec.rb +239 -45
  35. data/spec/unit/postmark/api_client_spec.rb +792 -406
  36. data/spec/unit/postmark/bounce_spec.rb +40 -62
  37. data/spec/unit/postmark/client_spec.rb +0 -6
  38. data/spec/unit/postmark/error_spec.rb +231 -0
  39. data/spec/unit/postmark/handlers/mail_spec.rb +59 -27
  40. data/spec/unit/postmark/helpers/hash_helper_spec.rb +5 -6
  41. data/spec/unit/postmark/helpers/message_helper_spec.rb +60 -11
  42. data/spec/unit/postmark/http_client_spec.rb +76 -61
  43. data/spec/unit/postmark/inbound_spec.rb +34 -34
  44. data/spec/unit/postmark/inflector_spec.rb +11 -13
  45. data/spec/unit/postmark/json_spec.rb +2 -2
  46. data/spec/unit/postmark/mail_message_converter_spec.rb +250 -81
  47. data/spec/unit/postmark/message_extensions/mail_spec.rb +249 -38
  48. data/spec/unit/postmark_spec.rb +37 -37
  49. metadata +41 -11
@@ -17,11 +17,7 @@ describe "Sending Mail::Messages with delivery_method Mail::Postmark" do
17
17
  end
18
18
  }
19
19
 
20
- let(:tagged_message) {
21
- message.tap do |m|
22
- m.tag "postmark-gem"
23
- end
24
- }
20
+ let(:tagged_message) { message.tap { |m| m.tag "postmark-gem" } }
25
21
 
26
22
  let(:message_with_no_body) {
27
23
  Mail.new do
@@ -53,35 +49,37 @@ describe "Sending Mail::Messages with delivery_method Mail::Postmark" do
53
49
  expect { message.deliver }.to change{message.delivered?}.to(true)
54
50
  end
55
51
 
56
- it 'updates a message object with Message-ID' do
57
- expect { message.deliver }.
58
- to change{message['Message-ID'].to_s}.to(postmark_message_id_format)
52
+ it 'updates a message object with X-PM-Message-Id' do
53
+ expect { message.deliver }.to change{message['X-PM-Message-Id'].to_s}.to(postmark_message_id_format)
59
54
  end
60
55
 
61
56
  it 'updates a message object with full postmark response' do
62
- expect { message.deliver }.
63
- to change{message.postmark_response}.from(nil)
57
+ expect { message.deliver }.to change{message.postmark_response}.from(nil)
64
58
  end
65
59
 
66
60
  it 'delivers a tagged message' do
67
- expect { tagged_message.deliver }.
68
- to change{message.delivered?}.to(true)
61
+ expect { tagged_message.deliver }.to change{message.delivered?}.to(true)
69
62
  end
70
63
 
71
64
  it 'delivers a message with attachment' do
72
- expect { message_with_attachment.deliver }.
73
- to change{message_with_attachment.delivered?}.to(true)
65
+ expect { message_with_attachment.deliver }.to change{message_with_attachment.delivered?}.to(true)
74
66
  end
75
67
 
76
- it 'fails to deliver a message without body' do
77
- expect { message_with_no_body.deliver! }.
78
- to raise_error(Postmark::InvalidMessageError)
79
- message_with_no_body.should_not be_delivered
80
- end
68
+ context 'fails to deliver a message' do
69
+ it ' without body - raise error' do
70
+ expect { message_with_no_body.deliver! }.to raise_error(Postmark::InvalidMessageError)
71
+ end
81
72
 
82
- it 'fails to deliver a message with invalid To address' do
83
- expect { message_with_invalid_to.deliver! }.
84
- to raise_error(Postmark::InvalidMessageError)
85
- message_with_invalid_to.should_not be_delivered
73
+ it 'without body - do not deliver' do
74
+ expect(message_with_no_body).not_to be_delivered
75
+ end
76
+
77
+ it 'with invalid To address - raise error' do
78
+ expect { message_with_invalid_to.deliver! }.to raise_error(Postmark::InvalidMessageError)
79
+ end
80
+
81
+ it 'with invalid To address - do not deliver' do
82
+ expect(message_with_invalid_to).not_to be_delivered
83
+ end
86
84
  end
87
85
  end
data/spec/spec_helper.rb CHANGED
@@ -10,8 +10,9 @@ require 'json'
10
10
  require 'fakeweb'
11
11
  require 'fakeweb_matcher'
12
12
  require 'rspec'
13
- require 'rspec/autorun'
13
+ require 'rspec/its'
14
14
  require File.join(File.expand_path(File.dirname(__FILE__)), 'support', 'shared_examples.rb')
15
+ require File.join(File.expand_path(File.dirname(__FILE__)), 'support', 'custom_matchers.rb')
15
16
  require File.join(File.expand_path(File.dirname(__FILE__)), 'support', 'helpers.rb')
16
17
 
17
18
  if ENV['JSONGEM']
@@ -23,6 +24,8 @@ end
23
24
  RSpec.configure do |config|
24
25
  include Postmark::RSpecHelpers
25
26
 
27
+ config.expect_with(:rspec) { |c| c.syntax = :expect }
28
+
26
29
  config.filter_run_excluding :skip_for_platform => lambda { |platform|
27
30
  RUBY_PLATFORM.to_s =~ /^#{platform.to_s}/
28
31
  }
@@ -46,9 +49,3 @@ RSpec.configure do |config|
46
49
  Postmark.response_parser_class = nil
47
50
  end
48
51
  end
49
-
50
- RSpec::Matchers.define :be_serialized_to do |json|
51
- match do |mail_message|
52
- Postmark.convert_message_to_options_hash(mail_message).should == JSON.parse(json)
53
- end
54
- end
@@ -0,0 +1,44 @@
1
+ RSpec::Matchers.define :a_postmark_json do |string|
2
+ def postmark_key?(key)
3
+ key == ::Postmark::Inflector.to_postmark(key)
4
+ end
5
+
6
+ def postmark_object?(obj)
7
+ case obj
8
+ when Hash
9
+ return false unless obj.keys.all? { |k| postmark_key?(k) }
10
+ return false unless obj.values.all? { |v| postmark_object?(v) }
11
+ when Array
12
+ return false unless obj.all? { |v| postmark_object?(v) }
13
+ end
14
+
15
+ true
16
+ end
17
+
18
+ def postmark_json?(str)
19
+ return false unless str.is_a?(String)
20
+
21
+ json = Postmark::Json.decode(str)
22
+ postmark_object?(json)
23
+ rescue
24
+ false
25
+ end
26
+
27
+ match do |actual|
28
+ postmark_json?(actual)
29
+ end
30
+ end
31
+
32
+ RSpec::Matchers.define :json_representation_of do |x|
33
+ match { |actual| Postmark::Json.decode(actual) == x }
34
+ end
35
+
36
+ RSpec::Matchers.define :match_json do |x|
37
+ match { |actual| Postmark::Json.encode(x) == actual }
38
+ end
39
+
40
+ RSpec::Matchers.define :be_serialized_to do |json|
41
+ match do |mail_message|
42
+ Postmark.convert_message_to_options_hash(mail_message) == JSON.parse(json)
43
+ end
44
+ end
@@ -1,40 +1,40 @@
1
1
  shared_examples :mail do
2
- it "should set text body for plain message" do
3
- Postmark.send(:convert_message_to_options_hash, subject)['TextBody'].should_not be_nil
2
+ it "set text body for plain message" do
3
+ expect(Postmark.send(:convert_message_to_options_hash, subject)['TextBody']).not_to be_nil
4
4
  end
5
5
 
6
- it "should encode from properly when name is used" do
6
+ it "encode from properly when name is used" do
7
7
  subject.from = "Sheldon Lee Cooper <sheldon@bigbangtheory.com>"
8
- subject.should be_serialized_to %q[{"Subject":"Hello!", "From":"Sheldon Lee Cooper <sheldon@bigbangtheory.com>", "To":"lenard@bigbangtheory.com", "TextBody":"Hello Sheldon!"}]
8
+ expect(subject).to be_serialized_to %q[{"Subject":"Hello!", "From":"Sheldon Lee Cooper <sheldon@bigbangtheory.com>", "To":"lenard@bigbangtheory.com", "TextBody":"Hello Sheldon!"}]
9
9
  end
10
10
 
11
- it "should encode reply to" do
11
+ it "encode reply to" do
12
12
  subject.reply_to = ['a@a.com', 'b@b.com']
13
- subject.should be_serialized_to %q[{"Subject":"Hello!", "From":"sheldon@bigbangtheory.com", "ReplyTo":"a@a.com, b@b.com", "To":"lenard@bigbangtheory.com", "TextBody":"Hello Sheldon!"}]
13
+ expect(subject).to be_serialized_to %q[{"Subject":"Hello!", "From":"sheldon@bigbangtheory.com", "ReplyTo":"a@a.com, b@b.com", "To":"lenard@bigbangtheory.com", "TextBody":"Hello Sheldon!"}]
14
14
  end
15
15
 
16
- it "should encode tag" do
16
+ it "encode tag" do
17
17
  subject.tag = "invite"
18
- subject.should be_serialized_to %q[{"Subject":"Hello!", "From":"sheldon@bigbangtheory.com", "Tag":"invite", "To":"lenard@bigbangtheory.com", "TextBody":"Hello Sheldon!"}]
18
+ expect(subject).to be_serialized_to %q[{"Subject":"Hello!", "From":"sheldon@bigbangtheory.com", "Tag":"invite", "To":"lenard@bigbangtheory.com", "TextBody":"Hello Sheldon!"}]
19
19
  end
20
20
 
21
- it "should encode multiple recepients (TO)" do
21
+ it "encode multiple recepients (TO)" do
22
22
  subject.to = ['a@a.com', 'b@b.com']
23
- subject.should be_serialized_to %q[{"Subject":"Hello!", "From":"sheldon@bigbangtheory.com", "To":"a@a.com, b@b.com", "TextBody":"Hello Sheldon!"}]
23
+ expect(subject).to be_serialized_to %q[{"Subject":"Hello!", "From":"sheldon@bigbangtheory.com", "To":"a@a.com, b@b.com", "TextBody":"Hello Sheldon!"}]
24
24
  end
25
25
 
26
- it "should encode multiple recepients (CC)" do
26
+ it "encode multiple recepients (CC)" do
27
27
  subject.cc = ['a@a.com', 'b@b.com']
28
- subject.should be_serialized_to %q[{"Cc":"a@a.com, b@b.com", "Subject":"Hello!", "From":"sheldon@bigbangtheory.com", "To":"lenard@bigbangtheory.com", "TextBody":"Hello Sheldon!"}]
28
+ expect(subject).to be_serialized_to %q[{"Cc":"a@a.com, b@b.com", "Subject":"Hello!", "From":"sheldon@bigbangtheory.com", "To":"lenard@bigbangtheory.com", "TextBody":"Hello Sheldon!"}]
29
29
  end
30
30
 
31
- it "should encode multiple recepients (BCC)" do
31
+ it "encode multiple recepients (BCC)" do
32
32
  subject.bcc = ['a@a.com', 'b@b.com']
33
- subject.should be_serialized_to %q[{"Bcc":"a@a.com, b@b.com", "Subject":"Hello!", "From":"sheldon@bigbangtheory.com", "To":"lenard@bigbangtheory.com", "TextBody":"Hello Sheldon!"}]
33
+ expect(subject).to be_serialized_to %q[{"Bcc":"a@a.com, b@b.com", "Subject":"Hello!", "From":"sheldon@bigbangtheory.com", "To":"lenard@bigbangtheory.com", "TextBody":"Hello Sheldon!"}]
34
34
  end
35
35
 
36
- it "should accept string as reply_to field" do
36
+ it "accept string as reply_to field" do
37
37
  subject.reply_to = ['Anton Astashov <b@b.com>']
38
- subject.should be_serialized_to %q[{"From": "sheldon@bigbangtheory.com", "ReplyTo": "b@b.com", "To": "lenard@bigbangtheory.com", "Subject": "Hello!", "TextBody": "Hello Sheldon!"}]
38
+ expect(subject).to be_serialized_to %q[{"From": "sheldon@bigbangtheory.com", "ReplyTo": "b@b.com", "To": "lenard@bigbangtheory.com", "Subject": "Hello!", "TextBody": "Hello Sheldon!"}]
39
39
  end
40
40
  end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Postmark::AccountApiClient do
4
-
5
4
  let(:api_token) { 'abcd-efgh' }
6
5
  subject { Postmark::AccountApiClient}
7
6
 
@@ -14,7 +13,6 @@ describe Postmark::AccountApiClient do
14
13
  end
15
14
 
16
15
  context 'instance' do
17
-
18
16
  subject { Postmark::AccountApiClient.new(api_token) }
19
17
 
20
18
  it 'uses the auth header specific for Account API' do
@@ -23,7 +21,6 @@ describe Postmark::AccountApiClient do
23
21
  end
24
22
 
25
23
  describe '#senders' do
26
-
27
24
  let(:response) {
28
25
  {
29
26
  'TotalCount' => 10, 'SenderSignatures' => [{}, {}]
@@ -44,11 +41,9 @@ describe Postmark::AccountApiClient do
44
41
  with('senders', an_instance_of(Hash)).and_return(response)
45
42
  subject.senders.take(1000)
46
43
  end
47
-
48
44
  end
49
45
 
50
46
  describe '#get_senders' do
51
-
52
47
  let(:response) {
53
48
  {
54
49
  "TotalCount" => 1,
@@ -77,7 +72,7 @@ describe Postmark::AccountApiClient do
77
72
  it 'formats the keys of returned list of senders' do
78
73
  allow(subject.http_client).to receive(:get).and_return(response)
79
74
  keys = subject.get_senders.map { |s| s.keys }.flatten
80
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
75
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
81
76
  end
82
77
 
83
78
  it 'accepts offset and count options' do
@@ -86,11 +81,9 @@ describe Postmark::AccountApiClient do
86
81
  and_return(response)
87
82
  subject.get_senders(:offset => 10, :count => 42)
88
83
  end
89
-
90
84
  end
91
85
 
92
86
  describe '#get_senders_count' do
93
-
94
87
  let(:response) { {'TotalCount' => 42} }
95
88
 
96
89
  it 'is aliased as #get_signatures_count' do
@@ -103,11 +96,9 @@ describe Postmark::AccountApiClient do
103
96
  with('senders', an_instance_of(Hash)).and_return(response)
104
97
  expect(subject.get_senders_count).to eq(42)
105
98
  end
106
-
107
99
  end
108
100
 
109
101
  describe '#get_sender' do
110
-
111
102
  let(:response) {
112
103
  {
113
104
  "Domain" => "example.com",
@@ -132,12 +123,11 @@ describe Postmark::AccountApiClient do
132
123
  it 'formats the keys of returned response' do
133
124
  allow(subject.http_client).to receive(:get).and_return(response)
134
125
  keys = subject.get_sender(42).keys
135
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
126
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
136
127
  end
137
128
  end
138
129
 
139
130
  describe '#create_sender' do
140
-
141
131
  let(:response) {
142
132
  {
143
133
  "Domain" => "example.com",
@@ -168,12 +158,11 @@ describe Postmark::AccountApiClient do
168
158
  it 'formats the keys of returned response' do
169
159
  allow(subject.http_client).to receive(:post).and_return(response)
170
160
  keys = subject.create_sender(:foo => 'bar').keys
171
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
161
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
172
162
  end
173
163
  end
174
164
 
175
165
  describe '#update_sender' do
176
-
177
166
  let(:response) {
178
167
  {
179
168
  "Domain" => "example.com",
@@ -205,13 +194,11 @@ describe Postmark::AccountApiClient do
205
194
  it 'formats the keys of returned response' do
206
195
  allow(subject.http_client).to receive(:put).and_return(response)
207
196
  keys = subject.update_sender(42, :foo => 'bar').keys
208
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
197
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
209
198
  end
210
-
211
199
  end
212
200
 
213
201
  describe '#resend_sender_confirmation' do
214
-
215
202
  let(:response) {
216
203
  {
217
204
  "ErrorCode" => 0,
@@ -233,13 +220,11 @@ describe Postmark::AccountApiClient do
233
220
  it 'formats the keys of returned response' do
234
221
  allow(subject.http_client).to receive(:post).and_return(response)
235
222
  keys = subject.resend_sender_confirmation(42).keys
236
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
223
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
237
224
  end
238
-
239
225
  end
240
226
 
241
227
  describe '#verified_sender_spf?' do
242
-
243
228
  let(:response) { {"SPFVerified" => true} }
244
229
  let(:false_response) { {"SPFVerified" => false} }
245
230
 
@@ -255,18 +240,16 @@ describe Postmark::AccountApiClient do
255
240
 
256
241
  it 'returns false when SPFVerified field of the response is false' do
257
242
  allow(subject.http_client).to receive(:post).and_return(false_response)
258
- expect(subject.verified_sender_spf?(42)).to be_false
243
+ expect(subject.verified_sender_spf?(42)).to be false
259
244
  end
260
245
 
261
246
  it 'returns true when SPFVerified field of the response is true' do
262
247
  allow(subject.http_client).to receive(:post).and_return(response)
263
- expect(subject.verified_sender_spf?(42)).to be_true
248
+ expect(subject.verified_sender_spf?(42)).to be true
264
249
  end
265
-
266
250
  end
267
251
 
268
252
  describe '#request_new_sender_dkim' do
269
-
270
253
  let(:response) {
271
254
  {
272
255
  "Domain" => "example.com",
@@ -292,13 +275,11 @@ describe Postmark::AccountApiClient do
292
275
  it 'formats the keys of returned response' do
293
276
  allow(subject.http_client).to receive(:post).and_return(response)
294
277
  keys = subject.request_new_sender_dkim(42).keys
295
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
278
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
296
279
  end
297
-
298
280
  end
299
281
 
300
282
  describe '#delete_sender' do
301
-
302
283
  let(:response) {
303
284
  {
304
285
  "ErrorCode" => 0,
@@ -319,13 +300,209 @@ describe Postmark::AccountApiClient do
319
300
  it 'formats the keys of returned response' do
320
301
  allow(subject.http_client).to receive(:delete).and_return(response)
321
302
  keys = subject.delete_sender(42).keys
322
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
303
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
304
+ end
305
+ end
306
+
307
+ describe '#domains' do
308
+ let(:response) {{'TotalCount' => 10, 'Domains' => [{}, {}]}}
309
+
310
+ it 'returns an enumerator' do
311
+ expect(subject.domains).to be_kind_of(Enumerable)
312
+ end
313
+
314
+ it 'lazily loads domains' do
315
+ allow(subject.http_client).to receive(:get).
316
+ with('domains', an_instance_of(Hash)).and_return(response)
317
+ subject.domains.take(1000)
323
318
  end
324
319
 
325
320
  end
326
321
 
327
- describe '#servers' do
322
+ describe '#get_domains' do
323
+
324
+ let(:response) {
325
+ {
326
+ "TotalCount" => 1,
327
+ "Domains" => [{
328
+ "Name" => "example.com",
329
+ "ID" => 8139
330
+ }]
331
+ }
332
+ }
333
+
334
+ it 'performs a GET request to /domains endpoint' do
335
+ allow(subject.http_client).to receive(:get).
336
+ with('domains', :offset => 0, :count => 30).
337
+ and_return(response)
338
+ subject.get_domains
339
+ end
340
+
341
+ it 'formats the keys of returned list of domains' do
342
+ allow(subject.http_client).to receive(:get).and_return(response)
343
+ keys = subject.get_domains.map { |s| s.keys }.flatten
344
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
345
+ end
346
+
347
+ it 'accepts offset and count options' do
348
+ allow(subject.http_client).to receive(:get).
349
+ with('domains', :offset => 10, :count => 42).
350
+ and_return(response)
351
+ subject.get_domains(:offset => 10, :count => 42)
352
+ end
353
+
354
+ end
355
+
356
+ describe '#get_domains_count' do
357
+ let(:response) { {'TotalCount' => 42} }
358
+
359
+ it 'returns a total number of domains' do
360
+ allow(subject.http_client).to receive(:get).
361
+ with('domains', an_instance_of(Hash)).and_return(response)
362
+ expect(subject.get_domains_count).to eq(42)
363
+ end
364
+ end
365
+
366
+ describe '#get_domain' do
367
+ let(:response) {
368
+ {
369
+ "Name" => "example.com",
370
+ "ID" => 8139
371
+ }
372
+ }
373
+
374
+ it 'performs a GET request to /domains/:id endpoint' do
375
+ allow(subject.http_client).to receive(:get).with("domains/42").
376
+ and_return(response)
377
+ subject.get_domain(42)
378
+ end
379
+
380
+ it 'formats the keys of returned response' do
381
+ allow(subject.http_client).to receive(:get).and_return(response)
382
+ keys = subject.get_domain(42).keys
383
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
384
+ end
385
+ end
386
+
387
+ describe '#create_domain' do
388
+ let(:response) {
389
+ {
390
+ "Name" => "example.com",
391
+ "ID" => 8139
392
+ }
393
+ }
394
+
395
+ it 'performs a POST request to /domains endpoint' do
396
+ allow(subject.http_client).to receive(:post).
397
+ with("domains", an_instance_of(String)).and_return(response)
398
+ subject.create_domain(:name => 'example.com')
399
+ end
400
+
401
+ it 'converts the domain attributes names to camel case' do
402
+ allow(subject.http_client).to receive(:post).
403
+ with("domains", {'FooBar' => 'bar'}.to_json).and_return(response)
404
+ subject.create_domain(:foo_bar => 'bar')
405
+ end
406
+
407
+ it 'formats the keys of returned response' do
408
+ allow(subject.http_client).to receive(:post).and_return(response)
409
+ keys = subject.create_domain(:foo => 'bar').keys
410
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
411
+ end
412
+ end
328
413
 
414
+ describe '#update_domain' do
415
+ let(:response) {
416
+ {
417
+ "Name" => "example.com",
418
+ "ReturnPathDomain" => "return.example.com",
419
+ "ID" => 8139
420
+ }
421
+ }
422
+
423
+ it 'performs a PUT request to /domains/:id endpoint' do
424
+ allow(subject.http_client).to receive(:put).
425
+ with('domains/42', an_instance_of(String)).and_return(response)
426
+ subject.update_domain(42, :return_path_domain => 'updated-return.example.com')
427
+ end
428
+
429
+ it 'converts the domain attributes names to camel case' do
430
+ allow(subject.http_client).to receive(:put).
431
+ with('domains/42', {'FooBar' => 'bar'}.to_json).and_return(response)
432
+ subject.update_domain(42, :foo_bar => 'bar')
433
+ end
434
+
435
+ it 'formats the keys of returned response' do
436
+ allow(subject.http_client).to receive(:put).and_return(response)
437
+ keys = subject.update_domain(42, :foo => 'bar').keys
438
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
439
+ end
440
+ end
441
+
442
+ describe '#verified_domain_spf?' do
443
+ let(:response) { {"SPFVerified" => true} }
444
+ let(:false_response) { {"SPFVerified" => false} }
445
+
446
+ it 'performs a POST request to /domains/:id/verifyspf endpoint' do
447
+ allow(subject.http_client).to receive(:post).
448
+ with('domains/42/verifyspf').and_return(response)
449
+ subject.verified_domain_spf?(42)
450
+ end
451
+
452
+ it 'returns false when SPFVerified field of the response is false' do
453
+ allow(subject.http_client).to receive(:post).and_return(false_response)
454
+ expect(subject.verified_domain_spf?(42)).to be false
455
+ end
456
+
457
+ it 'returns true when SPFVerified field of the response is true' do
458
+ allow(subject.http_client).to receive(:post).and_return(response)
459
+ expect(subject.verified_domain_spf?(42)).to be true
460
+ end
461
+ end
462
+
463
+ describe '#rotate_domain_dkim' do
464
+ let(:response) {
465
+ {
466
+ "Name" => "example.com",
467
+ "ID" => 8139
468
+ }
469
+ }
470
+
471
+ it 'performs a POST request to /domains/:id/rotatedkim endpoint' do
472
+ allow(subject.http_client).to receive(:post).
473
+ with('domains/42/rotatedkim').and_return(response)
474
+ subject.rotate_domain_dkim(42)
475
+ end
476
+
477
+ it 'formats the keys of returned response' do
478
+ allow(subject.http_client).to receive(:post).and_return(response)
479
+ keys = subject.rotate_domain_dkim(42).keys
480
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
481
+ end
482
+ end
483
+
484
+ describe '#delete_domain' do
485
+ let(:response) {
486
+ {
487
+ "ErrorCode" => 0,
488
+ "Message" => "Domain example.com removed."
489
+ }
490
+ }
491
+
492
+ it 'performs a DELETE request to /domains/:id endpoint' do
493
+ allow(subject.http_client).to receive(:delete).
494
+ with('domains/42').and_return(response)
495
+ subject.delete_domain(42)
496
+ end
497
+
498
+ it 'formats the keys of returned response' do
499
+ allow(subject.http_client).to receive(:delete).and_return(response)
500
+ keys = subject.delete_sender(42).keys
501
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
502
+ end
503
+ end
504
+
505
+ describe '#servers' do
329
506
  let(:response) { {'TotalCount' => 10, 'Servers' => [{}, {}]} }
330
507
 
331
508
  it 'returns an enumerator' do
@@ -337,11 +514,9 @@ describe Postmark::AccountApiClient do
337
514
  with('servers', an_instance_of(Hash)).and_return(response)
338
515
  subject.servers.take(100)
339
516
  end
340
-
341
517
  end
342
518
 
343
519
  describe '#get_servers' do
344
-
345
520
  let(:response) {
346
521
  {
347
522
  'TotalCount' => 1,
@@ -375,7 +550,7 @@ describe Postmark::AccountApiClient do
375
550
  it 'formats the keys of returned list of servers' do
376
551
  allow(subject.http_client).to receive(:get).and_return(response)
377
552
  keys = subject.get_servers.map { |s| s.keys }.flatten
378
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
553
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
379
554
  end
380
555
 
381
556
  it 'accepts offset and count options' do
@@ -387,7 +562,6 @@ describe Postmark::AccountApiClient do
387
562
  end
388
563
 
389
564
  describe '#get_server' do
390
-
391
565
  let(:response) {
392
566
  {
393
567
  "ID" => 7438,
@@ -416,13 +590,11 @@ describe Postmark::AccountApiClient do
416
590
  it 'formats the keys of returned response' do
417
591
  allow(subject.http_client).to receive(:get).and_return(response)
418
592
  keys = subject.get_server(42).keys
419
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
593
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
420
594
  end
421
-
422
595
  end
423
596
 
424
597
  describe '#get_servers_count' do
425
-
426
598
  let(:response) { {'TotalCount' => 42} }
427
599
 
428
600
  it 'returns a total number of servers' do
@@ -434,7 +606,6 @@ describe Postmark::AccountApiClient do
434
606
  end
435
607
 
436
608
  describe '#create_server' do
437
-
438
609
  let(:response) {
439
610
  {
440
611
  "Name" => "Staging Testing",
@@ -463,9 +634,8 @@ describe Postmark::AccountApiClient do
463
634
  it 'formats the keys of returned response' do
464
635
  allow(subject.http_client).to receive(:post).and_return(response)
465
636
  keys = subject.create_server(:foo => 'bar').keys
466
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
637
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
467
638
  end
468
-
469
639
  end
470
640
 
471
641
  describe '#update_server' do
@@ -505,13 +675,11 @@ describe Postmark::AccountApiClient do
505
675
  it 'formats the keys of returned response' do
506
676
  allow(subject.http_client).to receive(:put).and_return(response)
507
677
  keys = subject.update_server(42, :foo => 'bar').keys
508
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
678
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
509
679
  end
510
-
511
680
  end
512
681
 
513
682
  describe '#delete_server' do
514
-
515
683
  let(:response) {
516
684
  {
517
685
  "ErrorCode" => "0",
@@ -528,11 +696,37 @@ describe Postmark::AccountApiClient do
528
696
  it 'formats the keys of returned response' do
529
697
  allow(subject.http_client).to receive(:delete).and_return(response)
530
698
  keys = subject.delete_server(42).keys
531
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
699
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
532
700
  end
701
+ end
702
+
703
+ describe '#push_templates' do
704
+ let(:response) {
705
+ {"TotalCount"=>5,
706
+ "Templates"=>
707
+ [{"Action"=>"Create", "TemplateId"=>nil, "Alias"=>"alias1", "Name"=>"Comment notification"},
708
+ {"Action"=>"Create", "TemplateId"=>nil, "Alias"=>"alias2", "Name"=>"Password reset"}]}
709
+ }
533
710
 
711
+ let(:request_data) {{:source_server_id => 1, :destination_server_id => 2, :perform_changes => false}}
712
+
713
+ it 'gets templates info and converts it to ruby format' do
714
+ allow(subject.http_client).to receive(:put).and_return(response)
715
+ templates = subject.push_templates({:source_server_id => 1, :destination_server_id => 2, :perform_changes => false} )
716
+
717
+ expect(templates.size).to eq(2)
718
+ expect(templates.first[:action]).to eq('Create')
719
+ expect(templates.first[:alias]).to eq('alias1')
720
+ end
721
+
722
+ it 'formats the keys of returned response' do
723
+ allow(subject.http_client).to receive(:put).and_return(response)
724
+ templates = subject.push_templates({:source_server_id => 1, :destination_server_id => 2, :perform_changes => false} )
725
+
726
+ keys = templates.map { |template| template.keys }.flatten
727
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
728
+ end
534
729
  end
535
730
 
536
731
  end
537
-
538
- end
732
+ end