parity-sendgrid-api 0.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.
Files changed (99) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +3 -0
  5. data/.yardopts +6 -0
  6. data/Gemfile +17 -0
  7. data/Gemfile.lock +67 -0
  8. data/LICENSE +22 -0
  9. data/README.md +261 -0
  10. data/Rakefile +12 -0
  11. data/lib/sendgrid/api.rb +7 -0
  12. data/lib/sendgrid/api/client.rb +43 -0
  13. data/lib/sendgrid/api/entities/category.rb +13 -0
  14. data/lib/sendgrid/api/entities/email.rb +13 -0
  15. data/lib/sendgrid/api/entities/entity.rb +83 -0
  16. data/lib/sendgrid/api/entities/list.rb +30 -0
  17. data/lib/sendgrid/api/entities/marketing_email.rb +20 -0
  18. data/lib/sendgrid/api/entities/profile.rb +14 -0
  19. data/lib/sendgrid/api/entities/response.rb +21 -0
  20. data/lib/sendgrid/api/entities/response_insert.rb +23 -0
  21. data/lib/sendgrid/api/entities/response_remove.rb +23 -0
  22. data/lib/sendgrid/api/entities/schedule.rb +13 -0
  23. data/lib/sendgrid/api/entities/sender_address.rb +13 -0
  24. data/lib/sendgrid/api/entities/stats.rb +14 -0
  25. data/lib/sendgrid/api/newsletter/categories.rb +74 -0
  26. data/lib/sendgrid/api/newsletter/emails.rb +69 -0
  27. data/lib/sendgrid/api/newsletter/lists.rb +64 -0
  28. data/lib/sendgrid/api/newsletter/marketing_emails.rb +72 -0
  29. data/lib/sendgrid/api/newsletter/recipients.rb +55 -0
  30. data/lib/sendgrid/api/newsletter/schedule.rb +70 -0
  31. data/lib/sendgrid/api/newsletter/sender_addresses.rb +80 -0
  32. data/lib/sendgrid/api/newsletter/utils.rb +34 -0
  33. data/lib/sendgrid/api/rest/errors/error.rb +66 -0
  34. data/lib/sendgrid/api/rest/resource.rb +58 -0
  35. data/lib/sendgrid/api/rest/response/parse_error.rb +19 -0
  36. data/lib/sendgrid/api/rest/response/parse_json.rb +24 -0
  37. data/lib/sendgrid/api/service.rb +23 -0
  38. data/lib/sendgrid/api/version.rb +5 -0
  39. data/lib/sendgrid/api/web/mail.rb +44 -0
  40. data/lib/sendgrid/api/web/profile.rb +38 -0
  41. data/lib/sendgrid/api/web/stats.rb +36 -0
  42. data/sendgrid-api.gemspec +23 -0
  43. data/spec/fixtures/categories.json +11 -0
  44. data/spec/fixtures/emails/email.json +6 -0
  45. data/spec/fixtures/emails/emails.json +10 -0
  46. data/spec/fixtures/errors/already_exists.json +3 -0
  47. data/spec/fixtures/errors/bad_request.json +6 -0
  48. data/spec/fixtures/errors/database_error.json +3 -0
  49. data/spec/fixtures/errors/does_not_exist.json +3 -0
  50. data/spec/fixtures/errors/forbidden.json +3 -0
  51. data/spec/fixtures/errors/invalid_fields.json +3 -0
  52. data/spec/fixtures/errors/not_scheduled.json +3 -0
  53. data/spec/fixtures/errors/unauthorized.json +6 -0
  54. data/spec/fixtures/lists/list.json +5 -0
  55. data/spec/fixtures/lists/lists.json +11 -0
  56. data/spec/fixtures/marketing_emails/marketing_email.json +19 -0
  57. data/spec/fixtures/marketing_emails/marketing_emails.json +10 -0
  58. data/spec/fixtures/profile.json +18 -0
  59. data/spec/fixtures/recipients.json +8 -0
  60. data/spec/fixtures/schedule.json +3 -0
  61. data/spec/fixtures/sender_addresses/sender_address.json +11 -0
  62. data/spec/fixtures/sender_addresses/sender_addresses.json +11 -0
  63. data/spec/fixtures/stats.json +50 -0
  64. data/spec/fixtures/success.json +3 -0
  65. data/spec/sendgrid/api/client_spec.rb +38 -0
  66. data/spec/sendgrid/api/entities/category_spec.rb +14 -0
  67. data/spec/sendgrid/api/entities/email_spec.rb +15 -0
  68. data/spec/sendgrid/api/entities/entity_spec.rb +279 -0
  69. data/spec/sendgrid/api/entities/list_spec.rb +34 -0
  70. data/spec/sendgrid/api/entities/marketing_email_spec.rb +31 -0
  71. data/spec/sendgrid/api/entities/profile_spec.rb +26 -0
  72. data/spec/sendgrid/api/entities/response_insert_spec.rb +28 -0
  73. data/spec/sendgrid/api/entities/response_remove_spec.rb +28 -0
  74. data/spec/sendgrid/api/entities/response_spec.rb +28 -0
  75. data/spec/sendgrid/api/entities/schedule_spec.rb +14 -0
  76. data/spec/sendgrid/api/entities/sender_address_spec.rb +21 -0
  77. data/spec/sendgrid/api/entities/stats_spec.rb +25 -0
  78. data/spec/sendgrid/api/newsletter/categories_spec.rb +247 -0
  79. data/spec/sendgrid/api/newsletter/emails_spec.rb +265 -0
  80. data/spec/sendgrid/api/newsletter/lists_spec.rb +307 -0
  81. data/spec/sendgrid/api/newsletter/marketing_emails_spec.rb +306 -0
  82. data/spec/sendgrid/api/newsletter/recipients_spec.rb +252 -0
  83. data/spec/sendgrid/api/newsletter/schedule_spec.rb +263 -0
  84. data/spec/sendgrid/api/newsletter/sender_addresses_spec.rb +300 -0
  85. data/spec/sendgrid/api/rest/errors/error_spec.rb +121 -0
  86. data/spec/sendgrid/api/rest/resource_spec.rb +145 -0
  87. data/spec/sendgrid/api/rest/response/parse_error_spec.rb +39 -0
  88. data/spec/sendgrid/api/rest/response/parse_json_spec.rb +45 -0
  89. data/spec/sendgrid/api/service_spec.rb +44 -0
  90. data/spec/sendgrid/api/version_spec.rb +11 -0
  91. data/spec/sendgrid/api/web/mail_spec.rb +111 -0
  92. data/spec/sendgrid/api/web/profile_spec.rb +110 -0
  93. data/spec/sendgrid/api/web/stats_spec.rb +94 -0
  94. data/spec/spec_helper.rb +23 -0
  95. data/spec/support/helpers.rb +23 -0
  96. data/spec/support/mock.rb +30 -0
  97. data/spec/support/online.rb +114 -0
  98. data/spec/support/shared_examples.rb +104 -0
  99. metadata +225 -0
