sendgrid-api 0.0.2 → 0.0.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.
Files changed (76) hide show
  1. data/.gitignore +4 -2
  2. data/.yardopts +6 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +5 -1
  5. data/README.md +200 -12
  6. data/Rakefile +3 -0
  7. data/lib/sendgrid/api/client.rb +16 -0
  8. data/lib/sendgrid/api/entities/category.rb +13 -0
  9. data/lib/sendgrid/api/entities/email.rb +13 -0
  10. data/lib/sendgrid/api/entities/entity.rb +2 -2
  11. data/lib/sendgrid/api/entities/list.rb +30 -0
  12. data/lib/sendgrid/api/entities/marketing_email.rb +20 -0
  13. data/lib/sendgrid/api/entities/response_insert.rb +23 -0
  14. data/lib/sendgrid/api/entities/response_remove.rb +23 -0
  15. data/lib/sendgrid/api/entities/schedule.rb +13 -0
  16. data/lib/sendgrid/api/entities/sender_address.rb +13 -0
  17. data/lib/sendgrid/api/newsletter/categories.rb +74 -0
  18. data/lib/sendgrid/api/newsletter/emails.rb +69 -0
  19. data/lib/sendgrid/api/newsletter/lists.rb +64 -0
  20. data/lib/sendgrid/api/newsletter/marketing_emails.rb +72 -0
  21. data/lib/sendgrid/api/newsletter/recipients.rb +55 -0
  22. data/lib/sendgrid/api/newsletter/schedule.rb +70 -0
  23. data/lib/sendgrid/api/newsletter/sender_addresses.rb +80 -0
  24. data/lib/sendgrid/api/newsletter/utils.rb +34 -0
  25. data/lib/sendgrid/api/rest/errors/error.rb +9 -3
  26. data/lib/sendgrid/api/rest/resource.rb +3 -1
  27. data/lib/sendgrid/api/version.rb +1 -1
  28. data/lib/sendgrid/api/web/mail.rb +44 -0
  29. data/lib/sendgrid/api/web/profile.rb +3 -3
  30. data/lib/sendgrid/api/web/stats.rb +3 -3
  31. data/spec/fixtures/categories.json +11 -0
  32. data/spec/fixtures/emails/email.json +6 -0
  33. data/spec/fixtures/emails/emails.json +10 -0
  34. data/spec/fixtures/errors/already_exists.json +3 -0
  35. data/spec/fixtures/errors/bad_request.json +6 -0
  36. data/spec/fixtures/errors/database_error.json +3 -0
  37. data/spec/fixtures/errors/does_not_exist.json +3 -0
  38. data/spec/fixtures/{forbidden.json → errors/forbidden.json} +0 -0
  39. data/spec/fixtures/errors/invalid_fields.json +3 -0
  40. data/spec/fixtures/errors/not_scheduled.json +3 -0
  41. data/spec/fixtures/errors/unauthorized.json +6 -0
  42. data/spec/fixtures/lists/list.json +5 -0
  43. data/spec/fixtures/lists/lists.json +11 -0
  44. data/spec/fixtures/marketing_emails/marketing_email.json +19 -0
  45. data/spec/fixtures/marketing_emails/marketing_emails.json +10 -0
  46. data/spec/fixtures/recipients.json +8 -0
  47. data/spec/fixtures/schedule.json +3 -0
  48. data/spec/fixtures/sender_addresses/sender_address.json +11 -0
  49. data/spec/fixtures/sender_addresses/sender_addresses.json +11 -0
  50. data/spec/sendgrid/api/client_spec.rb +16 -0
  51. data/spec/sendgrid/api/entities/category_spec.rb +14 -0
  52. data/spec/sendgrid/api/entities/email_spec.rb +15 -0
  53. data/spec/sendgrid/api/entities/list_spec.rb +34 -0
  54. data/spec/sendgrid/api/entities/marketing_email_spec.rb +31 -0
  55. data/spec/sendgrid/api/entities/response_insert_spec.rb +28 -0
  56. data/spec/sendgrid/api/entities/response_remove_spec.rb +28 -0
  57. data/spec/sendgrid/api/entities/schedule_spec.rb +14 -0
  58. data/spec/sendgrid/api/entities/sender_address_spec.rb +21 -0
  59. data/spec/sendgrid/api/newsletter/categories_spec.rb +247 -0
  60. data/spec/sendgrid/api/newsletter/emails_spec.rb +265 -0
  61. data/spec/sendgrid/api/newsletter/lists_spec.rb +307 -0
  62. data/spec/sendgrid/api/newsletter/marketing_emails_spec.rb +306 -0
  63. data/spec/sendgrid/api/newsletter/recipients_spec.rb +252 -0
  64. data/spec/sendgrid/api/newsletter/schedule_spec.rb +263 -0
  65. data/spec/sendgrid/api/newsletter/sender_addresses_spec.rb +300 -0
  66. data/spec/sendgrid/api/rest/errors/error_spec.rb +40 -16
  67. data/spec/sendgrid/api/rest/resource_spec.rb +2 -0
  68. data/spec/sendgrid/api/web/mail_spec.rb +111 -0
  69. data/spec/sendgrid/api/web/profile_spec.rb +13 -29
  70. data/spec/sendgrid/api/web/stats_spec.rb +9 -15
  71. data/spec/support/helpers.rb +8 -0
  72. data/spec/support/mock.rb +6 -2
  73. data/spec/support/online.rb +114 -0
  74. data/spec/support/shared_examples.rb +93 -0
  75. metadata +96 -10
  76. data/spec/fixtures/unauthorized.json +0 -6
