postmark 1.10.0 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -31,7 +31,7 @@ module Postmark
31
31
  'Headers' => @message.export_headers,
32
32
  'Tag' => @message.tag.to_s,
33
33
  'TrackOpens' => (cast_to_bool(@message.track_opens) unless @message.track_opens.empty?),
34
- 'TrackLinks' => (@message.track_links unless @message.track_links.empty?)
34
+ 'TrackLinks' => (::Postmark::Inflector.to_postmark(@message.track_links) unless @message.track_links.empty?)
35
35
  }
36
36
  end
37
37
 
@@ -1,3 +1,3 @@
1
1
  module Postmark
2
- VERSION = '1.10.0'
2
+ VERSION = '1.11.0'
3
3
  end
@@ -33,7 +33,7 @@ describe 'Account API client usage' do
33
33
 
34
34
 
35
35
  # spf
36
- expect(subject.verified_sender_spf?(new_sender[:id])).to be_true
36
+ expect(subject.verified_sender_spf?(new_sender[:id])).to be true
37
37
 
38
38
  # resend
39
39
  expect { subject.resend_sender_confirmation(new_sender[:id]) }.not_to raise_error
@@ -74,7 +74,7 @@ describe 'Account API client usage' do
74
74
  expect(updated_domain[:id]).to eq(new_domain[:id])
75
75
 
76
76
  # spf
77
- expect(subject.verified_domain_spf?(new_domain[:id])).to be_false
77
+ expect(subject.verified_domain_spf?(new_domain[:id])).to be true
78
78
 
79
79
  # dkim
80
80
  expect { subject.rotate_domain_dkim(new_domain[:id]) }.
@@ -91,14 +91,14 @@ describe "Sending Mail::Messages with Postmark::ApiClient" do
91
91
  api_client.deliver_messages(valid_messages)
92
92
 
93
93
  expect(valid_messages.all? { |m| m.message_id =~ postmark_message_id_format }).
94
- to be_true
94
+ to be true
95
95
  end
96
96
 
97
97
  it 'updates delivered messages with related Postmark responses' do
98
98
  api_client.deliver_messages(valid_messages)
99
99
 
100
100
  expect(valid_messages.all? { |m| m.postmark_response["To"] == m.to[0] }).
101
- to be_true
101
+ to be true
102
102
  end
103
103
 
104
104
  it 'returns as many responses as many messages were sent' do
@@ -114,7 +114,7 @@ describe "Sending Mail::Messages with Postmark::ApiClient" do
114
114
  api_client.deliver_messages(valid_messages)
115
115
 
116
116
  expect(valid_messages.all? { |m| m.postmark_response["To"] == m.to[0] }).
117
- to be_true
117
+ to be true
118
118
  end
119
119
 
120
120
  it 'returns as many responses as many messages were sent' do
@@ -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 = [:should, :expect] }
28
+
26
29
  config.filter_run_excluding :skip_for_platform => lambda { |platform|
27
30
  RUBY_PLATFORM.to_s =~ /^#{platform.to_s}/
28
31
  }
@@ -0,0 +1,30 @@
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
@@ -77,7 +77,7 @@ describe Postmark::AccountApiClient do
77
77
  it 'formats the keys of returned list of senders' do
78
78
  allow(subject.http_client).to receive(:get).and_return(response)
79
79
  keys = subject.get_senders.map { |s| s.keys }.flatten
80
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
80
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
81
81
  end
82
82
 
83
83
  it 'accepts offset and count options' do
@@ -132,7 +132,7 @@ describe Postmark::AccountApiClient do
132
132
  it 'formats the keys of returned response' do
133
133
  allow(subject.http_client).to receive(:get).and_return(response)
134
134
  keys = subject.get_sender(42).keys
135
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
135
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
136
136
  end
137
137
  end
138
138
 
@@ -168,7 +168,7 @@ describe Postmark::AccountApiClient do
168
168
  it 'formats the keys of returned response' do
169
169
  allow(subject.http_client).to receive(:post).and_return(response)
170
170
  keys = subject.create_sender(:foo => 'bar').keys
171
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
171
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
172
172
  end
173
173
  end
174
174
 
@@ -205,7 +205,7 @@ describe Postmark::AccountApiClient do
205
205
  it 'formats the keys of returned response' do
206
206
  allow(subject.http_client).to receive(:put).and_return(response)
207
207
  keys = subject.update_sender(42, :foo => 'bar').keys
208
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
208
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
209
209
  end
210
210
 
211
211
  end
@@ -233,7 +233,7 @@ describe Postmark::AccountApiClient do
233
233
  it 'formats the keys of returned response' do
