sendgrid-ruby 1.1.6 → 6.0.4
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/.codeclimate.yml +21 -0
- data/.env_sample +1 -3
- data/.gitignore +1 -0
- data/.travis.yml +28 -17
- data/CHANGELOG.md +231 -1
- data/CODE_OF_CONDUCT.md +73 -0
- data/CONTRIBUTING.md +214 -0
- data/Gemfile +5 -4
- data/ISSUE_TEMPLATE.md +26 -0
- data/LICENSE.md +21 -0
- data/Makefile +7 -0
- data/PULL_REQUEST_TEMPLATE.md +31 -0
- data/README.md +161 -225
- data/Rakefile +9 -2
- data/TROUBLESHOOTING.md +137 -0
- data/UPGRADE.md +5 -0
- data/USAGE.md +5037 -0
- data/USE_CASES.md +377 -0
- data/config.ru +4 -0
- data/docker/Dockerfile +12 -0
- data/docker/README.md +30 -0
- data/examples/accesssettings/accesssettings.rb +83 -0
- data/examples/alerts/alerts.rb +62 -0
- data/examples/apikeys/apikeys.rb +84 -0
- data/examples/asm/asm.rb +173 -0
- data/examples/browsers/browsers.rb +16 -0
- data/examples/campaigns/campaigns.rb +153 -0
- data/examples/categories/categories.rb +36 -0
- data/examples/clients/clients.rb +27 -0
- data/examples/contactdb/contactdb.rb +395 -0
- data/examples/devices/devices.rb +16 -0
- data/examples/geo/geo.rb +16 -0
- data/examples/helpers/mail/example.rb +147 -0
- data/examples/helpers/settings/example.rb +23 -0
- data/examples/helpers/stats/example.rb +42 -0
- data/examples/ips/ips.rb +167 -0
- data/examples/mail/mail.rb +173 -0
- data/examples/mailboxproviders/mailboxproviders.rb +16 -0
- data/examples/mailsettings/mailsettings.rb +219 -0
- data/examples/partnersettings/partnersettings.rb +39 -0
- data/examples/scopes/scopes.rb +61 -0
- data/examples/senderauthentication/senderauthentication.rb +310 -0
- data/examples/senders/senders.rb +98 -0
- data/examples/stats/stats.rb +16 -0
- data/examples/subusers/subusers.rb +169 -0
- data/examples/suppression/suppression.rb +201 -0
- data/examples/templates/templates.rb +129 -0
- data/examples/trackingsettings/trackingsettings.rb +110 -0
- data/examples/user/user.rb +293 -0
- data/gemfiles/Sinatra_1.gemfile +6 -0
- data/gemfiles/Sinatra_2.gemfile +6 -0
- data/lib/sendgrid/client.rb +33 -57
- data/lib/sendgrid/helpers/inbound/README.md +98 -0
- data/lib/sendgrid/helpers/inbound/app.rb +32 -0
- data/lib/sendgrid/helpers/inbound/config.yml +26 -0
- data/lib/sendgrid/helpers/inbound/public/index.html +10 -0
- data/lib/sendgrid/helpers/inbound/sample_data/default_data.txt +58 -0
- data/lib/sendgrid/helpers/inbound/sample_data/raw_data.txt +57 -0
- data/lib/sendgrid/helpers/inbound/sample_data/raw_data_with_attachments.txt +298 -0
- data/lib/sendgrid/helpers/inbound/send.rb +26 -0
- data/lib/sendgrid/helpers/ip_management/ip_management.rb +17 -0
- data/lib/sendgrid/helpers/mail/README.md +14 -0
- data/lib/sendgrid/helpers/mail/asm.rb +33 -0
- data/lib/sendgrid/helpers/mail/attachment.rb +86 -0
- data/lib/sendgrid/helpers/mail/bcc_settings.rb +33 -0
- data/lib/sendgrid/helpers/mail/bypass_list_management.rb +43 -0
- data/lib/sendgrid/helpers/mail/category.rb +20 -0
- data/lib/sendgrid/helpers/mail/click_tracking.rb +33 -0
- data/lib/sendgrid/helpers/mail/content.rb +20 -0
- data/lib/sendgrid/helpers/mail/custom_arg.rb +24 -0
- data/lib/sendgrid/helpers/mail/email.rb +29 -0
- data/lib/sendgrid/helpers/mail/footer.rb +43 -0
- data/lib/sendgrid/helpers/mail/ganalytics.rb +74 -0
- data/lib/sendgrid/helpers/mail/header.rb +24 -0
- data/lib/sendgrid/helpers/mail/mail.rb +140 -0
- data/lib/sendgrid/helpers/mail/mail_settings.rb +63 -0
- data/lib/sendgrid/helpers/mail/open_tracking.rb +33 -0
- data/lib/sendgrid/helpers/mail/personalization.rb +82 -0
- data/lib/sendgrid/helpers/mail/section.rb +24 -0
- data/lib/sendgrid/helpers/mail/spam_check.rb +43 -0
- data/lib/sendgrid/helpers/mail/subscription_tracking.rb +53 -0
- data/lib/sendgrid/helpers/mail/substitution.rb +24 -0
- data/lib/sendgrid/helpers/mail/tracking_settings.rb +53 -0
- data/lib/sendgrid/helpers/permissions/scope.rb +28 -0
- data/lib/sendgrid/helpers/permissions/scopes.yml +309 -0
- data/lib/sendgrid/helpers/settings/README.md +14 -0
- data/lib/sendgrid/helpers/settings/mail_settings_dto.rb +13 -0
- data/lib/sendgrid/helpers/settings/partner_settings_dto.rb +13 -0
- data/lib/sendgrid/helpers/settings/settings.rb +28 -0
- data/lib/sendgrid/helpers/settings/tracking_settings_dto.rb +24 -0
- data/lib/sendgrid/helpers/settings/user_settings_dto.rb +13 -0
- data/lib/sendgrid/helpers/stats/email_stats.rb +46 -0
- data/lib/sendgrid/helpers/stats/metrics.rb +35 -0
- data/lib/sendgrid/helpers/stats/stats_response.rb +31 -0
- data/lib/sendgrid/version.rb +1 -1
- data/lib/sendgrid-ruby.rb +27 -6
- data/mail_helper_v3.md +390 -0
- data/sendgrid-ruby.gemspec +13 -17
- data/spec/sendgrid/helpers/ip_management/ip_management_spec.rb +12 -0
- data/spec/sendgrid/helpers/settings/mail_settings_dto_spec.rb +32 -0
- data/spec/sendgrid/helpers/settings/partner_settings_dto_spec.rb +24 -0
- data/spec/sendgrid/helpers/settings/settings_spec.rb +25 -0
- data/spec/sendgrid/helpers/settings/tracking_settings_dto_spec.rb +27 -0
- data/spec/sendgrid/helpers/settings/user_settings_dto_spec.rb +24 -0
- data/spec/sendgrid/helpers/stats/email_stats_spec.rb +112 -0
- data/spec/sendgrid/helpers/stats/metrics_spec.rb +46 -0
- data/spec/sendgrid/helpers/stats/stats_response_spec.rb +76 -0
- data/spec/spec_helper.rb +10 -1
- data/test/prism.sh +42 -0
- data/test/sendgrid/helpers/mail/test_attachment.rb +35 -0
- data/test/sendgrid/helpers/mail/test_category.rb +27 -0
- data/test/sendgrid/helpers/mail/test_email.rb +34 -0
- data/test/sendgrid/helpers/mail/test_mail.rb +261 -0
- data/test/sendgrid/helpers/mail/test_personalizations.rb +161 -0
- data/test/sendgrid/permissions/test_scopes.rb +38 -0
- data/test/sendgrid/test_sendgrid-ruby.rb +2751 -0
- metadata +149 -115
- data/.rspec +0 -2
- data/.rubocop.yml +0 -30
- data/FETCH_HEAD +0 -0
- data/Guardfile +0 -10
- data/LICENSE.txt +0 -22
- data/example.rb +0 -41
- data/lib/sendgrid/exceptions.rb +0 -7
- data/lib/sendgrid/mail.rb +0 -182
- data/lib/sendgrid/recipient.rb +0 -29
- data/lib/sendgrid/response.rb +0 -14
- data/lib/sendgrid/template.rb +0 -26
- data/lib/sendgrid/template_mailer.rb +0 -59
- data/spec/lib/sendgrid/client_spec.rb +0 -87
- data/spec/lib/sendgrid/mail_spec.rb +0 -151
- data/spec/lib/sendgrid/recipient_spec.rb +0 -91
- data/spec/lib/sendgrid/template_mailer_spec.rb +0 -86
- data/spec/lib/sendgrid/template_spec.rb +0 -61
- data/spec/lib/sendgrid_spec.rb +0 -7
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe SendGrid::EmailStats do
|
|
4
|
+
let(:sg_client) { SendGrid::API.new(api_key: 'abcd').client }
|
|
5
|
+
let(:stats) { SendGrid::EmailStats.new(sendgrid_client: sg_client) }
|
|
6
|
+
let(:sg_response) { double('SendGrid::Response') }
|
|
7
|
+
|
|
8
|
+
let(:sample_response) do
|
|
9
|
+
[{
|
|
10
|
+
"date" => "2017-10-01",
|
|
11
|
+
"stats" => [
|
|
12
|
+
{"metrics" =>
|
|
13
|
+
{
|
|
14
|
+
"blocks" => 101,
|
|
15
|
+
"bounce_drops" => 102,
|
|
16
|
+
"bounces" => 103,
|
|
17
|
+
"clicks" => 104,
|
|
18
|
+
"deferred" => 105,
|
|
19
|
+
"delivered" => 106,
|
|
20
|
+
"invalid_emails" => 107,
|
|
21
|
+
"opens" => 108,
|
|
22
|
+
"processed" => 109,
|
|
23
|
+
"requests" => 110,
|
|
24
|
+
"spam_report_drops" => 111,
|
|
25
|
+
"spam_reports" => 112,
|
|
26
|
+
"unique_clicks" => 113,
|
|
27
|
+
"unique_opens" => 114,
|
|
28
|
+
"unsubscribe_drops" => 115,
|
|
29
|
+
"unsubscribes" => 116
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
let(:error_response) do
|
|
37
|
+
{
|
|
38
|
+
"errors" => [
|
|
39
|
+
{
|
|
40
|
+
"message" => "end_date should be a YYYY-MM-DD formatted date"
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe '.new' do
|
|
47
|
+
it 'initializes with SendGrid::Client' do
|
|
48
|
+
expect(stats).to be_a SendGrid::EmailStats
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe 'successful response' do
|
|
53
|
+
before do
|
|
54
|
+
allow_any_instance_of(SendGrid::Response).to receive(:body) { sample_response.to_json }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe '#by_day' do
|
|
58
|
+
it 'fetches data aggregated by day' do
|
|
59
|
+
day_stats = stats.by_day('2017-10-01', '2017-10-02')
|
|
60
|
+
day_metrics = day_stats.metrics.first
|
|
61
|
+
|
|
62
|
+
expect(day_metrics).to be_a SendGrid::Metrics
|
|
63
|
+
expect(day_metrics.date.to_s).to eq('2017-10-01')
|
|
64
|
+
expect(day_metrics.requests).to eq(110)
|
|
65
|
+
expect(day_metrics.clicks).to eq(104)
|
|
66
|
+
expect(day_metrics.bounces).to eq(103)
|
|
67
|
+
expect(day_metrics.opens).to eq(108)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
describe '#by_week' do
|
|
72
|
+
it 'fetches data aggregated by week' do
|
|
73
|
+
day_stats = stats.by_week('2017-10-01', '2017-10-12')
|
|
74
|
+
day_metrics = day_stats.metrics.first
|
|
75
|
+
|
|
76
|
+
expect(day_metrics).to be_a SendGrid::Metrics
|
|
77
|
+
expect(day_metrics.date.to_s).to eq('2017-10-01')
|
|
78
|
+
expect(day_metrics.requests).to eq(110)
|
|
79
|
+
expect(day_metrics.clicks).to eq(104)
|
|
80
|
+
expect(day_metrics.bounces).to eq(103)
|
|
81
|
+
expect(day_metrics.opens).to eq(108)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
describe '#by_month' do
|
|
86
|
+
it 'fetches data aggregated by month' do
|
|
87
|
+
day_stats = stats.by_month('2017-10-01', '2017-11-01')
|
|
88
|
+
day_metrics = day_stats.metrics.first
|
|
89
|
+
|
|
90
|
+
expect(day_metrics).to be_a SendGrid::Metrics
|
|
91
|
+
expect(day_metrics.date.to_s).to eq('2017-10-01')
|
|
92
|
+
expect(day_metrics.requests).to eq(110)
|
|
93
|
+
expect(day_metrics.clicks).to eq(104)
|
|
94
|
+
expect(day_metrics.bounces).to eq(103)
|
|
95
|
+
expect(day_metrics.opens).to eq(108)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
describe 'error response' do
|
|
101
|
+
before do
|
|
102
|
+
allow_any_instance_of(SendGrid::Response).to receive(:body) { error_response.to_json }
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it 'fetches data aggregated by month' do
|
|
106
|
+
day_stats = stats.by_month('2017-10-01', '2017-10-02')
|
|
107
|
+
|
|
108
|
+
expect(day_stats.errors).to include('end_date should be a YYYY-MM-DD formatted date')
|
|
109
|
+
expect(day_stats.error?).to be_truthy
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe SendGrid::Metrics do
|
|
4
|
+
let(:params) do
|
|
5
|
+
{
|
|
6
|
+
"date" => "2017-10-01",
|
|
7
|
+
"blocks" => 101,
|
|
8
|
+
"bounce_drops" => 102,
|
|
9
|
+
"bounces" => 103,
|
|
10
|
+
"clicks" => 104,
|
|
11
|
+
"deferred" => 105,
|
|
12
|
+
"delivered" => 106,
|
|
13
|
+
"invalid_emails" => 107,
|
|
14
|
+
"opens" => 108,
|
|
15
|
+
"processed" => 109,
|
|
16
|
+
"requests" => 110,
|
|
17
|
+
"spam_report_drops" => 111,
|
|
18
|
+
"spam_reports" => 112,
|
|
19
|
+
"unique_clicks" => 113,
|
|
20
|
+
"unique_opens" => 114,
|
|
21
|
+
"unsubscribe_drops" => 115,
|
|
22
|
+
"unsubscribes" => 116
|
|
23
|
+
}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
subject { described_class.new(params) }
|
|
27
|
+
|
|
28
|
+
it 'initializes with metric parameters' do
|
|
29
|
+
expect(subject).to be_a SendGrid::Metrics
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it 'returns date as object' do
|
|
33
|
+
expect(subject.date).to be_a Date
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
%w(
|
|
37
|
+
blocks bounce_drops bounces clicks deferred delivered invalid_emails
|
|
38
|
+
opens processed requests spam_report_drops spam_reports unique_clicks
|
|
39
|
+
unique_opens unsubscribe_drops unsubscribes
|
|
40
|
+
).each do |attribute|
|
|
41
|
+
it "responds to #{attribute}" do
|
|
42
|
+
expect(subject).to respond_to(attribute.to_sym)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe SendGrid::StatsResponse do
|
|
4
|
+
let(:params) do
|
|
5
|
+
[{
|
|
6
|
+
"date" => "2017-10-01",
|
|
7
|
+
"stats" => [
|
|
8
|
+
{"metrics" =>
|
|
9
|
+
{
|
|
10
|
+
"blocks" => 101,
|
|
11
|
+
"bounce_drops" => 102,
|
|
12
|
+
"bounces" => 103,
|
|
13
|
+
"clicks" => 104,
|
|
14
|
+
"deferred" => 105,
|
|
15
|
+
"delivered" => 106,
|
|
16
|
+
"invalid_emails" => 107,
|
|
17
|
+
"opens" => 108,
|
|
18
|
+
"processed" => 109,
|
|
19
|
+
"requests" => 110,
|
|
20
|
+
"spam_report_drops" => 111,
|
|
21
|
+
"spam_reports" => 112,
|
|
22
|
+
"unique_clicks" => 113,
|
|
23
|
+
"unique_opens" => 114,
|
|
24
|
+
"unsubscribe_drops" => 115,
|
|
25
|
+
"unsubscribes" => 116
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
subject { described_class.new(params) }
|
|
33
|
+
|
|
34
|
+
it 'initialized with JSON response body' do
|
|
35
|
+
expect(subject).to be_a SendGrid::StatsResponse
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe '#metrics' do
|
|
39
|
+
it 'returns an array of metrics' do
|
|
40
|
+
metric = subject.metrics.first
|
|
41
|
+
|
|
42
|
+
expect(subject.metrics).to be_a Array
|
|
43
|
+
expect(metric.date.to_s).to eq('2017-10-01')
|
|
44
|
+
expect(metric.requests).to eq(110)
|
|
45
|
+
expect(metric.clicks).to eq(104)
|
|
46
|
+
expect(metric.bounces).to eq(103)
|
|
47
|
+
expect(metric.opens).to eq(108)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
context 'errors' do
|
|
52
|
+
let(:error_params) do
|
|
53
|
+
{
|
|
54
|
+
"errors" => [
|
|
55
|
+
{
|
|
56
|
+
"message" => "end_date should be a YYYY-MM-DD formatted date"
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
subject { described_class.new(error_params) }
|
|
63
|
+
|
|
64
|
+
describe '#errors' do
|
|
65
|
+
it 'shows a list of errors' do
|
|
66
|
+
expect(subject.errors).to include('end_date should be a YYYY-MM-DD formatted date')
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
describe '#error?' do
|
|
71
|
+
it 'returns true if there is an error' do
|
|
72
|
+
expect(subject.error?).to be_truthy
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'bundler/setup'
|
|
3
|
+
require 'pry'
|
|
4
|
+
require 'faker'
|
|
5
|
+
|
|
6
|
+
RSpec.configure do |config|
|
|
7
|
+
Dir["#{File.dirname(__FILE__)}/../lib/sendgrid-ruby.rb"].sort.each { |ext| require ext }
|
|
8
|
+
|
|
9
|
+
config.color = true
|
|
10
|
+
end
|
data/test/prism.sh
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
install () {
|
|
4
|
+
|
|
5
|
+
set -eu
|
|
6
|
+
|
|
7
|
+
UNAME=$(uname)
|
|
8
|
+
ARCH=$(uname -m)
|
|
9
|
+
if [ "$UNAME" != "Linux" ] && [ "$UNAME" != "Darwin" ] && [ "$ARCH" != "x86_64" ] && [ "$ARCH" != "i686" ]; then
|
|
10
|
+
echo "Sorry, OS/Architecture not supported: ${UNAME}/${ARCH}. Download binary from https://github.com/stoplightio/prism/releases"
|
|
11
|
+
exit 1
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
if [ "$UNAME" = "Darwin" ] ; then
|
|
15
|
+
OSX_ARCH=$(uname -m)
|
|
16
|
+
if [ "${OSX_ARCH}" = "x86_64" ] ; then
|
|
17
|
+
PLATFORM="darwin_amd64"
|
|
18
|
+
fi
|
|
19
|
+
elif [ "$UNAME" = "Linux" ] ; then
|
|
20
|
+
LINUX_ARCH=$(uname -m)
|
|
21
|
+
if [ "${LINUX_ARCH}" = "i686" ] ; then
|
|
22
|
+
PLATFORM="linux_386"
|
|
23
|
+
elif [ "${LINUX_ARCH}" = "x86_64" ] ; then
|
|
24
|
+
PLATFORM="linux_amd64"
|
|
25
|
+
fi
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
#LATEST=$(curl -s https://api.github.com/repos/stoplightio/prism/tags | grep -Eo '"name":.*?[^\\]",' | head -n 1 | sed 's/[," ]//g' | cut -d ':' -f 2)
|
|
29
|
+
LATEST="v0.2.7"
|
|
30
|
+
URL="https://github.com/stoplightio/prism/releases/download/$LATEST/prism_$PLATFORM"
|
|
31
|
+
DEST=./prism/bin/prism
|
|
32
|
+
|
|
33
|
+
if [ -z $LATEST ] ; then
|
|
34
|
+
echo "Error requesting. Download binary from ${URL}"
|
|
35
|
+
exit 1
|
|
36
|
+
else
|
|
37
|
+
curl -L $URL -o $DEST
|
|
38
|
+
chmod +x $DEST
|
|
39
|
+
fi
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
install
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
require_relative "../../../../lib/sendgrid/helpers/mail/attachment"
|
|
3
|
+
include SendGrid
|
|
4
|
+
require "json"
|
|
5
|
+
require "minitest/autorun"
|
|
6
|
+
|
|
7
|
+
class TestAttachment < Minitest::Test
|
|
8
|
+
SAMPLE_INPUT = """Es blüht so grün wie Blüten blüh'n im Frühling
|
|
9
|
+
Es blüht so grün wie Blüten blüh'n im Frühling
|
|
10
|
+
Es blüht so grün wie Blüten blüh'n im Frühling
|
|
11
|
+
Es blüht so grün wie Blüten blüh'n im Frühling
|
|
12
|
+
Es blüht so grün wie Blüten blüh'n im Frühling
|
|
13
|
+
""".force_encoding('UTF-8').encode
|
|
14
|
+
|
|
15
|
+
def setup
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_io_enocding
|
|
19
|
+
attachment = Attachment.new
|
|
20
|
+
attachment.content = StringIO.new(SAMPLE_INPUT)
|
|
21
|
+
|
|
22
|
+
expected = {
|
|
23
|
+
"content" => "RXMgYmzDvGh0IHNvIGdyw7xuIHdpZSBCbMO8dGVuIGJsw7xoJ24gaW0gRnLD\nvGhsaW5nCkVzIGJsw7xodCBzbyBncsO8biB3aWUgQmzDvHRlbiBibMO8aCdu\nIGltIEZyw7xobGluZwpFcyBibMO8aHQgc28gZ3LDvG4gd2llIEJsw7x0ZW4g\nYmzDvGgnbiBpbSBGcsO8aGxpbmcKRXMgYmzDvGh0IHNvIGdyw7xuIHdpZSBC\nbMO8dGVuIGJsw7xoJ24gaW0gRnLDvGhsaW5nCkVzIGJsw7xodCBzbyBncsO8\nbiB3aWUgQmzDvHRlbiBibMO8aCduIGltIEZyw7xobGluZwo=\n"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
json = attachment.to_json
|
|
27
|
+
|
|
28
|
+
# Double check that the decoded json matches original input.
|
|
29
|
+
decoded = Base64.decode64(json["content"]).force_encoding('UTF-8').encode
|
|
30
|
+
|
|
31
|
+
assert_equal(decoded, SAMPLE_INPUT)
|
|
32
|
+
|
|
33
|
+
assert_equal(json, expected)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require_relative '../../../../lib/sendgrid/helpers/mail/mail'
|
|
2
|
+
require 'minitest/autorun'
|
|
3
|
+
|
|
4
|
+
class TestCategory < Minitest::Test
|
|
5
|
+
|
|
6
|
+
include SendGrid
|
|
7
|
+
|
|
8
|
+
def setup
|
|
9
|
+
@category = Category.new(name: 'foo')
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_aliases
|
|
13
|
+
assert_equal @category.method(:name), @category.method(:category)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_name
|
|
17
|
+
assert_equal @category.name, 'foo'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_to_json
|
|
21
|
+
expected_json = {
|
|
22
|
+
'category' => 'foo'
|
|
23
|
+
}
|
|
24
|
+
assert_equal @category.to_json, expected_json
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require_relative '../../../../lib/sendgrid/helpers/mail/email'
|
|
2
|
+
require 'minitest/autorun'
|
|
3
|
+
|
|
4
|
+
class TestEmail < Minitest::Test
|
|
5
|
+
|
|
6
|
+
include SendGrid
|
|
7
|
+
|
|
8
|
+
def test_split_email_full_email
|
|
9
|
+
@email = Email.new(email: "Example User <test1@example.com>")
|
|
10
|
+
expected_json = {
|
|
11
|
+
"email"=>"test1@example.com",
|
|
12
|
+
"name"=>"Example User"
|
|
13
|
+
}
|
|
14
|
+
assert_equal @email.to_json, expected_json
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_split_email_only_email
|
|
18
|
+
@email = Email.new(email: "test1@example.com")
|
|
19
|
+
expected_json = {
|
|
20
|
+
"email"=>"test1@example.com",
|
|
21
|
+
}
|
|
22
|
+
assert_equal @email.to_json, expected_json
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_split_email_name_and_email
|
|
26
|
+
@email = Email.new(name: "Example User", email: "test1@example.com")
|
|
27
|
+
expected_json = {
|
|
28
|
+
"email"=>"test1@example.com",
|
|
29
|
+
"name"=>"Example User"
|
|
30
|
+
}
|
|
31
|
+
assert_equal @email.to_json, expected_json
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
require_relative "../../../../lib/sendgrid/helpers/mail/mail"
|
|
2
|
+
require_relative "../../../../lib/sendgrid/client"
|
|
3
|
+
include SendGrid
|
|
4
|
+
require "json"
|
|
5
|
+
require 'minitest/autorun'
|
|
6
|
+
|
|
7
|
+
class TestMail < Minitest::Test
|
|
8
|
+
def setup
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_hello_world
|
|
12
|
+
from = Email.new(email: 'test@example.com')
|
|
13
|
+
to = Email.new(email: 'test@example.com')
|
|
14
|
+
subject = 'Sending with Twilio SendGrid is Fun'
|
|
15
|
+
content = Content.new(type: 'text/plain', value: 'and easy to do anywhere, even with Ruby')
|
|
16
|
+
mail = SendGrid::Mail.new(from, subject, to, content)
|
|
17
|
+
|
|
18
|
+
assert_equal(mail.to_json, JSON.parse('{"from":{"email":"test@example.com"}, "subject":"Sending with Twilio SendGrid is Fun", "personalizations":[{"to":[{"email":"test@example.com"}]}], "content":[{"type":"text/plain", "value":"and easy to do anywhere, even with Ruby"}]}'))
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_kitchen_sink
|
|
22
|
+
mail = SendGrid::Mail.new
|
|
23
|
+
mail.from = Email.new(email: "test@example.com")
|
|
24
|
+
mail.subject = "Hello World from the Twilio SendGrid Ruby Library"
|
|
25
|
+
personalization = Personalization.new
|
|
26
|
+
personalization.add_to(Email.new(email: "test@example.com", name: "Example User"))
|
|
27
|
+
personalization.add_to(Email.new(email: "test@example.com", name: "Example User"))
|
|
28
|
+
personalization.add_cc(Email.new(email: "test@example.com", name: "Example User"))
|
|
29
|
+
personalization.add_cc(Email.new(email: "test@example.com", name: "Example User"))
|
|
30
|
+
personalization.add_bcc(Email.new(email: "test@example.com", name: "Example User"))
|
|
31
|
+
personalization.add_bcc(Email.new(email: "test@example.com", name: "Example User"))
|
|
32
|
+
personalization.subject = "Hello World from the Personalized Twilio SendGrid Ruby Library"
|
|
33
|
+
personalization.add_header(Header.new(key: "X-Test", value: "True"))
|
|
34
|
+
personalization.add_header(Header.new(key: "X-Mock", value: "False"))
|
|
35
|
+
personalization.add_substitution(Substitution.new(key: "%name%", value: "Example User"))
|
|
36
|
+
personalization.add_substitution(Substitution.new(key: "%city%", value: "Denver"))
|
|
37
|
+
personalization.add_custom_arg(CustomArg.new(key: "user_id", value: "343"))
|
|
38
|
+
personalization.add_custom_arg(CustomArg.new(key: "type", value: "marketing"))
|
|
39
|
+
personalization.send_at = 1443636843
|
|
40
|
+
mail.add_personalization(personalization)
|
|
41
|
+
|
|
42
|
+
personalization2 = Personalization.new
|
|
43
|
+
personalization2.add_to(Email.new(email: "test@example.com", name: "Example User"))
|
|
44
|
+
personalization2.add_to(Email.new(email: "test@example.com", name: "Example User"))
|
|
45
|
+
personalization2.add_cc(Email.new(email: "test@example.com", name: "Example User"))
|
|
46
|
+
personalization2.add_cc(Email.new(email: "test@example.com", name: "Example User"))
|
|
47
|
+
personalization2.add_bcc(Email.new(email: "test@example.com", name: "Example User"))
|
|
48
|
+
personalization2.add_bcc(Email.new(email: "test@example.com", name: "Example User"))
|
|
49
|
+
personalization2.subject = "Hello World from the Personalized Twilio SendGrid Ruby Library"
|
|
50
|
+
personalization2.add_header(Header.new(key: "X-Test", value: "True"))
|
|
51
|
+
personalization2.add_header(Header.new(key: "X-Mock", value: "False"))
|
|
52
|
+
personalization2.add_substitution(Substitution.new(key: "%name%", value: "Example User"))
|
|
53
|
+
personalization2.add_substitution(Substitution.new(key: "%city%", value: "Denver"))
|
|
54
|
+
personalization2.add_custom_arg(CustomArg.new(key: "user_id", value: "343"))
|
|
55
|
+
personalization2.add_custom_arg(CustomArg.new(key: "type", value: "marketing"))
|
|
56
|
+
personalization2.send_at = 1443636843
|
|
57
|
+
mail.add_personalization(personalization2)
|
|
58
|
+
|
|
59
|
+
mail.add_content(Content.new(type: "text/plain", value: "some text here"))
|
|
60
|
+
mail.add_content(Content.new(type: "text/html", value: "<html><body>some text here</body></html>"))
|
|
61
|
+
|
|
62
|
+
attachment = Attachment.new
|
|
63
|
+
attachment.content = "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gQ3JhcyBwdW12"
|
|
64
|
+
attachment.type = "application/pdf"
|
|
65
|
+
attachment.filename = "balance_001.pdf"
|
|
66
|
+
attachment.disposition = "attachment"
|
|
67
|
+
attachment.content_id = "Balance Sheet"
|
|
68
|
+
|
|
69
|
+
mail.add_attachment(attachment)
|
|
70
|
+
|
|
71
|
+
attachment2 = Attachment.new
|
|
72
|
+
attachment2.content = "BwdW"
|
|
73
|
+
attachment2.type = "image/png"
|
|
74
|
+
attachment2.filename = "banner.png"
|
|
75
|
+
attachment2.disposition = "inline"
|
|
76
|
+
attachment2.content_id = "Banner"
|
|
77
|
+
mail.add_attachment(attachment2)
|
|
78
|
+
|
|
79
|
+
mail.template_id = "13b8f94f-bcae-4ec6-b752-70d6cb59f932"
|
|
80
|
+
|
|
81
|
+
mail.add_section(Section.new(key: "%section1%", value: "Substitution Text for Section 1"))
|
|
82
|
+
mail.add_section(Section.new(key: "%section2%", value: "Substitution Text for Section 2"))
|
|
83
|
+
|
|
84
|
+
mail.add_header(Header.new(key: "X-Test3", value: "test3"))
|
|
85
|
+
mail.add_header(Header.new(key: "X-Test4", value: "test4"))
|
|
86
|
+
|
|
87
|
+
mail.add_category(Category.new(name: "May"))
|
|
88
|
+
mail.add_category(Category.new(name: "2016"))
|
|
89
|
+
|
|
90
|
+
mail.add_custom_arg(CustomArg.new(key: "campaign", value: "welcome"))
|
|
91
|
+
mail.add_custom_arg(CustomArg.new(key: "weekday", value: "morning"))
|
|
92
|
+
|
|
93
|
+
mail.send_at = 1443636842
|
|
94
|
+
|
|
95
|
+
mail.batch_id = "sendgrid_batch_id"
|
|
96
|
+
|
|
97
|
+
mail.asm = ASM.new(group_id: 99, groups_to_display: [4,5,6,7,8])
|
|
98
|
+
|
|
99
|
+
mail.ip_pool_name = "23"
|
|
100
|
+
|
|
101
|
+
mail_settings = MailSettings.new
|
|
102
|
+
mail_settings.bcc = BccSettings.new(enable: true, email: "test@example.com")
|
|
103
|
+
mail_settings.bypass_list_management = BypassListManagement.new(enable: true)
|
|
104
|
+
mail_settings.footer = Footer.new(enable: true, text: "Footer Text", html: "<html><body>Footer Text</body></html>")
|
|
105
|
+
mail_settings.sandbox_mode = SandBoxMode.new(enable: true)
|
|
106
|
+
mail_settings.spam_check = SpamCheck.new(enable: true, threshold: 1, post_to_url: "https://spamcatcher.sendgrid.com")
|
|
107
|
+
mail.mail_settings = mail_settings
|
|
108
|
+
|
|
109
|
+
tracking_settings = TrackingSettings.new
|
|
110
|
+
tracking_settings.click_tracking = ClickTracking.new(enable: false, enable_text: false)
|
|
111
|
+
tracking_settings.open_tracking = OpenTracking.new(enable: true, substitution_tag: "Optional tag to replace with the open image in the body of the message")
|
|
112
|
+
tracking_settings.subscription_tracking = SubscriptionTracking.new(enable: true, text: "text to insert into the text/plain portion of the message", html: "html to insert into the text/html portion of the message", substitution_tag: "Optional tag to replace with the open image in the body of the message")
|
|
113
|
+
tracking_settings.ganalytics = Ganalytics.new(enable: true, utm_source: "some source", utm_medium: "some medium", utm_term: "some term", utm_content: "some content", utm_campaign: "some campaign")
|
|
114
|
+
mail.tracking_settings = tracking_settings
|
|
115
|
+
|
|
116
|
+
mail.reply_to = Email.new(email: "test@example.com")
|
|
117
|
+
|
|
118
|
+
assert_equal(mail.to_json, JSON.parse('{"asm":{"group_id":99,"groups_to_display":[4,5,6,7,8]},"attachments":[{"content":"TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gQ3JhcyBwdW12","content_id":"Balance Sheet","disposition":"attachment","filename":"balance_001.pdf","type":"application/pdf"},{"content":"BwdW","content_id":"Banner","disposition":"inline","filename":"banner.png","type":"image/png"}],"batch_id":"sendgrid_batch_id","categories":["May","2016"],"content":[{"type":"text/plain","value":"some text here"},{"type":"text/html","value":"<html><body>some text here</body></html>"}],"custom_args":{"campaign":"welcome","weekday":"morning"},"from":{"email":"test@example.com"},"headers":{"X-Test3":"test3","X-Test4":"test4"},"ip_pool_name":"23","mail_settings":{"bcc":{"email":"test@example.com","enable":true},"bypass_list_management":{"enable":true},"footer":{"enable":true,"html":"<html><body>Footer Text</body></html>","text":"Footer Text"},"sandbox_mode":{"enable":true},"spam_check":{"enable":true,"post_to_url":"https://spamcatcher.sendgrid.com","threshold":1}},"personalizations":[{"bcc":[{"email":"test@example.com","name":"Example User"},{"email":"test@example.com","name":"Example User"}],"cc":[{"email":"test@example.com","name":"Example User"},{"email":"test@example.com","name":"Example User"}],"custom_args":{"type":"marketing","user_id":"343"},"headers":{"X-Mock":"False","X-Test":"True"},"send_at":1443636843,"subject":"Hello World from the Personalized Twilio SendGrid Ruby Library","substitutions":{"%city%":"Denver","%name%":"Example User"},"to":[{"email":"test@example.com","name":"Example User"},{"email":"test@example.com","name":"Example User"}]},{"bcc":[{"email":"test@example.com","name":"Example User"},{"email":"test@example.com","name":"Example User"}],"cc":[{"email":"test@example.com","name":"Example User"},{"email":"test@example.com","name":"Example User"}],"custom_args":{"type":"marketing","user_id":"343"},"headers":{"X-Mock":"False","X-Test":"True"},"send_at":1443636843,"subject":"Hello World from the Personalized Twilio SendGrid Ruby Library","substitutions":{"%city%":"Denver","%name%":"Example User"},"to":[{"email":"test@example.com","name":"Example User"},{"email":"test@example.com","name":"Example User"}]}],"reply_to":{"email":"test@example.com"},"sections":{"%section1%":"Substitution Text for Section 1","%section2%":"Substitution Text for Section 2"},"send_at":1443636842,"subject":"Hello World from the Twilio SendGrid Ruby Library","template_id":"13b8f94f-bcae-4ec6-b752-70d6cb59f932","tracking_settings":{"click_tracking":{"enable":false,"enable_text":false},"ganalytics":{"enable":true,"utm_campaign":"some campaign","utm_content":"some content","utm_medium":"some medium","utm_source":"some source","utm_term":"some term"},"open_tracking":{"enable":true,"substitution_tag":"Optional tag to replace with the open image in the body of the message"},"subscription_tracking":{"enable":true,"html":"html to insert into the text/html portion of the message","substitution_tag":"Optional tag to replace with the open image in the body of the message","text":"text to insert into the text/plain portion of the message"}}}'))
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def test_that_personalizations_is_empty_initially
|
|
122
|
+
mail = SendGrid::Mail.new
|
|
123
|
+
assert_equal([], mail.personalizations)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def test_that_contents_is_empty_initially
|
|
127
|
+
mail = SendGrid::Mail.new
|
|
128
|
+
assert_equal([], mail.contents)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def test_that_attachments_is_empty_initially
|
|
132
|
+
mail = SendGrid::Mail.new
|
|
133
|
+
assert_equal([], mail.attachments)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def test_that_categories_is_empty_initially
|
|
137
|
+
mail = SendGrid::Mail.new
|
|
138
|
+
assert_equal([], mail.categories)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def test_add_personalization
|
|
142
|
+
mail = SendGrid::Mail.new
|
|
143
|
+
mail.add_personalization('foo')
|
|
144
|
+
assert_equal(['foo'.to_json], mail.personalizations)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def test_add_content
|
|
148
|
+
mail = SendGrid::Mail.new
|
|
149
|
+
mail.add_content('foo')
|
|
150
|
+
assert_equal(['foo'.to_json], mail.contents)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def test_add_section
|
|
154
|
+
mail = SendGrid::Mail.new
|
|
155
|
+
mail.add_section(Section.new(key: '%section1%', value: 'Substitution Text for Section 1'))
|
|
156
|
+
expected_json = {
|
|
157
|
+
"sections"=>{
|
|
158
|
+
"%section1%"=>"Substitution Text for Section 1"
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
assert_equal mail.to_json, expected_json
|
|
162
|
+
mail.add_section(Section.new(key: '%section2%', value: 'Substitution Text for Section 2'))
|
|
163
|
+
expected_json = {
|
|
164
|
+
"sections"=>{
|
|
165
|
+
"%section1%"=>"Substitution Text for Section 1",
|
|
166
|
+
"%section2%"=>"Substitution Text for Section 2"
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
assert_equal mail.to_json, expected_json
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def test_add_header
|
|
173
|
+
mail = SendGrid::Mail.new
|
|
174
|
+
mail.add_header(Header.new(key: 'X-Test3', value: 'test3'))
|
|
175
|
+
expected_json = {
|
|
176
|
+
"headers"=>{
|
|
177
|
+
"X-Test3"=>"test3"
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
assert_equal mail.to_json, expected_json
|
|
181
|
+
mail.add_header(Header.new(key: 'X-Test4', value: 'test4'))
|
|
182
|
+
expected_json = {
|
|
183
|
+
"headers"=>{
|
|
184
|
+
"X-Test3"=>"test3",
|
|
185
|
+
"X-Test4"=>"test4"
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
assert_equal mail.to_json, expected_json
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def test_add_custom_arg
|
|
192
|
+
mail = SendGrid::Mail.new
|
|
193
|
+
mail.add_custom_arg(CustomArg.new(key: 'campaign 1', value: 'welcome 1'))
|
|
194
|
+
expected_json = {
|
|
195
|
+
"custom_args"=>{
|
|
196
|
+
"campaign 1"=>"welcome 1"
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
assert_equal mail.to_json, expected_json
|
|
200
|
+
mail.add_custom_arg(CustomArg.new(key: 'campaign 2', value: 'welcome 2'))
|
|
201
|
+
expected_json = {
|
|
202
|
+
"custom_args"=>{
|
|
203
|
+
"campaign 1"=>"welcome 1",
|
|
204
|
+
"campaign 2"=>"welcome 2"
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
assert_equal mail.to_json, expected_json
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def test_add_non_string_custom_arg
|
|
211
|
+
mail = Mail.new
|
|
212
|
+
mail.add_custom_arg(CustomArg.new(key: "Integer", value: 1))
|
|
213
|
+
mail.add_custom_arg(CustomArg.new(key: "Array", value: [1, "a", true]))
|
|
214
|
+
mail.add_custom_arg(CustomArg.new(key: "Hash", value: {"a" => 1, "b" => 2}))
|
|
215
|
+
expected_json = {
|
|
216
|
+
"custom_args"=>{
|
|
217
|
+
"Integer"=>"1",
|
|
218
|
+
"Array"=>"[1, \"a\", true]",
|
|
219
|
+
"Hash"=>"{\"a\"=>1, \"b\"=>2}",
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
assert_equal mail.to_json, expected_json
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def test_add_attachment
|
|
226
|
+
mail = SendGrid::Mail.new
|
|
227
|
+
mail.add_attachment('foo')
|
|
228
|
+
assert_equal(['foo'.to_json], mail.attachments)
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def test_add_valid_category
|
|
232
|
+
mail = SendGrid::Mail.new
|
|
233
|
+
category = Category.new(name: 'foo')
|
|
234
|
+
mail.add_category(category)
|
|
235
|
+
assert_equal(['foo'], mail.categories)
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def test_add_more_than_1_valid_category
|
|
239
|
+
mail = SendGrid::Mail.new
|
|
240
|
+
category_1 = Category.new(name: 'foo')
|
|
241
|
+
category_2 = Category.new(name: 'bar')
|
|
242
|
+
mail.add_category(category_1)
|
|
243
|
+
mail.add_category(category_2)
|
|
244
|
+
assert_equal(['foo', 'bar'], mail.categories)
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def test_add_invalid_category
|
|
248
|
+
mail = SendGrid::Mail.new
|
|
249
|
+
assert_raises(NoMethodError) do
|
|
250
|
+
mail.add_category('foo')
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
def test_check_for_secrets
|
|
255
|
+
mail = Mail.new
|
|
256
|
+
mail.add_content(Content.new(type: 'text/plain', value: 'Sensitive information: SG.a123b456'))
|
|
257
|
+
assert_raises(SecurityError) do
|
|
258
|
+
mail.check_for_secrets([/SG.[a-zA-Z0-9_-]*/])
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|