send_sonar 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -24,7 +24,7 @@ module SendSonar
24
24
  end
25
25
 
26
26
  def inspect
27
- @original_exception.inspect
27
+ "#{self.class.name}: #{@original_exception.to_s}: #{@original_exception.http_body}"
28
28
  end
29
29
 
30
30
  def to_s
@@ -39,9 +39,11 @@ module SendSonar
39
39
  class UnknownRequestError < RequestException; end
40
40
  class RequestTimeout < RequestException; end
41
41
  class ConnectionRefused < RequestException; end
42
+ class TokenOrPublishableKeyNotFound < RequestException; end
42
43
 
43
44
  class Customer < OpenStruct; end
44
45
  class Message < OpenStruct; end
46
+ class Response < OpenStruct; end
45
47
 
46
48
  module Exceptions
47
49
  EXCEPTIONS_MAP = {
@@ -49,7 +51,8 @@ module SendSonar
49
51
  "No Active Subscription" => NoActiveSubscription,
50
52
  "Api Disabled For Company" => ApiDisabledForCompany,
51
53
  "Request Timed Out" => RequestTimeout,
52
- "Invalid Phone Number" => InvalidPhoneNumber
54
+ "Invalid Phone Number" => InvalidPhoneNumber,
55
+ "Token or publishable_key not found" => TokenOrPublishableKeyNotFound
53
56
  }
54
57
  end
55
58
  end
@@ -1,3 +1,3 @@
1
1
  module SendSonar
2
- VERSION = "1.1.0"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -18,12 +18,12 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.3"
22
- spec.add_development_dependency "rake", "~> 10.0"
23
- spec.add_development_dependency "rspec", "~> 3.0"
24
- spec.add_development_dependency "vcr", "~> 2.6"
25
- spec.add_development_dependency "webmock", "~> 1.1"
26
- spec.add_development_dependency "json"
21
+ spec.add_development_dependency "bundler", "~> 1.15", ">= 1.15.4"
22
+ spec.add_development_dependency "rake", "~> 12.1"
23
+ spec.add_development_dependency "rspec", "~> 3.6"
24
+ spec.add_development_dependency "vcr", "~> 3.0", ">= 3.0.3"
25
+ spec.add_development_dependency "webmock", "~> 3.0", ">= 3.0.1"
26
+ spec.add_development_dependency "json", "~> 2.1"
27
27
 
28
- spec.add_runtime_dependency "rest-client", '~> 1.6'
28
+ spec.add_runtime_dependency "rest-client", "~> 2.0", ">= 2.0.2"
29
29
  end
@@ -31,13 +31,13 @@ describe 'SendSonar' do
31
31
  end
32
32
  end
33
33
 
34
- shared_examples "a mature, error handling gem" do |context|
34
+ shared_examples 'a mature, error handling gem' do |context|
35
35
  context 'with an invalid token' do
36
36
  let(:token) { 'FAKE_TOKEN' }
37
37
 
38
- it 'raises a BadToken error' do
38
+ it 'raises a BadToken exception' do
39
39
  VCR.use_cassette("#{cassette_group}_bad_token") do
40
- expect { response }.to raise_error(SendSonar::BadToken, 'SendSonar::BadToken')
40
+ expect { response }.to raise_exception(SendSonar::BadToken, 'SendSonar::BadToken')
41
41
  end
42
42
  end
43
43
  end
@@ -45,9 +45,9 @@ describe 'SendSonar' do
45
45
  context 'with an inactive subscription' do
46
46
  let(:token) { 'tKux9Vwkt0UuTVJqGUO80MGJHCAeebpe' }
47
47
 
48
- it 'raises a BadToken error' do
48
+ it 'raises a NoActiveSubscription exception' do
49
49
  VCR.use_cassette("#{cassette_group}_no_subscription") do
50
- expect { response }.to raise_error(SendSonar::NoActiveSubscription, 'SendSonar::NoActiveSubscription')
50
+ expect { response }.to raise_exception(SendSonar::NoActiveSubscription, 'SendSonar::NoActiveSubscription')
51
51
  end
52
52
  end
53
53
  end
@@ -55,9 +55,9 @@ describe 'SendSonar' do
55
55
  context 'with disabled API' do
56
56
  let(:token) { 'ts9mOO_O5Dc7TOBaEAQym-00RGEl3Uel' }
57
57
 