234
234
  allow(subject.http_client).to receive(:post).and_return(response)
235
235
  keys = subject.resend_sender_confirmation(42).keys
236
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
236
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
237
237
  end
238
238
 
239
239
  end
@@ -255,12 +255,12 @@ describe Postmark::AccountApiClient do
255
255
 
256
256
  it 'returns false when SPFVerified field of the response is false' do
257
257
  allow(subject.http_client).to receive(:post).and_return(false_response)
258
- expect(subject.verified_sender_spf?(42)).to be_false
258
+ expect(subject.verified_sender_spf?(42)).to be false
259
259
  end
260
260
 
261
261
  it 'returns true when SPFVerified field of the response is true' do
262
262
  allow(subject.http_client).to receive(:post).and_return(response)
263
- expect(subject.verified_sender_spf?(42)).to be_true
263
+ expect(subject.verified_sender_spf?(42)).to be true
264
264
  end
265
265
 
266
266
  end
@@ -292,7 +292,7 @@ describe Postmark::AccountApiClient do
292
292
  it 'formats the keys of returned response' do
293
293
  allow(subject.http_client).to receive(:post).and_return(response)
294
294
  keys = subject.request_new_sender_dkim(42).keys
295
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
295
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
296
296
  end
297
297
 
298
298
  end
@@ -319,7 +319,7 @@ describe Postmark::AccountApiClient do
319
319
  it 'formats the keys of returned response' do
320
320
  allow(subject.http_client).to receive(:delete).and_return(response)
321
321
  keys = subject.delete_sender(42).keys
322
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
322
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
323
323
  end
324
324
 
325
325
  end
@@ -366,7 +366,7 @@ describe Postmark::AccountApiClient do
366
366
  it 'formats the keys of returned list of domains' do
367
367
  allow(subject.http_client).to receive(:get).and_return(response)
368
368
  keys = subject.get_domains.map { |s| s.keys }.flatten
369
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
369
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
370
370
  end
371
371
 
372
372
  it 'accepts offset and count options' do
@@ -408,7 +408,7 @@ describe Postmark::AccountApiClient do
408
408
  it 'formats the keys of returned response' do
409
409
  allow(subject.http_client).to receive(:get).and_return(response)
410
410
  keys = subject.get_domain(42).keys
411
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
411
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
412
412
  end
413
413
  end
414
414
 
@@ -436,7 +436,7 @@ describe Postmark::AccountApiClient do
436
436
  it 'formats the keys of returned response' do
437
437
  allow(subject.http_client).to receive(:post).and_return(response)
438
438
  keys = subject.create_domain(:foo => 'bar').keys
439
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
439
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
440
440
  end
441
441
  end
442
442
 
@@ -465,7 +465,7 @@ describe Postmark::AccountApiClient do
465
465
  it 'formats the keys of returned response' do
466
466
  allow(subject.http_client).to receive(:put).and_return(response)
467
467
  keys = subject.update_domain(42, :foo => 'bar').keys
468
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
468
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
469
469
  end
470
470
 
471
471
  end
@@ -483,12 +483,12 @@ describe Postmark::AccountApiClient do
483
483
 
484
484
  it 'returns false when SPFVerified field of the response is false' do
485
485
  allow(subject.http_client).to receive(:post).and_return(false_response)
486
- expect(subject.verified_domain_spf?(42)).to be_false
486
+ expect(subject.verified_domain_spf?(42)).to be false
487
487
  end
488
488
 
489
489
  it 'returns true when SPFVerified field of the response is true' do
490
490
  allow(subject.http_client).to receive(:post).and_return(response)
491
- expect(subject.verified_domain_spf?(42)).to be_true
491
+ expect(subject.verified_domain_spf?(42)).to be true
492
492
  end
493
493
 
494
494
  end
@@ -511,7 +511,7 @@ describe Postmark::AccountApiClient do
511
511
  it 'formats the keys of returned response' do
512
512
  allow(subject.http_client).to receive(:post).and_return(response)
513
513
  keys = subject.rotate_domain_dkim(42).keys
514
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
514
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
515
515
  end
516
516
 
517
517
  end
@@ -534,7 +534,7 @@ describe Postmark::AccountApiClient do
534
534
  it 'formats the keys of returned response' do
535
535
  allow(subject.http_client).to receive(:delete).and_return(response)
536
536
  keys = subject.delete_sender(42).keys
537
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
537
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
538
538
  end
539
539
 
540
540
  end
@@ -590,7 +590,7 @@ describe Postmark::AccountApiClient do
590
590
  it 'formats the keys of returned list of servers' do
591
591
  allow(subject.http_client).to receive(:get).and_return(response)