@@ -0,0 +1,252 @@
1
+ require 'spec_helper'
2
+
3
+ module Sendgrid
4
+ module API
5
+ module Newsletter
6
+ module Recipients
7
+ describe Services do
8
+
9
+ subject { service }
10
+ let(:service) { described_class.new(resource) }
11
+ let(:resource) { REST::Resource.new(user, key) }
12
+ let(:user) { 'my_user' }
13
+ let(:key) { 'my_key' }
14
+ let(:sg_mock) { Sendgrid::Mock.new(user, key) }
15
+
16
+ let(:marketing_email_name) { 'my marketing email' }
17
+ let(:listname) { 'my list' }
18
+ let(:marketing_email) { Entities::MarketingEmail.new(:name => marketing_email_name) }
19
+ let(:list) { Entities::List.new(:list => listname) }
20
+
21
+ describe '#add' do
22
+ let(:url) { 'newsletter/recipients/add.json' }
23
+ let(:stub_post) { sg_mock.stub_post(url, :name => marketing_email_name, :list => listname) }
24
+ subject { service.add(list, marketing_email) }
25
+
26
+ context 'when add a recipient list successfully' do
27
+ context 'with object' do
28
+ it_behaves_like 'a success response'
29
+ end
30
+
31
+ context 'with name' do
32
+ subject { service.add(listname, marketing_email_name) }
33
+ it_behaves_like 'a success response'
34
+ end
35
+ end
36
+
37
+ context 'when the list does not exist' do
38
+ it_behaves_like 'a database error response'
39
+ end
40
+
41
+ context 'when the marketing email does not exist' do
42
+ it_behaves_like 'a does not exist response'
43
+ end
44
+
45
+ context 'when permission failed' do
46
+ it_behaves_like 'a forbidden response'
47
+ end
48
+ end
49
+
50
+ describe '#get' do
51
+ let(:url) { 'newsletter/recipients/get.json' }
52
+ let(:stub_post) { sg_mock.stub_post(url, :name => marketing_email_name) }
53
+ subject { service.get(marketing_email) }
54
+
55
+ context 'when get the recipient lists successfully' do
56
+ before do
57
+ stub_post.to_return(:body => fixture('recipients.json'))
58
+ end
59
+
60
+ context 'with object' do
61
+ it { should have(2).items }
62
+
63
+ describe 'first item' do
64
+ subject { service.get(marketing_email).first }
65
+ its(:list) { should == 'list 1' }
66
+ end
67
+ end
68
+
69
+ context 'with name' do
70
+ subject { service.get(marketing_email_name) }
71
+
72
+ it { should have(2).items }
73
+ end
74
+ end
75
+
76
+ context 'when the marketing email does not exist' do
77
+ it_behaves_like 'a does not exist response'
78
+ end
79
+
80
+ context 'when permission failed' do
81
+ it_behaves_like 'a forbidden response'
82
+ end
83
+ end
84
+
85
+ describe '#delete' do
86
+ let(:url) { 'newsletter/recipients/delete.json' }
87
+ let(:stub_post) { sg_mock.stub_post(url, :name => marketing_email_name, :list => listname) }
88
+ subject { service.delete(list, marketing_email) }
89
+
90
+ context 'when delete a recipient list successfully' do
91
+ context 'with object' do
92
+ it_behaves_like 'a success response'
93
+ end
94
+
95
+ context 'with name' do
96
+ subject { service.delete(listname, marketing_email_name) }
97
+ it_behaves_like 'a success response'
98
+ end
99
+ end
100
+
101
+ context 'when the list does not exist' do
102
+ it_behaves_like 'a database error response'
103
+ end
104
+
105
+ context 'when the marketing email does not exist' do
106
+ it_behaves_like 'a does not exist response'
107
+ end
108
+
109
+ context 'when permission failed' do
110
+ it_behaves_like 'a forbidden response'
111
+ end
112
+ end
113
+
114
+ describe 'online tests', :online => true do
115
+ include_examples 'online tests'
116
+ let(:online) { Online.new(env_user, env_key) }
117
+ let(:marketing_email) { online.marketing_email_example }
118
+ let(:list) { online.list_example }
119
+ let(:client) { online.client }
120
+
121
+ context 'when credentials are valid' do
122
+ let(:resource) { REST::Resource.new(env_user, env_key) }
123
+
124
+ describe '#add' do
125
+ context 'when add a recipient list successfully' do
126
+ before do
127
+ online.add_marketing_email
128
+ online.add_list
129
+ end
130
+ after do
131
+ online.delete_marketing_email
132
+ online.delete_list
133
+ end
134
+
135
+ it 'adds the recipient list' do
136
+ online.add_recipient_list.should be_true
137
+ end
138
+ end
139
+
140
+ context 'when the list does not exist' do
141
+ before do
142
+ online.add_marketing_email
143
+ end
144
+ after do
145
+ online.delete_marketing_email
146
+ end
147
+ it 'raises an error' do
148
+ expect { subject.add(list, marketing_email) }.to raise_error(REST::Errors::Unknown)
149
+ end
150
+ end
151
+
152
+ context 'when the marketing email does not exist' do
153
+ before do
154
+ online.add_list
155
+ end
156
+ after do
157
+ online.delete_list
158
+ end
159
+ it 'raises an error' do
160
+ expect { subject.add(list, marketing_email) }.to raise_error(REST::Errors::Unauthorized)
161
+ end
162
+ end
163
+ end
164
+
165
+ describe '#get' do
166
+ context 'when get the recipient lists successfully' do
167
+ before do
168
+ online.add_marketing_email
169
+ end
170
+ after do
171
+ online.delete_marketing_email
172
+ end
173
+ it 'gets the recipient lists' do
174
+ expect { subject.get(marketing_email) }.to_not raise_error
175
+ end
176
+ end
177
+
178
+ context 'when the marketing email does not exist' do
179
+ it 'raises an error' do
180
+ expect { subject.get(marketing_email) }.to raise_error(REST::Errors::Unauthorized)
181
+ end
182
+ end
183
+ end
184
+
185
+ describe '#delete' do
186
+ context 'when delete a recipient list successfully' do
187
+ before do
188
+ online.add_marketing_email
189
+ online.add_list
190
+ online.add_recipient_list
191
+ end
192
+ after do
193
+ online.delete_marketing_email
194
+ online.delete_list
195
+ end
196
+
197
+ it 'deletes the recipient list' do
198
+ subject.delete(list, marketing_email).success?.should be_true
199
+ end
200
+ end
201
+
202
+ context 'when the list does not exist' do
203
+ before do
204
+ online.add_marketing_email
205
+ end
206
+ after do
207
+ online.delete_marketing_email
208
+ end
209
+ it 'raises an error' do
210
+ expect { subject.delete(list, marketing_email) }.to raise_error(REST::Errors::Unknown)
211
+ end
212
+ end
213
+
214
+ context 'when the marketing email does not exist' do
215
+ before do
216
+ online.add_list
217
+ end
218
+ after do
219
+ online.delete_list
220
+ end
221
+ it 'raises an error' do
222
+ expect { subject.delete(list, marketing_email) }.to raise_error(REST::Errors::Unauthorized)
223
+ end
224
+ end
225
+ end
226
+ end
227
+
228
+ context 'when credentials are invalid' do
229
+ describe '#add' do
230
+ it 'raises an error' do
231
+ expect { subject.add(list, marketing_email) }.to raise_error(REST::Errors::Forbidden)
232
+ end
233
+ end
234
+
235
+ describe '#get' do
236
+ it 'raises an error' do
237
+ expect { subject.get(marketing_email) }.to raise_error(REST::Errors::Forbidden)
238
+ end
239
+ end
240
+
241
+ describe '#delete' do
242
+ it 'raises an error' do
243
+ expect { subject.delete(list, marketing_email) }.to raise_error(REST::Errors::Forbidden)
244
+ end
245
+ end
246
+ end
247
+ end
248
+ end
249
+ end
250
+ end
251
+ end
252
+ end
@@ -0,0 +1,263 @@
1
+ require 'spec_helper'
2
+
3
+ module Sendgrid
4
+ module API
5
+ module Newsletter
6
+ module Schedule
7
+ describe Services do
8
+
9
+ subject { service }
10
+ let(:service) { described_class.new(resource) }
11
+ let(:resource) { REST::Resource.new(user, key) }
12
+ let(:user) { 'my_user' }
13
+ let(:key) { 'my_key' }
14
+ let(:sg_mock) { Sendgrid::Mock.new(user, key) }
15
+
16
+ let(:marketing_email_name) { 'my marketing email' }
17
+ let(:marketing_email) { Entities::MarketingEmail.new(:name => marketing_email_name) }
18
+
19
+ describe '#add' do
20
+ let(:url) { 'newsletter/schedule/add.json' }
21
+ let(:stub_post) { sg_mock.stub_post(url, :name => marketing_email_name) }
22
+ subject { service.add(marketing_email) }
23
+
24
+ context 'when add a schedule successfully' do
25
+ context 'with object' do
26
+ it_behaves_like 'a success response'
27
+ end
28
+
29
+ context 'with name' do
30
+ subject { service.add(marketing_email_name) }
31
+ it_behaves_like 'a success response'
32
+ end
33
+
34
+ context 'with after option' do
35
+ let(:after) { 10 }
36
+ let(:stub_post) { sg_mock.stub_post(url, :name => marketing_email_name, :after => after.to_s) }
37
+ subject { service.add(marketing_email_name, :after => after) }
38
+ it_behaves_like 'a success response'
39
+ end
40
+
41
+ context 'with at option' do
42
+ context 'when at is a string object' do
43
+ let(:at) { 'time in string' }
44
+ let(:stub_post) { sg_mock.stub_post(url, :name => marketing_email_name, :at => at) }
45
+ subject { service.add(marketing_email_name, :at => at) }
46
+ it_behaves_like 'a success response'
47
+ end
48
+
49
+ context 'when at is a time object' do
50
+ let(:at) { Time.now }
51
+ let(:stub_post) { sg_mock.stub_post(url, :name => marketing_email_name, :at => at.strftime('%Y-%m-%d %H:%M:%S%:z')) }
52
+ subject { service.add(marketing_email_name, :at => at) }
53
+ it_behaves_like 'a success response'
54
+ end
55
+ end
56
+
57
+ context 'with invalid options' do
58
+ let(:other) { 'other' }
59
+ let(:stub_post) { sg_mock.stub_post(url, :name => marketing_email_name) }
60
+ subject { service.add(marketing_email_name, :other => other) }
61
+ it_behaves_like 'a success response'
62
+ end
63
+ end
64
+
65
+ context 'when the schedule params are invalid' do
66
+ it_behaves_like 'an invalid fields response'
67
+ end
68
+
69
+ context 'when the marketing email does not exist' do
70
+ it_behaves_like 'a does not exist response'
71
+ end
72
+
73
+ context 'when permission failed' do
74
+ it_behaves_like 'a forbidden response'
75
+ end
76
+ end
77
+
78
+ describe '#get' do
79
+ let(:url) { 'newsletter/schedule/get.json' }
80
+ let(:stub_post) { sg_mock.stub_post(url, :name => marketing_email_name) }
81
+ subject { service.get(marketing_email) }
82
+
83
+ context 'when get the schedule successfully' do
84
+ before do
85
+ stub_post.to_return(:body => fixture('schedule.json'))
86
+ end
87
+
88
+ context 'with object' do
89
+ its(:date) { should == '2013-10-30 18:01:40' }
90
+ end
91
+
92
+ context 'with name' do
93
+ subject { service.get(marketing_email_name) }
94
+ its(:date) { should == '2013-10-30 18:01:40' }
95
+ end
96
+ end
97
+
98
+ context 'when the marketing email does not exist' do
99
+ it_behaves_like 'a does not exist response'
100
+ end
101
+
102
+ context 'when permission failed' do
103
+ it_behaves_like 'a forbidden response'
104
+ end
105
+ end
106
+
107
+ describe '#delete' do
108
+ let(:url) { 'newsletter/schedule/delete.json' }
109
+ let(:stub_post) { sg_mock.stub_post(url, :name => marketing_email_name) }
110
+ subject { service.delete(marketing_email) }
111
+
112
+ context 'when delete the schedule successfully' do
113
+ context 'with object' do
114
+ it_behaves_like 'a success response'
115
+ end
116
+
117
+ context 'with name' do
118
+ subject { service.delete(marketing_email_name) }
119
+ it_behaves_like 'a success response'
120
+ end
121
+ end
122
+
123
+ context 'when there is no previous schedule' do
124
+ it_behaves_like 'a not scheduled response'
125
+ end
126
+
127
+ context 'when the marketing email does not exist' do
128
+ it_behaves_like 'a does not exist response'
129
+ end
130
+
131
+ context 'when permission failed' do
132
+ it_behaves_like 'a forbidden response'
133
+ end
134
+ end
135
+
136
+ describe 'online tests', :online => true do
137
+ include_examples 'online tests'
138
+ let(:online) { Online.new(env_user, env_key) }
139
+ let(:marketing_email) { online.marketing_email_example }
140
+ let(:client) { online.client }
141
+
142
+ context 'when credentials are valid' do
143
+ let(:resource) { REST::Resource.new(env_user, env_key) }
144
+
145
+ describe '#add' do
146
+ context 'when add a schedule successfully' do
147
+ before do
148
+ online.add_marketing_email_with_list
149
+ end
150
+ after do
151
+ online.delete_marketing_email_with_list
152
+ end
153
+ context 'with after option' do
154
+ it 'schedules a marketing email' do
155
+ subject.add(marketing_email, :after => 10).success?.should be_true
156
+ end
157
+ end
158
+ context 'with at option' do
159
+ it 'schedules a marketing email' do
160
+ subject.add(marketing_email, :at => (Time.now + 10*60)).success?.should be_true
161
+ end
162
+ end
163
+ end
164
+
165
+ context 'when the schedule params are invalid' do
166
+ before do
167
+ online.add_marketing_email
168
+ end
169
+ after do
170
+ online.delete_marketing_email
171
+ end
172
+ it 'raises an error' do
173
+ expect { subject.add(marketing_email, :at => '2013') }.to raise_error(REST::Errors::BadRequest)
174
+ end
175
+ end
176
+
177
+ context 'when the marketing email does not exist' do
178
+ it 'raises an error' do
179
+ expect { subject.add(marketing_email) }.to raise_error(REST::Errors::Unauthorized)
180
+ end
181
+ end
182
+ end
183
+
184
+ describe '#get' do
185
+ context 'when get the schedule successfully' do
186
+ before do
187
+ online.add_marketing_email_with_list
188
+ subject.add(marketing_email, :after => 10)
189
+ end
190
+ after do
191
+ online.delete_marketing_email_with_list
192
+ end
193
+ it 'gets the schedule' do
194
+ subject.get(marketing_email).date.should_not be_empty
195
+ end
196
+ end
197
+
198
+ context 'when the marketing email does not exist' do
199
+ it 'raises an error' do
200
+ expect { subject.get(marketing_email) }.to raise_error(REST::Errors::Unauthorized)
201
+ end
202
+ end
203
+ end
204
+
205
+ describe '#delete' do
206
+ context 'when delete the schedule successfully' do
207
+ before do
208
+ online.add_marketing_email_with_list
209
+ subject.add(marketing_email, :after => 10)
210
+ end
211
+ after do
212
+ online.delete_marketing_email_with_list
213
+ end
214
+ it 'deletes the schedule' do
215
+ subject.delete(marketing_email).success?.should be_true
216
+ end
217
+ end
218
+
219
+ context 'when there is no previous schedule' do
220
+ before do
221
+ online.add_marketing_email
222
+ end
223
+ after do
224
+ online.delete_marketing_email
225
+ end
226
+ it 'raises an error' do
227
+ expect { subject.delete(marketing_email) }.to raise_error(REST::Errors::Unauthorized)
228
+ end
229
+ end
230
+
231
+ context 'when the marketing email does not exist' do
232
+ it 'raises an error' do
233
+ expect { subject.delete(marketing_email) }.to raise_error(REST::Errors::Unauthorized)
234
+ end
235
+ end
236
+ end
237
+ end
238
+
239
+ context 'when credentials are invalid' do
240
+ describe '#add' do
241
+ it 'raises an error' do
242
+ expect { subject.add(marketing_email) }.to raise_error(REST::Errors::Forbidden)
243
+ end
244
+ end
245
+
246
+ describe '#get' do
247
+ it 'raises an error' do
248
+ expect { subject.get(marketing_email) }.to raise_error(REST::Errors::Forbidden)
249
+ end
250
+ end
251
+
252
+ describe '#delete' do
253
+ it 'raises an error' do
254
+ expect { subject.delete(marketing_email) }.to raise_error(REST::Errors::Forbidden)
255
+ end
256
+ end
257
+ end
258
+ end
259
+ end
260
+ end
261
+ end
262
+ end
263
+ end