postmark 1.13.0 → 1.14.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.
- checksums.yaml +4 -4
- data/CHANGELOG.rdoc +7 -1
- data/README.md +34 -1
- data/VERSION +1 -1
- data/lib/postmark/account_api_client.rb +8 -0
- data/lib/postmark/api_client.rb +6 -5
- data/lib/postmark/version.rb +1 -1
- data/spec/unit/postmark/api_client_spec.rb +332 -322
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 512806d8502e950b2372e80998206636f5e4ef57
|
4
|
+
data.tar.gz: a39bfc31b589a7356f6f5f719468016fed438406
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2572c526c7de534b5806458c35ff81541641388878e4ac1f8b6d7ce9122f5d05f2f8e08d81de5cedb2a3bfa0e094215a91df3d6b22deac81ef02f6fa4f913be2
|
7
|
+
data.tar.gz: fc533f59049c454a5ca0ff4e199c3f7374b964bb24ed1211f7657fc32f4d14d6c4817da4bf9645259da5e5c1e40805492a018f7ce9b41fa04d581baba3be2393
|
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
= Changelog
|
2
2
|
|
3
|
+
== 1.14.0
|
4
|
+
|
5
|
+
* Added support for verifying DKIM/Return-Path.
|
6
|
+
* Added support for searching inbound rules.
|
7
|
+
* Updated README.
|
8
|
+
|
3
9
|
== 1.13.0
|
4
10
|
|
5
11
|
* Changed default value returned by Mail::Message#metadata to a mutable hash (makes things easier for postmark-rails).
|
@@ -28,7 +34,7 @@
|
|
28
34
|
|
29
35
|
== 1.9.0
|
30
36
|
|
31
|
-
* Added methods to access domains API endoints
|
37
|
+
* Added methods to access domains API endoints.
|
32
38
|
|
33
39
|
== 1.8.1
|
34
40
|
|
data/README.md
CHANGED
@@ -194,7 +194,8 @@ client.deliver(from: 'sheldon@bigbangtheory.com',
|
|
194
194
|
|
195
195
|
## Sending a templated email
|
196
196
|
|
197
|
-
If you have a [template created](https://github.com/wildbit/postmark-gem/wiki/The-Templates-API-support) in Postmark you can send an email using that template.
|
197
|
+
If you have a [template created](https://github.com/wildbit/postmark-gem/wiki/The-Templates-API-support) in Postmark you can send an email using that template.
|
198
|
+
For the purpose of sending emails, you can reference a template by its alias or ID.
|
198
199
|
|
199
200
|
``` ruby
|
200
201
|
client.deliver_with_template(from: 'sheldon@bigbangtheory.com',
|
@@ -208,6 +209,38 @@ client.deliver_with_template(from: 'sheldon@bigbangtheory.com',
|
|
208
209
|
# => {:to=>"Penny <penny@bigbangtheory.com>", :submitted_at=>"2013-05-09T03:00:55.4454938-04:00", :message_id=>"34aed4b3-3a95-xxxx-bd1d-88064909cc93", :error_code=>0, :message=>"OK"}
|
209
210
|
```
|
210
211
|
|
212
|
+
Following example shows how to send email using template alias:
|
213
|
+
|
214
|
+
``` ruby
|
215
|
+
client.deliver_with_template(from: 'sheldon@bigbangtheory.com',
|
216
|
+
to: 'Penny <penny@bigbangtheory.com>',
|
217
|
+
template_alias: 'bigbangtheory',
|
218
|
+
template_model: {
|
219
|
+
name: 'Penny',
|
220
|
+
message: 'Bazinga!'
|
221
|
+
})
|
222
|
+
|
223
|
+
# => {:to=>"Penny <penny@bigbangtheory.com>", :submitted_at=>"2013-05-09T03:00:55.4454938-04:00", :message_id=>"34aed4b3-3a95-xxxx-bd1d-88064909cc93", :error_code=>0, :message=>"OK"}
|
224
|
+
```
|
225
|
+
|
226
|
+
## Sending a templated email in batches
|
227
|
+
|
228
|
+
``` ruby
|
229
|
+
client.deliver_with_template([{from: 'sheldon@bigbangtheory.com',
|
230
|
+
to: 'Penny <penny@bigbangtheory.com>',
|
231
|
+
template_alias: 'bigbangtheory',
|
232
|
+
template_model: {
|
233
|
+
name: 'Penny',
|
234
|
+
message: 'Bazinga!'
|
235
|
+
}
|
236
|
+
},
|
237
|
+
{from: 'tom@bigbangtheory.com',
|
238
|
+
to: '<sheldon@bigbangtheory.com>',
|
239
|
+
template_id: 53,
|
240
|
+
template_model: {}
|
241
|
+
}])
|
242
|
+
```
|
243
|
+
|
211
244
|
## Sending in batches
|
212
245
|
|
213
246
|
While Postmark is focused on transactional email, we understand that developers
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.14.0
|
@@ -89,6 +89,14 @@ module Postmark
|
|
89
89
|
format_response http_client.put("domains/#{id.to_i}", data)
|
90
90
|
end
|
91
91
|
|
92
|
+
def verify_domain_dkim(id)
|
93
|
+
format_response http_client.put("domains/#{id.to_i}/verifydkim")
|
94
|
+
end
|
95
|
+
|
96
|
+
def verify_domain_return_path(id)
|
97
|
+
format_response http_client.put("domains/#{id.to_i}/verifyreturnpath")
|
98
|
+
end
|
99
|
+
|
92
100
|
def verified_domain_spf?(id)
|
93
101
|
!!http_client.post("domains/#{id.to_i}/verifyspf")['SPFVerified']
|
94
102
|
end
|
data/lib/postmark/api_client.rb
CHANGED
@@ -150,6 +150,7 @@ module Postmark
|
|
150
150
|
end
|
151
151
|
|
152
152
|
def create_trigger(type, options)
|
153
|
+
type = Postmark::Inflector.to_postmark(type).downcase
|
153
154
|
data = serialize(HashHelper.to_postmark(options))
|
154
155
|
format_response http_client.post("triggers/#{type}", data)
|
155
156
|
end
|
@@ -164,16 +165,19 @@ module Postmark
|
|
164
165
|
end
|
165
166
|
|
166
167
|
def delete_trigger(type, id)
|
168
|
+
type = Postmark::Inflector.to_postmark(type).downcase
|
167
169
|
format_response http_client.delete("triggers/#{type}/#{id}")
|
168
170
|
end
|
169
171
|
|
170
172
|
def get_triggers(type, options = {})
|
171
|
-
|
173
|
+
type = Postmark::Inflector.to_postmark(type)
|
174
|
+
_, batch = load_batch("triggers/#{type.downcase}", type, options)
|
172
175
|
batch
|
173
176
|
end
|
174
177
|
|
175
178
|
def triggers(type, options = {})
|
176
|
-
|
179
|
+
type = Postmark::Inflector.to_postmark(type)
|
180
|
+
find_each("triggers/#{type.downcase}", type, options)
|
177
181
|
end
|
178
182
|
|
179
183
|
def server_info
|
@@ -258,13 +262,10 @@ module Postmark
|
|
258
262
|
|
259
263
|
def get_stats_counts(stat, options = {})
|
260
264
|
url = "stats/outbound/#{stat}"
|
261
|
-
|
262
265
|
url << "/#{options[:type]}" if options.has_key?(:type)
|
263
266
|
|
264
267
|
response = format_response(http_client.get(url, options))
|
265
|
-
|
266
268
|
response[:days].map! { |d| HashHelper.to_ruby(d) }
|
267
|
-
|
268
269
|
response
|
269
270
|
end
|
270
271
|
|
data/lib/postmark/version.rb
CHANGED
@@ -1,14 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Postmark::ApiClient do
|
4
|
-
|
5
|
-
let(:
|
6
|
-
let(:
|
7
|
-
let(:message_hash) {
|
8
|
-
{
|
9
|
-
:from => "support@postmarkapp.com"
|
10
|
-
}
|
11
|
-
}
|
4
|
+
let(:api_token) {"provided-api-token"}
|
5
|
+
let(:max_retries) {42}
|
6
|
+
let(:message_hash) {{:from => "support@postmarkapp.com"}}
|
12
7
|
let(:message) {
|
13
8
|
Mail.new do
|
14
9
|
from "support@postmarkapp.com"
|
@@ -16,37 +11,30 @@ describe Postmark::ApiClient do
|
|
16
11
|
end
|
17
12
|
}
|
18
13
|
|
19
|
-
let(:api_client) {
|
20
|
-
subject {
|
14
|
+
let(:api_client) {Postmark::ApiClient.new(api_token)}
|
15
|
+
subject {api_client}
|
21
16
|
|
22
17
|
context "attr readers" do
|
23
|
-
it {
|
24
|
-
it {
|
18
|
+
it {should respond_to(:http_client)}
|
19
|
+
it {should respond_to(:max_retries)}
|
25
20
|
end
|
26
21
|
|
27
22
|
context "when it's created without options" do
|
28
|
-
|
29
|
-
its(:max_retries) { should eq 3 }
|
30
|
-
|
23
|
+
its(:max_retries) {should eq 3}
|
31
24
|
end
|
32
25
|
|
33
26
|
context "when it's created with user options" do
|
34
|
-
|
35
|
-
|
36
|
-
:foo => :bar)}
|
37
|
-
|
38
|
-
its(:max_retries) { should eq max_retries }
|
27
|
+
subject {Postmark::ApiClient.new(api_token, :max_retries => max_retries, :foo => :bar)}
|
28
|
+
its(:max_retries) {should eq max_retries}
|
39
29
|
|
40
30
|
it 'passes other options to HttpClient instance' do
|
41
31
|
allow(Postmark::HttpClient).to receive(:new).with(api_token, :foo => :bar)
|
42
32
|
subject.should be
|
43
33
|
end
|
44
|
-
|
45
34
|
end
|
46
35
|
|
47
36
|
describe "#api_token=" do
|
48
|
-
|
49
|
-
let(:api_token) { "new-api-token-value" }
|
37
|
+
let(:api_token) {"new-api-token-value"}
|
50
38
|
|
51
39
|
it 'assigns the api token to the http client instance' do
|
52
40
|
subject.api_token = api_token
|
@@ -57,56 +45,55 @@ describe Postmark::ApiClient do
|
|
57
45
|
subject.api_key = api_token
|
58
46
|
subject.http_client.api_token.should == api_token
|
59
47
|
end
|
60
|
-
|
61
48
|
end
|
62
49
|
|
63
50
|
describe "#deliver" do
|
64
|
-
let(:email) {
|
65
|
-
let(:email_json) {
|
66
|
-
let(:http_client) {
|
67
|
-
let(:response) {
|
51
|
+
let(:email) {Postmark::MessageHelper.to_postmark(message_hash)}
|
52
|
+
let(:email_json) {Postmark::Json.encode(email)}
|
53
|
+
let(:http_client) {subject.http_client}
|
54
|
+
let(:response) {{"MessageID" => 42}}
|
68
55
|
|
69
56
|
it 'converts message hash to Postmark format and posts it to /email' do
|
70
|
-
allow(http_client).to receive(:post).with('email', email_json) {
|
57
|
+
allow(http_client).to receive(:post).with('email', email_json) {response}
|
71
58
|
subject.deliver(message_hash)
|
72
59
|
end
|
73
60
|
|
74
61
|
it 'retries 3 times' do
|
75
62
|
expect(http_client).to receive(:post).twice.and_raise(Postmark::InternalServerError)
|
76
|
-
expect(http_client).to receive(:post) {
|
77
|
-
expect {
|
63
|
+
expect(http_client).to receive(:post) {response}
|
64
|
+
expect {subject.deliver(message_hash)}.not_to raise_error
|
78
65
|
end
|
79
66
|
|
80
67
|
it 'converts response to ruby format' do
|
81
|
-
expect(http_client).to receive(:post).with('email', email_json) {
|
68
|
+
expect(http_client).to receive(:post).with('email', email_json) {response}
|
82
69
|
r = subject.deliver(message_hash)
|
83
70
|
r.should have_key(:message_id)
|
84
71
|
end
|
85
72
|
end
|
86
73
|
|
87
74
|
describe "#deliver_in_batches" do
|
88
|
-
let(:email) {
|
89
|
-
let(:emails) {
|
90
|
-
let(:emails_json) {
|
91
|
-
let(:http_client) {
|
92
|
-
let(:response) {
|
75
|
+
let(:email) {Postmark::MessageHelper.to_postmark(message_hash)}
|
76
|
+
let(:emails) {[email, email, email]}
|
77
|
+
let(:emails_json) {Postmark::Json.encode(emails)}
|
78
|
+
let(:http_client) {subject.http_client}
|
79
|
+
let(:response) {[{'ErrorCode' => 0}, {'ErrorCode' => 0}, {'ErrorCode' => 0}]}
|
93
80
|
|
94
81
|
it 'turns array of messages into a JSON document and posts it to /email/batch' do
|
95
|
-
expect(http_client).to receive(:post).with('email/batch', emails_json) {
|
82
|
+
expect(http_client).to receive(:post).with('email/batch', emails_json) {response}
|
96
83
|
subject.deliver_in_batches([message_hash, message_hash, message_hash])
|
97
84
|
end
|
98
85
|
|
99
86
|
it 'converts response to ruby format' do
|
100
|
-
expect(http_client).to receive(:post).with('email/batch', emails_json) {
|
87
|
+
expect(http_client).to receive(:post).with('email/batch', emails_json) {response}
|
101
88
|
response = subject.deliver_in_batches([message_hash, message_hash, message_hash])
|
102
89
|
response.first.should have_key(:error_code)
|
103
90
|
end
|
104
91
|
end
|
105
92
|
|
106
93
|
describe "#deliver_message" do
|
107
|
-
let(:email) {
|
108
|
-
let(:email_json) {
|
109
|
-
let(:http_client) {
|
94
|
+
let(:email) {message.to_postmark_hash}
|
95
|
+
let(:email_json) {Postmark::Json.encode(email)}
|
96
|
+
let(:http_client) {subject.http_client}
|
110
97
|
|
111
98
|
it 'turns message into a JSON document and posts it to /email' do
|
112
99
|
expect(http_client).to receive(:post).with('email', email_json)
|
@@ -118,32 +105,31 @@ describe Postmark::ApiClient do
|
|
118
105
|
expect(http_client).to receive(:post).and_raise(Postmark::InternalServerError)
|
119
106
|
end
|
120
107
|
expect(http_client).to receive(:post)
|
121
|
-
expect {
|
108
|
+
expect {subject.deliver_message(message)}.not_to raise_error
|
122
109
|
end
|
123
110
|
|
124
111
|
it "retries on timeout" do
|
125
112
|
expect(http_client).to receive(:post).and_raise(Postmark::TimeoutError)
|
126
113
|
expect(http_client).to receive(:post)
|
127
|
-
expect {
|
114
|
+
expect {subject.deliver_message(message)}.not_to raise_error
|
128
115
|
end
|
129
116
|
|
130
117
|
it "proxies errors" do
|
131
118
|
allow(http_client).to receive(:post).and_raise(Postmark::TimeoutError)
|
132
|
-
expect {
|
119
|
+
expect {subject.deliver_message(message)}.to raise_error(Postmark::TimeoutError)
|
133
120
|
end
|
134
121
|
|
135
122
|
end
|
136
123
|
|
137
124
|
describe "#deliver_messages" do
|
138
|
-
|
139
|
-
let(:
|
140
|
-
let(:
|
141
|
-
let(:
|
142
|
-
let(:
|
143
|
-
let(:response) { [{}, {}, {}] }
|
125
|
+
let(:email) {message.to_postmark_hash}
|
126
|
+
let(:emails) {[email, email, email]}
|
127
|
+
let(:emails_json) {Postmark::Json.encode(emails)}
|
128
|
+
let(:http_client) {subject.http_client}
|
129
|
+
let(:response) {[{}, {}, {}]}
|
144
130
|
|
145
131
|
it 'turns array of messages into a JSON document and posts it to /email/batch' do
|
146
|
-
expect(http_client).to receive(:post).with('email/batch', emails_json) {
|
132
|
+
expect(http_client).to receive(:post).with('email/batch', emails_json) {response}
|
147
133
|
subject.deliver_messages([message, message, message])
|
148
134
|
end
|
149
135
|
|
@@ -151,36 +137,31 @@ describe Postmark::ApiClient do
|
|
151
137
|
2.times do
|
152
138
|
expect(http_client).to receive(:post).and_raise(Postmark::InternalServerError)
|
153
139
|
end
|
154
|
-
expect(http_client).to receive(:post) {
|
155
|
-
expect {
|
140
|
+
expect(http_client).to receive(:post) {response}
|
141
|
+
expect {subject.deliver_messages([message, message, message])}.not_to raise_error
|
156
142
|
end
|
157
143
|
|
158
144
|
it "should retry on timeout" do
|
159
145
|
expect(http_client).to receive(:post).and_raise(Postmark::TimeoutError)
|
160
|
-
expect(http_client).to receive(:post) {
|
161
|
-
expect {
|
146
|
+
expect(http_client).to receive(:post) {response}
|
147
|
+
expect {subject.deliver_messages([message, message, message])}.not_to raise_error
|
162
148
|
end
|
163
149
|
|
164
150
|
end
|
165
151
|
|
166
152
|
describe "#delivery_stats" do
|
167
|
-
let(:http_client) {
|
168
|
-
let(:response) {
|
153
|
+
let(:http_client) {subject.http_client}
|
154
|
+
let(:response) {{"Bounces" => [{"Foo" => "Bar"}]}}
|
169
155
|
|
170
156
|
it 'requests data at /deliverystats' do
|
171
|
-
expect(http_client).to receive(:get).with("deliverystats") {
|
157
|
+
expect(http_client).to receive(:get).with("deliverystats") {response}
|
172
158
|
subject.delivery_stats.should have_key(:bounces)
|
173
159
|
end
|
174
160
|
end
|
175
161
|
|
176
162
|
describe '#messages' do
|
177
|
-
|
178
163
|
context 'given outbound' do
|
179
|
-
|
180
|
-
let(:response) {
|
181
|
-
{'TotalCount' => 5,
|
182
|
-
'Messages' => [{}].cycle(5).to_a}
|
183
|
-
}
|
164
|
+
let(:response) {{'TotalCount' => 5, 'Messages' => [{}].cycle(5).to_a}}
|
184
165
|
|
185
166
|
it 'returns an enumerator' do
|
186
167
|
expect(subject.messages).to be_kind_of(Enumerable)
|
@@ -191,15 +172,10 @@ describe Postmark::ApiClient do
|
|
191
172
|
with('messages/outbound', an_instance_of(Hash)).and_return(response)
|
192
173
|
expect(subject.messages.count).to eq(5)
|
193
174
|
end
|
194
|
-
|
195
175
|
end
|
196
176
|
|
197
177
|
context 'given inbound' do
|
198
|
-
|
199
|
-
let(:response) {
|
200
|
-
{'TotalCount' => 5,
|
201
|
-
'InboundMessages' => [{}].cycle(5).to_a}
|
202
|
-
}
|
178
|
+
let(:response) {{'TotalCount' => 5, 'InboundMessages' => [{}].cycle(5).to_a}}
|
203
179
|
|
204
180
|
it 'returns an enumerator' do
|
205
181
|
expect(subject.messages(:inbound => true)).to be_kind_of(Enumerable)
|
@@ -216,37 +192,36 @@ describe Postmark::ApiClient do
|
|
216
192
|
end
|
217
193
|
|
218
194
|
describe '#get_messages' do
|
219
|
-
let(:http_client) {
|
195
|
+
let(:http_client) {subject.http_client}
|
220
196
|
|
221
197
|
context 'given outbound' do
|
222
|
-
let(:response) {
|
198
|
+
let(:response) {{"TotalCount" => 1, "Messages" => [{}]}}
|
223
199
|
|
224
200
|
it 'requests data at /messages/outbound' do
|
225
201
|
expect(http_client).to receive(:get).
|
226
|
-
|
227
|
-
|
202
|
+
with('messages/outbound', :offset => 50, :count => 50).
|
203
|
+
and_return(response)
|
228
204
|
subject.get_messages(:offset => 50, :count => 50)
|
229
205
|
end
|
230
206
|
|
231
207
|
end
|
232
208
|
|
233
209
|
context 'given inbound' do
|
234
|
-
let(:response) {
|
210
|
+
let(:response) {{"TotalCount" => 1, "InboundMessages" => [{}]}}
|
235
211
|
|
236
212
|
it 'requests data at /messages/inbound' do
|
237
213
|
expect(http_client).to receive(:get).
|
238
|
-
|
239
|
-
|
214
|
+
with('messages/inbound', :offset => 50, :count => 50).
|
215
|
+
and_return(response)
|
240
216
|
subject.get_messages(:inbound => true, :offset => 50, :count => 50).
|
241
|
-
|
217
|
+
should be_an(Array)
|
242
218
|
end
|
243
219
|
|
244
220
|
end
|
245
221
|
end
|
246
222
|
|
247
223
|
describe '#get_messages_count' do
|
248
|
-
|
249
|
-
let(:response) { {'TotalCount' => 42} }
|
224
|
+
let(:response) {{'TotalCount' => 42}}
|
250
225
|
|
251
226
|
context 'given outbound' do
|
252
227
|
|
@@ -260,75 +235,66 @@ describe Postmark::ApiClient do
|
|
260
235
|
end
|
261
236
|
|
262
237
|
context 'given inbound' do
|
263
|
-
|
264
238
|
it 'requests and returns inbound messages count' do
|
265
239
|
allow(subject.http_client).to receive(:get).
|
266
240
|
with('messages/inbound', an_instance_of(Hash)).and_return(response)
|
267
241
|
expect(subject.get_messages_count(:inbound => true)).to eq(42)
|
268
242
|
end
|
269
|
-
|
270
243
|
end
|
271
244
|
|
272
245
|
end
|
273
246
|
|
274
247
|
describe '#get_message' do
|
275
|
-
let(:id) {
|
276
|
-
let(:http_client) {
|
277
|
-
let(:response) {
|
248
|
+
let(:id) {'8ad0e8b0-xxxx-xxxx-951d-223c581bb467'}
|
249
|
+
let(:http_client) {subject.http_client}
|
250
|
+
let(:response) {{"To" => "leonard@bigbangtheory.com"}}
|
278
251
|
|
279
252
|
context 'given outbound' do
|
280
|
-
|
281
253
|
it 'requests a single message by id at /messages/outbound/:id/details' do
|
282
254
|
expect(http_client).to receive(:get).
|
283
|
-
|
284
|
-
|
255
|
+
with("messages/outbound/#{id}/details", {}).
|
256
|
+
and_return(response)
|
285
257
|
subject.get_message(id).should have_key(:to)
|
286
258
|
end
|
287
|
-
|
288
259
|
end
|
289
260
|
|
290
261
|
context 'given inbound' do
|
291
|
-
|
292
262
|
it 'requests a single message by id at /messages/inbound/:id/details' do
|
293
263
|
expect(http_client).to receive(:get).
|
294
|
-
|
295
|
-
|
264
|
+
with("messages/inbound/#{id}/details", {}).
|
265
|
+
and_return(response)
|
296
266
|
subject.get_message(id, :inbound => true).should have_key(:to)
|
297
267
|
end
|
298
|
-
|
299
268
|
end
|
300
269
|
end
|
301
270
|
|
302
271
|
describe '#dump_message' do
|
303
|
-
let(:id) {
|
304
|
-
let(:http_client) {
|
305
|
-
let(:response) {
|
272
|
+
let(:id) {'8ad0e8b0-xxxx-xxxx-951d-223c581bb467'}
|
273
|
+
let(:http_client) {subject.http_client}
|
274
|
+
let(:response) {{"Body" => "From: <leonard@bigbangtheory.com> \r\n ..."}}
|
306
275
|
|
307
276
|
context 'given outbound' do
|
308
277
|
|
309
278
|
it 'requests a single message by id at /messages/outbound/:id/dump' do
|
310
279
|
expect(http_client).to receive(:get).
|
311
|
-
|
312
|
-
|
280
|
+
with("messages/outbound/#{id}/dump", {}).
|
281
|
+
and_return(response)
|
313
282
|
subject.dump_message(id).should have_key(:body)
|
314
283
|
end
|
315
284
|
|
316
285
|
end
|
317
286
|
|
318
287
|
context 'given inbound' do
|
319
|
-
|
320
288
|
it 'requests a single message by id at /messages/inbound/:id/dump' do
|
321
289
|
expect(http_client).to receive(:get).
|
322
|
-
|
323
|
-
|
290
|
+
with("messages/inbound/#{id}/dump", {}).
|
291
|
+
and_return(response)
|
324
292
|
subject.dump_message(id, :inbound => true).should have_key(:body)
|
325
293
|
end
|
326
|
-
|
327
294
|
end
|
328
295
|
end
|
329
296
|
|
330
297
|
describe '#bounces' do
|
331
|
-
|
332
298
|
it 'returns an Enumerator' do
|
333
299
|
expect(subject.bounces).to be_kind_of(Enumerable)
|
334
300
|
end
|
@@ -339,23 +305,22 @@ describe Postmark::ApiClient do
|
|
339
305
|
and_return('TotalCount' => 1, 'Bounces' => [{}])
|
340
306
|
expect(subject.bounces.first(5).count).to eq(1)
|
341
307
|
end
|
342
|
-
|
343
308
|
end
|
344
309
|
|
345
310
|
describe "#get_bounces" do
|
346
|
-
let(:http_client) {
|
347
|
-
let(:options) {
|
348
|
-
let(:response) {
|
311
|
+
let(:http_client) {subject.http_client}
|
312
|
+
let(:options) {{:foo => :bar}}
|
313
|
+
let(:response) {{"Bounces" => []}}
|
349
314
|
|
350
315
|
it 'requests data at /bounces' do
|
351
|
-
allow(http_client).to receive(:get).with("bounces", options) {
|
316
|
+
allow(http_client).to receive(:get).with("bounces", options) {response}
|
352
317
|
expect(subject.get_bounces(options)).to be_an(Array)
|
353
318
|
expect(subject.get_bounces(options).count).to be_zero
|
354
319
|
end
|
355
320
|
end
|
356
321
|
|
357
322
|
describe "#get_bounced_tags" do
|
358
|
-
let(:http_client) {
|
323
|
+
let(:http_client) {subject.http_client}
|
359
324
|
|
360
325
|
it 'requests data at /bounces/tags' do
|
361
326
|
expect(http_client).to receive(:get).with("bounces/tags")
|
@@ -364,8 +329,8 @@ describe Postmark::ApiClient do
|
|
364
329
|
end
|
365
330
|
|
366
331
|
describe "#get_bounce" do
|
367
|
-
let(:http_client) {
|
368
|
-
let(:id) {
|
332
|
+
let(:http_client) {subject.http_client}
|
333
|
+
let(:id) {42}
|
369
334
|
|
370
335
|
it 'requests a single bounce by ID at /bounces/:id' do
|
371
336
|
expect(http_client).to receive(:get).with("bounces/#{id}")
|
@@ -374,8 +339,8 @@ describe Postmark::ApiClient do
|
|
374
339
|
end
|
375
340
|
|
376
341
|
describe "#dump_bounce" do
|
377
|
-
let(:http_client) {
|
378
|
-
let(:id) {
|
342
|
+
let(:http_client) {subject.http_client}
|
343
|
+
let(:id) {42}
|
379
344
|
|
380
345
|
it 'requests a specific bounce data at /bounces/:id/dump' do
|
381
346
|
expect(http_client).to receive(:get).with("bounces/#{id}/dump")
|
@@ -384,18 +349,17 @@ describe Postmark::ApiClient do
|
|
384
349
|
end
|
385
350
|
|
386
351
|
describe "#activate_bounce" do
|
387
|
-
let(:http_client) {
|
388
|
-
let(:id) {
|
389
|
-
let(:response) {
|
352
|
+
let(:http_client) {subject.http_client}
|
353
|
+
let(:id) {42}
|
354
|
+
let(:response) {{"Bounce" => {}}}
|
390
355
|
|
391
356
|
it 'activates a specific bounce by sending a PUT request to /bounces/:id/activate' do
|
392
|
-
expect(http_client).to receive(:put).with("bounces/#{id}/activate") {
|
357
|
+
expect(http_client).to receive(:put).with("bounces/#{id}/activate") {response}
|
393
358
|
subject.activate_bounce(id)
|
394
359
|
end
|
395
360
|
end
|
396
361
|
|
397
362
|
describe '#opens' do
|
398
|
-
|
399
363
|
it 'returns an Enumerator' do
|
400
364
|
expect(subject.opens).to be_kind_of(Enumerable)
|
401
365
|
end
|
@@ -406,7 +370,6 @@ describe Postmark::ApiClient do
|
|
406
370
|
and_return('TotalCount' => 1, 'Opens' => [{}])
|
407
371
|
expect(subject.opens.first(5).count).to eq(1)
|
408
372
|
end
|
409
|
-
|
410
373
|
end
|
411
374
|
|
412
375
|
describe '#clicks' do
|
@@ -423,63 +386,63 @@ describe Postmark::ApiClient do
|
|
423
386
|
end
|
424
387
|
|
425
388
|
describe '#get_opens' do
|
426
|
-
let(:http_client) {
|
427
|
-
let(:options) {
|
428
|
-
let(:response) {
|
389
|
+
let(:http_client) {subject.http_client}
|
390
|
+
let(:options) {{:offset => 5}}
|
391
|
+
let(:response) {{'Opens' => [], 'TotalCount' => 0}}
|
429
392
|
|
430
393
|
it 'performs a GET request to /messages/outbound/opens' do
|
431
|
-
allow(http_client).to receive(:get).with('messages/outbound/opens', options) {
|
394
|
+
allow(http_client).to receive(:get).with('messages/outbound/opens', options) {response}
|
432
395
|
expect(subject.get_opens(options)).to be_an(Array)
|
433
396
|
expect(subject.get_opens(options).count).to be_zero
|
434
397
|
end
|
435
398
|
end
|
436
399
|
|
437
400
|
describe '#get_clicks' do
|
438
|
-
let(:http_client) {
|
439
|
-
let(:options) {
|
440
|
-
let(:response) {
|
401
|
+
let(:http_client) {subject.http_client}
|
402
|
+
let(:options) {{:offset => 5}}
|
403
|
+
let(:response) {{'Clicks' => [], 'TotalCount' => 0}}
|
441
404
|
|
442
405
|
it 'performs a GET request to /messages/outbound/clicks' do
|
443
|
-
allow(http_client).to receive(:get).with('messages/outbound/clicks', options) {
|
406
|
+
allow(http_client).to receive(:get).with('messages/outbound/clicks', options) {response}
|
444
407
|
expect(subject.get_clicks(options)).to be_an(Array)
|
445
408
|
expect(subject.get_clicks(options).count).to be_zero
|
446
409
|
end
|
447
410
|
end
|
448
411
|
|
449
412
|
describe '#get_opens_by_message_id' do
|
450
|
-
let(:http_client) {
|
451
|
-
let(:message_id) {
|
452
|
-
let(:options) {
|
453
|
-
let(:response) {
|
413
|
+
let(:http_client) {subject.http_client}
|
414
|
+
let(:message_id) {42}
|
415
|
+
let(:options) {{:offset => 5}}
|
416
|
+
let(:response) {{'Opens' => [], 'TotalCount' => 0}}
|
454
417
|
|
455
418
|
it 'performs a GET request to /messages/outbound/opens' do
|
456
419
|
allow(http_client).
|
457
420
|
to receive(:get).with("messages/outbound/opens/#{message_id}",
|
458
421
|
options).
|
459
|
-
|
422
|
+
and_return(response)
|
460
423
|
expect(subject.get_opens_by_message_id(message_id, options)).to be_an(Array)
|
461
424
|
expect(subject.get_opens_by_message_id(message_id, options).count).to be_zero
|
462
425
|
end
|
463
426
|
end
|
464
427
|
|
465
428
|
describe '#get_clicks_by_message_id' do
|
466
|
-
let(:http_client) {
|
467
|
-
let(:message_id) {
|
468
|
-
let(:options) {
|
469
|
-
let(:response) {
|
429
|
+
let(:http_client) {subject.http_client}
|
430
|
+
let(:message_id) {42}
|
431
|
+
let(:options) {{:offset => 5}}
|
432
|
+
let(:response) {{'Clicks' => [], 'TotalCount' => 0}}
|
470
433
|
|
471
434
|
it 'performs a GET request to /messages/outbound/clicks' do
|
472
435
|
allow(http_client).
|
473
436
|
to receive(:get).with("messages/outbound/clicks/#{message_id}",
|
474
437
|
options).
|
475
|
-
|
438
|
+
and_return(response)
|
476
439
|
expect(subject.get_clicks_by_message_id(message_id, options)).to be_an(Array)
|
477
440
|
expect(subject.get_clicks_by_message_id(message_id, options).count).to be_zero
|
478
441
|
end
|
479
442
|
end
|
480
443
|
|
481
444
|
describe '#opens_by_message_id' do
|
482
|
-
let(:message_id) {
|
445
|
+
let(:message_id) {42}
|
483
446
|
|
484
447
|
it 'returns an Enumerator' do
|
485
448
|
expect(subject.opens_by_message_id(message_id)).to be_kind_of(Enumerable)
|
@@ -494,7 +457,7 @@ describe Postmark::ApiClient do
|
|
494
457
|
end
|
495
458
|
|
496
459
|
describe '#clicks_by_message_id' do
|
497
|
-
let(:message_id) {
|
460
|
+
let(:message_id) {42}
|
498
461
|
|
499
462
|
it 'returns an Enumerator' do
|
500
463
|
expect(subject.clicks_by_message_id(message_id)).to be_kind_of(Enumerable)
|
@@ -509,25 +472,44 @@ describe Postmark::ApiClient do
|
|
509
472
|
end
|
510
473
|
|
511
474
|
describe '#create_trigger' do
|
512
|
-
let(:http_client) {
|
513
|
-
let(:options) { {:foo => 'bar'} }
|
514
|
-
let(:response) { {'Foo' => 'Bar'} }
|
475
|
+
let(:http_client) {subject.http_client}
|
515
476
|
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
477
|
+
context 'tags' do
|
478
|
+
let(:options) {{:foo => 'bar'}}
|
479
|
+
let(:response) {{'Foo' => 'Bar'}}
|
480
|
+
|
481
|
+
it 'performs a POST request to /triggers/tags with given options' do
|
482
|
+
allow(http_client).to receive(:post).with('triggers/tags',
|
483
|
+
{'Foo' => 'bar'}.to_json)
|
484
|
+
subject.create_trigger(:tags, options)
|
485
|
+
end
|
486
|
+
|
487
|
+
it 'symbolizes response keys' do
|
488
|
+
allow(http_client).to receive(:post).and_return(response)
|
489
|
+
expect(subject.create_trigger(:tags, options)).to eq(:foo => 'Bar')
|
490
|
+
end
|
520
491
|
end
|
521
492
|
|
522
|
-
|
523
|
-
|
524
|
-
|
493
|
+
context 'inbound rules' do
|
494
|
+
let(:options) {{:rule => 'example.com'}}
|
495
|
+
let(:response) {{'Rule' => 'example.com'}}
|
496
|
+
|
497
|
+
it 'performs a POST request to /triggers/inboundrules with given options' do
|
498
|
+
allow(http_client).to receive(:post).with('triggers/inboundrules',
|
499
|
+
{'Rule' => 'example.com'}.to_json)
|
500
|
+
subject.create_trigger(:inbound_rules, options)
|
501
|
+
end
|
502
|
+
|
503
|
+
it 'symbolizes response keys' do
|
504
|
+
allow(http_client).to receive(:post).and_return(response)
|
505
|
+
expect(subject.create_trigger(:inbound_rules, options)).to eq(:rule => 'example.com')
|
506
|
+
end
|
525
507
|
end
|
526
508
|
end
|
527
509
|
|
528
510
|
describe '#get_trigger' do
|
529
|
-
let(:http_client) {
|
530
|
-
let(:id) {
|
511
|
+
let(:http_client) {subject.http_client}
|
512
|
+
let(:id) {42}
|
531
513
|
|
532
514
|
it 'performs a GET request to /triggers/tags/:id' do
|
533
515
|
allow(http_client).to receive(:get).with("triggers/tags/#{id}")
|
@@ -541,9 +523,9 @@ describe Postmark::ApiClient do
|
|
541
523
|
end
|
542
524
|
|
543
525
|
describe '#update_trigger' do
|
544
|
-
let(:http_client) {
|
545
|
-
let(:options) {
|
546
|
-
let(:id) {
|
526
|
+
let(:http_client) {subject.http_client}
|
527
|
+
let(:options) {{:foo => 'bar'}}
|
528
|
+
let(:id) {42}
|
547
529
|
|
548
530
|
it 'performs a PUT request to /triggers/tags/:id' do
|
549
531
|
allow(http_client).to receive(:put).with("triggers/tags/#{id}",
|
@@ -558,34 +540,63 @@ describe Postmark::ApiClient do
|
|
558
540
|
end
|
559
541
|
|
560
542
|
describe '#delete_trigger' do
|
561
|
-
let(:http_client) {
|
562
|
-
|
543
|
+
let(:http_client) {subject.http_client}
|
544
|
+
|
545
|
+
context 'tags' do
|
546
|
+
let(:id) {42}
|
547
|
+
|
548
|
+
it 'performs a DELETE request to /triggers/tags/:id' do
|
549
|
+
allow(http_client).to receive(:delete).with("triggers/tags/#{id}")
|
550
|
+
subject.delete_trigger(:tags, id)
|
551
|
+
end
|
563
552
|
|
564
|
-
|
565
|
-
|
566
|
-
|
553
|
+
it 'symbolizes response keys' do
|
554
|
+
allow(http_client).to receive(:delete).and_return('Foo' => 'Bar')
|
555
|
+
expect(subject.delete_trigger(:tags, id)).to eq(:foo => 'Bar')
|
556
|
+
end
|
567
557
|
end
|
558
|
+
|
559
|
+
context 'inbound rules' do
|
560
|
+
let(:id) {42}
|
568
561
|
|
569
|
-
|
570
|
-
|
571
|
-
|
562
|
+
it 'performs a DELETE request to /triggers/inboundrules/:id' do
|
563
|
+
allow(http_client).to receive(:delete).with("triggers/inboundrules/#{id}")
|
564
|
+
subject.delete_trigger(:inbound_rules, id)
|
565
|
+
end
|
566
|
+
|
567
|
+
it 'symbolizes response keys' do
|
568
|
+
allow(http_client).to receive(:delete).and_return('Rule' => 'example.com')
|
569
|
+
expect(subject.delete_trigger(:tags, id)).to eq(:rule => 'example.com')
|
570
|
+
end
|
572
571
|
end
|
573
572
|
end
|
574
573
|
|
575
574
|
describe '#get_triggers' do
|
576
|
-
let(:http_client) {
|
577
|
-
let(:options) {
|
578
|
-
let(:response) { {'Tags' => [], 'TotalCount' => 0} }
|
575
|
+
let(:http_client) {subject.http_client}
|
576
|
+
let(:options) {{:offset => 5}}
|
579
577
|
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
578
|
+
context 'tags' do
|
579
|
+
let(:response) {{'Tags' => [], 'TotalCount' => 0}}
|
580
|
+
|
581
|
+
it 'performs a GET request to /triggers/tags' do
|
582
|
+
allow(http_client).to receive(:get).with('triggers/tags', options) {response}
|
583
|
+
expect(subject.get_triggers(:tags, options)).to be_an(Array)
|
584
|
+
expect(subject.get_triggers(:tags, options).count).to be_zero
|
585
|
+
end
|
586
|
+
end
|
587
|
+
|
588
|
+
context 'inbound rules' do
|
589
|
+
let(:response) {{'InboundRules' => [], 'TotalCount' => 0}}
|
590
|
+
|
591
|
+
it 'performs a GET request to /triggers/inboundrules' do
|
592
|
+
allow(http_client).to receive(:get).with('triggers/inboundrules', options) {response}
|
593
|
+
expect(subject.get_triggers(:inbound_rules, options)).to be_an(Array)
|
594
|
+
expect(subject.get_triggers(:inbound_rules, options).count).to be_zero
|
595
|
+
end
|
584
596
|
end
|
585
597
|
end
|
586
598
|
|
587
599
|
describe '#triggers' do
|
588
|
-
|
589
600
|
it 'returns an Enumerator' do
|
590
601
|
expect(subject.triggers(:tags)).to be_kind_of(Enumerable)
|
591
602
|
end
|
@@ -596,53 +607,52 @@ describe Postmark::ApiClient do
|
|
596
607
|
and_return('TotalCount' => 1, 'Tags' => [{}])
|
597
608
|
expect(subject.triggers(:tags).first(5).count).to eq(1)
|
598
609
|
end
|
599
|
-
|
600
610
|
end
|
601
611
|
|
602
612
|
describe "#server_info" do
|
603
|
-
let(:http_client) {
|
604
|
-
let(:response) {
|
605
|
-
|
606
|
-
|
607
|
-
|
613
|
+
let(:http_client) {subject.http_client}
|
614
|
+
let(:response) {{"Name" => "Testing",
|
615
|
+
"Color" => "blue",
|
616
|
+
"InboundHash" => "c2425d77f74f8643e5f6237438086c81",
|
617
|
+
"SmtpApiActivated" => true}}
|
608
618
|
|
609
619
|
it 'requests server info from Postmark and converts it to ruby format' do
|
610
|
-
expect(http_client).to receive(:get).with('server') {
|
620
|
+
expect(http_client).to receive(:get).with('server') {response}
|
611
621
|
subject.server_info.should have_key(:inbound_hash)
|
612
622
|
end
|
613
623
|
end
|
614
624
|
|
615
625
|
describe "#update_server_info" do
|
616
|
-
let(:http_client) {
|
617
|
-
let(:response) {
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
let(:update) {
|
626
|
+
let(:http_client) {subject.http_client}
|
627
|
+
let(:response) {{"Name" => "Testing",
|
628
|
+
"Color" => "blue",
|
629
|
+
"InboundHash" => "c2425d77f74f8643e5f6237438086c81",
|
630
|
+
"SmtpApiActivated" => false}}
|
631
|
+
let(:update) {{:smtp_api_activated => false}}
|
622
632
|
|
623
633
|
it 'updates server info in Postmark and converts it to ruby format' do
|
624
|
-
expect(http_client).to receive(:put).with('server', anything) {
|
634
|
+
expect(http_client).to receive(:put).with('server', anything) {response}
|
625
635
|
subject.update_server_info(update)[:smtp_api_activated].should be false
|
626
636
|
end
|
627
637
|
end
|
628
638
|
|
629
639
|
describe '#get_templates' do
|
630
|
-
let(:http_client) {
|
640
|
+
let(:http_client) {subject.http_client}
|
631
641
|
let(:response) do
|
632
642
|
{
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
643
|
+
'TotalCount' => 31,
|
644
|
+
'Templates' => [
|
645
|
+
{
|
646
|
+
'Active' => true,
|
647
|
+
'TemplateId' => 123,
|
648
|
+
'Name' => 'ABC'
|
649
|
+
},
|
650
|
+
{
|
651
|
+
'Active' => true,
|
652
|
+
'TemplateId' => 456,
|
653
|
+
'Name' => 'DEF'
|
654
|
+
}
|
655
|
+
]
|
646
656
|
}
|
647
657
|
end
|
648
658
|
|
@@ -671,16 +681,16 @@ describe Postmark::ApiClient do
|
|
671
681
|
end
|
672
682
|
|
673
683
|
describe '#get_template' do
|
674
|
-
let(:http_client) {
|
684
|
+
let(:http_client) {subject.http_client}
|
675
685
|
let(:response) do
|
676
686
|
{
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
687
|
+
'Name' => 'Template Name',
|
688
|
+
'TemplateId' => 123,
|
689
|
+
'Subject' => 'Subject',
|
690
|
+
'HtmlBody' => 'Html',
|
691
|
+
'TextBody' => 'Text',
|
692
|
+
'AssociatedServerId' => 456,
|
693
|
+
'Active' => true
|
684
694
|
}
|
685
695
|
end
|
686
696
|
|
@@ -696,17 +706,17 @@ describe Postmark::ApiClient do
|
|
696
706
|
end
|
697
707
|
|
698
708
|
describe '#create_template' do
|
699
|
-
let(:http_client) {
|
709
|
+
let(:http_client) {subject.http_client}
|
700
710
|
let(:response) do
|
701
711
|
{
|
702
|
-
|
703
|
-
|
704
|
-
|
712
|
+
'TemplateId' => 123,
|
713
|
+
'Name' => 'template name',
|
714
|
+
'Active' => true
|
705
715
|
}
|
706
716
|
end
|
707
717
|
|
708
718
|
it 'performs a POST request to /templates with the given attributes' do
|
709
|
-
expected_json = {
|
719
|
+
expected_json = {'Name' => 'template name'}.to_json
|
710
720
|
|
711
721
|
expect(http_client).to receive(:post).with('templates', expected_json).and_return(response)
|
712
722
|
|
@@ -718,17 +728,17 @@ describe Postmark::ApiClient do
|
|
718
728
|
end
|
719
729
|
|
720
730
|
describe '#update_template' do
|
721
|
-
let(:http_client) {
|
731
|
+
let(:http_client) {subject.http_client}
|
722
732
|
let(:response) do
|
723
733
|
{
|
724
|
-
|
725
|
-
|
726
|
-
|
734
|
+
'TemplateId' => 123,
|
735
|
+
'Name' => 'template name',
|
736
|
+
'Active' => true
|
727
737
|
}
|
728
738
|
end
|
729
739
|
|
730
740
|
it 'performs a PUT request to /templates with the given attributes' do
|
731
|
-
expected_json = {
|
741
|
+
expected_json = {'Name' => 'template name'}.to_json
|
732
742
|
|
733
743
|
expect(http_client).to receive(:put).with('templates/123', expected_json).and_return(response)
|
734
744
|
|
@@ -740,11 +750,11 @@ describe Postmark::ApiClient do
|
|
740
750
|
end
|
741
751
|
|
742
752
|
describe '#delete_template' do
|
743
|
-
let(:http_client) {
|
753
|
+
let(:http_client) {subject.http_client}
|
744
754
|
let(:response) do
|
745
755
|
{
|
746
|
-
|
747
|
-
|
756
|
+
'ErrorCode' => 0,
|
757
|
+
'Message' => 'Template 123 removed.'
|
748
758
|
}
|
749
759
|
end
|
750
760
|
|
@@ -758,38 +768,38 @@ describe Postmark::ApiClient do
|
|
758
768
|
end
|
759
769
|
|
760
770
|
describe '#validate_template' do
|
761
|
-
let(:http_client) {
|
771
|
+
let(:http_client) {subject.http_client}
|
762
772
|
|
763
773
|
context 'when template is valid' do
|
764
774
|
let(:response) do
|
765
775
|
{
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
776
|
+
'AllContentIsValid' => true,
|
777
|
+
'HtmlBody' => {
|
778
|
+
'ContentIsValid' => true,
|
779
|
+
'ValidationErrors' => [],
|
780
|
+
'RenderedContent' => '<html><head></head><body>MyName_Value</body></html>'
|
781
|
+
},
|
782
|
+
'TextBody' => {
|
783
|
+
'ContentIsValid' => true,
|
784
|
+
'ValidationErrors' => [],
|
785
|
+
'RenderedContent' => 'MyName_Value'
|
786
|
+
},
|
787
|
+
'Subject' => {
|
788
|
+
'ContentIsValid' => true,
|
789
|
+
'ValidationErrors' => [],
|
790
|
+
'RenderedContent' => 'MyName_Value'
|
791
|
+
},
|
792
|
+
'SuggestedTemplateModel' => {
|
793
|
+
'MyName' => 'MyName_Value'
|
794
|
+
}
|
785
795
|
}
|
786
796
|
end
|
787
797
|
|
788
798
|
it 'performs a POST request and returns unmodified suggested template model' do
|
789
799
|
expected_template_json = {
|
790
|
-
|
791
|
-
|
792
|
-
|
800
|
+
'HtmlBody' => '{{MyName}}',
|
801
|
+
'TextBody' => '{{MyName}}',
|
802
|
+
'Subject' => '{{MyName}}'
|
793
803
|
}.to_json
|
794
804
|
|
795
805
|
expect(http_client).to receive(:post).with('templates/validate', expected_template_json).and_return(response)
|
@@ -808,37 +818,37 @@ describe Postmark::ApiClient do
|
|
808
818
|
context 'when template is invalid' do
|
809
819
|
let(:response) do
|
810
820
|
{
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
825
|
-
|
826
|
-
|
827
|
-
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
821
|
+
'AllContentIsValid' => false,
|
822
|
+
'HtmlBody' => {
|
823
|
+
'ContentIsValid' => false,
|
824
|
+
'ValidationErrors' => [
|
825
|
+
{
|
826
|
+
'Message' => 'The \'each\' block being opened requires a model path to be specified in the form \'{#each <name>}\'.',
|
827
|
+
'Line' => 1,
|
828
|
+
'CharacterPosition' => 1
|
829
|
+
}
|
830
|
+
],
|
831
|
+
'RenderedContent' => nil
|
832
|
+
},
|
833
|
+
'TextBody' => {
|
834
|
+
'ContentIsValid' => true,
|
835
|
+
'ValidationErrors' => [],
|
836
|
+
'RenderedContent' => 'MyName_Value'
|
837
|
+
},
|
838
|
+
'Subject' => {
|
839
|
+
'ContentIsValid' => true,
|
840
|
+
'ValidationErrors' => [],
|
841
|
+
'RenderedContent' => 'MyName_Value'
|
842
|
+
},
|
843
|
+
'SuggestedTemplateModel' => nil
|
834
844
|
}
|
835
845
|
end
|
836
846
|
|
837
847
|
it 'performs a POST request and returns validation errors' do
|
838
848
|
expected_template_json = {
|
839
|
-
|
840
|
-
|
841
|
-
|
849
|
+
'HtmlBody' => '{{#each}}',
|
850
|
+
'TextBody' => '{{MyName}}',
|
851
|
+
'Subject' => '{{MyName}}'
|
842
852
|
}.to_json
|
843
853
|
|
844
854
|
expect(http_client).to receive(:post).with('templates/validate', expected_template_json).and_return(response)
|
@@ -857,13 +867,13 @@ describe Postmark::ApiClient do
|
|
857
867
|
end
|
858
868
|
|
859
869
|
describe "#deliver_with_template" do
|
860
|
-
let(:email) {
|
861
|
-
let(:email_json) {
|
862
|
-
let(:http_client) {
|
863
|
-
let(:response) {
|
870
|
+
let(:email) {Postmark::MessageHelper.to_postmark(message_hash)}
|
871
|
+
let(:email_json) {Postmark::Json.encode(email)}
|
872
|
+
let(:http_client) {subject.http_client}
|
873
|
+
let(:response) {{"MessageID" => 42}}
|
864
874
|
|
865
875
|
it 'converts message hash to Postmark format and posts it to /email/withTemplate' do
|
866
|
-
expect(http_client).to receive(:post).with('email/withTemplate', email_json) {
|
876
|
+
expect(http_client).to receive(:post).with('email/withTemplate', email_json) {response}
|
867
877
|
subject.deliver_with_template(message_hash)
|
868
878
|
end
|
869
879
|
|
@@ -871,54 +881,54 @@ describe Postmark::ApiClient do
|
|
871
881
|
2.times do
|
872
882
|
expect(http_client).to receive(:post).and_raise(Postmark::InternalServerError, 500)
|
873
883
|
end
|
874
|
-
expect(http_client).to receive(:post) {
|
875
|
-
expect {
|
884
|
+
expect(http_client).to receive(:post) {response}
|
885
|
+
expect {subject.deliver_with_template(message_hash)}.not_to raise_error
|
876
886
|
end
|
877
887
|
|
878
888
|
it 'converts response to ruby format' do
|
879
|
-
expect(http_client).to receive(:post).with('email/withTemplate', email_json) {
|
889
|
+
expect(http_client).to receive(:post).with('email/withTemplate', email_json) {response}
|
880
890
|
r = subject.deliver_with_template(message_hash)
|
881
891
|
r.should have_key(:message_id)
|
882
892
|
end
|
883
893
|
end
|
884
894
|
|
885
895
|
describe '#deliver_in_batches_with_templates' do
|
886
|
-
let(:max_batch_size) {
|
887
|
-
let(:factor) {
|
888
|
-
let(:http_client) {
|
896
|
+
let(:max_batch_size) {50}
|
897
|
+
let(:factor) {3.5}
|
898
|
+
let(:http_client) {subject.http_client}
|
889
899
|
let(:postmark_response) do
|
890
900
|
{
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
901
|
+
'ErrorCode' => 0,
|
902
|
+
'Message' => 'OK',
|
903
|
+
'SubmittedAt' => '2018-03-14T09:56:50.4288265-04:00',
|
904
|
+
'To' => 'recipient@example.org'
|
895
905
|
}
|
896
906
|
end
|
897
907
|
|
898
908
|
let(:message_hashes) do
|
899
909
|
Array.new((factor * max_batch_size).to_i) do
|
900
910
|
{
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
911
|
+
:template_id => 42,
|
912
|
+
:alias => 'alias',
|
913
|
+
:template_model => {:Foo => 'attr_value'},
|
914
|
+
:from => 'sender@example.org',
|
915
|
+
:to => 'recipient@example.org'
|
906
916
|
}
|
907
917
|
end
|
908
918
|
end
|
909
919
|
|
910
|
-
before {
|
920
|
+
before {subject.max_batch_size = max_batch_size}
|
911
921
|
|
912
922
|
it 'performs a total of (bath_size / max_batch_size) requests' do
|
913
923
|
expect(http_client).
|
914
|
-
|
915
|
-
|
916
|
-
Array.new(max_batch_size) {
|
924
|
+
to receive(:post).with('email/batchWithTemplates', a_postmark_json).
|
925
|
+
at_most(factor.to_i).times do
|
926
|
+
Array.new(max_batch_size) {postmark_response}
|
917
927
|
end
|
918
928
|
|
919
929
|
expect(http_client).
|
920
|
-
|
921
|
-
|
930
|
+
to receive(:post).with('email/batchWithTemplates', a_postmark_json).
|
931
|
+
exactly((factor - factor.to_i).ceil).times do
|
922
932
|
response = Array.new(((factor - factor.to_i) * max_batch_size).to_i) do
|
923
933
|
postmark_response
|
924
934
|
end
|
@@ -941,14 +951,14 @@ describe Postmark::ApiClient do
|
|
941
951
|
describe '#get_stats_totals' do
|
942
952
|
let(:response) do
|
943
953
|
{
|
944
|
-
|
945
|
-
|
954
|
+
"Sent" => 615,
|
955
|
+
"BounceRate" => 10.406,
|
946
956
|
}
|
947
957
|
end
|
948
|
-
let(:http_client) {
|
958
|
+
let(:http_client) {subject.http_client}
|
949
959
|
|
950
960
|
it 'converts response to ruby format' do
|
951
|
-
expect(http_client).to receive(:get).with('stats/outbound', {
|
961
|
+
expect(http_client).to receive(:get).with('stats/outbound', {:tag => 'foo'}) {response}
|
952
962
|
r = subject.get_stats_totals(:tag => 'foo')
|
953
963
|
r.should have_key(:sent)
|
954
964
|
r.should have_key(:bounce_rate)
|
@@ -958,31 +968,31 @@ describe Postmark::ApiClient do
|
|
958
968
|
describe '#get_stats_counts' do
|
959
969
|
let(:response) do
|
960
970
|
{
|
961
|
-
|
962
|
-
|
963
|
-
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
|
969
|
-
|
970
|
-
|
971
|
-
|
972
|
-
|
973
|
-
|
974
|
-
|
975
|
-
|
976
|
-
|
977
|
-
|
978
|
-
|
979
|
-
|
971
|
+
"Days" => [
|
972
|
+
{
|
973
|
+
"Date" => "2014-01-01",
|
974
|
+
"Sent" => 140
|
975
|
+
},
|
976
|
+
{
|
977
|
+
"Date" => "2014-01-02",
|
978
|
+
"Sent" => 160
|
979
|
+
},
|
980
|
+
{
|
981
|
+
"Date" => "2014-01-04",
|
982
|
+
"Sent" => 50
|
983
|
+
},
|
984
|
+
{
|
985
|
+
"Date" => "2014-01-05",
|
986
|
+
"Sent" => 115
|
987
|
+
}
|
988
|
+
],
|
989
|
+
"Sent" => 615
|
980
990
|
}
|
981
991
|
end
|
982
|
-
let(:http_client) {
|
992
|
+
let(:http_client) {subject.http_client}
|
983
993
|
|
984
994
|
it 'converts response to ruby format' do
|
985
|
-
expect(http_client).to receive(:get).with('stats/outbound/sends', {
|
995
|
+
expect(http_client).to receive(:get).with('stats/outbound/sends', {:tag => 'foo'}) {response}
|
986
996
|
r = subject.get_stats_counts(:sends, :tag => 'foo')
|
987
997
|
r.should have_key(:days)
|
988
998
|
r.should have_key(:sent)
|
@@ -994,7 +1004,7 @@ describe Postmark::ApiClient do
|
|
994
1004
|
end
|
995
1005
|
|
996
1006
|
it 'uses fromdate that is passed in' do
|
997
|
-
expect(http_client).to receive(:get).with('stats/outbound/sends', {
|
1007
|
+
expect(http_client).to receive(:get).with('stats/outbound/sends', {:tag => 'foo', :fromdate => '2015-01-01'}) {response}
|
998
1008
|
r = subject.get_stats_counts(:sends, :tag => 'foo', :fromdate => '2015-01-01')
|
999
1009
|
r.should have_key(:days)
|
1000
1010
|
r.should have_key(:sent)
|
@@ -1006,7 +1016,7 @@ describe Postmark::ApiClient do
|
|
1006
1016
|
end
|
1007
1017
|
|
1008
1018
|
it 'uses stats type that is passed in' do
|
1009
|
-
expect(http_client).to receive(:get).with('stats/outbound/opens/readtimes', {
|
1019
|
+
expect(http_client).to receive(:get).with('stats/outbound/opens/readtimes', {:tag => 'foo', :type => :readtimes}) {response}
|
1010
1020
|
r = subject.get_stats_counts(:opens, :type => :readtimes, :tag => 'foo')
|
1011
1021
|
r.should have_key(:days)
|
1012
1022
|
r.should have_key(:sent)
|