592
592
  keys = subject.get_servers.map { |s| s.keys }.flatten
593
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
593
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
594
594
  end
595
595
 
596
596
  it 'accepts offset and count options' do
@@ -631,7 +631,7 @@ describe Postmark::AccountApiClient do
631
631
  it 'formats the keys of returned response' do
632
632
  allow(subject.http_client).to receive(:get).and_return(response)
633
633
  keys = subject.get_server(42).keys
634
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
634
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
635
635
  end
636
636
 
637
637
  end
@@ -678,7 +678,7 @@ describe Postmark::AccountApiClient do
678
678
  it 'formats the keys of returned response' do
679
679
  allow(subject.http_client).to receive(:post).and_return(response)
680
680
  keys = subject.create_server(:foo => 'bar').keys
681
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
681
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
682
682
  end
683
683
 
684
684
  end
@@ -720,7 +720,7 @@ describe Postmark::AccountApiClient do
720
720
  it 'formats the keys of returned response' do
721
721
  allow(subject.http_client).to receive(:put).and_return(response)
722
722
  keys = subject.update_server(42, :foo => 'bar').keys
723
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
723
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
724
724
  end
725
725
 
726
726
  end
@@ -743,7 +743,7 @@ describe Postmark::AccountApiClient do
743
743
  it 'formats the keys of returned response' do
744
744
  allow(subject.http_client).to receive(:delete).and_return(response)
745
745
  keys = subject.delete_server(42).keys
746
- expect(keys.all? { |k| k.is_a?(Symbol) }).to be_true
746
+ expect(keys.all? { |k| k.is_a?(Symbol) }).to be true
747
747
  end
748
748
 
749
749
  end
@@ -38,7 +38,7 @@ describe Postmark::ApiClient do
38
38
  its(:max_retries) { should eq max_retries }
39
39
 
40
40
  it 'passes other options to HttpClient instance' do
41
- Postmark::HttpClient.should_receive(:new).with(api_token, :foo => :bar)
41
+ allow(Postmark::HttpClient).to receive(:new).with(api_token, :foo => :bar)
42
42
  subject.should be
43
43
  end
44
44
 
@@ -67,20 +67,18 @@ describe Postmark::ApiClient do
67
67
  let(:response) { {"MessageID" => 42} }
68
68
 
69
69
  it 'converts message hash to Postmark format and posts it to /email' do
70
- http_client.should_receive(:post).with('email', email_json) { response }
70
+ allow(http_client).to receive(:post).with('email', email_json) { response }
71
71
  subject.deliver(message_hash)
72
72
  end
73
73
 
74
74
  it 'retries 3 times' do
75
- 2.times do
76
- http_client.should_receive(:post).and_raise(Postmark::InternalServerError)
77
- end
78
- http_client.should_receive(:post) { response }
75
+ expect(http_client).to receive(:post).twice.and_raise(Postmark::InternalServerError)
76
+ expect(http_client).to receive(:post) { response }
79
77
  expect { subject.deliver(message_hash) }.not_to raise_error
80
78
  end
81
79
 
82
80
  it 'converts response to ruby format' do
83
- http_client.should_receive(:post).with('email', email_json) { response }
81
+ expect(http_client).to receive(:post).with('email', email_json) { response }
84
82
  r = subject.deliver(message_hash)
85
83
  r.should have_key(:message_id)
86
84
  end
@@ -94,12 +92,12 @@ describe Postmark::ApiClient do
94
92
  let(:response) { [{'ErrorCode' => 0}, {'ErrorCode' => 0}, {'ErrorCode' => 0}] }
95
93
 
96
94
  it 'turns array of messages into a JSON document and posts it to /email/batch' do
97
- http_client.should_receive(:post).with('email/batch', emails_json) { response }
95
+ expect(http_client).to receive(:post).with('email/batch', emails_json) { response }
98
96
  subject.deliver_in_batches([message_hash, message_hash, message_hash])
99
97
  end
100
98
 
101
99
  it 'converts response to ruby format' do
102
- http_client.should_receive(:post).with('email/batch', emails_json) { response }
100
+ expect(http_client).to receive(:post).with('email/batch', emails_json) { response }
103
101
  response = subject.deliver_in_batches([message_hash, message_hash, message_hash])
104
102
  response.first.should have_key(:error_code)
105
103
  end
@@ -111,26 +109,26 @@ describe Postmark::ApiClient do
111
109
  let(:http_client) { subject.http_client }
112
110
 
113
111
  it 'turns message into a JSON document and posts it to /email' do