58
- it 'raises a BadToken error' do
58
+ it 'raises an ApiDisabledForCompany error' do
59
59
  VCR.use_cassette("#{cassette_group}_api_disabled") do
60
- expect { response }.to raise_error(SendSonar::ApiDisabledForCompany, 'SendSonar::ApiDisabledForCompany')
60
+ expect { response }.to raise_exception(SendSonar::ApiDisabledForCompany, 'SendSonar::ApiDisabledForCompany')
61
61
  end
62
62
  end
63
63
  end
@@ -72,28 +72,28 @@ describe 'SendSonar' do
72
72
  end
73
73
  end
74
74
 
75
- let(:cassette_group) { "add_customer" }
75
+ let(:cassette_group) { 'add_customer' }
76
76
  let(:response) { SendSonar.add_customer(params) }
77
77
  let(:token) { '3Z9L8xFjeNmXL7Yn-pFJUBoxkVWBbl5o' }
78
78
  let(:params) do
79
- { :phone_number => "5555555557",
80
- :email => "user@example.com",
81
- :first_name => "john",
82
- :last_name => "doe",
83
- :properties => { :great_customer => "true" } }
79
+ { :phone_number => '5555555557',
80
+ :email => 'user@example.com',
81
+ :first_name => 'john',
82
+ :last_name => 'doe',
83
+ :properties => { :great_customer => 'true' } }
84
84
  end
85
85
 
86
- it_behaves_like "a mature, error handling gem"
86
+ it_behaves_like 'a mature, error handling gem'
87
87
 
88
88
  context 'with invalid params' do
89
89
  let(:params) do
90
- { :phone_numbah => "5555555558" }
90
+ { :phone_numbah => '5555555558' }
91
91
  end
92
92
 
93
- it 'raises a BadRequest error with hint' do
94
- VCR.use_cassette("add_customer_bad_params") do
95
- expect { response }.to raise_error(SendSonar::BadRequest,
96
- '400 Bad Request: {"error":"phone_number is missing"}')
93
+ it 'raises a BadRequest exception with hint' do
94
+ VCR.use_cassette('add_customer_bad_params') do
95
+ expect { response }.to raise_exception(SendSonar::BadRequest,
96
+ 'SendSonar::BadRequest: 400 Bad Request: {"error":"phone_number is missing"}')
97
97
  end
98
98
  end
99
99
  end
@@ -101,10 +101,10 @@ describe 'SendSonar' do
101
101
  context 'with an invalid phone number' do
102
102
  let(:token) { 'tKux9Vwkt0UuTVJqGUO80MGJHCAeebpe' }
103
103
 
104
- it 'raises a Invalid Phone Number error' do
104
+ it 'raises a BadRequest exception with Invalid Phone Number error message' do
105
105
  VCR.use_cassette("#{cassette_group}_invalid_phone_number") do
106
- expect { response }.to raise_error(SendSonar::BadRequest,
107
- '400 Bad Request: {"error":"Invalid Phone Number"}')
106
+ expect { response }.to raise_exception(SendSonar::BadRequest,
107
+ 'SendSonar::BadRequest: 400 Bad Request: {"error":"Invalid Phone Number"}')
108
108
  end
109
109
  end
110
110
  end
@@ -119,16 +119,60 @@ describe 'SendSonar' do
119
119
  it 'includes the expected attributes' do
120
120
  VCR.use_cassette('add_customer') do
121
121
  customer = response
122
- expect(customer.phone_number).to eq("5555555557")
123
- expect(customer.email).to eq("user@example.com")
124
- expect(customer.first_name).to eq("john")
125
- expect(customer.last_name).to eq("doe")
126
- expect(customer.properties).to eq({ "great_customer" => "true" })
122
+ expect(customer.phone_number).to eq('5555555557')
123
+ expect(customer.email).to eq('user@example.com')
124
+ expect(customer.first_name).to eq('john')
125
+ expect(customer.last_name).to eq('doe')
126
+ expect(customer.properties).to eq({ 'great_customer' => 'true' })
127
127
  end
128
128
  end
129
129
  end
130
130
  end
131
131
 
