mailgun-ruby 1.4.1 → 1.4.3
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/.github/workflows/ci.yml +30 -8
- data/.rubocop.yml +64 -4
- data/Gemfile +3 -1
- data/README.md +1 -1
- data/Rakefile +5 -8
- data/docs/AnalyticsTags.md +63 -0
- data/lib/mailgun/address.rb +5 -5
- data/lib/mailgun/chains.rb +2 -3
- data/lib/mailgun/client.rb +56 -56
- data/lib/mailgun/domains/domains.rb +11 -10
- data/lib/mailgun/events/events.rb +4 -3
- data/lib/mailgun/exceptions/exceptions.rb +12 -15
- data/lib/mailgun/helpers/api_version_checker.rb +6 -1
- data/lib/mailgun/lists/opt_in_handler.rb +6 -10
- data/lib/mailgun/logs/logs.rb +4 -2
- data/lib/mailgun/messages/batch_message.rb +10 -10
- data/lib/mailgun/messages/message_builder.rb +40 -56
- data/lib/mailgun/metrics/metrics.rb +12 -6
- data/lib/mailgun/response.rb +12 -10
- data/lib/mailgun/subaccounts/subaccounts.rb +13 -8
- data/lib/mailgun/suppressions.rb +36 -43
- data/lib/mailgun/tags/analytics_tags.rb +37 -2
- data/lib/mailgun/tags/tags.rb +29 -19
- data/lib/mailgun/templates/templates.rb +40 -29
- data/lib/mailgun/version.rb +3 -1
- data/lib/mailgun/webhooks/webhooks.rb +22 -19
- data/lib/mailgun-ruby.rb +2 -0
- data/lib/mailgun.rb +4 -4
- data/lib/railgun/attachment.rb +12 -19
- data/lib/railgun/errors.rb +2 -3
- data/lib/railgun/mailer.rb +37 -41
- data/lib/railgun/railtie.rb +2 -0
- data/lib/railgun.rb +2 -0
- data/mailgun.gemspec +15 -11
- data/spec/integration/analytics_tags_spec.rb +54 -0
- data/spec/integration/bounces_spec.rb +12 -11
- data/spec/integration/campaign_spec.rb +20 -18
- data/spec/integration/complaints_spec.rb +8 -6
- data/spec/integration/domains_spec.rb +12 -18
- data/spec/integration/email_validation_spec.rb +35 -34
- data/spec/integration/events_spec.rb +8 -8
- data/spec/integration/list_members_spec.rb +27 -26
- data/spec/integration/list_spec.rb +22 -21
- data/spec/integration/logs_spec.rb +49 -47
- data/spec/integration/mailer_spec.rb +7 -3
- data/spec/integration/mailgun_spec.rb +85 -92
- data/spec/integration/metrics_spec.rb +137 -131
- data/spec/integration/routes_spec.rb +41 -40
- data/spec/integration/stats_spec.rb +4 -2
- data/spec/integration/subaccounts_spec.rb +9 -10
- data/spec/integration/suppressions_spec.rb +222 -44
- data/spec/integration/templates_spec.rb +14 -12
- data/spec/integration/unsubscribes_spec.rb +8 -6
- data/spec/integration/webhook_spec.rb +18 -12
- data/spec/spec_helper.rb +15 -8
- data/spec/unit/client_spec.rb +424 -0
- data/spec/unit/connection/test_client.rb +108 -55
- data/spec/unit/events/events_spec.rb +48 -29
- data/spec/unit/exceptions/exceptions_spec.rb +8 -7
- data/spec/unit/helpers/api_version_checker_spec.rb +206 -0
- data/spec/unit/lists/opt_in_handler_spec.rb +11 -7
- data/spec/unit/mailgun_spec.rb +71 -68
- data/spec/unit/messages/batch_message_spec.rb +37 -36
- data/spec/unit/messages/message_builder_spec.rb +170 -169
- data/spec/unit/railgun/content_type_spec.rb +31 -30
- data/spec/unit/railgun/mailer_spec.rb +62 -59
- data/spec/unit/response_spec.rb +225 -0
- data/vcr_cassettes/For_the_suppressions_handling_class/creates_a_single_bounce.yml +55 -0
- data/vcr_cassettes/analytics_tags.yml +187 -0
- data/vcr_cassettes/suppressions.yml +1053 -170
- metadata +95 -29
- data/.rubocop_todo.yml +0 -22
data/lib/mailgun.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# require ruby dependencies
|
|
2
4
|
require 'json'
|
|
3
5
|
require 'openssl'
|
|
@@ -16,7 +18,7 @@ require 'mailgun/exceptions/exceptions'
|
|
|
16
18
|
require 'mailgun/helpers/api_version_checker'
|
|
17
19
|
|
|
18
20
|
# load zeitwerk
|
|
19
|
-
Zeitwerk::Loader.for_gem.tap do |loader|
|
|
21
|
+
Zeitwerk::Loader.for_gem.tap do |loader|
|
|
20
22
|
loader.ignore("#{__dir__}/mailgun-ruby.rb")
|
|
21
23
|
loader.ignore("#{__dir__}/railgun.rb")
|
|
22
24
|
loader.ignore("#{__dir__}/railgun")
|
|
@@ -41,7 +43,6 @@ end
|
|
|
41
43
|
#
|
|
42
44
|
# See the Github documentation for full examples.
|
|
43
45
|
module Mailgun
|
|
44
|
-
|
|
45
46
|
class << self
|
|
46
47
|
attr_accessor :api_host,
|
|
47
48
|
:api_key,
|
|
@@ -56,7 +57,6 @@ module Mailgun
|
|
|
56
57
|
yield self
|
|
57
58
|
true
|
|
58
59
|
end
|
|
59
|
-
|
|
60
|
+
alias config configure
|
|
60
61
|
end
|
|
61
|
-
|
|
62
62
|
end
|
data/lib/railgun/attachment.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
module Railgun
|
|
3
4
|
class Attachment < StringIO
|
|
4
|
-
|
|
5
5
|
attr_reader :filename, :content_type, :path,
|
|
6
6
|
:original_filename, :overwritten_filename
|
|
7
7
|
|
|
@@ -9,17 +9,15 @@ module Railgun
|
|
|
9
9
|
@path = ''
|
|
10
10
|
@inline = args.detect { |opt| opt[:inline] }
|
|
11
11
|
|
|
12
|
-
if @inline
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
@filename = if @inline
|
|
13
|
+
attachment.cid
|
|
14
|
+
else
|
|
15
|
+
attachment.filename
|
|
16
|
+
end
|
|
17
17
|
|
|
18
18
|
@original_filename = @filename
|
|
19
19
|
|
|
20
|
-
if args.detect { |opt| opt[:filename] }
|
|
21
|
-
@filename = opt[:filename]
|
|
22
|
-
end
|
|
20
|
+
@filename = opt[:filename] if args.detect { |opt| opt[:filename] }
|
|
23
21
|
|
|
24
22
|
@overwritten_filename = @filename
|
|
25
23
|
|
|
@@ -32,7 +30,7 @@ module Railgun
|
|
|
32
30
|
@inline
|
|
33
31
|
end
|
|
34
32
|
|
|
35
|
-
def
|
|
33
|
+
def original_filename?
|
|
36
34
|
@original_filename == @overwritten_filename
|
|
37
35
|
end
|
|
38
36
|
|
|
@@ -40,17 +38,12 @@ module Railgun
|
|
|
40
38
|
@filename
|
|
41
39
|
end
|
|
42
40
|
|
|
43
|
-
def attach_to_message!(
|
|
44
|
-
if mb.nil?
|
|
45
|
-
nil
|
|
46
|
-
end
|
|
47
|
-
|
|
41
|
+
def attach_to_message!(m_body)
|
|
48
42
|
if inline?
|
|
49
|
-
|
|
43
|
+
m_body.add_inline_image self, @filename
|
|
50
44
|
else
|
|
51
|
-
|
|
45
|
+
m_body.add_attachment self, @filename
|
|
52
46
|
end
|
|
53
47
|
end
|
|
54
|
-
|
|
55
48
|
end
|
|
56
49
|
end
|
data/lib/railgun/errors.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
module Railgun
|
|
3
4
|
class Error < StandardError
|
|
4
|
-
|
|
5
5
|
attr_reader :object
|
|
6
6
|
|
|
7
7
|
def initialize(message = nil, object = nil)
|
|
@@ -15,7 +15,6 @@ module Railgun
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
class InternalError < Error
|
|
18
|
-
|
|
19
18
|
attr_reader :source_exception
|
|
20
19
|
|
|
21
20
|
def initialize(source_exc, message = nil, object = nil)
|
data/lib/railgun/mailer.rb
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
module Railgun
|
|
3
4
|
# Railgun::Mailer is an ActionMailer provider for sending mail through
|
|
4
5
|
# Mailgun.
|
|
5
6
|
class Mailer
|
|
6
|
-
|
|
7
7
|
# List of the headers that will be ignored when copying headers from `mail.header_fields`
|
|
8
|
-
IGNORED_HEADERS = %w[
|
|
8
|
+
IGNORED_HEADERS = %w[to from subject reply-to mime-version template].freeze
|
|
9
9
|
|
|
10
10
|
# [Hash] config ->
|
|
11
11
|
# Requires *at least* `api_key` and `domain` keys.
|
|
@@ -17,15 +17,15 @@ module Railgun
|
|
|
17
17
|
def initialize(config)
|
|
18
18
|
@config = config
|
|
19
19
|
|
|
20
|
-
[
|
|
21
|
-
raise Railgun::ConfigurationError.new("Config requires `#{k}` key", @config) unless @config.
|
|
20
|
+
%i[api_key domain].each do |k|
|
|
21
|
+
raise Railgun::ConfigurationError.new("Config requires `#{k}` key", @config) unless @config.key?(k)
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
@mg_client = Mailgun::Client.new(
|
|
25
25
|
config[:api_key],
|
|
26
26
|
config[:api_host] || 'api.mailgun.net',
|
|
27
27
|
config[:api_version] || 'v3',
|
|
28
|
-
config[:api_ssl].nil?
|
|
28
|
+
config[:api_ssl].nil? || config[:api_ssl],
|
|
29
29
|
false,
|
|
30
30
|
config[:timeout]
|
|
31
31
|
)
|
|
@@ -34,14 +34,14 @@ module Railgun
|
|
|
34
34
|
# To avoid exception in mail gem v2.6
|
|
35
35
|
@settings = { return_response: true }
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
return unless @config[:fake_message_send] || false
|
|
38
|
+
|
|
39
|
+
Rails.logger.info 'NOTE: fake message sending has been enabled for mailgun-ruby!'
|
|
40
|
+
@mg_client.enable_test_mode!
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
def deliver!(mail)
|
|
44
|
-
@mg_domain =
|
|
44
|
+
@mg_domain = mg_domain(mail)
|
|
45
45
|
@mg_client.set_api_key(mail[:api_key].value) if mail[:api_key].present?
|
|
46
46
|
@mg_client.set_subaccount(mail[:subaccount_id].value) if mail[:subaccount_id].present?
|
|
47
47
|
|
|
@@ -52,7 +52,7 @@ module Railgun
|
|
|
52
52
|
mg_message = Railgun.transform_for_mailgun(mail)
|
|
53
53
|
response = @mg_client.send_message(@mg_domain, mg_message)
|
|
54
54
|
|
|
55
|
-
if response.code == 200
|
|
55
|
+
if response.code == 200
|
|
56
56
|
mg_id = response.to_h['id']
|
|
57
57
|
mail.message_id = mg_id
|
|
58
58
|
end
|
|
@@ -66,11 +66,11 @@ module Railgun
|
|
|
66
66
|
private
|
|
67
67
|
|
|
68
68
|
# Set @mg_domain from mail[:domain] header if present, then remove it to prevent being sent.
|
|
69
|
-
def
|
|
69
|
+
def mg_domain(mail)
|
|
70
70
|
return mail[:domain].value if mail[:domain]
|
|
71
|
+
|
|
71
72
|
domain
|
|
72
73
|
end
|
|
73
|
-
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
module_function
|
|
@@ -102,7 +102,7 @@ module Railgun
|
|
|
102
102
|
# note: this will filter out parameters such as `from`, `to`, and so forth
|
|
103
103
|
# as they are accepted as POST parameters on the message endpoint.
|
|
104
104
|
|
|
105
|
-
msg_headers =
|
|
105
|
+
msg_headers = {}
|
|
106
106
|
|
|
107
107
|
# h:* attributes (headers)
|
|
108
108
|
|
|
@@ -111,11 +111,11 @@ module Railgun
|
|
|
111
111
|
mail.headers(mail.mailgun_headers || {})
|
|
112
112
|
mail.header_fields.each do |field|
|
|
113
113
|
header = field.name.downcase
|
|
114
|
-
if msg_headers.include? header
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
114
|
+
msg_headers[header] = if msg_headers.include? header
|
|
115
|
+
[msg_headers[header], field.value].flatten
|
|
116
|
+
else
|
|
117
|
+
field.value
|
|
118
|
+
end
|
|
119
119
|
end
|
|
120
120
|
|
|
121
121
|
msg_headers.each do |k, v|
|
|
@@ -140,7 +140,7 @@ module Railgun
|
|
|
140
140
|
message['recipient-variables'] = mail.mailgun_recipient_variables.to_json if mail.mailgun_recipient_variables
|
|
141
141
|
|
|
142
142
|
# reject blank values
|
|
143
|
-
message.delete_if do |
|
|
143
|
+
message.delete_if do |_k, v|
|
|
144
144
|
next true if v.nil?
|
|
145
145
|
|
|
146
146
|
# if it's an array remove empty elements
|
|
@@ -149,7 +149,7 @@ module Railgun
|
|
|
149
149
|
v.respond_to?(:empty?) && v.empty?
|
|
150
150
|
end
|
|
151
151
|
|
|
152
|
-
|
|
152
|
+
message
|
|
153
153
|
end
|
|
154
154
|
|
|
155
155
|
# Acts on a Rails/ActionMailer message object and uses Mailgun::MessageBuilder
|
|
@@ -169,7 +169,7 @@ module Railgun
|
|
|
169
169
|
mb.body_text extract_body_text(mail)
|
|
170
170
|
mb.amp_html extract_amp_html(mail)
|
|
171
171
|
|
|
172
|
-
[
|
|
172
|
+
%i[to cc bcc].each do |rcpt_type|
|
|
173
173
|
addrs = mail[rcpt_type] || nil
|
|
174
174
|
case addrs
|
|
175
175
|
when String
|
|
@@ -196,7 +196,7 @@ module Railgun
|
|
|
196
196
|
attach.attach_to_message! mb
|
|
197
197
|
end
|
|
198
198
|
|
|
199
|
-
|
|
199
|
+
mb.message
|
|
200
200
|
end
|
|
201
201
|
|
|
202
202
|
# Returns the decoded HTML body from the Mail::Message object if available,
|
|
@@ -206,11 +206,9 @@ module Railgun
|
|
|
206
206
|
#
|
|
207
207
|
# @return [String]
|
|
208
208
|
def extract_body_html(mail)
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
nil
|
|
213
|
-
end
|
|
209
|
+
retrieve_html_part(mail).body.decoded || nil
|
|
210
|
+
rescue StandardError
|
|
211
|
+
nil
|
|
214
212
|
end
|
|
215
213
|
|
|
216
214
|
# Returns the decoded text body from the Mail::Message object if it is available,
|
|
@@ -220,11 +218,9 @@ module Railgun
|
|
|
220
218
|
#
|
|
221
219
|
# @return [String]
|
|
222
220
|
def extract_body_text(mail)
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
nil
|
|
227
|
-
end
|
|
221
|
+
retrieve_text_part(mail).body.decoded || nil
|
|
222
|
+
rescue StandardError
|
|
223
|
+
nil
|
|
228
224
|
end
|
|
229
225
|
|
|
230
226
|
# Returns the decoded AMP HTML from the Mail::Message object if it is available,
|
|
@@ -234,11 +230,9 @@ module Railgun
|
|
|
234
230
|
#
|
|
235
231
|
# @return [String]
|
|
236
232
|
def extract_amp_html(mail)
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
nil
|
|
241
|
-
end
|
|
233
|
+
retrieve_amp_part(mail).body.decoded || nil
|
|
234
|
+
rescue StandardError
|
|
235
|
+
nil
|
|
242
236
|
end
|
|
243
237
|
|
|
244
238
|
# Returns the mail object from the Mail::Message object if text part exists,
|
|
@@ -250,7 +244,8 @@ module Railgun
|
|
|
250
244
|
# @return [Mail::Message] mail message with its content-type = text/plain
|
|
251
245
|
def retrieve_text_part(mail)
|
|
252
246
|
return mail.text_part if mail.multipart?
|
|
253
|
-
|
|
247
|
+
|
|
248
|
+
(mail.mime_type =~ %r{^text/plain$}i) && mail
|
|
254
249
|
end
|
|
255
250
|
|
|
256
251
|
# Returns the mail object from the Mail::Message object if html part exists,
|
|
@@ -262,7 +257,8 @@ module Railgun
|
|
|
262
257
|
# @return [Mail::Message] mail message with its content-type = text/html
|
|
263
258
|
def retrieve_html_part(mail)
|
|
264
259
|
return mail.html_part if mail.multipart?
|
|
265
|
-
|
|
260
|
+
|
|
261
|
+
(mail.mime_type =~ %r{^text/html$}i) && mail
|
|
266
262
|
end
|
|
267
263
|
|
|
268
264
|
# Returns the mail object from the Mail::Message object if AMP part exists,
|
data/lib/railgun/railtie.rb
CHANGED
data/lib/railgun.rb
CHANGED
data/mailgun.gemspec
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
5
|
require 'mailgun/version'
|
|
5
6
|
|
|
6
7
|
Gem::Specification.new do |spec|
|
|
7
|
-
|
|
8
8
|
spec.name = 'mailgun-ruby'
|
|
9
9
|
spec.version = Mailgun::VERSION
|
|
10
10
|
spec.homepage = 'https://www.mailgun.com/'
|
|
@@ -23,21 +23,25 @@ Gem::Specification.new do |spec|
|
|
|
23
23
|
spec.files = `git ls-files -z`.split("\x0")
|
|
24
24
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
25
25
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
26
|
-
spec.require_paths = [
|
|
26
|
+
spec.require_paths = ['lib']
|
|
27
27
|
|
|
28
28
|
spec.required_ruby_version = '>= 3.0.0'
|
|
29
29
|
|
|
30
30
|
spec.add_development_dependency 'bundler', '>= 1.16.2'
|
|
31
|
+
spec.add_development_dependency 'pry', '~> 0.16.0'
|
|
32
|
+
spec.add_development_dependency 'rails'
|
|
33
|
+
spec.add_development_dependency 'rake', '~> 13.3.1'
|
|
31
34
|
spec.add_development_dependency 'rspec', '~> 3.13.0'
|
|
32
35
|
spec.add_development_dependency 'rspec-its', '~> 2.0.0'
|
|
33
|
-
spec.add_development_dependency '
|
|
34
|
-
spec.add_development_dependency '
|
|
35
|
-
spec.add_development_dependency '
|
|
36
|
+
spec.add_development_dependency 'rubocop'
|
|
37
|
+
spec.add_development_dependency 'rubocop-rake'
|
|
38
|
+
spec.add_development_dependency 'rubocop-rspec'
|
|
39
|
+
spec.add_development_dependency 'simplecov'
|
|
40
|
+
spec.add_development_dependency 'simplecov-json'
|
|
36
41
|
spec.add_development_dependency 'vcr', '~> 6.4.0'
|
|
37
|
-
spec.add_development_dependency '
|
|
38
|
-
spec.
|
|
39
|
-
spec.add_dependency 'mini_mime'
|
|
40
|
-
spec.add_dependency 'faraday', "~> 2.1"
|
|
42
|
+
spec.add_development_dependency 'webmock', '~> 3.7'
|
|
43
|
+
spec.add_dependency 'faraday', '~> 2.1'
|
|
41
44
|
spec.add_dependency 'faraday-multipart', '< 2'
|
|
45
|
+
spec.add_dependency 'mini_mime'
|
|
42
46
|
spec.add_dependency 'zeitwerk'
|
|
43
47
|
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
require 'mailgun'
|
|
5
|
+
|
|
6
|
+
vcr_opts = { cassette_name: 'analytics_tags' }
|
|
7
|
+
|
|
8
|
+
describe 'AnalyticsTags', vcr: vcr_opts do
|
|
9
|
+
let(:api_version) { APIVERSION }
|
|
10
|
+
let(:mg_client) { Mailgun::Client.new(APIKEY, APIHOST, api_version, SSL) }
|
|
11
|
+
let(:mg_obj) { Mailgun::AnalyticsTags.new(mg_client) }
|
|
12
|
+
let(:api_version) { 'v1' }
|
|
13
|
+
|
|
14
|
+
describe '#update' do
|
|
15
|
+
it 'updates a tag' do
|
|
16
|
+
response = mg_obj.update('test1', 'test_description')
|
|
17
|
+
|
|
18
|
+
expect(response).to be_truthy
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe '#list' do
|
|
23
|
+
it 'returns a list of tags' do
|
|
24
|
+
response = mg_obj.list(
|
|
25
|
+
{
|
|
26
|
+
pagination: {
|
|
27
|
+
sort: 'lastseen:desc',
|
|
28
|
+
limit: 10
|
|
29
|
+
},
|
|
30
|
+
include_subaccounts: true
|
|
31
|
+
}
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
expect(response[0]['account_id']).to eq('test')
|
|
35
|
+
expect(response[0]['tag']).to eq('test1')
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe '#remove' do
|
|
40
|
+
it 'removes a tag' do
|
|
41
|
+
response = mg_obj.remove('test1')
|
|
42
|
+
|
|
43
|
+
expect(response).to be_truthy
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe '#limits' do
|
|
48
|
+
it 'returns limits' do
|
|
49
|
+
response = mg_obj.limits
|
|
50
|
+
|
|
51
|
+
expect(response['limit']).to eq(100_000)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
require 'mailgun'
|
|
3
5
|
|
|
4
|
-
vcr_opts = { :
|
|
6
|
+
vcr_opts = { cassette_name: 'bounces' }
|
|
5
7
|
|
|
6
8
|
describe 'For the Bounces endpoint', order: :defined, vcr: vcr_opts do
|
|
7
9
|
before(:all) do
|
|
@@ -12,33 +14,32 @@ describe 'For the Bounces endpoint', order: :defined, vcr: vcr_opts do
|
|
|
12
14
|
|
|
13
15
|
it 'creates a bounce' do
|
|
14
16
|
@result = @mg_obj.post("#{@domain}/bounces",
|
|
15
|
-
{:
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
{ address: @email,
|
|
18
|
+
code: 550,
|
|
19
|
+
error: 'Integration Test' })
|
|
18
20
|
|
|
19
21
|
@result.to_h!
|
|
20
|
-
expect(@result.body[
|
|
21
|
-
expect(@result.body[
|
|
22
|
+
expect(@result.body['message']).to eq('Address has been added to the bounces table')
|
|
23
|
+
expect(@result.body['address']).to eq(@email)
|
|
22
24
|
end
|
|
23
25
|
|
|
24
26
|
it 'get a bounce.' do
|
|
25
27
|
result = @mg_obj.get("#{@domain}/bounces/#{CGI.escape(@email)}")
|
|
26
28
|
|
|
27
29
|
result.to_h!
|
|
28
|
-
expect(result.body[
|
|
29
|
-
expect(result.body[
|
|
30
|
-
expect(result.body[
|
|
30
|
+
expect(result.body['code']).to eq('550')
|
|
31
|
+
expect(result.body['address']).to eq(@email)
|
|
32
|
+
expect(result.body['error']).to eq('Integration Test')
|
|
31
33
|
end
|
|
32
34
|
|
|
33
35
|
it 'gets a list of bounces.' do
|
|
34
36
|
result = @mg_obj.get("#{@domain}/bounces")
|
|
35
37
|
|
|
36
38
|
result.to_h!
|
|
37
|
-
expect(result.body[
|
|
39
|
+
expect(result.body['items'].length).to be > 0
|
|
38
40
|
end
|
|
39
41
|
|
|
40
42
|
it 'deletes a bounce' do
|
|
41
43
|
@mg_obj.delete("#{@domain}/bounces/#{CGI.escape(@email)}")
|
|
42
44
|
end
|
|
43
|
-
|
|
44
45
|
end
|
|
@@ -1,57 +1,59 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
require 'mailgun'
|
|
3
5
|
|
|
4
|
-
vcr_opts = { :
|
|
6
|
+
vcr_opts = { cassette_name: 'campaigns' }
|
|
5
7
|
|
|
6
8
|
describe 'For the campaigns endpoint', vcr: vcr_opts do
|
|
7
9
|
before(:all) do
|
|
8
10
|
skip 'pending removal'
|
|
9
11
|
@mg_obj = Mailgun::Client.new(APIKEY, APIHOST, APIVERSION, SSL)
|
|
10
12
|
@domain = TESTDOMAIN
|
|
11
|
-
@campaign_id =
|
|
13
|
+
@campaign_id = 'integration_test_campaign'
|
|
12
14
|
end
|
|
13
15
|
|
|
14
16
|
it 'creates a campaign' do
|
|
15
|
-
result = @mg_obj.post("#{@domain}/campaigns", {:
|
|
16
|
-
|
|
17
|
+
result = @mg_obj.post("#{@domain}/campaigns", { name: 'My Campaign',
|
|
18
|
+
id: @campaign_id })
|
|
17
19
|
|
|
18
20
|
result.to_h!
|
|
19
|
-
expect(result.body[
|
|
20
|
-
expect(result.body[
|
|
21
|
-
expect(result.body[
|
|
21
|
+
expect(result.body['message']).to eq('Campaign created')
|
|
22
|
+
expect(result.body['campaign']['id']).to eq(@campaign_id)
|
|
23
|
+
expect(result.body['campaign']['name']).to eq('My Campaign')
|
|
22
24
|
end
|
|
23
25
|
|
|
24
26
|
it 'get a campaign.' do
|
|
25
27
|
result = @mg_obj.get("#{@domain}/campaigns/#{@campaign_id}")
|
|
26
28
|
|
|
27
29
|
result.to_h!
|
|
28
|
-
expect(result.body[
|
|
29
|
-
expect(result.body[
|
|
30
|
+
expect(result.body['id']).to eq(@campaign_id)
|
|
31
|
+
expect(result.body['name']).to eq('My Campaign')
|
|
30
32
|
end
|
|
31
33
|
|
|
32
34
|
it 'gets a list of all campaigns.' do
|
|
33
|
-
result = @mg_obj.get("#{@domain}/campaigns", {:
|
|
35
|
+
result = @mg_obj.get("#{@domain}/campaigns", { limit: 50 })
|
|
34
36
|
|
|
35
37
|
result.to_h!
|
|
36
|
-
expect(result.body[
|
|
38
|
+
expect(result.body['total_count']).to be > 0
|
|
37
39
|
end
|
|
38
40
|
|
|
39
41
|
it 'update a campaign.' do
|
|
40
|
-
result = @mg_obj.put("#{@domain}/campaigns/#{@campaign_id}", {:
|
|
41
|
-
|
|
42
|
+
result = @mg_obj.put("#{@domain}/campaigns/#{@campaign_id}", { name: 'My Updated Campaign',
|
|
43
|
+
id: @campaign_id })
|
|
42
44
|
|
|
43
45
|
result.to_h!
|
|
44
|
-
expect(result.body[
|
|
45
|
-
expect(result.body[
|
|
46
|
-
expect(result.body[
|
|
46
|
+
expect(result.body['message']).to eq('Campaign updated')
|
|
47
|
+
expect(result.body['campaign']['id']).to eq(@campaign_id)
|
|
48
|
+
expect(result.body['campaign']['name']).to eq('My Updated Campaign')
|
|
47
49
|
end
|
|
48
50
|
|
|
49
51
|
it 'get campaign events.' do
|
|
50
|
-
expect{@mg_obj.get("#{@domain}/campaigns/#{@campaign_id}/events", {:
|
|
52
|
+
expect { @mg_obj.get("#{@domain}/campaigns/#{@campaign_id}/events", { groupby: 'clicked' }) }.not_to raise_error
|
|
51
53
|
end
|
|
52
54
|
|
|
53
55
|
it 'get campaign stats.' do
|
|
54
|
-
expect{@mg_obj.get("#{@domain}/campaigns/#{@campaign_id}/stats", {:
|
|
56
|
+
expect { @mg_obj.get("#{@domain}/campaigns/#{@campaign_id}/stats", { groupby: 'domain' }) }.not_to raise_error
|
|
55
57
|
end
|
|
56
58
|
|
|
57
59
|
it 'removes a campaign' do
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
require 'mailgun'
|
|
3
5
|
|
|
4
|
-
vcr_opts = { :
|
|
6
|
+
vcr_opts = { cassette_name: 'complaints' }
|
|
5
7
|
|
|
6
8
|
describe 'For the Complaints endpoint', order: :defined, vcr: vcr_opts do
|
|
7
9
|
before(:all) do
|
|
@@ -11,25 +13,25 @@ describe 'For the Complaints endpoint', order: :defined, vcr: vcr_opts do
|
|
|
11
13
|
end
|
|
12
14
|
|
|
13
15
|
it 'creates a complaint' do
|
|
14
|
-
@result = @mg_obj.post("#{@domain}/complaints", {:
|
|
16
|
+
@result = @mg_obj.post("#{@domain}/complaints", { address: @email })
|
|
15
17
|
|
|
16
18
|
@result.to_h!
|
|
17
|
-
expect(@result.body[
|
|
18
|
-
expect(@result.body[
|
|
19
|
+
expect(@result.body['message']).to eq('Address has been added to the complaints table')
|
|
20
|
+
expect(@result.body['address']).to eq(@email)
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
it 'get a complaint.' do
|
|
22
24
|
result = @mg_obj.get("#{@domain}/complaints/#{@email}")
|
|
23
25
|
|
|
24
26
|
result.to_h!
|
|
25
|
-
expect(result.body[
|
|
27
|
+
expect(result.body['address']).to eq(@email)
|
|
26
28
|
end
|
|
27
29
|
|
|
28
30
|
it 'gets a list of complaints.' do
|
|
29
31
|
result = @mg_obj.get("#{@domain}/complaints")
|
|
30
32
|
|
|
31
33
|
result.to_h!
|
|
32
|
-
expect(result.body[
|
|
34
|
+
expect(result.body['items'].length).to be > 0
|
|
33
35
|
end
|
|
34
36
|
|
|
35
37
|
it 'removes a complaint' do
|