114
- http_client.should_receive(:post).with('email', email_json)
112
+ expect(http_client).to receive(:post).with('email', email_json)
115
113
  subject.deliver_message(message)
116
114
  end
117
115
 
118
116
  it "retries 3 times" do
119
117
  2.times do
120
- http_client.should_receive(:post).and_raise(Postmark::InternalServerError)
118
+ expect(http_client).to receive(:post).and_raise(Postmark::InternalServerError)
121
119
  end
122
- http_client.should_receive(:post)
120
+ expect(http_client).to receive(:post)
123
121
  expect { subject.deliver_message(message) }.not_to raise_error
124
122
  end
125
123
 
126
124
  it "retries on timeout" do
127
- http_client.should_receive(:post).and_raise(Postmark::TimeoutError)
128
- http_client.should_receive(:post)
125
+ expect(http_client).to receive(:post).and_raise(Postmark::TimeoutError)
126
+ expect(http_client).to receive(:post)
129
127
  expect { subject.deliver_message(message) }.not_to raise_error
130
128
  end
131
129
 
132
130
  it "proxies errors" do
133
- http_client.stub(:post).and_raise(Postmark::TimeoutError)
131
+ allow(http_client).to receive(:post).and_raise(Postmark::TimeoutError)
134
132
  expect { subject.deliver_message(message) }.to raise_error(Postmark::TimeoutError)
135
133
  end
136
134
 
@@ -145,21 +143,21 @@ describe Postmark::ApiClient do
145
143
  let(:response) { [{}, {}, {}] }
146
144
 
147
145
  it 'turns array of messages into a JSON document and posts it to /email/batch' do
148
- http_client.should_receive(:post).with('email/batch', emails_json) { response }
146
+ expect(http_client).to receive(:post).with('email/batch', emails_json) { response }
149
147
  subject.deliver_messages([message, message, message])
150
148
  end
151
149
 
152
150
  it "should retry 3 times" do
153
151
  2.times do
154
- http_client.should_receive(:post).and_raise(Postmark::InternalServerError)
152
+ expect(http_client).to receive(:post).and_raise(Postmark::InternalServerError)
155
153
  end
156
- http_client.should_receive(:post) { response }
154
+ expect(http_client).to receive(:post) { response }
157
155
  expect { subject.deliver_messages([message, message, message]) }.not_to raise_error
158
156
  end
159
157
 
160
158
  it "should retry on timeout" do
161
- http_client.should_receive(:post).and_raise(Postmark::TimeoutError)
162
- http_client.should_receive(:post) { response }
159
+ expect(http_client).to receive(:post).and_raise(Postmark::TimeoutError)
160
+ expect(http_client).to receive(:post) { response }
163
161
  expect { subject.deliver_messages([message, message, message]) }.not_to raise_error
164
162
  end
165
163
 
@@ -170,7 +168,7 @@ describe Postmark::ApiClient do
170
168
  let(:response) { {"Bounces" => [{"Foo" => "Bar"}]} }
171
169
 
172
170
  it 'requests data at /deliverystats' do
173
- http_client.should_receive(:get).with("deliverystats") { response }
171
+ expect(http_client).to receive(:get).with("deliverystats") { response }
174
172
  subject.delivery_stats.should have_key(:bounces)
175
173
  end
176
174
  end
@@ -224,7 +222,7 @@ describe Postmark::ApiClient do
224
222
  let(:response) { {"TotalCount" => 1, "Messages" => [{}]} }
225
223
 
226
224
  it 'requests data at /messages/outbound' do
227
- http_client.should_receive(:get).
225
+ expect(http_client).to receive(:get).
228
226
  with('messages/outbound', :offset => 50, :count => 50).
229
227
  and_return(response)
230
228
  subject.get_messages(:offset => 50, :count => 50)
@@ -236,7 +234,7 @@ describe Postmark::ApiClient do
236
234
  let(:response) { {"TotalCount" => 1, "InboundMessages" => [{}]} }
237
235
 
238
236
  it 'requests data at /messages/inbound' do
239
- http_client.should_receive(:get).
237
+ expect(http_client).to receive(:get).
240
238
  with('messages/inbound', :offset => 50, :count => 50).
241
239
  and_return(response)
242
240
  subject.get_messages(:inbound => true, :offset => 50, :count => 50).
@@ -281,7 +279,7 @@ describe Postmark::ApiClient do
281
279
  context 'given outbound' do
282
280
 
283
281
  it 'requests a single message by id at /messages/outbound/:id/details' do
284
- http_client.should_receive(:get).
282
+ expect(http_client).to receive(:get).
285
283
  with("messages/outbound/#{id}/details", {}).
286
284
  and_return(response)