132
+ describe '.add_update_customer' do
133
+ before do
134
+ SendSonar.configure do |config|
135
+ config.token = token
136
+ config.env = :sandbox
137
+ end
138
+ end
139
+
140
+ let(:response) { SendSonar.add_update_customer(params) }
141
+ let(:token) { '99siwE4WRn6bg_B_ktm6h2w6Kez0JYLL' }
142
+ let(:phone_number) { '+13105555555' }
143
+ let(:email) { 'five@example.com' }
144
+ let(:first_name) { 'Five' }
145
+ let(:last_name) { 'Example' }
146
+ let(:properties) { { 'great_customer' => 'true' } }
147
+ let(:params) do
148
+ { :phone_number => phone_number,
149
+ :email => email,
150
+ :first_name => first_name,
151
+ :last_name => last_name,
152
+ :properties => properties }
153
+ end
154
+
155
+ context 'with proper param, active subscription' do
156
+ it 'returns a customer' do
157
+ VCR.use_cassette('add_update_customer') do
158
+ expect(response).to be_a(SendSonar::Customer)
159
+ end
160
+ end
161
+
162
+ it 'includes the expected attributes' do
163
+ VCR.use_cassette('add_update_customer') do
164
+ customer = response
165
+ expect(customer.phone_number).to eq(phone_number)
166
+ expect(customer.email).to eq(email)
167
+ expect(customer.first_name).to eq(first_name)
168
+ expect(customer.last_name).to eq(last_name)
169
+ expect(customer.properties).to eq(properties)
170
+ end
171
+ end
172
+ end
173
+
174
+ end
175
+
132
176
  describe '.message_customer' do
133
177
  before do
134
178
  SendSonar.configure do |config|
@@ -137,24 +181,24 @@ describe 'SendSonar' do
137
181
  end
138
182
  end
139
183
 
140
- let(:cassette_group) { "message_customer" }
184
+ let(:cassette_group) { 'message_customer' }
141
185
  let(:response) { SendSonar.message_customer(params) }
142
186
  let(:token) { '3Z9L8xFjeNmXL7Yn-pFJUBoxkVWBbl5o' }
143
187
  let(:params) do
144
- { :to => "5555555557", :text => "this is the message text" }
188
+ { :to => '5555555557', :text => 'this is the message text' }
145
189
  end
146
190
 
147
- it_behaves_like "a mature, error handling gem"
191
+ it_behaves_like 'a mature, error handling gem'
148
192
 
149
193
  context 'with invalid params' do
150
194
  let(:params) do
151
- { :toz => "5555555558" }
195
+ { :toz => '5555555558' }
152
196
  end
153
197
 
154
- it 'raises a BadRequest error with hint' do
155
- VCR.use_cassette("message_customer_bad_params") do
156
- expect { response }.to raise_error(SendSonar::BadRequest,
157
- '400 Bad Request: {"error":"text is missing, to is missing"}')
198
+ it 'raises a BadRequest exception with hint' do
199
+ VCR.use_cassette('message_customer_bad_params') do
200
+ expect { response }.to raise_exception(SendSonar::BadRequest,
201
+ 'SendSonar::BadRequest: 400 Bad Request: {"error":"text is missing, to is missing"}')
158
202
  end
159
203
  end
160
204
  end
@@ -162,10 +206,10 @@ describe 'SendSonar' do
162
206
  context 'with an invalid phone number' do
163
207
  let(:token) { 'tKux9Vwkt0UuTVJqGUO80MGJHCAeebpe' }
164
208
 
165
- it 'raises a Invalid Phone Number error' do
209
+ it 'raises a BadRequest exception with Invalid Phone Number error message' do
166
210
  VCR.use_cassette("#{cassette_group}_invalid_phone_number") do
167
- expect { response }.to raise_error(SendSonar::BadRequest,
168
- '400 Bad Request: {"error":"Invalid Phone Number"}')
211
+ expect { response }.to raise_exception(SendSonar::BadRequest,
212
+ 'SendSonar::BadRequest: 400 Bad Request: {"error":"Invalid Phone Number"}')
169
213
  end
170
214
  end
171
215
  end
@@ -180,11 +224,234 @@ describe 'SendSonar' do
180
224
  it 'includes the expected attributes' do
181
225
  VCR.use_cassette('message_customer') do
182
226
  message = response
