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
|
@@ -1,105 +1,99 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
require 'mailgun'
|
|
3
5
|
require 'mailgun/exceptions/exceptions'
|
|
4
6
|
|
|
5
|
-
describe 'Mailgun instantiation', vcr: { :
|
|
7
|
+
describe 'Mailgun instantiation', vcr: { cassette_name: 'instance' } do
|
|
6
8
|
it 'instantiates an HttpClient object' do
|
|
7
|
-
expect {@mg_obj = Mailgun::Client.new(APIKEY, APIHOST, APIVERSION, SSL)}.not_to raise_error
|
|
9
|
+
expect { @mg_obj = Mailgun::Client.new(APIKEY, APIHOST, APIVERSION, SSL) }.not_to raise_error
|
|
8
10
|
end
|
|
9
11
|
end
|
|
10
12
|
|
|
11
|
-
describe 'Client exceptions', vcr: { :
|
|
13
|
+
describe 'Client exceptions', vcr: { cassette_name: 'exceptions' } do
|
|
12
14
|
before(:all) do
|
|
13
15
|
@mg_obj = Mailgun::Client.new(APIKEY, APIHOST, APIVERSION, SSL)
|
|
14
16
|
@domain = TESTDOMAIN || 'DOMAIN.TEST'
|
|
15
17
|
end
|
|
16
18
|
|
|
17
19
|
it 'display useful error information' do
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
fail
|
|
30
|
-
end
|
|
20
|
+
@mg_obj.send_message('not-our-doma.in', {
|
|
21
|
+
from: 'sally@not-our-doma.in',
|
|
22
|
+
to: "bob@#{@domain}",
|
|
23
|
+
subject: 'Exception Integration Test',
|
|
24
|
+
text: 'INTEGRATION TESTING'
|
|
25
|
+
})
|
|
26
|
+
rescue Mailgun::CommunicationError => e
|
|
27
|
+
expect(e.message).to include('404')
|
|
28
|
+
expect(e.message).to include('Domain not found: not-our-doma.in')
|
|
29
|
+
else
|
|
30
|
+
raise
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
describe 'Client exceptions', vcr: { :
|
|
34
|
+
describe 'Client exceptions', vcr: { cassette_name: 'exceptions-invalid-api-key' } do
|
|
35
35
|
before(:all) do
|
|
36
36
|
@mg_obj = Mailgun::Client.new(APIKEY, APIHOST, APIVERSION, SSL)
|
|
37
37
|
@domain = TESTDOMAIN || 'DOMAIN.TEST'
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
it 'displays error information that API key is invalid' do
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
fail
|
|
53
|
-
end
|
|
41
|
+
@mg_obj.send_message(@domain, {
|
|
42
|
+
from: "sally@#{@domain}",
|
|
43
|
+
to: "sally@#{@domain}",
|
|
44
|
+
subject: 'Exception Integration Test',
|
|
45
|
+
text: 'INTEGRATION TESTING'
|
|
46
|
+
})
|
|
47
|
+
rescue Mailgun::Unauthorized => e
|
|
48
|
+
expect(e.message).to include('401')
|
|
49
|
+
expect(e.message).to include('Invalid Domain or API key')
|
|
50
|
+
else
|
|
51
|
+
raise
|
|
54
52
|
end
|
|
55
53
|
end
|
|
56
54
|
|
|
57
|
-
describe 'Client exceptions', vcr: { :
|
|
55
|
+
describe 'Client exceptions', vcr: { cassette_name: 'exceptions-invalid-data' } do
|
|
58
56
|
before(:all) do
|
|
59
57
|
@mg_obj = Mailgun::Client.new(APIKEY, APIHOST, APIVERSION, SSL)
|
|
60
58
|
@domain = TESTDOMAIN || 'DOMAIN.TEST'
|
|
61
59
|
end
|
|
62
60
|
|
|
63
61
|
it 'display useful error information' do
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
fail
|
|
76
|
-
end
|
|
62
|
+
@mg_obj.send_message(@domain, {
|
|
63
|
+
from: "sally@#{@domain}",
|
|
64
|
+
to: "sally#{@domain}",
|
|
65
|
+
subject: 'Exception Integration Test',
|
|
66
|
+
text: 'INTEGRATION TESTING'
|
|
67
|
+
})
|
|
68
|
+
rescue Mailgun::BadRequest => e
|
|
69
|
+
expect(e.message).to include('400')
|
|
70
|
+
expect(e.message).to include('to parameter is not a valid address. please check documentation')
|
|
71
|
+
else
|
|
72
|
+
raise
|
|
77
73
|
end
|
|
78
74
|
end
|
|
79
75
|
|
|
80
|
-
describe 'Client exceptions', vcr: { :
|
|
76
|
+
describe 'Client exceptions', vcr: { cassette_name: 'exceptions-not-allowed' } do
|
|
81
77
|
before(:all) do
|
|
82
78
|
@mg_obj = Mailgun::Client.new(APIKEY, APIHOST, APIVERSION, SSL)
|
|
83
79
|
@domain = TESTDOMAIN || 'DOMAIN.TEST'
|
|
84
80
|
end
|
|
85
81
|
|
|
86
82
|
it 'display useful error information' do
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
fail
|
|
98
|
-
end
|
|
83
|
+
@mg_obj.send_message(@domain, {
|
|
84
|
+
from: "invalid@#{@domain}",
|
|
85
|
+
to: "invalid#{@domain}",
|
|
86
|
+
subject: 'Exception Integration Test',
|
|
87
|
+
text: 'INTEGRATION TESTING'
|
|
88
|
+
})
|
|
89
|
+
rescue Mailgun::CommunicationError => e
|
|
90
|
+
expect(e.message).to include('403')
|
|
91
|
+
else
|
|
92
|
+
raise
|
|
99
93
|
end
|
|
100
94
|
end
|
|
101
95
|
|
|
102
|
-
describe 'The method send_message()', vcr: { :
|
|
96
|
+
describe 'The method send_message()', vcr: { cassette_name: 'send_message' } do
|
|
103
97
|
before(:all) do
|
|
104
98
|
@mg_obj = Mailgun::Client.new(APIKEY, APIHOST, APIVERSION, SSL)
|
|
105
99
|
@domain = TESTDOMAIN || 'DOMAIN.TEST'
|
|
@@ -107,26 +101,26 @@ describe 'The method send_message()', vcr: { :cassette_name => "send_message" }
|
|
|
107
101
|
|
|
108
102
|
it 'sends a standard message in test mode.' do
|
|
109
103
|
@mg_obj.enable_test_mode!
|
|
110
|
-
result = @mg_obj.send_message(@domain, {:from => "bob@#{@domain}",
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
)
|
|
104
|
+
result = @mg_obj.send_message(@domain, { :from => "bob@#{@domain}",
|
|
105
|
+
:to => "sally@#{@domain}",
|
|
106
|
+
:subject => 'Hash Integration Test',
|
|
107
|
+
:text => 'INTEGRATION TESTING',
|
|
108
|
+
'o:testmode' => true })
|
|
116
109
|
result.to_h!
|
|
117
|
-
expect(result.body).to include(
|
|
118
|
-
expect(result.body).to include(
|
|
110
|
+
expect(result.body).to include('message')
|
|
111
|
+
expect(result.body).to include('id')
|
|
112
|
+
expect(Mailgun::Client.deliveries.size).to eq(1)
|
|
119
113
|
end
|
|
120
114
|
|
|
121
115
|
it 'fakes message send while in *client* test mode' do
|
|
122
116
|
@mg_obj.enable_test_mode!
|
|
123
117
|
|
|
124
|
-
expect(@mg_obj.test_mode?).to
|
|
118
|
+
expect(@mg_obj.test_mode?).to be(true)
|
|
125
119
|
|
|
126
|
-
data = { :
|
|
127
|
-
:
|
|
128
|
-
:
|
|
129
|
-
:
|
|
120
|
+
data = { from: "joe@#{@domain}",
|
|
121
|
+
to: "bob@#{@domain}",
|
|
122
|
+
subject: 'Test',
|
|
123
|
+
text: 'Test Data' }
|
|
130
124
|
uuid = 'uuid'
|
|
131
125
|
|
|
132
126
|
allow(SecureRandom).to receive(:uuid).and_return(uuid)
|
|
@@ -135,27 +129,27 @@ describe 'The method send_message()', vcr: { :cassette_name => "send_message" }
|
|
|
135
129
|
|
|
136
130
|
result.to_h!
|
|
137
131
|
|
|
138
|
-
expect(result.body).to include(
|
|
139
|
-
expect(result.body).to include(
|
|
132
|
+
expect(result.body).to include('message')
|
|
133
|
+
expect(result.body).to include('id')
|
|
140
134
|
|
|
141
135
|
expect(result.code).to eq(200)
|
|
142
136
|
expect(result.body['id']).to eq("test-mode-mail-#{uuid}@localhost")
|
|
143
|
-
expect(result.body['message']).to eq(
|
|
137
|
+
expect(result.body['message']).to eq('Queued. Thank you.')
|
|
144
138
|
end
|
|
145
139
|
|
|
146
140
|
it 'sends a message builder message in test mode.' do
|
|
147
|
-
mb_obj = Mailgun::MessageBuilder.new
|
|
148
|
-
mb_obj.from("sender@#{@domain}", {'first' => 'Sending', 'last' => 'User'})
|
|
149
|
-
mb_obj.add_recipient(:to, "recipient@#{@domain}", {'first' => 'Recipient', 'last' => 'User'})
|
|
150
|
-
mb_obj.subject(
|
|
151
|
-
mb_obj.body_text(
|
|
141
|
+
mb_obj = Mailgun::MessageBuilder.new
|
|
142
|
+
mb_obj.from("sender@#{@domain}", { 'first' => 'Sending', 'last' => 'User' })
|
|
143
|
+
mb_obj.add_recipient(:to, "recipient@#{@domain}", { 'first' => 'Recipient', 'last' => 'User' })
|
|
144
|
+
mb_obj.subject('Message Builder Integration Test')
|
|
145
|
+
mb_obj.body_text('This is the text body.')
|
|
152
146
|
mb_obj.test_mode(true)
|
|
153
147
|
|
|
154
148
|
result = @mg_obj.send_message(@domain, mb_obj)
|
|
155
149
|
|
|
156
150
|
result.to_h!
|
|
157
|
-
expect(result.body).to include(
|
|
158
|
-
expect(result.body).to include(
|
|
151
|
+
expect(result.body).to include('message')
|
|
152
|
+
expect(result.body).to include('id')
|
|
159
153
|
end
|
|
160
154
|
|
|
161
155
|
it 'sends a custom MIME message in test mode.' do
|
|
@@ -175,26 +169,26 @@ Sender: me@samples.mailgun.org
|
|
|
175
169
|
|
|
176
170
|
Testing some Mailgun awesomness!'
|
|
177
171
|
|
|
178
|
-
message_params = {:
|
|
179
|
-
|
|
180
|
-
|
|
172
|
+
message_params = { from: "bobby@#{@domain}",
|
|
173
|
+
to: "sally@#{@domain}",
|
|
174
|
+
message: mime_string }
|
|
181
175
|
|
|
182
176
|
result = @mg_obj.send_message(@domain, message_params)
|
|
183
177
|
|
|
184
178
|
result.to_h!
|
|
185
|
-
expect(result.body).to include(
|
|
186
|
-
expect(result.body).to include(
|
|
179
|
+
expect(result.body).to include('message')
|
|
180
|
+
expect(result.body).to include('id')
|
|
187
181
|
end
|
|
188
182
|
|
|
189
183
|
it 'receives success response code' do
|
|
190
184
|
@mg_obj.enable_test_mode!
|
|
191
185
|
|
|
192
|
-
expect(@mg_obj.test_mode?).to
|
|
186
|
+
expect(@mg_obj.test_mode?).to be(true)
|
|
193
187
|
|
|
194
|
-
data = { :
|
|
195
|
-
:
|
|
196
|
-
:
|
|
197
|
-
:
|
|
188
|
+
data = { from: "joe@#{@domain}",
|
|
189
|
+
to: "bob@#{@domain}",
|
|
190
|
+
subject: 'Test',
|
|
191
|
+
text: 'Test Data' }
|
|
198
192
|
|
|
199
193
|
result = @mg_obj.send_message(@domain, data)
|
|
200
194
|
result.to_h!
|
|
@@ -202,4 +196,3 @@ Testing some Mailgun awesomness!'
|
|
|
202
196
|
expect(result.success?).to be(true)
|
|
203
197
|
end
|
|
204
198
|
end
|
|
205
|
-
|
|
@@ -1,20 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
require 'mailgun'
|
|
3
5
|
|
|
4
6
|
vcr_opts = { cassette_name: 'metrics' }
|
|
5
7
|
|
|
6
8
|
describe Mailgun::Metrics, vcr: vcr_opts do
|
|
7
|
-
let(:metrics) {
|
|
9
|
+
let(:metrics) { described_class.new(Mailgun::Client.new(APIKEY, APIHOST, 'v1')) }
|
|
8
10
|
|
|
9
11
|
describe '#account_metrics' do
|
|
10
12
|
let(:options) do
|
|
11
13
|
{
|
|
12
14
|
resolution: 'hour',
|
|
13
|
-
metrics: [
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
metrics: %w[
|
|
16
|
+
accepted_count
|
|
17
|
+
delivered_count
|
|
18
|
+
clicked_rate
|
|
19
|
+
opened_rate
|
|
18
20
|
],
|
|
19
21
|
include_aggregates: true,
|
|
20
22
|
start: 'Tue, 26 Nov 2024 20:56:50 -0500',
|
|
@@ -42,48 +44,53 @@ describe Mailgun::Metrics, vcr: vcr_opts do
|
|
|
42
44
|
it 'responds with account metrics' do
|
|
43
45
|
expect(metrics.account_metrics(options)).to eq(
|
|
44
46
|
{
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
'start' => 'Fri, 01 Nov 2024 01:00:00 +0000',
|
|
48
|
+
'end' => 'Sun, 01 Dec 2024 01:00:00 +0000',
|
|
49
|
+
'resolution' => 'hour',
|
|
50
|
+
'duration' => '1m',
|
|
51
|
+
'dimensions' => ['time'],
|
|
52
|
+
'pagination' => {
|
|
53
|
+
'sort' => '', 'skip' => 0, 'limit' => 1500, 'total' => 3
|
|
52
54
|
},
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
"dimensions" => [{
|
|
65
|
-
"dimension" => "time",
|
|
66
|
-
"value" => "Wed, 27 Nov 2024 13:00:00 +0000",
|
|
67
|
-
"display_value" => "Wed, 27 Nov 2024 13:00:00 +0000"
|
|
68
|
-
}],
|
|
69
|
-
"metrics" => {
|
|
70
|
-
"accepted_count" => 1, "delivered_count" => 1, "opened_rate" => "0.0000", "clicked_rate" => "0.0000"
|
|
71
|
-
}
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
"dimensions" => [{
|
|
75
|
-
"dimension" => "time",
|
|
76
|
-
"value" => "Thu, 28 Nov 2024 15:00:00 +0000",
|
|
77
|
-
"display_value" => "Thu, 28 Nov 2024 15:00:00 +0000"
|
|
78
|
-
}],
|
|
79
|
-
"metrics" => {
|
|
80
|
-
"accepted_count" => 1, "delivered_count" => 1, "opened_rate" => "0.0000", "clicked_rate" => "0.0000"
|
|
81
|
-
}
|
|
55
|
+
'items' => [{
|
|
56
|
+
'dimensions' => [{
|
|
57
|
+
'dimension' => 'time',
|
|
58
|
+
'value' => 'Wed, 27 Nov 2024 12:00:00 +0000',
|
|
59
|
+
'display_value' => 'Wed, 27 Nov 2024 12:00:00 +0000'
|
|
60
|
+
}],
|
|
61
|
+
'metrics' => {
|
|
62
|
+
'accepted_count' => 1, 'delivered_count' => 1, 'opened_rate' => '0.0000', 'clicked_rate' => '0.0000'
|
|
82
63
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
'dimensions' => [{
|
|
67
|
+
'dimension' => 'time',
|
|
68
|
+
'value' => 'Wed, 27 Nov 2024 13:00:00 +0000',
|
|
69
|
+
'display_value' => 'Wed, 27 Nov 2024 13:00:00 +0000'
|
|
70
|
+
}],
|
|
71
|
+
'metrics' => {
|
|
72
|
+
'accepted_count' => 1,
|
|
73
|
+
'delivered_count' => 1,
|
|
74
|
+
'opened_rate' => '0.0000',
|
|
75
|
+
'clicked_rate' => '0.0000'
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
'dimensions' => [{
|
|
80
|
+
'dimension' => 'time',
|
|
81
|
+
'value' => 'Thu, 28 Nov 2024 15:00:00 +0000',
|
|
82
|
+
'display_value' => 'Thu, 28 Nov 2024 15:00:00 +0000'
|
|
83
|
+
}],
|
|
84
|
+
'metrics' => {
|
|
85
|
+
'accepted_count' => 1,
|
|
86
|
+
'delivered_count' => 1,
|
|
87
|
+
'opened_rate' => '0.0000',
|
|
88
|
+
'clicked_rate' => '0.0000'
|
|
89
|
+
}
|
|
90
|
+
}],
|
|
91
|
+
'aggregates' => {
|
|
92
|
+
'metrics' => {
|
|
93
|
+
'accepted_count' => 3, 'delivered_count' => 3, 'opened_rate' => '0.0000', 'clicked_rate' => '0.0000'
|
|
87
94
|
}
|
|
88
95
|
}
|
|
89
96
|
}
|
|
@@ -95,21 +102,21 @@ describe Mailgun::Metrics, vcr: vcr_opts do
|
|
|
95
102
|
let(:options) do
|
|
96
103
|
{
|
|
97
104
|
resolution: 'hour',
|
|
98
|
-
metrics: [
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
105
|
+
metrics: %w[
|
|
106
|
+
email_preview_count
|
|
107
|
+
email_preview_failed_count
|
|
108
|
+
email_validation_bulk_count
|
|
109
|
+
email_validation_count
|
|
110
|
+
email_validation_list_count
|
|
111
|
+
email_validation_mailgun_count
|
|
112
|
+
email_validation_mailjet_count
|
|
113
|
+
email_validation_public_count
|
|
114
|
+
email_validation_single_count
|
|
115
|
+
email_validation_valid_count
|
|
116
|
+
link_validation_count
|
|
117
|
+
link_validation_failed_count
|
|
118
|
+
processed_count
|
|
119
|
+
seed_test_count
|
|
113
120
|
],
|
|
114
121
|
include_aggregates: true,
|
|
115
122
|
start: 'Tue, 26 Nov 2024 20:56:50 -0500',
|
|
@@ -137,78 +144,77 @@ describe Mailgun::Metrics, vcr: vcr_opts do
|
|
|
137
144
|
it 'responds with account usage metrics' do
|
|
138
145
|
expect(metrics.account_usage_metrics(options)).to eq(
|
|
139
146
|
{
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
+
'start' => 'Tue, 29 Oct 2024 01:00:00 +0000',
|
|
148
|
+
'end' => 'Fri, 29 Nov 2024 01:00:00 +0000',
|
|
149
|
+
'resolution' => 'hour',
|
|
150
|
+
'duration' => '1m',
|
|
151
|
+
'dimensions' => ['time'],
|
|
152
|
+
'pagination' => {
|
|
153
|
+
'sort' => '', 'skip' => 0, 'limit' => 1500, 'total' => 2
|
|
147
154
|
},
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
},
|
|
171
|
-
{
|
|
172
|
-
"dimensions" => [{
|
|
173
|
-
"dimension" => "time",
|
|
174
|
-
"value" => "Thu, 28 Nov 2024 00:00:00 +0000",
|
|
175
|
-
"display_value" => "Thu, 28 Nov 2024 00:00:00 +0000"
|
|
176
|
-
}],
|
|
177
|
-
"metrics" => {
|
|
178
|
-
"processed_count" => 1,
|
|
179
|
-
"email_validation_count" => 0,
|
|
180
|
-
"email_validation_public_count" => 0,
|
|
181
|
-
"email_validation_valid_count" => 0,
|
|
182
|
-
"email_validation_single_count" => 0,
|
|
183
|
-
"email_validation_bulk_count" => 0,
|
|
184
|
-
"email_validation_list_count" => 0,
|
|
185
|
-
"email_validation_mailgun_count" => 0,
|
|
186
|
-
"email_validation_mailjet_count" => 0,
|
|
187
|
-
"email_preview_count" => 0,
|
|
188
|
-
"email_preview_failed_count" => 0,
|
|
189
|
-
"link_validation_count" => 0,
|
|
190
|
-
"link_validation_failed_count" => 0,
|
|
191
|
-
"seed_test_count" => 0
|
|
192
|
-
}
|
|
155
|
+
'items' => [{
|
|
156
|
+
'dimensions' => [{
|
|
157
|
+
'dimension' => 'time',
|
|
158
|
+
'value' => 'Wed, 27 Nov 2024 00:00:00 +0000',
|
|
159
|
+
'display_value' => 'Wed, 27 Nov 2024 00:00:00 +0000'
|
|
160
|
+
}],
|
|
161
|
+
'metrics' => {
|
|
162
|
+
'processed_count' => 2,
|
|
163
|
+
'email_validation_count' => 0,
|
|
164
|
+
'email_validation_public_count' => 0,
|
|
165
|
+
'email_validation_valid_count' => 0,
|
|
166
|
+
'email_validation_single_count' => 0,
|
|
167
|
+
'email_validation_bulk_count' => 0,
|
|
168
|
+
'email_validation_list_count' => 0,
|
|
169
|
+
'email_validation_mailgun_count' => 0,
|
|
170
|
+
'email_validation_mailjet_count' => 0,
|
|
171
|
+
'email_preview_count' => 0,
|
|
172
|
+
'email_preview_failed_count' => 0,
|
|
173
|
+
'link_validation_count' => 0,
|
|
174
|
+
'link_validation_failed_count' => 0,
|
|
175
|
+
'seed_test_count' => 0
|
|
193
176
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
'dimensions' => [{
|
|
180
|
+
'dimension' => 'time',
|
|
181
|
+
'value' => 'Thu, 28 Nov 2024 00:00:00 +0000',
|
|
182
|
+
'display_value' => 'Thu, 28 Nov 2024 00:00:00 +0000'
|
|
183
|
+
}],
|
|
184
|
+
'metrics' => {
|
|
185
|
+
'processed_count' => 1,
|
|
186
|
+
'email_validation_count' => 0,
|
|
187
|
+
'email_validation_public_count' => 0,
|
|
188
|
+
'email_validation_valid_count' => 0,
|
|
189
|
+
'email_validation_single_count' => 0,
|
|
190
|
+
'email_validation_bulk_count' => 0,
|
|
191
|
+
'email_validation_list_count' => 0,
|
|
192
|
+
'email_validation_mailgun_count' => 0,
|
|
193
|
+
'email_validation_mailjet_count' => 0,
|
|
194
|
+
'email_preview_count' => 0,
|
|
195
|
+
'email_preview_failed_count' => 0,
|
|
196
|
+
'link_validation_count' => 0,
|
|
197
|
+
'link_validation_failed_count' => 0,
|
|
198
|
+
'seed_test_count' => 0
|
|
199
|
+
}
|
|
200
|
+
}],
|
|
201
|
+
'aggregates' => {
|
|
202
|
+
'metrics' => {
|
|
203
|
+
'permanent_failed_count' => 0,
|
|
204
|
+
'processed_count' => 3,
|
|
205
|
+
'email_validation_count' => 0,
|
|
206
|
+
'email_validation_public_count' => 0,
|
|
207
|
+
'email_validation_valid_count' => 0,
|
|
208
|
+
'email_validation_single_count' => 0,
|
|
209
|
+
'email_validation_bulk_count' => 0,
|
|
210
|
+
'email_validation_list_count' => 0,
|
|
211
|
+
'email_validation_mailgun_count' => 0,
|
|
212
|
+
'email_validation_mailjet_count' => 0,
|
|
213
|
+
'email_preview_count' => 0,
|
|
214
|
+
'email_preview_failed_count' => 0,
|
|
215
|
+
'link_validation_count' => 0,
|
|
216
|
+
'link_validation_failed_count' => 0,
|
|
217
|
+
'seed_test_count' => 0
|
|
212
218
|
}
|
|
213
219
|
}
|
|
214
220
|
}
|