287
285
  subject.get_message(id).should have_key(:to)
@@ -292,7 +290,7 @@ describe Postmark::ApiClient do
292
290
  context 'given inbound' do
293
291
 
294
292
  it 'requests a single message by id at /messages/inbound/:id/details' do
295
- http_client.should_receive(:get).
293
+ expect(http_client).to receive(:get).
296
294
  with("messages/inbound/#{id}/details", {}).
297
295
  and_return(response)
298
296
  subject.get_message(id, :inbound => true).should have_key(:to)
@@ -309,7 +307,7 @@ describe Postmark::ApiClient do
309
307
  context 'given outbound' do
310
308
 
311
309
  it 'requests a single message by id at /messages/outbound/:id/dump' do
312
- http_client.should_receive(:get).
310
+ expect(http_client).to receive(:get).
313
311
  with("messages/outbound/#{id}/dump", {}).
314
312
  and_return(response)
315
313
  subject.dump_message(id).should have_key(:body)
@@ -320,7 +318,7 @@ describe Postmark::ApiClient do
320
318
  context 'given inbound' do
321
319
 
322
320
  it 'requests a single message by id at /messages/inbound/:id/dump' do
323
- http_client.should_receive(:get).
321
+ expect(http_client).to receive(:get).
324
322
  with("messages/inbound/#{id}/dump", {}).
325
323
  and_return(response)
326
324
  subject.dump_message(id, :inbound => true).should have_key(:body)
@@ -360,7 +358,7 @@ describe Postmark::ApiClient do
360
358
  let(:http_client) { subject.http_client }
361
359
 
362
360
  it 'requests data at /bounces/tags' do
363
- http_client.should_receive(:get).with("bounces/tags")
361
+ expect(http_client).to receive(:get).with("bounces/tags")
364
362
  subject.get_bounced_tags
365
363
  end
366
364
  end
@@ -370,7 +368,7 @@ describe Postmark::ApiClient do
370
368
  let(:id) { 42 }
371
369
 
372
370
  it 'requests a single bounce by ID at /bounces/:id' do
373
- http_client.should_receive(:get).with("bounces/#{id}")
371
+ expect(http_client).to receive(:get).with("bounces/#{id}")
374
372
  subject.get_bounce(id)
375
373
  end
376
374
  end
@@ -380,7 +378,7 @@ describe Postmark::ApiClient do
380
378
  let(:id) { 42 }
381
379
 
382
380
  it 'requests a specific bounce data at /bounces/:id/dump' do
383
- http_client.should_receive(:get).with("bounces/#{id}/dump")
381
+ expect(http_client).to receive(:get).with("bounces/#{id}/dump")
384
382
  subject.dump_bounce(id)
385
383
  end
386
384
  end
@@ -391,7 +389,7 @@ describe Postmark::ApiClient do
391
389
  let(:response) { {"Bounce" => {}} }
392
390
 
393
391
  it 'activates a specific bounce by sending a PUT request to /bounces/:id/activate' do
394
- http_client.should_receive(:put).with("bounces/#{id}/activate") { response }
392
+ expect(http_client).to receive(:put).with("bounces/#{id}/activate") { response }
395
393
  subject.activate_bounce(id)
396
394
  end
397
395
  end
@@ -411,6 +409,19 @@ describe Postmark::ApiClient do
411
409
 
412
410
  end
413
411
 
412
+ describe '#clicks' do
413
+ it 'returns an Enumerator' do
414
+ expect(subject.clicks).to be_kind_of(Enumerable)
415
+ end
416
+
417
+ it 'performs a GET request to /clicks/tags' do
418
+ allow(subject.http_client).to receive(:get).
419
+ with('messages/outbound/clicks', an_instance_of(Hash)).
420
+ and_return('TotalCount' => 1, 'Clicks' => [{}])
421
+ expect(subject.clicks.first(5).count).to eq(1)
422
+ end
423
+ end
424
+
414
425
  describe '#get_opens' do
415
426
  let(:http_client) { subject.http_client }
416
427
  let(:options) { {:offset => 5} }
@@ -423,6 +434,18 @@ describe Postmark::ApiClient do
423
434
  end
424
435
  end
425
436
 
437
+ describe '#get_clicks' do
438
+ let(:http_client) { subject.http_client }
439
+ let(:options) { {:offset => 5} }
440
+ let(:response) { {'Clicks' => [], 'TotalCount' => 0} }
441
+
442
+ it 'performs a GET request to /messages/outbound/clicks' do
443
+ allow(http_client).to receive(:get).with('messages/outbound/clicks', options) { response }
444
+ expect(subject.get_clicks(options)).to be_an(Array)
445
+ expect(subject.get_clicks(options).count).to be_zero
446
+ end
447
+ end
448
+
426
449
  describe '#get_opens_by_message_id' do