183
- expect(message.to).to eq("5555555557")
184
- expect(message.text).to eq("this is the message text")
185
- expect(message.status).to eq("queued")
227
+ expect(message.to).to eq('5555555557')
228
+ expect(message.text).to eq('this is the message text')
229
+ expect(message.status).to eq('queued')
230
+ end
231
+ end
232
+ end
233
+ end
234
+
235
+ shared_examples 'an error receiving gem' do |context|
236
+ context 'with an invalid token' do
237
+ let(:token) { 'FAKE_TOKEN' }
238
+
239
+ it 'raises a BadToken exception' do
240
+ VCR.use_cassette("#{cassette_group}_bad_token") do
241
+ expect { response }.to raise_exception(SendSonar::TokenOrPublishableKeyNotFound, 'SendSonar::TokenOrPublishableKeyNotFound')
242
+ end
243
+ end
244
+ end
245
+ end
246
+
247
+ describe '.send_campaign' do
248
+ before do
249
+ SendSonar.configure do |config|
250
+ config.token = token
251
+ config.env = :sandbox
252
+ end
253
+ end
254
+
255
+ let(:cassette_group) { 'send_campaign' }
256
+ let(:response) { SendSonar.send_campaign(params) }
257
+ let(:token) { '99siwE4WRn6bg_B_ktm6h2w6Kez0JYLL' }
258
+ let(:recepient_number) { '+13105551111' }
259
+ let(:params) do
260
+ { :to => recepient_number, :campaign_id => 'test_d0Bu23' }
261
+ end
262
+
263
+ context 'with proper params, active subscription' do
264
+ it 'returns a campaign sent receipt' do
265
+ VCR.use_cassette('send_campaign') do
266
+ expect(response).to be_a(SendSonar::Response)
267
+ end
268
+ end
269
+
270
+ it 'includes the expected attributes' do
271
+ VCR.use_cassette('send_campaign') do
272
+ campaign_sent = response
273
+ expect(campaign_sent.to).to eq(recepient_number)
274
+ expect(campaign_sent.text).to eq('sent')
275
+ expect(campaign_sent.status).to eq('queued')
276
+ end
277
+ end
278
+ end
279
+
280
+ it_behaves_like 'an error receiving gem'
281
+ end
282
+
283
+ describe '.close_customer' do
284
+ before do
285
+ SendSonar.configure do |config|
286
+ config.token = token
287
+ config.env = :sandbox
288
+ end
289
+ end
290
+
291
+ let(:cassette_group) { 'close_customer' }
292
+ let(:response) { SendSonar.close_customer(params) }
293
+ let(:token) { '99siwE4WRn6bg_B_ktm6h2w6Kez0JYLL' }
294
+ let(:params) do
295
+ { :phone_number => '+13105551111' }
296
+ end
297
+
298
+ context 'with proper param, active subscription' do
299
+ it 'returns a customer closed status' do
300
+ VCR.use_cassette('close_customer') do
301
+ expect(response).to be_a(SendSonar::Response)
302
+ end
303
+ end
304
+
305
+ it 'includes the expected attributes' do
306
+ VCR.use_cassette('close_customer') do
307
+ customer_closed = response
308
+ expect(customer_closed.success).to eq(true)
309
+ end
310
+ end
311
+ end
312
+
313
+ it_behaves_like 'an error receiving gem'
314
+ end
315
+
316
+ describe '.delete_customer_property' do
317
+ before do
318
+ SendSonar.configure do |config|
319
+ config.token = token
320
+ config.env = :sandbox
321
+ end
322
+ end
323
+
324
+ let(:cassette_group) { 'delete_customer_property' }
325
+ let(:response) { SendSonar.delete_customer_property(params) }
326
+ let(:token) { '99siwE4WRn6bg_B_ktm6h2w6Kez0JYLL' }
327
+ let(:phone_number) { '+13105551111' }
328
+ let(:email) { 'one@example.com' }
329
+
330
+ context 'using phone_number param' do
331
+ let(:property_name) { 'foo' }
332
+ let(:params) do
333
+ { :phone_number => phone_number, :property_name => property_name }
334
+ end
335
+ it 'returns a customer property deleted' do
336
+ VCR.use_cassette('delete_customer_property_with_phone_number') do
337
+ expect(response).to be_a(SendSonar::Response)
338
+ end
339
+ end
340
+
341
+ it 'includes the expected attributes' do
342
+ VCR.use_cassette('delete_customer_property_with_phone_number') do
343
+ customer_property_deleted = response
344
+ expect(customer_property_deleted.phone_number).to eq(phone_number)
345
+ expect(customer_property_deleted.email).to eq(email)
346
+ expect(customer_property_deleted.property_name).to eq(property_name)
347
+ expect(customer_property_deleted.phone_number).to eq(phone_number)
348
+ expect(customer_property_deleted.deleted).to eq(true)
349
+ end
350
+ end
351
+
352
+ it_behaves_like 'an error receiving gem'
353
+ end
354
+
355
+ context 'using email param' do
356
+ let(:property_name) { 'bar' }
357
+ let(:params) do
358
+ { :email => email, :property_name => property_name }
359
+ end
360
+ it 'returns a customer property deleted' do
361
+ VCR.use_cassette('delete_customer_property_with_email') do
362
+ expect(response).to be_a(SendSonar::Response)
363
+ end
364
+ end
365
+
366
+ it 'includes the expected attributes' do
367
+ VCR.use_cassette('delete_customer_property_with_email') do
368
+ customer_property_deleted = response
369
+ expect(customer_property_deleted.phone_number).to eq(phone_number)
370
+ expect(customer_property_deleted.email).to eq(email)
371
+ expect(customer_property_deleted.property_name).to eq(property_name)
372
+ expect(customer_property_deleted.phone_number).to eq(phone_number)
373
+ expect(customer_property_deleted.deleted).to eq(true)
374
+ end
375
+ end
376
+ end
377
+ end
378
+
379
+ describe '.get_customer' do
380
+ before do
381
+ SendSonar.configure do |config|
382
+ config.token = token
383
+ config.env = :sandbox
384
+ end
385
+ end
386
+
387
+ let(:cassette_group) { 'get_customer' }
388
+ let(:response) { SendSonar.get_customer(params) }
389
+ let(:token) { '99siwE4WRn6bg_B_ktm6h2w6Kez0JYLL' }
390
+ let(:phone_number) { '+13105551111' }
391
+ let(:params) do
392
+ { :phone_number => phone_number }
393
+ end
394
+
395
+ context 'with proper param, active subscription' do
396
+ it 'returns a customer' do
397
+ VCR.use_cassette('get_customer') do
398
+ expect(response).to be_a(SendSonar::Customer)
399
+ end
400
+ end
401
+
402
+ it 'includes the expected attributes' do
403
+ VCR.use_cassette('get_customer') do
404
+ customer = response
405
+ expect(customer.phone_number).to eq(phone_number)
406
+ expect(customer).to respond_to(:first_name)
407
+ expect(customer).to respond_to(:last_name)
408
+ expect(customer).to respond_to(:email)
409
+ expect(customer).to respond_to(:assigned_phone_number)
410
+ expect(customer).to respond_to(:subscribed)
411
+ expect(customer).to respond_to(:unsubscribed_at)
412
+ expect(customer).to respond_to(:properties)
186
413
  end
