postmark 1.13.0 → 1.14.0
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|