427
450
  let(:http_client) { subject.http_client }
428
451
  let(:message_id) { 42 }
@@ -439,6 +462,22 @@ describe Postmark::ApiClient do
439
462
  end
440
463
  end
441
464
 
465
+ describe '#get_clicks_by_message_id' do
466
+ let(:http_client) { subject.http_client }
467
+ let(:message_id) { 42 }
468
+ let(:options) { {:offset => 5} }
469
+ let(:response) { {'Clicks' => [], 'TotalCount' => 0} }
470
+
471
+ it 'performs a GET request to /messages/outbound/clicks' do
472
+ allow(http_client).
473
+ to receive(:get).with("messages/outbound/clicks/#{message_id}",
474
+ options).
475
+ and_return(response)
476
+ expect(subject.get_clicks_by_message_id(message_id, options)).to be_an(Array)
477
+ expect(subject.get_clicks_by_message_id(message_id, options).count).to be_zero
478
+ end
479
+ end
480
+
442
481
  describe '#opens_by_message_id' do
443
482
  let(:message_id) { 42 }
444
483
 
@@ -454,6 +493,21 @@ describe Postmark::ApiClient do
454
493
  end
455
494
  end
456
495
 
496
+ describe '#clicks_by_message_id' do
497
+ let(:message_id) { 42 }
498
+
499
+ it 'returns an Enumerator' do
500
+ expect(subject.clicks_by_message_id(message_id)).to be_kind_of(Enumerable)
501
+ end
502
+
503
+ it 'performs a GET request to /clicks/tags' do
504
+ allow(subject.http_client).to receive(:get).
505
+ with("messages/outbound/clicks/#{message_id}", an_instance_of(Hash)).
506
+ and_return('TotalCount' => 1, 'Clicks' => [{}])
507
+ expect(subject.clicks_by_message_id(message_id).first(5).count).to eq(1)
508
+ end
509
+ end
510
+
457
511
  describe '#create_trigger' do
458
512
  let(:http_client) { subject.http_client }
459
513
  let(:options) { {:foo => 'bar'} }
@@ -553,7 +607,7 @@ describe Postmark::ApiClient do
553
607
  "SmtpApiActivated" => true} }
554
608
 
555
609
  it 'requests server info from Postmark and converts it to ruby format' do
556
- http_client.should_receive(:get).with('server') { response }
610
+ expect(http_client).to receive(:get).with('server') { response }
557
611
  subject.server_info.should have_key(:inbound_hash)
558
612
  end
559
613
  end
@@ -567,8 +621,8 @@ describe Postmark::ApiClient do
567
621
  let(:update) { {:smtp_api_activated => false} }
568
622
 
569
623
  it 'updates server info in Postmark and converts it to ruby format' do
570
- http_client.should_receive(:put).with('server', anything) { response }
571
- subject.update_server_info(update)[:smtp_api_activated].should be_false
624
+ expect(http_client).to receive(:put).with('server', anything) { response }
625
+ subject.update_server_info(update)[:smtp_api_activated].should be false
572
626
  end
573
627
  end
574
628
 
@@ -593,7 +647,7 @@ describe Postmark::ApiClient do
593
647
  end
594
648
 
595
649
  it 'gets templates info and converts it to ruby format' do
596
- http_client.should_receive(:get).with('templates', :offset => 0, :count => 2).and_return(response)
650
+ expect(http_client).to receive(:get).with('templates', :offset => 0, :count => 2).and_return(response)
597
651
 
598
652
  count, templates = subject.get_templates(:count => 2)
599
653
 
@@ -631,7 +685,7 @@ describe Postmark::ApiClient do
631
685
  end
632
686
 
633
687
  it 'gets single template and converts it to ruby format' do
634
- http_client.should_receive(:get).with('templates/123').and_return(response)
688
+ expect(http_client).to receive(:get).with('templates/123').and_return(response)
635
689
 
636
690
  template = subject.get_template('123')
637
691
 
@@ -654,7 +708,7 @@ describe Postmark::ApiClient do
654
708
  it 'performs a POST request to /templates with the given attributes' do
655
709
  expected_json = { 'Name' => 'template name' }.to_json
656
710
 
657
- http_client.should_receive(:post).with('templates', expected_json).and_return(response)
711
+ expect(http_client).to receive(:post).with('templates', expected_json).and_return(response)
658
712
 
659
713
  template = subject.create_template(:name => 'template name')
660
714
 