187
414
  end
188
415
  end
416
+
417
+ it_behaves_like 'an error receiving gem'
189
418
  end
419
+
420
+ describe '.available_phone_number' do
421
+ before do
422
+ SendSonar.configure do |config|
423
+ config.publishable_key = publishable_key
424
+ config.env = :sandbox
425
+ end
426
+ end
427
+
428
+ let(:response) { SendSonar.available_phone_number }
429
+ let(:publishable_key) { 'f77a884d-4c52-4369-90c2-22a3d5607c24' }
430
+
431
+ context 'with proper param, active subscription' do
432
+ it 'returns an available number' do
433
+ VCR.use_cassette('available_phone_number') do
434
+ expect(response).to be_a(SendSonar::Response)
435
+ end
436
+ end
437
+
438
+ it 'includes the expected attributes' do
439
+ VCR.use_cassette('available_phone_number') do
440
+ available_number = response
441
+ expect(available_number).to respond_to(:available_number)
442
+ end
443
+ end
444
+ end
445
+
446
+ context 'with an invalid publishable key' do
447
+ let(:publishable_key) { 'BAD_PUBLISHABLE_KEY' }
448
+
449
+ it 'raises a TokenOrPublishableKeyNotFound exception' do
450
+ VCR.use_cassette('available_phone_number_bad_publishable_key') do
451
+ expect { response }.to raise_exception(SendSonar::TokenOrPublishableKeyNotFound, 'SendSonar::TokenOrPublishableKeyNotFound')
452
+ end
453
+ end
454
+ end
455
+ end
456
+
190
457
  end