@@ -0,0 +1,265 @@
1
+ require 'spec_helper'
2
+
3
+ module Sendgrid
4
+ module API
5
+ module Newsletter
6
+ module Emails
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(:listname) { 'my list' }
17
+ let(:email) { Entities::Email.new(:email => 'john@example.com', :name => 'John') }
18
+ let(:email2) { Entities::Email.new(:email => 'brian@example.com', :name => 'Brian') }
19
+ let(:emails) { [email, email2] }
20
+
21
+ describe '#add' do
22
+ let(:url) { 'newsletter/lists/email/add.json' }
23
+
24
+ context 'when add an email successfully' do
25
+ before do
26
+ sg_mock.stub_post(url, :list => listname, :data => [email.to_json]).
27
+ to_return(:body => {:inserted => 1}.to_json)
28
+ end
29
+ subject { service.add(listname, email) }
30
+ its(:inserted) { should == 1 }
31
+ its(:any?) { should be_true }
32
+ its(:none?) { should be_false }
33
+ end
34
+
35
+ context 'when add multiple emails successfully' do
36
+ before do
37
+ sg_mock.stub_post(url, :list => listname, :data => emails.map(&:to_json)).
38
+ to_return(:body => {:inserted => 2}.to_json)
39
+ end
40
+ subject { service.add(listname, emails) }
41
+ its(:inserted) { should == 2 }
42
+ its(:any?) { should be_true }
43
+ its(:none?) { should be_false }
44
+ end
45
+
46
+ context 'when add an email that already exists' do
47
+ before do
48
+ sg_mock.stub_post(url, :list => listname, :data => [email.to_json]).
49
+ to_return(:body => {:inserted => 0}.to_json)
50
+ end
51
+ subject { service.add(listname, email) }
52
+ its(:inserted) { should == 0 }
53
+ its(:any?) { should be_false }
54
+ its(:none?) { should be_true }
55
+ end
56
+
57
+ context 'when permission failed' do
58
+ let(:stub_post) { sg_mock.stub_post(url, :list => listname, :data => [email.to_json]) }
59
+ subject { service.add(listname, email) }
60
+ it_behaves_like 'a forbidden response'
61
+ end
62
+ end
63
+
64
+ describe '#get' do
65
+ let(:url) { 'newsletter/lists/email/get.json' }
66
+
67
+ context 'when get all emails successfully' do
68
+ before do
69
+ sg_mock.stub_post(url, :list => listname).
70
+ to_return(:body => fixture('emails/emails.json'))
71
+ end
72
+ let(:response) { service.get(listname) }
73
+ subject { response }
74
+ it { should have(2).items }
75
+ describe 'first result' do
76
+ subject { response.first }
77
+ its(:email) { should == 'john@example.com' }
78
+ its(:name) { should == 'John' }
79
+ end
80
+ end
81
+
82
+ context 'when get an email successfully' do
83
+ before do
84
+ sg_mock.stub_post(url, :list => listname, :email => [email.email]).
85
+ to_return(:body => fixture('emails/email.json'))
86
+ end
87
+ let(:response) { service.get(listname, email) }
88
+ subject { response }
89
+ it { should have(1).item }
90
+ describe 'first result' do
91
+ subject { response.first }
92
+ its(:email) { should == 'john@example.com' }
93
+ its(:name) { should == 'John' }
94
+ end
95
+ end
96
+
97
+ context 'when permission failed' do
98
+ let(:stub_post) { sg_mock.stub_post(url, :list => listname) }
99
+ subject { service.get(listname) }
100
+ it_behaves_like 'a forbidden response'
101
+ end
102
+ end
103
+
104
+ describe '#delete' do
105
+ let(:url) { 'newsletter/lists/email/delete.json' }
106
+
107
+ context 'when delete an email successfully' do
108
+ before do
109
+ sg_mock.stub_post(url, :list => listname, :email => [email.email]).
110
+ to_return(:body => {:removed => 1}.to_json)
111
+ end
112
+ let(:response) { service.delete(listname, email) }
113
+ subject { response }
114
+ its(:removed) { should == 1 }
115
+ its(:any?) { should be_true }
116
+ its(:none?) { should be_false }
117
+ end
118
+
119
+ context 'when delete multiple emails successfully' do
120
+ before do
121
+ sg_mock.stub_post(url, :list => listname, :email => emails.map(&:email)).
122
+ to_return(:body => {:removed => 2}.to_json)
123
+ end
124
+ let(:response) { service.delete(listname, emails) }
125
+ subject { response }
126
+ its(:removed) { should == 2 }
127
+ its(:any?) { should be_true }
128
+ its(:none?) { should be_false }
129
+ end
130
+
131
+ context 'when no emails were deleted' do
132
+ before do
133
+ sg_mock.stub_post(url, :list => listname, :email => [email.email]).
134
+ to_return(:body => {:removed => 0}.to_json)
135
+ end
136
+ let(:response) { service.delete(listname, email) }
137
+ subject { response }
138
+ its(:removed) { should == 0 }
139
+ its(:any?) { should be_false }
140
+ its(:none?) { should be_true }
141
+ end
142
+
143
+ context 'when permission failed' do
144
+ let(:stub_post) { sg_mock.stub_post(url, :list => listname, :email => [email.email]) }
145
+ subject { service.delete(listname, email) }
146
+ it_behaves_like 'a forbidden response'
147
+ end
148
+ end
149
+
150
+ describe 'online tests', :online => true do
151
+ include_examples 'online tests'
152
+ let(:online) { Online.new(env_user, env_key) }
153
+ let(:list) { online.list_example }
154
+ let(:emails) { online.emails_example }
155
+ let(:email) { emails.first }
156
+
157
+ context 'when credentials are valid' do
158
+ let(:lists) { Newsletter::Lists::Services.new(resource) }
159
+ let(:resource) { REST::Resource.new(env_user, env_key) }
160
+
161
+ before do
162
+ lists.add(list).success? or raise 'could not create the list'
163
+ end
164
+ after do
165
+ lists.delete(list).success? or raise 'could not remove the created list'
166
+ end
167
+
168
+ describe '#add' do
169
+ context 'when add an email successfully' do
170
+ it 'adds the email' do
171
+ response = subject.add(list, email)
172
+ response.any?.should be_true
173
+ response.inserted.should == 1
174
+ end
175
+ end
176
+
177
+ context 'when add multiple emails successfully' do
178
+ it 'adds the emails' do
179
+ response = subject.add(list, emails)
180
+ response.any?.should be_true
181
+ response.inserted.should == 2
182
+ end
183
+ end
184
+
185
+ context 'when add an email that already exists' do
186
+ before do
187
+ subject.add(list, email)
188
+ end
189
+ it 'do not add the email' do
190
+ response = subject.add(list, email)
191
+ response.any?.should be_false
192
+ response.inserted.should == 0
193
+ end
194
+ end
195
+ end
196
+
197
+ describe '#get' do
198
+ before do
199
+ service.add(list, emails)
200
+ end
201
+
202
+ context 'when get all emails successfully' do
203
+ it 'gets the emails' do
204
+ response = subject.get(list)
205
+ response.should have(2).items
206
+ end
207
+ end
208
+
209
+ context 'when get an email successfully' do
210
+ it 'gets the email' do
211
+ response = subject.get(list, email)
212
+ response.should have(1).item
213
+ end
214
+ end
215
+ end
216
+
217
+ describe '#delete' do
218
+ before do
219
+ service.add(list, emails)
220
+ end
221
+
222
+ context 'when delete an email successfully' do
223
+ it 'deletes the email' do
224
+ response = service.delete(list, email)
225
+ response.any?.should be_true
226
+ response.removed.should == 1
227
+ end
228
+ end
229
+
230
+ context 'when delete multiple emails successfully' do
231
+ it 'deletes the emails' do
232
+ response = service.delete(list, emails)
233
+ response.any?.should be_true
234
+ response.removed.should == 2
235
+ end
236
+ end
237
+ end
238
+ end
239
+
240
+ context 'when credentials are invalid' do
241
+ describe '#add' do
242
+ it 'raises an error' do
243
+ expect { subject.add(list, email) }.to raise_error(REST::Errors::Forbidden)
244
+ end
245
+ end
246
+
247
+ describe '#get' do
248
+ it 'raises an error' do
249
+ expect { subject.get(list, email) }.to raise_error(REST::Errors::Forbidden)
250
+ end
251
+ end
252
+
253
+ describe '#delete' do
254
+ it 'raises an error' do
255
+ expect { subject.delete(list, email) }.to raise_error(REST::Errors::Forbidden)
256
+ end
257
+ end
258
+ end
259
+ end
260
+
261
+ end
262
+ end
263
+ end
264
+ end
265
+ end
@@ -0,0 +1,307 @@
1
+ require 'spec_helper'
2
+
3
+ module Sendgrid
4
+ module API
5
+ module Newsletter
6
+ module Lists
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
+ describe '#add' do
17
+ let(:url) { 'newsletter/lists/add.json' }
18
+ let(:listname) { 'list 1' }
19
+ let(:stub_post) { sg_mock.stub_post(url, :list => listname) }
20
+
21
+ subject { service.add(listname) }
22
+
23
+ context 'when add a list successfully' do
24
+ context 'with name' do
25
+ it_behaves_like 'a success response'
26
+ end
27
+
28
+ context 'with object' do
29
+ let(:list) { Entities::List.new(:list => listname) }
30
+ subject { service.add(list) }
31
+ it_behaves_like 'a success response'
32
+ end
33
+ end
34
+
35
+ context 'when permission failed' do
36
+ it_behaves_like 'a forbidden response'
37
+ end
38
+
39
+ context 'when list already exists' do
40
+ it_behaves_like 'an already exists response'
41
+ end
42
+ end
43
+
44
+ describe '#edit' do
45
+ let(:url) { 'newsletter/lists/edit.json' }
46
+ let(:listname) { 'list 1' }
47
+ let(:newlistname) { 'new list 1' }
48
+ let(:stub_post) { sg_mock.stub_post(url, :list => listname, :newlist => newlistname) }
49
+
50
+ subject { service.edit(listname, newlistname) }
51
+
52
+ context 'when edit a list successfully' do
53
+ context 'with name' do
54
+ it_behaves_like 'a success response'
55
+ end
56
+
57
+ context 'with object' do
58
+ let(:list) { Entities::List.new(:list => listname) }
59
+ let(:newlist) { Entities::List.new(:list => newlistname) }
60
+ subject { service.edit(list, newlist) }
61
+ it_behaves_like 'a success response'
62
+ end
63
+ end
64
+
65
+ context 'when permission failed' do
66
+ it_behaves_like 'a forbidden response'
67
+ end
68
+
69
+ context 'when list already exists' do
70
+ it_behaves_like 'an already exists response'
71
+ end
72
+
73
+ context 'when list does not exist' do
74
+ it_behaves_like 'a does not exist response'
75
+ end
76
+ end
77
+
78
+ describe '#delete' do
79
+ let(:url) { 'newsletter/lists/delete.json' }
80
+ let(:listname) { 'list 1' }
81
+ let(:stub_post) { sg_mock.stub_post(url, :list => listname) }
82
+
83
+ subject { service.delete(listname) }
84
+
85
+ context 'when delete a list successfully' do
86
+ context 'with name' do
87
+ it_behaves_like 'a success response'
88
+ end
89
+
90
+ context 'with object' do
91
+ let(:list) { Entities::List.new(:list => listname) }
92
+ subject { service.delete(list) }
93
+ it_behaves_like 'a success response'
94
+ end
95
+ end
96
+
97
+ context 'when permission failed' do
98
+ it_behaves_like 'a forbidden response'
99
+ end
100
+
101
+ context 'when list does not exist' do
102
+ it_behaves_like 'a does not exist response'
103
+ end
104
+ end
105
+
106
+ describe '#get' do
107
+ let(:url) { 'newsletter/lists/get.json' }
108
+ let(:response) { service.get(listname) }
109
+ let(:listname) { 'list 1' }
110
+ let(:stub_post) { sg_mock.stub_post(url, :list => listname) }
111
+ subject { response }
112
+
113
+ context 'when get all lists successfully' do
114
+ let(:stub_post) { sg_mock.stub_post(url) }
115
+ let(:response) { service.get }
116
+
117
+ before do
118
+ stub_post.to_return(:body => fixture('lists/lists.json'))
119
+ end
120
+
121
+ it { should_not be_empty }
122
+ it { should have(3).items }
123
+
124
+ describe 'first list' do
125
+ subject { response.first }
126
+ it { should be_instance_of(Entities::List) }
127
+ its(:list) { should == 'list 1' }
128
+ end
129
+ end
130
+
131
+ context 'when get a list successfully' do
132
+ before do
133
+ stub_post.to_return(:body => fixture('lists/list.json'))
134
+ end
135
+
136
+ context 'with name' do
137
+ it { should_not be_empty }
138
+ it { should have(1).item }
139
+ end
140
+
141
+ context 'with object' do
142
+ let(:response) { service.get(list) }
143
+ let(:list) { Entities::List.new(:list => listname) }
144
+
145
+ it { should_not be_empty }
146
+ it { should have(1).item }
147
+ end
148
+ end
149
+
150
+ context 'when permission failed' do
151
+ it_behaves_like 'a forbidden response'
152
+ end
153
+
154
+ context 'when not found' do
155
+ it_behaves_like 'a does not exist response'
156
+ end
157
+ end
158
+
159
+ describe 'online tests', :online => true do
160
+ include_examples 'online tests'
161
+ let(:online) { Online.new(env_user, env_key) }
162
+ let(:list) { online.list_example }
163
+ let(:newlistname) { 'sendgrid-api new list test' }
164
+
165
+ context 'when credentials are valid' do
166
+ let(:resource) { REST::Resource.new(env_user, env_key) }
167
+
168
+ describe '#add' do
169
+ after do
170
+ subject.delete(list).success? or raise 'could not remove the created list'
171
+ end
172
+
173
+ context 'when add a list successfully' do
174
+ it 'adds a list' do
175
+ subject.add(list).success?.should be_true
176
+ end
177
+ end
178
+
179
+ context 'when list already exists' do
180
+ before do
181
+ subject.add(list).success? or raise 'could not create the list'
182
+ end
183
+ it 'raises an error' do
184
+ expect { subject.add(list) }.to raise_error(REST::Errors::UnprocessableEntity)
185
+ end
186
+ end
187
+ end
188
+
189
+ describe '#edit' do
190
+ context 'when edit a list successfully' do
191
+ before do
192
+ subject.add(list).success? or raise 'could not create the list'
193
+ end
194
+ after do
195
+ subject.delete(newlistname).success? or raise 'could not remove the created list'
196
+ end
197
+ it 'edits a list' do
198
+ subject.edit(list, newlistname).success?.should be_true
199
+ end
200
+ end
201
+
202
+ context 'when list does not exist' do
203
+ before do
204
+ subject.add(newlistname).success? or raise 'could not create the list'
205
+ end
206
+ after do
207
+ subject.delete(newlistname).success? or raise 'could not remove the created list'
208
+ end
209
+ it 'raises an error' do
210
+ expect { subject.edit(list, newlistname) }.to raise_error(REST::Errors::Unauthorized)
211
+ end
212
+ end
213
+
214
+ context 'when list already exists' do
215
+ before do
216
+ subject.add(list).success? or raise 'could not create the list'
217
+ subject.add(newlistname).success? or raise 'could not create the list'
218
+ end
219
+ after do
220
+ subject.delete(list).success? or raise 'could not remove the created list'
221
+ subject.delete(newlistname).success? or raise 'could not remove the created list'
222
+ end
223
+ it 'raises an error' do
224
+ expect { subject.edit(list, newlistname) }.to raise_error(REST::Errors::Unauthorized)
225
+ end
226
+ end
227
+ end
228
+
229
+ describe '#delete' do
230
+ context 'when delete a list successfully' do
231
+ before do
232
+ subject.add(list).success? or raise 'could not create the list'
233
+ end
234
+ it 'deletes a list' do
235
+ subject.delete(list).success?.should be_true
236
+ end
237
+ end
238
+
239
+ context 'when list does not exist' do
240
+ it 'raises an error' do
241
+ expect { subject.delete(list) }.to raise_error(REST::Errors::UnprocessableEntity)
242
+ end
243
+ end
244
+ end
245
+
246
+ describe '#get' do
247
+ context 'when get all lists successfully' do
248
+ before do
249
+ subject.add(list).success? or raise 'could not create the list'
250
+ end
251
+ after do
252
+ subject.delete(list).success? or raise 'could not remove the created list'
253
+ end
254
+ it 'gets a list' do
255
+ subject.get.should_not be_empty
256
+ end
257
+ end
258
+
259
+ context 'when get a list successfully' do
260
+ before do
261
+ subject.add(list).success? or raise 'could not create the list'
262
+ end
263
+ after do
264
+ subject.delete(list).success? or raise 'could not remove the created list'
265
+ end
266
+ it 'gets a list' do
267
+ subject.get(list).should_not be_empty
268
+ end
269
+ end
270
+
271
+ context 'when list does not exist' do
272
+ it 'raises an error' do
273
+ expect { subject.get(list) }.to raise_error(REST::Errors::Unauthorized)
274
+ end
275
+ end
276
+ end
277
+ end
278
+
279
+ context 'when credentials are invalid' do
280
+ describe '#add' do
281
+ it 'raises an error' do
282
+ expect { subject.add(list) }.to raise_error(REST::Errors::Forbidden)
283
+ end
284
+ end
285
+ describe '#edit' do
286
+ it 'raises an error' do
287
+ expect { subject.edit(list, newlistname) }.to raise_error(REST::Errors::Forbidden)
288
+ end
289
+ end
290
+ describe '#delete' do
291
+ it 'raises an error' do
292
+ expect { subject.delete(list) }.to raise_error(REST::Errors::Forbidden)
293
+ end
294
+ end
295
+ describe '#get' do
296
+ it 'raises an error' do
297
+ expect { subject.get(list) }.to raise_error(REST::Errors::Forbidden)
298
+ end
299
+ end
300
+ end
301
+ end
302
+
303
+ end
304
+ end
305
+ end
306
+ end
307
+ end