@@ -676,7 +730,7 @@ describe Postmark::ApiClient do
676
730
  it 'performs a PUT request to /templates with the given attributes' do
677
731
  expected_json = { 'Name' => 'template name' }.to_json
678
732
 
679
- http_client.should_receive(:put).with('templates/123', expected_json).and_return(response)
733
+ expect(http_client).to receive(:put).with('templates/123', expected_json).and_return(response)
680
734
 
681
735
  template = subject.update_template(123, :name => 'template name')
682
736
 
@@ -695,7 +749,7 @@ describe Postmark::ApiClient do
695
749
  end
696
750
 
697
751
  it 'performs a DELETE request to /templates/:id' do
698
- http_client.should_receive(:delete).with('templates/123').and_return(response)
752
+ expect(http_client).to receive(:delete).with('templates/123').and_return(response)
699
753
 
700
754
  resp = subject.delete_template(123)
701
755
 
@@ -738,14 +792,14 @@ describe Postmark::ApiClient do
738
792
  'Subject' => '{{MyName}}'
739
793
  }.to_json
740
794
 
741
- http_client.should_receive(:post).with('templates/validate', expected_template_json).and_return(response)
795
+ expect(http_client).to receive(:post).with('templates/validate', expected_template_json).and_return(response)
742
796
 
743
797
  resp = subject.validate_template(:html_body => '{{MyName}}',
744
798
  :text_body => '{{MyName}}',
745
799
  :subject => '{{MyName}}')
746
800
 
747
- expect(resp[:all_content_is_valid]).to be_true
748
- expect(resp[:html_body][:content_is_valid]).to be_true
801
+ expect(resp[:all_content_is_valid]).to be true
802
+ expect(resp[:html_body][:content_is_valid]).to be true
749
803
  expect(resp[:html_body][:validation_errors]).to be_empty
750
804
  expect(resp[:suggested_template_model]['MyName']).to eq('MyName_Value')
751
805
  end
@@ -787,15 +841,15 @@ describe Postmark::ApiClient do
787
841
  'Subject' => '{{MyName}}'
788
842
  }.to_json
789
843
 
790
- http_client.should_receive(:post).with('templates/validate', expected_template_json).and_return(response)
844
+ expect(http_client).to receive(:post).with('templates/validate', expected_template_json).and_return(response)
791
845
 
792
846
  resp = subject.validate_template(:html_body => '{{#each}}',
793
847
  :text_body => '{{MyName}}',
794
848
  :subject => '{{MyName}}')
795
849
 
796
- expect(resp[:all_content_is_valid]).to be_false
797
- expect(resp[:text_body][:content_is_valid]).to be_true
798
- expect(resp[:html_body][:content_is_valid]).to be_false
850
+ expect(resp[:all_content_is_valid]).to be false
851
+ expect(resp[:text_body][:content_is_valid]).to be true
852
+ expect(resp[:html_body][:content_is_valid]).to be false
799
853
  expect(resp[:html_body][:validation_errors].first[:character_position]).to eq(1)
800
854
  expect(resp[:html_body][:validation_errors].first[:message]).to eq('The \'each\' block being opened requires a model path to be specified in the form \'{#each <name>}\'.')
801
855
  end
@@ -809,25 +863,81 @@ describe Postmark::ApiClient do
809
863
  let(:response) { {"MessageID" => 42} }
810
864
 
811
865
  it 'converts message hash to Postmark format and posts it to /email/withTemplate' do
812
- http_client.should_receive(:post).with('email/withTemplate', email_json) { response }
866
+ expect(http_client).to receive(:post).with('email/withTemplate', email_json) { response }
813
867
  subject.deliver_with_template(message_hash)
814
868
  end
815
869
 
816
870
  it 'retries 3 times' do
817
871
  2.times do
818
- http_client.should_receive(:post).and_raise(Postmark::InternalServerError)
872
+ expect(http_client).to receive(:post).and_raise(Postmark::InternalServerError, 500)
819
873
  end
820
- http_client.should_receive(:post) { response }
874
+ expect(http_client).to receive(:post) { response }
821
875
  expect { subject.deliver_with_template(message_hash) }.not_to raise_error
822
876
  end
823
877
 
824
878
  it 'converts response to ruby format' do
825
- http_client.should_receive(:post).with('email/withTemplate', email_json) { response }
879
+ expect(http_client).to receive(:post).with('email/withTemplate', email_json) { response }
826
880
  r = subject.deliver_with_template(message_hash)
827
881
  r.should have_key(:message_id)
828
882
  end
829
883
  end
830
884
 
