mailgunner 2.5.0 → 3.2.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 +5 -5
- data/CHANGES.md +214 -0
- data/LICENSE.txt +1 -1
- data/README.md +25 -25
- data/lib/mailgunner.rb +20 -376
- data/lib/mailgunner/client.rb +73 -0
- data/lib/mailgunner/client/domains.rb +77 -0
- data/lib/mailgunner/client/email_validation.rb +25 -0
- data/lib/mailgunner/client/events.rb +9 -0
- data/lib/mailgunner/client/ips.rb +25 -0
- data/lib/mailgunner/client/mailing_lists.rb +45 -0
- data/lib/mailgunner/client/messages.rb +29 -0
- data/lib/mailgunner/client/routes.rb +25 -0
- data/lib/mailgunner/client/stats.rb +9 -0
- data/lib/mailgunner/client/suppressions.rb +73 -0
- data/lib/mailgunner/client/tags.rb +25 -0
- data/lib/mailgunner/client/webhooks.rb +25 -0
- data/lib/mailgunner/config.rb +45 -0
- data/lib/mailgunner/delivery_method.rb +4 -2
- data/lib/mailgunner/errors.rb +25 -7
- data/lib/mailgunner/params.rb +16 -0
- data/lib/mailgunner/railtie.rb +1 -0
- data/lib/mailgunner/struct.rb +49 -0
- data/lib/mailgunner/version.rb +1 -1
- data/mailgunner.gemspec +9 -8
- metadata +30 -83
- data/spec/mailgunner_delivery_method_spec.rb +0 -37
- data/spec/mailgunner_spec.rb +0 -819
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Config
|
5
|
+
def domain
|
6
|
+
@domain ||= default_domain
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_writer :domain
|
10
|
+
|
11
|
+
def api_key
|
12
|
+
@api_key ||= ENV.fetch('MAILGUN_API_KEY')
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_writer :api_key
|
16
|
+
|
17
|
+
def api_host
|
18
|
+
@api_host ||= 'api.mailgun.net'
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_writer :api_host
|
22
|
+
|
23
|
+
def user_agent
|
24
|
+
@user_agent ||= "Ruby/#{RUBY_VERSION} Mailgunner/#{VERSION}"
|
25
|
+
end
|
26
|
+
|
27
|
+
attr_writer :user_agent
|
28
|
+
|
29
|
+
module NoDomainProvided
|
30
|
+
def self.to_s
|
31
|
+
raise Error, 'No domain provided'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private_constant :NoDomainProvided
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def default_domain
|
40
|
+
return NoDomainProvided unless ENV.key?('MAILGUN_SMTP_LOGIN')
|
41
|
+
|
42
|
+
ENV['MAILGUN_SMTP_LOGIN'].to_s.split('@').last
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -1,17 +1,19 @@
|
|
1
1
|
require 'mail/check_delivery_params'
|
2
2
|
|
3
3
|
module Mailgunner
|
4
|
+
# @private
|
4
5
|
class DeliveryMethod
|
5
6
|
attr_accessor :settings
|
6
7
|
|
7
8
|
def initialize(values)
|
8
|
-
|
9
|
+
self.settings = values
|
9
10
|
end
|
10
11
|
|
11
12
|
def deliver!(mail)
|
12
13
|
check(mail)
|
13
14
|
|
14
|
-
|
15
|
+
client = Client.new(**settings)
|
16
|
+
client.send_mime(mail)
|
15
17
|
end
|
16
18
|
|
17
19
|
private
|
data/lib/mailgunner/errors.rb
CHANGED
@@ -1,15 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Mailgunner
|
2
|
-
class Error < StandardError
|
4
|
+
class Error < StandardError
|
5
|
+
# @private
|
6
|
+
def self.parse(response)
|
7
|
+
exception_class = case response
|
8
|
+
when Net::HTTPUnauthorized
|
9
|
+
AuthenticationError
|
10
|
+
when Net::HTTPClientError
|
11
|
+
ClientError
|
12
|
+
when Net::HTTPServerError
|
13
|
+
ServerError
|
14
|
+
else
|
15
|
+
Error
|
16
|
+
end
|
17
|
+
|
18
|
+
message = if response['Content-Type']&.start_with?('application/json')
|
19
|
+
JSON.parse(response.body)['message']
|
20
|
+
end
|
21
|
+
|
22
|
+
message ||= "HTTP #{response.code} response from Mailgun API"
|
23
|
+
|
24
|
+
exception_class.new(message)
|
25
|
+
end
|
26
|
+
end
|
3
27
|
|
4
28
|
class ClientError < Error; end
|
5
29
|
|
6
30
|
class AuthenticationError < ClientError; end
|
7
31
|
|
8
32
|
class ServerError < Error; end
|
9
|
-
|
10
|
-
module NoDomainProvided
|
11
|
-
def self.to_s
|
12
|
-
raise Error, 'No domain provided'
|
13
|
-
end
|
14
|
-
end
|
15
33
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'cgi'
|
3
|
+
|
4
|
+
module Mailgunner
|
5
|
+
module Params
|
6
|
+
def self.encode(params)
|
7
|
+
params.flat_map { |k, vs| Array(vs).map { |v| "#{escape(k)}=#{escape(v)}" } }.join('&')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.escape(component)
|
11
|
+
CGI.escape(component.to_s)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private_constant :Params
|
16
|
+
end
|
data/lib/mailgunner/railtie.rb
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Struct
|
5
|
+
def initialize(hash = nil)
|
6
|
+
@hash = hash || {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def [](key)
|
10
|
+
@hash[key.to_s]
|
11
|
+
end
|
12
|
+
|
13
|
+
def []=(key, value)
|
14
|
+
@hash[key] = value
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_h
|
18
|
+
@hash
|
19
|
+
end
|
20
|
+
|
21
|
+
def ==(other)
|
22
|
+
other.is_a?(self.class) && other.to_h == @hash
|
23
|
+
end
|
24
|
+
|
25
|
+
def respond_to_missing?(name, include_all)
|
26
|
+
@hash.key?(name.to_s)
|
27
|
+
end
|
28
|
+
|
29
|
+
def method_missing(name, *args)
|
30
|
+
return @hash[name.to_s] if @hash.key?(name.to_s)
|
31
|
+
|
32
|
+
super
|
33
|
+
end
|
34
|
+
|
35
|
+
def pretty_print(q)
|
36
|
+
q.object_address_group(self) do
|
37
|
+
q.seplist(@hash, lambda { q.text ',' }) do |key, value|
|
38
|
+
q.breakable
|
39
|
+
q.text key.to_s
|
40
|
+
q.text '='
|
41
|
+
q.group(1) {
|
42
|
+
q.breakable ''
|
43
|
+
q.pp value
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/mailgunner/version.rb
CHANGED
data/mailgunner.gemspec
CHANGED
@@ -7,15 +7,16 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
8
|
s.authors = ['Tim Craft']
|
9
9
|
s.email = ['mail@timcraft.com']
|
10
|
-
s.homepage = '
|
10
|
+
s.homepage = 'https://github.com/readysteady/mailgunner'
|
11
11
|
s.description = 'Ruby client for the Mailgun API'
|
12
12
|
s.summary = 'Ruby client for the Mailgun API'
|
13
|
-
s.files = Dir.glob('
|
14
|
-
s.required_ruby_version = '>=
|
15
|
-
s.add_development_dependency('rake', '>= 12')
|
16
|
-
s.add_development_dependency('webmock', '~> 3')
|
17
|
-
s.add_development_dependency('mail', '~> 2')
|
18
|
-
s.add_development_dependency('actionmailer', '~> 5')
|
19
|
-
s.add_development_dependency('mocha', '~> 1')
|
13
|
+
s.files = Dir.glob('lib/**/*.rb') + %w(CHANGES.md LICENSE.txt README.md mailgunner.gemspec)
|
14
|
+
s.required_ruby_version = '>= 2.5.0'
|
20
15
|
s.require_path = 'lib'
|
16
|
+
s.metadata = {
|
17
|
+
'homepage' => 'https://github.com/readysteady/mailgunner',
|
18
|
+
'source_code_uri' => 'https://github.com/readysteady/mailgunner',
|
19
|
+
'bug_tracker_uri' => 'https://github.com/readysteady/mailgunner/issues',
|
20
|
+
'changelog_uri' => 'https://github.com/readysteady/mailgunner/blob/master/CHANGES.md'
|
21
|
+
}
|
21
22
|
end
|
metadata
CHANGED
@@ -1,85 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mailgunner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Craft
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rake
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '12'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '12'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: webmock
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '3'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '3'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: mail
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '2'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '2'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: actionmailer
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '5'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '5'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: mocha
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '1'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '1'
|
11
|
+
date: 2020-10-13 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
83
13
|
description: Ruby client for the Mailgun API
|
84
14
|
email:
|
85
15
|
- mail@timcraft.com
|
@@ -87,21 +17,39 @@ executables: []
|
|
87
17
|
extensions: []
|
88
18
|
extra_rdoc_files: []
|
89
19
|
files:
|
20
|
+
- CHANGES.md
|
90
21
|
- LICENSE.txt
|
91
22
|
- README.md
|
92
23
|
- lib/mailgunner.rb
|
24
|
+
- lib/mailgunner/client.rb
|
25
|
+
- lib/mailgunner/client/domains.rb
|
26
|
+
- lib/mailgunner/client/email_validation.rb
|
27
|
+
- lib/mailgunner/client/events.rb
|
28
|
+
- lib/mailgunner/client/ips.rb
|
29
|
+
- lib/mailgunner/client/mailing_lists.rb
|
30
|
+
- lib/mailgunner/client/messages.rb
|
31
|
+
- lib/mailgunner/client/routes.rb
|
32
|
+
- lib/mailgunner/client/stats.rb
|
33
|
+
- lib/mailgunner/client/suppressions.rb
|
34
|
+
- lib/mailgunner/client/tags.rb
|
35
|
+
- lib/mailgunner/client/webhooks.rb
|
36
|
+
- lib/mailgunner/config.rb
|
93
37
|
- lib/mailgunner/delivery_method.rb
|
94
38
|
- lib/mailgunner/errors.rb
|
39
|
+
- lib/mailgunner/params.rb
|
95
40
|
- lib/mailgunner/railtie.rb
|
41
|
+
- lib/mailgunner/struct.rb
|
96
42
|
- lib/mailgunner/version.rb
|
97
43
|
- mailgunner.gemspec
|
98
|
-
|
99
|
-
- spec/mailgunner_spec.rb
|
100
|
-
homepage: http://github.com/timcraft/mailgunner
|
44
|
+
homepage: https://github.com/readysteady/mailgunner
|
101
45
|
licenses:
|
102
46
|
- LGPL-3.0
|
103
|
-
metadata:
|
104
|
-
|
47
|
+
metadata:
|
48
|
+
homepage: https://github.com/readysteady/mailgunner
|
49
|
+
source_code_uri: https://github.com/readysteady/mailgunner
|
50
|
+
bug_tracker_uri: https://github.com/readysteady/mailgunner/issues
|
51
|
+
changelog_uri: https://github.com/readysteady/mailgunner/blob/master/CHANGES.md
|
52
|
+
post_install_message:
|
105
53
|
rdoc_options: []
|
106
54
|
require_paths:
|
107
55
|
- lib
|
@@ -109,16 +57,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
109
57
|
requirements:
|
110
58
|
- - ">="
|
111
59
|
- !ruby/object:Gem::Version
|
112
|
-
version:
|
60
|
+
version: 2.5.0
|
113
61
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
62
|
requirements:
|
115
63
|
- - ">="
|
116
64
|
- !ruby/object:Gem::Version
|
117
65
|
version: '0'
|
118
66
|
requirements: []
|
119
|
-
|
120
|
-
|
121
|
-
signing_key:
|
67
|
+
rubygems_version: 3.1.4
|
68
|
+
signing_key:
|
122
69
|
specification_version: 4
|
123
70
|
summary: Ruby client for the Mailgun API
|
124
71
|
test_files: []
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'minitest/autorun'
|
2
|
-
require 'webmock/minitest'
|
3
|
-
require 'action_mailer'
|
4
|
-
require 'mailgunner'
|
5
|
-
require 'mailgunner/delivery_method'
|
6
|
-
|
7
|
-
class ExampleMailer < ActionMailer::Base
|
8
|
-
default from: 'testing@localhost'
|
9
|
-
|
10
|
-
def registration_confirmation(user)
|
11
|
-
mail to: user[:email], subject: 'Welcome!', body: 'Hello!'
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
describe 'Mailgunner::DeliveryMethod' do
|
16
|
-
before do
|
17
|
-
@api_key = 'xxx'
|
18
|
-
|
19
|
-
@domain = 'samples.mailgun.org'
|
20
|
-
|
21
|
-
@base_url = 'https://api.mailgun.net/v3'
|
22
|
-
|
23
|
-
@auth = ['api', @api_key]
|
24
|
-
|
25
|
-
@address = 'user@example.com'
|
26
|
-
|
27
|
-
ActionMailer::Base.delivery_method = :mailgun
|
28
|
-
|
29
|
-
ActionMailer::Base.mailgun_settings = {api_key: @api_key, domain: @domain}
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'delivers the mail to mailgun in mime format' do
|
33
|
-
stub_request(:post, "#@base_url/#@domain/messages.mime").with(basic_auth: @auth)
|
34
|
-
|
35
|
-
ExampleMailer.registration_confirmation(email: @address).deliver_now
|
36
|
-
end
|
37
|
-
end
|
data/spec/mailgunner_spec.rb
DELETED
@@ -1,819 +0,0 @@
|
|
1
|
-
require 'minitest/autorun'
|
2
|
-
require 'webmock/minitest'
|
3
|
-
require 'mocha/setup'
|
4
|
-
require 'mailgunner'
|
5
|
-
require 'json'
|
6
|
-
require 'mail'
|
7
|
-
|
8
|
-
describe 'Mailgunner::Client' do
|
9
|
-
before do
|
10
|
-
@domain = 'samples.mailgun.org'
|
11
|
-
|
12
|
-
@api_key = 'xxx'
|
13
|
-
|
14
|
-
@base_url = 'https://@api.mailgun.net/v3'
|
15
|
-
|
16
|
-
@json_response_object = {'key' => 'value'}
|
17
|
-
|
18
|
-
@client = Mailgunner::Client.new(domain: @domain, api_key: @api_key)
|
19
|
-
|
20
|
-
@address = 'user@example.com'
|
21
|
-
|
22
|
-
@encoded_address = 'user%40example.com'
|
23
|
-
|
24
|
-
@login = 'bob.bar'
|
25
|
-
|
26
|
-
@id = 'idxxx'
|
27
|
-
end
|
28
|
-
|
29
|
-
def stub(http_method, url, body: nil, headers: nil)
|
30
|
-
headers ||= {}
|
31
|
-
headers['User-Agent'] = /\ARuby\/\d+\.\d+\.\d+ Mailgunner\/\d+\.\d+\.\d+\z/
|
32
|
-
|
33
|
-
params = {basic_auth: ['api', @api_key]}
|
34
|
-
params[:headers] = headers
|
35
|
-
params[:body] = body if body
|
36
|
-
|
37
|
-
response_headers = {'Content-Type' => 'application/json;charset=utf-8'}
|
38
|
-
response_body = '{"key":"value"}'
|
39
|
-
|
40
|
-
stub_request(http_method, url).with(params).to_return(headers: response_headers, body: response_body)
|
41
|
-
end
|
42
|
-
|
43
|
-
describe 'http method' do
|
44
|
-
it 'returns a net http object that uses ssl' do
|
45
|
-
@client.http.must_be_instance_of(Net::HTTP)
|
46
|
-
|
47
|
-
@client.http.use_ssl?.must_equal(true)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
describe 'domain method' do
|
52
|
-
it 'returns the value passed to the constructor' do
|
53
|
-
@client.domain.must_equal(@domain)
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'defaults to the domain in the MAILGUN_SMTP_LOGIN environment variable' do
|
57
|
-
ENV['MAILGUN_SMTP_LOGIN'] = 'postmaster@samples.mailgun.org'
|
58
|
-
|
59
|
-
Mailgunner::Client.new(api_key: @api_key).domain.must_equal(@domain)
|
60
|
-
|
61
|
-
ENV.delete('MAILGUN_SMTP_LOGIN')
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe 'api_key method' do
|
66
|
-
it 'returns the value passed to the constructor' do
|
67
|
-
@client.api_key.must_equal(@api_key)
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'defaults to the value of MAILGUN_API_KEY environment variable' do
|
71
|
-
ENV['MAILGUN_API_KEY'] = @api_key
|
72
|
-
|
73
|
-
Mailgunner::Client.new(domain: @domain).api_key.must_equal(@api_key)
|
74
|
-
|
75
|
-
ENV.delete('MAILGUN_API_KEY')
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
describe 'validate_address method' do
|
80
|
-
it 'calls the address validate resource with the given email address and returns the response object' do
|
81
|
-
stub(:get, "#@base_url/address/validate?address=#@encoded_address")
|
82
|
-
|
83
|
-
@client.validate_address(@address).must_equal(@json_response_object)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
describe 'parse_addresses method' do
|
88
|
-
it 'calls the address parse resource with the given email addresses and returns the response object' do
|
89
|
-
stub(:get, "#@base_url/address/parse?addresses=bob%40example.com%2Ceve%40example.com")
|
90
|
-
|
91
|
-
@client.parse_addresses(['bob@example.com', 'eve@example.com']).must_equal(@json_response_object)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
describe 'get_message method' do
|
96
|
-
it 'fetches the domain message resource with the given id and returns the response object' do
|
97
|
-
stub(:get, "#@base_url/domains/#@domain/messages/#@id")
|
98
|
-
|
99
|
-
@client.get_message(@id).must_equal(@json_response_object)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
describe 'get_mime_message method' do
|
104
|
-
it 'fetches the domain message resource with the given key and returns the response object' do
|
105
|
-
stub(:get, "#@base_url/domains/#@domain/messages/#@id", headers: {'Accept' => 'message/rfc2822'})
|
106
|
-
|
107
|
-
@client.get_mime_message(@id).must_equal(@json_response_object)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
describe 'send_message method' do
|
112
|
-
it 'posts to the domain messages resource and returns the response object' do
|
113
|
-
stub(:post, "#@base_url/#@domain/messages", body: "to=#@encoded_address")
|
114
|
-
|
115
|
-
@client.send_message({to: @address}).must_equal(@json_response_object)
|
116
|
-
end
|
117
|
-
|
118
|
-
it 'raises an exception if the domain is not provided' do
|
119
|
-
@client = Mailgunner::Client.new(api_key: @api_key)
|
120
|
-
|
121
|
-
exception = proc { @client.send_message({}) }.must_raise(Mailgunner::Error)
|
122
|
-
exception.message.must_include('No domain provided')
|
123
|
-
end
|
124
|
-
|
125
|
-
it 'encodes the message attributes as multipart form data when sending attachments' do
|
126
|
-
# TODO
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
describe 'send_mime method' do
|
131
|
-
before do
|
132
|
-
@mail = Mail.new({
|
133
|
-
to: 'alice@example.com',
|
134
|
-
from: 'bob@example.com',
|
135
|
-
subject: 'Test email',
|
136
|
-
body: 'This is a test email'
|
137
|
-
})
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'posts to the domain messages resource and returns the response object' do
|
141
|
-
stub(:post, "#@base_url/#@domain/messages.mime")
|
142
|
-
|
143
|
-
@client.send_mime(@mail).must_equal(@json_response_object)
|
144
|
-
end
|
145
|
-
|
146
|
-
it 'includes all recipients of the message' do
|
147
|
-
@mail.cc = 'carol@example.com'
|
148
|
-
@mail.bcc = 'dave@example.com'
|
149
|
-
|
150
|
-
stub(:post, "#@base_url/#@domain/messages.mime")
|
151
|
-
|
152
|
-
recipients = 'alice@example.com,carol@example.com,dave@example.com'
|
153
|
-
|
154
|
-
Net::HTTP::Post.any_instance.expects(:set_form).with(includes(['to', recipients]), 'multipart/form-data')
|
155
|
-
|
156
|
-
@client.send_mime(@mail)
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
describe 'delete_message method' do
|
161
|
-
it 'deletes the domain message resource with the given key and returns the response object' do
|
162
|
-
stub(:delete, "#@base_url/domains/#@domain/messages/#@id")
|
163
|
-
|
164
|
-
@client.delete_message(@id).must_equal(@json_response_object)
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
describe 'get_domains method' do
|
169
|
-
it 'fetches the domains resource and returns the response object' do
|
170
|
-
stub(:get, "#@base_url/domains")
|
171
|
-
|
172
|
-
@client.get_domains.must_equal(@json_response_object)
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
describe 'get_domain method' do
|
177
|
-
it 'fetches the domain resource and returns the response object' do
|
178
|
-
stub(:get, "#@base_url/domains/#@domain")
|
179
|
-
|
180
|
-
@client.get_domain(@domain).must_equal(@json_response_object)
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
describe 'add_domain method' do
|
185
|
-
it 'posts to the domains resource and returns the response object' do
|
186
|
-
stub(:post, "#@base_url/domains", body: "name=#@domain")
|
187
|
-
|
188
|
-
@client.add_domain({name: @domain}).must_equal(@json_response_object)
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
describe 'delete_domain method' do
|
193
|
-
it 'deletes the domain resource with the given name and returns the response object' do
|
194
|
-
stub(:delete, "#@base_url/domains/#@domain")
|
195
|
-
|
196
|
-
@client.delete_domain(@domain).must_equal(@json_response_object)
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
describe 'get_credentials method' do
|
201
|
-
it 'fetches the domain credentials resource and returns the response object' do
|
202
|
-
stub(:get, "#@base_url/domains/#@domain/credentials")
|
203
|
-
|
204
|
-
@client.get_credentials.must_equal(@json_response_object)
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
describe 'add_credentials method' do
|
209
|
-
it 'posts to the domain credentials resource and returns the response object' do
|
210
|
-
stub(:post, "#@base_url/domains/#@domain/credentials", body: "login=#@login")
|
211
|
-
|
212
|
-
@client.add_credentials(login: @login).must_equal(@json_response_object)
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
describe 'update_credentials method' do
|
217
|
-
it 'updates the domain credentials resource with the given login and returns the response object' do
|
218
|
-
stub(:put, "#@base_url/domains/#@domain/credentials/#@login", body: 'password=secret')
|
219
|
-
|
220
|
-
@client.update_credentials(@login, {password: 'secret'}).must_equal(@json_response_object)
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
describe 'delete_credentials method' do
|
225
|
-
it 'deletes the domain credentials resource with the given login and returns the response object' do
|
226
|
-
stub(:delete, "#@base_url/domains/#@domain/credentials/#@login")
|
227
|
-
|
228
|
-
@client.delete_credentials(@login).must_equal(@json_response_object)
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
describe 'get_connection_settings method' do
|
233
|
-
it 'fetches the domain connection settings resource and returns the response object' do
|
234
|
-
stub(:get, "#@base_url/domains/#@domain/connection")
|
235
|
-
|
236
|
-
@client.get_connection_settings.must_equal(@json_response_object)
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
describe 'update_connection_settings method' do
|
241
|
-
it 'updates the domain connection settings resource and returns the response object' do
|
242
|
-
stub(:put, "#@base_url/domains/#@domain/connection", body: 'require_tls=true')
|
243
|
-
|
244
|
-
@client.update_connection_settings({require_tls: true}).must_equal(@json_response_object)
|
245
|
-
end
|
246
|
-
end
|
247
|
-
|
248
|
-
describe 'get_unsubscribes method' do
|
249
|
-
it 'fetches the domain unsubscribes resource and returns the response object' do
|
250
|
-
stub(:get, "#@base_url/#@domain/unsubscribes")
|
251
|
-
|
252
|
-
@client.get_unsubscribes.must_equal(@json_response_object)
|
253
|
-
end
|
254
|
-
|
255
|
-
it 'encodes skip and limit parameters' do
|
256
|
-
stub(:get, "#@base_url/#@domain/unsubscribes?skip=1&limit=2")
|
257
|
-
|
258
|
-
@client.get_unsubscribes(skip: 1, limit: 2)
|
259
|
-
end
|
260
|
-
end
|
261
|
-
|
262
|
-
describe 'get_unsubscribe method' do
|
263
|
-
it 'fetches the unsubscribe resource with the given address and returns the response object' do
|
264
|
-
stub(:get, "#@base_url/#@domain/unsubscribes/#@encoded_address")
|
265
|
-
|
266
|
-
@client.get_unsubscribe(@address).must_equal(@json_response_object)
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
describe 'delete_unsubscribe method' do
|
271
|
-
it 'deletes the domain unsubscribe resource with the given address and returns the response object' do
|
272
|
-
stub(:delete, "#@base_url/#@domain/unsubscribes/#@encoded_address")
|
273
|
-
|
274
|
-
@client.delete_unsubscribe(@address).must_equal(@json_response_object)
|
275
|
-
end
|
276
|
-
end
|
277
|
-
|
278
|
-
describe 'add_unsubscribe method' do
|
279
|
-
it 'posts to the domain unsubscribes resource and returns the response object' do
|
280
|
-
stub(:post, "#@base_url/#@domain/unsubscribes", body: "address=#@encoded_address")
|
281
|
-
|
282
|
-
@client.add_unsubscribe({address: @address}).must_equal(@json_response_object)
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
describe 'get_complaints method' do
|
287
|
-
it 'fetches the domain complaints resource and returns the response object' do
|
288
|
-
stub(:get, "#@base_url/#@domain/complaints")
|
289
|
-
|
290
|
-
@client.get_complaints.must_equal(@json_response_object)
|
291
|
-
end
|
292
|
-
|
293
|
-
it 'encodes skip and limit parameters' do
|
294
|
-
stub(:get, "#@base_url/#@domain/complaints?skip=1&limit=2")
|
295
|
-
|
296
|
-
@client.get_complaints(skip: 1, limit: 2)
|
297
|
-
end
|
298
|
-
end
|
299
|
-
|
300
|
-
describe 'get_complaint method' do
|
301
|
-
it 'fetches the complaint resource with the given address and returns the response object' do
|
302
|
-
stub(:get, "#@base_url/#@domain/complaints/#@encoded_address")
|
303
|
-
|
304
|
-
@client.get_complaint(@address).must_equal(@json_response_object)
|
305
|
-
end
|
306
|
-
end
|
307
|
-
|
308
|
-
describe 'add_complaint method' do
|
309
|
-
it 'posts to the domain complaints resource and returns the response object' do
|
310
|
-
stub(:post, "#@base_url/#@domain/complaints", body: "address=#@encoded_address")
|
311
|
-
|
312
|
-
@client.add_complaint({address: @address}).must_equal(@json_response_object)
|
313
|
-
end
|
314
|
-
end
|
315
|
-
|
316
|
-
describe 'delete_complaint method' do
|
317
|
-
it 'deletes the domain complaint resource with the given address and returns the response object' do
|
318
|
-
stub(:delete, "#@base_url/#@domain/complaints/#@encoded_address")
|
319
|
-
|
320
|
-
@client.delete_complaint(@address).must_equal(@json_response_object)
|
321
|
-
end
|
322
|
-
end
|
323
|
-
|
324
|
-
describe 'get_bounces method' do
|
325
|
-
it 'fetches the domain bounces resource and returns the response object' do
|
326
|
-
stub(:get, "#@base_url/#@domain/bounces")
|
327
|
-
|
328
|
-
@client.get_bounces.must_equal(@json_response_object)
|
329
|
-
end
|
330
|
-
|
331
|
-
it 'encodes skip and limit parameters' do
|
332
|
-
stub(:get, "#@base_url/#@domain/bounces?skip=1&limit=2")
|
333
|
-
|
334
|
-
@client.get_bounces(skip: 1, limit: 2)
|
335
|
-
end
|
336
|
-
end
|
337
|
-
|
338
|
-
describe 'get_bounce method' do
|
339
|
-
it 'fetches the bounce resource with the given address and returns the response object' do
|
340
|
-
stub(:get, "#@base_url/#@domain/bounces/#@encoded_address")
|
341
|
-
|
342
|
-
@client.get_bounce(@address).must_equal(@json_response_object)
|
343
|
-
end
|
344
|
-
end
|
345
|
-
|
346
|
-
describe 'add_bounce method' do
|
347
|
-
it 'posts to the domain bounces resource and returns the response object' do
|
348
|
-
stub(:post, "#@base_url/#@domain/bounces", body: "address=#@encoded_address")
|
349
|
-
|
350
|
-
@client.add_bounce({address: @address}).must_equal(@json_response_object)
|
351
|
-
end
|
352
|
-
end
|
353
|
-
|
354
|
-
describe 'delete_bounce method' do
|
355
|
-
it 'deletes the domain bounce resource with the given address and returns the response object' do
|
356
|
-
stub(:delete, "#@base_url/#@domain/bounces/#@encoded_address")
|
357
|
-
|
358
|
-
@client.delete_bounce(@address).must_equal(@json_response_object)
|
359
|
-
end
|
360
|
-
end
|
361
|
-
|
362
|
-
describe 'delete_bounces method' do
|
363
|
-
it 'deletes the domain bounces resource and returns the response object' do
|
364
|
-
stub(:delete, "#@base_url/#@domain/bounces")
|
365
|
-
|
366
|
-
@client.delete_bounces.must_equal(@json_response_object)
|
367
|
-
end
|
368
|
-
end
|
369
|
-
|
370
|
-
describe 'get_stats method' do
|
371
|
-
before do
|
372
|
-
Kernel.stubs(:warn)
|
373
|
-
end
|
374
|
-
|
375
|
-
it 'fetches the domain stats resource and returns the response object' do
|
376
|
-
stub(:get, "#@base_url/#@domain/stats")
|
377
|
-
|
378
|
-
@client.get_stats.must_equal(@json_response_object)
|
379
|
-
end
|
380
|
-
|
381
|
-
it 'encodes skip and limit parameters' do
|
382
|
-
stub(:get, "#@base_url/#@domain/stats?skip=1&limit=2")
|
383
|
-
|
384
|
-
@client.get_stats(skip: 1, limit: 2)
|
385
|
-
end
|
386
|
-
|
387
|
-
it 'encodes an event parameter with multiple values' do
|
388
|
-
WebMock::Config.instance.query_values_notation = :flat_array
|
389
|
-
|
390
|
-
stub(:get, "#@base_url/#@domain/stats?event=opened&event=sent")
|
391
|
-
|
392
|
-
@client.get_stats(event: %w(sent opened))
|
393
|
-
|
394
|
-
WebMock::Config.instance.query_values_notation = nil
|
395
|
-
end
|
396
|
-
|
397
|
-
it 'emits a deprecation warning' do
|
398
|
-
stub(:get, "#@base_url/#@domain/stats")
|
399
|
-
|
400
|
-
Kernel.expects(:warn).with(regexp_matches(/Mailgunner::Client#get_stats is deprecated/))
|
401
|
-
|
402
|
-
@client.get_stats
|
403
|
-
end
|
404
|
-
end
|
405
|
-
|
406
|
-
describe 'get_total_stats method' do
|
407
|
-
it 'fetches the domain total stats resource and returns the response object' do
|
408
|
-
stub(:get, "#@base_url/#@domain/stats/total?event=delivered")
|
409
|
-
|
410
|
-
@client.get_total_stats(event: 'delivered').must_equal(@json_response_object)
|
411
|
-
end
|
412
|
-
|
413
|
-
it 'encodes optional parameters' do
|
414
|
-
stub(:get, "#@base_url/#@domain/stats/total?event=delivered&resolution=hour")
|
415
|
-
|
416
|
-
@client.get_total_stats(event: 'delivered', resolution: 'hour')
|
417
|
-
end
|
418
|
-
|
419
|
-
it 'encodes an event parameter with multiple values' do
|
420
|
-
WebMock::Config.instance.query_values_notation = :flat_array
|
421
|
-
|
422
|
-
stub(:get, "#@base_url/#@domain/stats/total?event=delivered&event=accepted")
|
423
|
-
|
424
|
-
@client.get_total_stats(event: %w(accepted delivered))
|
425
|
-
|
426
|
-
WebMock::Config.instance.query_values_notation = nil
|
427
|
-
end
|
428
|
-
end
|
429
|
-
|
430
|
-
describe 'get_events method' do
|
431
|
-
it 'fetches the domain events resource and returns the response object' do
|
432
|
-
stub(:get, "#@base_url/#@domain/events")
|
433
|
-
|
434
|
-
@client.get_events.must_equal(@json_response_object)
|
435
|
-
end
|
436
|
-
|
437
|
-
it 'encodes optional parameters' do
|
438
|
-
stub(:get, "#@base_url/#@domain/events?event=accepted&limit=10")
|
439
|
-
|
440
|
-
@client.get_events(event: 'accepted', limit: 10)
|
441
|
-
end
|
442
|
-
end
|
443
|
-
|
444
|
-
describe 'get_tags method' do
|
445
|
-
it 'fetches the domain tags resource and returns the response object' do
|
446
|
-
stub(:get, "#@base_url/#@domain/tags")
|
447
|
-
|
448
|
-
@client.get_tags.must_equal(@json_response_object)
|
449
|
-
end
|
450
|
-
|
451
|
-
it 'encodes optional limit parameter' do
|
452
|
-
stub(:get, "#@base_url/#@domain/tags?limit=2")
|
453
|
-
|
454
|
-
@client.get_tags(limit: 2)
|
455
|
-
end
|
456
|
-
end
|
457
|
-
|
458
|
-
describe 'get_tag method' do
|
459
|
-
it 'fetches the domain tag resource with the given id and returns the response object' do
|
460
|
-
stub(:get, "#@base_url/#@domain/tags/#@id")
|
461
|
-
|
462
|
-
@client.get_tag(@id).must_equal(@json_response_object)
|
463
|
-
end
|
464
|
-
end
|
465
|
-
|
466
|
-
describe 'update_tag method' do
|
467
|
-
it 'updates the domain tag resource with the given id and returns the response object' do
|
468
|
-
stub(:put, "#@base_url/#@domain/tags/#@id", body: 'description=Tag+description')
|
469
|
-
|
470
|
-
@client.update_tag(@id, {description: 'Tag description'}).must_equal(@json_response_object)
|
471
|
-
end
|
472
|
-
end
|
473
|
-
|
474
|
-
describe 'get_tag_stats method' do
|
475
|
-
it 'fetches the domain tag stats resource with the given id and returns the response object' do
|
476
|
-
stub(:get, "#@base_url/#@domain/tags/#@id/stats?event=accepted")
|
477
|
-
|
478
|
-
@client.get_tag_stats(@id, event: 'accepted').must_equal(@json_response_object)
|
479
|
-
end
|
480
|
-
end
|
481
|
-
|
482
|
-
describe 'delete_tag method' do
|
483
|
-
it 'deletes the domain tag resource with the given id and returns the response object' do
|
484
|
-
stub(:delete, "#@base_url/#@domain/tags/#@id")
|
485
|
-
|
486
|
-
@client.delete_tag(@id).must_equal(@json_response_object)
|
487
|
-
end
|
488
|
-
end
|
489
|
-
|
490
|
-
describe 'get_routes method' do
|
491
|
-
it 'fetches the routes resource and returns the response object' do
|
492
|
-
stub(:get, "#@base_url/routes")
|
493
|
-
|
494
|
-
@client.get_routes.must_equal(@json_response_object)
|
495
|
-
end
|
496
|
-
|
497
|
-
it 'encodes skip and limit parameters' do
|
498
|
-
stub(:get, "#@base_url/routes?skip=1&limit=2")
|
499
|
-
|
500
|
-
@client.get_routes(skip: 1, limit: 2)
|
501
|
-
end
|
502
|
-
end
|
503
|
-
|
504
|
-
describe 'get_route method' do
|
505
|
-
it 'fetches the route resource with the given id and returns the response object' do
|
506
|
-
stub(:get, "#@base_url/routes/#@id")
|
507
|
-
|
508
|
-
@client.get_route(@id).must_equal(@json_response_object)
|
509
|
-
end
|
510
|
-
end
|
511
|
-
|
512
|
-
describe 'add_route method' do
|
513
|
-
it 'posts to the routes resource and returns the response object' do
|
514
|
-
stub(:post, "#@base_url/routes", body: 'description=Example+route&priority=1')
|
515
|
-
|
516
|
-
@client.add_route({description: 'Example route', priority: 1}).must_equal(@json_response_object)
|
517
|
-
end
|
518
|
-
end
|
519
|
-
|
520
|
-
describe 'update_route method' do
|
521
|
-
it 'updates the route resource with the given id and returns the response object' do
|
522
|
-
stub(:put, "#@base_url/routes/#@id", body: 'priority=10')
|
523
|
-
|
524
|
-
@client.update_route(@id, {priority: 10}).must_equal(@json_response_object)
|
525
|
-
end
|
526
|
-
end
|
527
|
-
|
528
|
-
describe 'delete_route method' do
|
529
|
-
it 'deletes the route resource with the given id and returns the response object' do
|
530
|
-
stub(:delete, "#@base_url/routes/#@id")
|
531
|
-
|
532
|
-
@client.delete_route(@id).must_equal(@json_response_object)
|
533
|
-
end
|
534
|
-
end
|
535
|
-
|
536
|
-
describe 'get_webhooks method' do
|
537
|
-
it 'fetches the domain webhooks resource and returns the response object' do
|
538
|
-
stub(:get, "#@base_url/domains/#@domain/webhooks")
|
539
|
-
|
540
|
-
@client.get_webhooks.must_equal(@json_response_object)
|
541
|
-
end
|
542
|
-
end
|
543
|
-
|
544
|
-
describe 'get_webhook method' do
|
545
|
-
it 'fetches the domain webhook resource with the given id and returns the response object' do
|
546
|
-
stub(:get, "#@base_url/domains/#@domain/webhooks/#@id")
|
547
|
-
|
548
|
-
@client.get_webhook(@id).must_equal(@json_response_object)
|
549
|
-
end
|
550
|
-
end
|
551
|
-
|
552
|
-
describe 'add_webhook method' do
|
553
|
-
it 'posts to the domain webhooks resource and returns the response object' do
|
554
|
-
attributes = {id: @id, url: 'http://example.com/webhook'}
|
555
|
-
|
556
|
-
stub(:post, "#@base_url/domains/#@domain/webhooks", body: attributes)
|
557
|
-
|
558
|
-
@client.add_webhook(attributes).must_equal(@json_response_object)
|
559
|
-
end
|
560
|
-
end
|
561
|
-
|
562
|
-
describe 'update_webhook method' do
|
563
|
-
it 'updates the domain webhook resource with the given id and returns the response object' do
|
564
|
-
attributes = {url: 'http://example.com/webhook'}
|
565
|
-
|
566
|
-
stub(:put, "#@base_url/domains/#@domain/webhooks/#@id", body: attributes)
|
567
|
-
|
568
|
-
@client.update_webhook(@id, attributes).must_equal(@json_response_object)
|
569
|
-
end
|
570
|
-
end
|
571
|
-
|
572
|
-
describe 'delete_webhook method' do
|
573
|
-
it 'deletes the domain webhook resource with the given address and returns the response object' do
|
574
|
-
stub(:delete, "#@base_url/domains/#@domain/webhooks/#@id")
|
575
|
-
|
576
|
-
@client.delete_webhook(@id).must_equal(@json_response_object)
|
577
|
-
end
|
578
|
-
end
|
579
|
-
|
580
|
-
describe 'get_campaigns method' do
|
581
|
-
it 'fetches the domain campaigns resource and returns the response object' do
|
582
|
-
stub(:get, "#@base_url/#@domain/campaigns")
|
583
|
-
|
584
|
-
@client.get_campaigns.must_equal(@json_response_object)
|
585
|
-
end
|
586
|
-
|
587
|
-
it 'encodes skip and limit parameters' do
|
588
|
-
stub(:get, "#@base_url/#@domain/campaigns?skip=1&limit=2")
|
589
|
-
|
590
|
-
@client.get_campaigns(skip: 1, limit: 2)
|
591
|
-
end
|
592
|
-
end
|
593
|
-
|
594
|
-
describe 'get_campaign method' do
|
595
|
-
it 'fetches the campaign resource with the given id and returns the response object' do
|
596
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id")
|
597
|
-
|
598
|
-
@client.get_campaign(@id).must_equal(@json_response_object)
|
599
|
-
end
|
600
|
-
end
|
601
|
-
|
602
|
-
describe 'add_campaign method' do
|
603
|
-
it 'posts to the domain campaigns resource and returns the response object' do
|
604
|
-
stub(:post, "#@base_url/#@domain/campaigns", body: "id=#@id")
|
605
|
-
|
606
|
-
@client.add_campaign({id: @id}).must_equal(@json_response_object)
|
607
|
-
end
|
608
|
-
end
|
609
|
-
|
610
|
-
describe 'update_campaign method' do
|
611
|
-
it 'updates the campaign resource and returns the response object' do
|
612
|
-
stub(:put, "#@base_url/#@domain/campaigns/#@id", body: 'name=Example+Campaign')
|
613
|
-
|
614
|
-
@client.update_campaign(@id, {name: 'Example Campaign'}).must_equal(@json_response_object)
|
615
|
-
end
|
616
|
-
end
|
617
|
-
|
618
|
-
describe 'delete_campaign method' do
|
619
|
-
it 'deletes the domain campaign resource with the given id and returns the response object' do
|
620
|
-
stub(:delete, "#@base_url/#@domain/campaigns/#@id")
|
621
|
-
|
622
|
-
@client.delete_campaign(@id).must_equal(@json_response_object)
|
623
|
-
end
|
624
|
-
end
|
625
|
-
|
626
|
-
describe 'get_campaign_events method' do
|
627
|
-
it 'fetches the domain campaign events resource and returns the response object' do
|
628
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/events")
|
629
|
-
|
630
|
-
@client.get_campaign_events(@id).must_equal(@json_response_object)
|
631
|
-
end
|
632
|
-
|
633
|
-
it 'encodes the optional parameters' do
|
634
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/events?country=US&limit=100")
|
635
|
-
|
636
|
-
@client.get_campaign_events(@id, country: 'US', limit: 100)
|
637
|
-
end
|
638
|
-
end
|
639
|
-
|
640
|
-
describe 'get_campaign_stats method' do
|
641
|
-
it 'fetches the domain campaign stats resource and returns the response object' do
|
642
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/stats")
|
643
|
-
|
644
|
-
@client.get_campaign_stats(@id).must_equal(@json_response_object)
|
645
|
-
end
|
646
|
-
|
647
|
-
it 'encodes the optional parameters' do
|
648
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/stats?groupby=dailyhour")
|
649
|
-
|
650
|
-
@client.get_campaign_stats(@id, groupby: 'dailyhour')
|
651
|
-
end
|
652
|
-
end
|
653
|
-
|
654
|
-
describe 'get_campaign_clicks method' do
|
655
|
-
it 'fetches the domain campaign clicks resource and returns the response object' do
|
656
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/clicks")
|
657
|
-
|
658
|
-
@client.get_campaign_clicks(@id).must_equal(@json_response_object)
|
659
|
-
end
|
660
|
-
|
661
|
-
it 'encodes the optional parameters' do
|
662
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/clicks?groupby=month&limit=100")
|
663
|
-
|
664
|
-
@client.get_campaign_clicks(@id, groupby: 'month', limit: 100)
|
665
|
-
end
|
666
|
-
end
|
667
|
-
|
668
|
-
describe 'get_campaign_opens method' do
|
669
|
-
it 'fetches the domain campaign opens resource and returns the response object' do
|
670
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/opens")
|
671
|
-
|
672
|
-
@client.get_campaign_opens(@id).must_equal(@json_response_object)
|
673
|
-
end
|
674
|
-
|
675
|
-
it 'encodes the optional parameters' do
|
676
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/opens?groupby=month&limit=100")
|
677
|
-
|
678
|
-
@client.get_campaign_opens(@id, groupby: 'month', limit: 100)
|
679
|
-
end
|
680
|
-
end
|
681
|
-
|
682
|
-
describe 'get_campaign_unsubscribes method' do
|
683
|
-
it 'fetches the domain campaign unsubscribes resource and returns the response object' do
|
684
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/unsubscribes")
|
685
|
-
|
686
|
-
@client.get_campaign_unsubscribes(@id).must_equal(@json_response_object)
|
687
|
-
end
|
688
|
-
|
689
|
-
it 'encodes the optional parameters' do
|
690
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/unsubscribes?groupby=month&limit=100")
|
691
|
-
|
692
|
-
@client.get_campaign_unsubscribes(@id, groupby: 'month', limit: 100)
|
693
|
-
end
|
694
|
-
end
|
695
|
-
|
696
|
-
describe 'get_campaign_complaints method' do
|
697
|
-
it 'fetches the domain campaign complaints resource and returns the response object' do
|
698
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/complaints")
|
699
|
-
|
700
|
-
@client.get_campaign_complaints(@id).must_equal(@json_response_object)
|
701
|
-
end
|
702
|
-
|
703
|
-
it 'encodes the optional parameters' do
|
704
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/complaints?groupby=month&limit=100")
|
705
|
-
|
706
|
-
@client.get_campaign_complaints(@id, groupby: 'month', limit: 100)
|
707
|
-
end
|
708
|
-
end
|
709
|
-
|
710
|
-
describe 'get_lists method' do
|
711
|
-
it 'fetches the lists resource and returns the response object' do
|
712
|
-
stub(:get, "#@base_url/lists")
|
713
|
-
|
714
|
-
@client.get_lists.must_equal(@json_response_object)
|
715
|
-
end
|
716
|
-
|
717
|
-
it 'encodes skip and limit parameters' do
|
718
|
-
stub(:get, "#@base_url/lists?skip=1&limit=2")
|
719
|
-
|
720
|
-
@client.get_lists(skip: 1, limit: 2)
|
721
|
-
end
|
722
|
-
end
|
723
|
-
|
724
|
-
describe 'get_list method' do
|
725
|
-
it 'fetches the list resource with the given address and returns the response object' do
|
726
|
-
stub(:get, "#@base_url/lists/developers%40mailgun.net")
|
727
|
-
|
728
|
-
@client.get_list('developers@mailgun.net').must_equal(@json_response_object)
|
729
|
-
end
|
730
|
-
end
|
731
|
-
|
732
|
-
describe 'add_list method' do
|
733
|
-
it 'posts to the lists resource and returns the response object' do
|
734
|
-
stub(:post, "#@base_url/lists", body: 'address=developers%40mailgun.net')
|
735
|
-
|
736
|
-
@client.add_list({address: 'developers@mailgun.net'}).must_equal(@json_response_object)
|
737
|
-
end
|
738
|
-
end
|
739
|
-
|
740
|
-
describe 'update_list method' do
|
741
|
-
it 'updates the list resource and returns the response object' do
|
742
|
-
stub(:put, "#@base_url/lists/developers%40mailgun.net", body: 'name=Example+list')
|
743
|
-
|
744
|
-
@client.update_list('developers@mailgun.net', {name: 'Example list'}).must_equal(@json_response_object)
|
745
|
-
end
|
746
|
-
end
|
747
|
-
|
748
|
-
describe 'delete_list method' do
|
749
|
-
it 'deletes the list resource with the given address and returns the response object' do
|
750
|
-
stub(:delete, "#@base_url/lists/developers%40mailgun.net")
|
751
|
-
|
752
|
-
@client.delete_list('developers@mailgun.net').must_equal(@json_response_object)
|
753
|
-
end
|
754
|
-
end
|
755
|
-
|
756
|
-
describe 'get_list_members method' do
|
757
|
-
it 'fetches the list members resource and returns the response object' do
|
758
|
-
stub(:get, "#@base_url/lists/developers%40mailgun.net/members")
|
759
|
-
|
760
|
-
@client.get_list_members('developers@mailgun.net').must_equal(@json_response_object)
|
761
|
-
end
|
762
|
-
|
763
|
-
it 'encodes skip and limit parameters' do
|
764
|
-
stub(:get, "#@base_url/lists/developers%40mailgun.net/members?skip=1&limit=2")
|
765
|
-
|
766
|
-
@client.get_list_members('developers@mailgun.net', skip: 1, limit: 2)
|
767
|
-
end
|
768
|
-
end
|
769
|
-
|
770
|
-
describe 'get_list_member method' do
|
771
|
-
it 'fetches the list member resource with the given address and returns the response object' do
|
772
|
-
stub(:get, "#@base_url/lists/developers%40mailgun.net/members/#@encoded_address")
|
773
|
-
|
774
|
-
@client.get_list_member('developers@mailgun.net', @address).must_equal(@json_response_object)
|
775
|
-
end
|
776
|
-
end
|
777
|
-
|
778
|
-
describe 'add_list_member method' do
|
779
|
-
it 'posts to the list members resource and returns the response object' do
|
780
|
-
stub(:post, "#@base_url/lists/developers%40mailgun.net/members", body: "address=#@encoded_address")
|
781
|
-
|
782
|
-
@client.add_list_member('developers@mailgun.net', {address: @address}).must_equal(@json_response_object)
|
783
|
-
end
|
784
|
-
end
|
785
|
-
|
786
|
-
describe 'update_list_member method' do
|
787
|
-
it 'updates the list member resource with the given address and returns the response object' do
|
788
|
-
stub(:put, "#@base_url/lists/developers%40mailgun.net/members/#@encoded_address", body: 'subscribed=no')
|
789
|
-
|
790
|
-
@client.update_list_member('developers@mailgun.net', @address, {subscribed: 'no'}).must_equal(@json_response_object)
|
791
|
-
end
|
792
|
-
end
|
793
|
-
|
794
|
-
describe 'delete_list_member method' do
|
795
|
-
it 'deletes the list member resource with the given address and returns the response object' do
|
796
|
-
stub(:delete, "#@base_url/lists/developers%40mailgun.net/members/#@encoded_address")
|
797
|
-
|
798
|
-
@client.delete_list_member('developers@mailgun.net', @address).must_equal(@json_response_object)
|
799
|
-
end
|
800
|
-
end
|
801
|
-
|
802
|
-
it 'raises an exception for authentication errors' do
|
803
|
-
stub_request(:any, /api\.mailgun\.net/).to_return(status: 401)
|
804
|
-
|
805
|
-
proc { @client.get_message(@id) }.must_raise(Mailgunner::AuthenticationError)
|
806
|
-
end
|
807
|
-
|
808
|
-
it 'raises an exception for client errors' do
|
809
|
-
stub_request(:any, /api\.mailgun\.net/).to_return(status: 400)
|
810
|
-
|
811
|
-
proc { @client.get_message(@id) }.must_raise(Mailgunner::ClientError)
|
812
|
-
end
|
813
|
-
|
814
|
-
it 'raises an exception for server errors' do
|
815
|
-
stub_request(:any, /api\.mailgun\.net/).to_return(status: 500)
|
816
|
-
|
817
|
-
proc { @client.get_message(@id) }.must_raise(Mailgunner::ServerError)
|
818
|
-
end
|
819
|
-
end
|