885
+ describe '#deliver_in_batches_with_templates' do
886
+ let(:max_batch_size) { 50 }
887
+ let(:factor) { 3.5 }
888
+ let(:http_client) { subject.http_client }
889
+ let(:postmark_response) do
890
+ {
891
+ 'ErrorCode' => 0,
892
+ 'Message' => 'OK',
893
+ 'SubmittedAt' => '2018-03-14T09:56:50.4288265-04:00',
894
+ 'To' => 'recipient@example.org'
895
+ }
896
+ end
897
+
898
+ let(:message_hashes) do
899
+ Array.new((factor * max_batch_size).to_i) do
900
+ {
901
+ :template_id => 42,
902
+ :alias => 'alias',
903
+ :template_model => { :Foo => 'attr_value' },
904
+ :from => 'sender@example.org',
905
+ :to => 'recipient@example.org'
906
+ }
907
+ end
908
+ end
909
+
910
+ before { subject.max_batch_size = max_batch_size }
911
+
912
+ it 'performs a total of (bath_size / max_batch_size) requests' do
913
+ expect(http_client).
914
+ to receive(:post).with('email/batchWithTemplates', a_postmark_json).
915
+ at_most(factor.to_i).times do
916
+ Array.new(max_batch_size) { postmark_response }
917
+ end
918
+
919
+ expect(http_client).
920
+ to receive(:post).with('email/batchWithTemplates', a_postmark_json).
921
+ exactly((factor - factor.to_i).ceil).times do
922
+ response = Array.new(((factor - factor.to_i) * max_batch_size).to_i) do
923
+ postmark_response
924
+ end
925
+ response
926
+ end
927
+
928
+ response = subject.deliver_in_batches_with_templates(message_hashes)
929
+ expect(response).to be_an Array
930
+ expect(response.size).to eq message_hashes.size
931
+
932
+ response.each do |message_status|
933
+ expect(message_status).to have_key(:error_code)
934
+ expect(message_status).to have_key(:message)
935
+ expect(message_status).to have_key(:to)
936
+ expect(message_status).to have_key(:submitted_at)
937
+ end
938
+ end
939
+ end
940
+
831
941
  describe '#get_stats_totals' do
832
942
  let(:response) do
833
943
  {
@@ -838,7 +948,7 @@ describe Postmark::ApiClient do
838
948
  let(:http_client) { subject.http_client }
839
949
 
840
950
  it 'converts response to ruby format' do
841
- http_client.should_receive(:get).with('stats/outbound', { :tag => 'foo' }) { response }
951
+ expect(http_client).to receive(:get).with('stats/outbound', { :tag => 'foo' }) { response }
842
952
  r = subject.get_stats_totals(:tag => 'foo')
843
953
  r.should have_key(:sent)
844
954
  r.should have_key(:bounce_rate)
@@ -872,7 +982,7 @@ describe Postmark::ApiClient do
872
982
  let(:http_client) { subject.http_client }
873
983
 
874
984
  it 'converts response to ruby format' do
875
- http_client.should_receive(:get).with('stats/outbound/sends', { :tag => 'foo' }) { response }
985
+ expect(http_client).to receive(:get).with('stats/outbound/sends', { :tag => 'foo' }) { response }
876
986
  r = subject.get_stats_counts(:sends, :tag => 'foo')
877
987
  r.should have_key(:days)
878
988
  r.should have_key(:sent)
@@ -884,7 +994,7 @@ describe Postmark::ApiClient do
884
994
  end
885
995
 
886
996
  it 'uses fromdate that is passed in' do
887
- http_client.should_receive(:get).with('stats/outbound/sends', { :tag => 'foo', :fromdate => '2015-01-01' }) { response }
997
+ expect(http_client).to receive(:get).with('stats/outbound/sends', { :tag => 'foo', :fromdate => '2015-01-01' }) { response }
888
998
  r = subject.get_stats_counts(:sends, :tag => 'foo', :fromdate => '2015-01-01')
889
999
  r.should have_key(:days)
890
1000
  r.should have_key(:sent)
@@ -896,7 +1006,7 @@ describe Postmark::ApiClient do
896
1006
  end
897
1007
 
898
1008
  it 'uses stats type that is passed in' do
899
- http_client.should_receive(:get).with('stats/outbound/opens/readtimes', { :tag => 'foo', :type => :readtimes }) { response }
1009
+ expect(http_client).to receive(:get).with('stats/outbound/opens/readtimes', { :tag => 'foo', :type => :readtimes }) { response }
900
1010
  r = subject.get_stats_counts(:opens, :type => :readtimes, :tag => 'foo')
901
1011
  r.should have_key(:days)
902
1012
  r.should have_key(:sent)