elk 0.0.11 → 0.0.12

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cec2cf51647b89d4639431b5e6cad98a4eb1c3ac
4
- data.tar.gz: 311eb1055230e2545f94fa5e194ff99d6815fdaf
3
+ metadata.gz: ffe981763600225095d75aaf6c9906060fca7be7
4
+ data.tar.gz: 411313ddbd7e12b1b2fd8b78f2135e9bfd1ab425
5
5
  SHA512:
6
- metadata.gz: e34f77bae51ddfefbb3750df28fa56fe89910a081a6ff872775d2a928dccabca2be5b44ec0ae28e27b5014496825303ace5eb1b9ffe48bdd95a1913f08c925b1
7
- data.tar.gz: 93c31cf0651316835a997c01ccb688e7b5c1ee6f5321a9ffeeecbfa51ea4758498632e4a1491a921d375db74884f84f74730b7466d8acc78c88de1537c32f847
6
+ metadata.gz: f504ba330456a3d3b9ebd292d0baf0b0eacd07d2b4d1fa213f9431cd5d4f97879f9ff10ffcd128dae87ddfa4e8176a0dbb9cb9b64149a7818e886d4ff3542aad
7
+ data.tar.gz: 878e51be0a7383459fbf04aff9a259c837a7866c249f9ae6c11953c80a8c4e816cdf76921caaf6a6b5d107d5cbd910485b2eca301b8ef5dd555bddb8cc05f0f5
data/README.MD CHANGED
@@ -29,60 +29,76 @@ elk can be used to allocate a phone numbers, manage the numbers and send/recieve
29
29
 
30
30
  First thing when using elk is to set the authentication parameters
31
31
 
32
- require 'elk'
32
+ ```Ruby
33
+ require 'elk'
33
34
 
34
- Elk.configure do |config|
35
- config.username = 'USERNAME'
36
- config.password = 'PASSWORD'
37
- end
35
+ Elk.configure do |config|
36
+ config.username = 'USERNAME'
37
+ config.password = 'PASSWORD'
38
+ end
39
+ ```
38
40
 
39
41
  ### Numbers
40
42
 
41
43
  To be able to send and recieve messages, a number is needed. Several numbers can be allocated.
42
44
 
43
- number = Elk::Number.allocate(:sms_url => 'http://myservice.se/callback/newsms.php', :country => 'se')
44
- # => #<Elk::Number:0x0000010282aa70 @country="se", @sms_url="http://myservice.se/callback/newsms.php", @status="yes", @number_id="n03e7db70cc06c1ff85e09a2b3f86dd62", @number="+46766861034", @capabilities=[:sms], @loaded_at=2011-07-17 15:23:55 +0200>
45
+ ```Ruby
46
+ number = Elk::Number.allocate(:sms_url => 'http://myservice.se/callback/newsms.php', :country => 'se')
47
+ # => #<Elk::Number:0x0000010282aa70 @country="se", @sms_url="http://myservice.se/callback/newsms.php", @status="yes", @number_id="n03e7db70cc06c1ff85e09a2b3f86dd62", @number="+46766861034", @capabilities=[:sms], @loaded_at=2011-07-17 15:23:55 +0200>
48
+ ```
45
49
 
46
50
  Get all numbers
47
51
 
48
- numbers = Elk::Number.all
49
- # => [#<Elk::Number ...>, #<Elk::Number ...>]
52
+ ```Ruby
53
+ numbers = Elk::Number.all
54
+ # => [#<Elk::Number ...>, #<Elk::Number ...>]
55
+ ```
50
56
 
51
57
  Change number settings
52
58
 
53
- number.sms_url = 'http://myservice.se/callback/newsms.php'
54
- number.save
55
- # => true
59
+ ```Ruby
60
+ number.sms_url = 'http://myservice.se/callback/newsms.php'
61
+ number.save
62
+ # => true
63
+ ```
56
64
 
57
65
  Deallocate a number.
58
66
  Beware that there is no way to get your number back once it has been deallocated!
59
67
 
60
- number.deallocate!
61
- # => true
62
- number.status
63
- # => :deallocated
68
+ ```Ruby
69
+ number.deallocate!
70
+ # => true
71
+ number.status
72
+ # => :deallocated
73
+ ```
64
74
 
65
75
  ### SMS
66
76
 
67
77
  Send SMS. Messages can be sent from one of the allocated numbers or an arbitrary alphanumeric string of at most 11 characters.
68
78
 
69
- Elk::SMS.send(:from => 'MyService', :to => '+46704508449', :message => 'Your order #171 has now been sent!')
70
- # => #<Elk::SMS:0x0000010179d7e8 @from="MyService", @to="+46704508449", @message="Your order #171 has now been sent!", @message_id="sdc39a7926d37159b6985283e32f43251", @created_at=2011-07-17 16:21:13 +0200, @loaded_at=2011-07-17 16:21:13 +0200>
79
+ ```Ruby
80
+ Elk::SMS.send(:from => 'MyService', :to => '+46704508449', :message => 'Your order #171 has now been sent!')
81
+ # => #<Elk::SMS:0x0000010179d7e8 @from="MyService", @to="+46704508449", @message="Your order #171 has now been sent!", @message_id="sdc39a7926d37159b6985283e32f43251", @created_at=2011-07-17 16:21:13 +0200, @loaded_at=2011-07-17 16:21:13 +0200>
82
+ ```
71
83
 
72
84
  Receiving SMS does not require Elk, but should be of interest anyway.
73
85
  Example with Sinatra:
74
86
 
75
- post '/receive' do
76
- if request.params['message'] == 'Hello'
77
- # Sends a return SMS with message "world!"
78
- "world!"
79
- end
80
- end
87
+ ```Ruby
88
+ post '/receive' do
89
+ if request.params['message'] == 'Hello'
90
+ # Sends a return SMS with message "world!"
91
+ "world!"
92
+ end
93
+ end
94
+ ```
81
95
 
82
96
  SMS history
83
97
 
84
- Elk::SMS.all
85
- # => [#<Elk::SMS ...>, #<Elk::SMS ...>, <Elk::SMS ...>]
98
+ ```Ruby
99
+ Elk::SMS.all
100
+ # => [#<Elk::SMS ...>, #<Elk::SMS ...>, <Elk::SMS ...>]
101
+ ```
86
102
 
87
103
  ## Copyright
88
104
 
@@ -33,13 +33,22 @@ module Elk
33
33
  # Required parameters
34
34
  #
35
35
  # * :from - Either the one of the allocated numbers or arbitrary alphanumeric string of at most 11 characters
36
- # * :to - Any phone number capable of receiving SMS
36
+ # * :to - Any phone number capable of receiving SMS. Multiple numbers can be given as Array or comma separated String
37
37
  # * :message - Any UTF-8 text Splitting and joining multi-part SMS messages are automatically handled by the API
38
+ #
39
+ # Optional parameters
40
+ # * :flash - if set to non-false value SMS is sent as a "Flash SMS"
41
+ #
38
42
  def send(parameters)
39
43
  verify_parameters(parameters, [:from, :message, :to])
40
44
 
41
45
  parameters[:to] = Array(parameters[:to]).join(',')
42
46
 
47
+ if parameters[:flash]
48
+ parameters.delete(:flash)
49
+ parameters[:flashsms] = 'yes'
50
+ end
51
+
43
52
  # Warn if the from string will be capped by the sms gateway
44
53
  if parameters[:from] && parameters[:from].match(/^(\w{11,})$/)
45
54
  warn "SMS 'from' value #{parameters[:from]} will be capped at 11 chars"
@@ -1,3 +1,3 @@
1
1
  module Elk
2
- VERSION = '0.0.11'
2
+ VERSION = '0.0.12'
3
3
  end
@@ -0,0 +1,117 @@
1
+ require 'spec_helper'
2
+ require 'elk'
3
+
4
+ describe Elk::Number do
5
+ before { configure_elk }
6
+
7
+ it 'allocates a number' do
8
+ stub_request(:post, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers").
9
+ with(:body => {"country" => "se", "sms_url" => "http://localhost/receive"},
10
+ :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
11
+ to_return(fixture('allocates_a_number.txt'))
12
+
13
+ number = described_class.allocate(:sms_url => 'http://localhost/receive', :country => 'se')
14
+ number.status.should == :active
15
+ number.sms_url.should == 'http://localhost/receive'
16
+ number.country.should == 'se'
17
+ number.number.should == '+46766861012'
18
+ number.capabilities.should == [:sms]
19
+ end
20
+
21
+ it 'gets allocated numbers' do
22
+ stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers").
23
+ with(:headers => {'Accept'=>'application/json'}).
24
+ to_return(fixture('gets_allocated_numbers.txt'))
25
+
26
+ numbers = described_class.all
27
+ numbers.size.should == 2
28
+ numbers[0].number_id.should == 'nea19c8e291676fb7003fa1d63bba7899'
29
+ numbers[0].number.should == '+46704508449'
30
+ numbers[0].sms_url == 'http://localhost/receive1'
31
+
32
+ numbers[1].number_id.should == 'nea19c8e291676fb7003fa1d63bba789A'
33
+ numbers[1].number.should == '+46761042247'
34
+ numbers[0].sms_url == 'http://localhost/receive2'
35
+ end
36
+
37
+ it 'updates a number' do
38
+ stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers").
39
+ with(:headers => {'Accept'=>'application/json'}).
40
+ to_return(fixture('gets_allocated_numbers.txt'))
41
+ stub_request(:post, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers/nea19c8e291676fb7003fa1d63bba7899").
42
+ with(:body => {"sms_url" => "http://otherhost/receive", "voice_start" => ""},
43
+ :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
44
+ to_return(fixture('updates_a_number.txt'))
45
+
46
+ number = described_class.all[0]
47
+ number.country = 'no'
48
+ number.sms_url = 'http://otherhost/receive'
49
+ number.save.should == true
50
+ number.country.should == 'no'
51
+ number.sms_url.should == 'http://otherhost/receive'
52
+ end
53
+
54
+ it 'deallocates a number' do
55
+ stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers").
56
+ with(:headers => {'Accept'=>'application/json'}).
57
+ to_return(fixture('gets_allocated_numbers.txt'))
58
+ stub_request(:post, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers/nea19c8e291676fb7003fa1d63bba7899").
59
+ with(:body => {"active" => "no"},
60
+ :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
61
+ to_return(fixture('deallocates_a_number.txt'))
62
+
63
+ number = described_class.all[0]
64
+ number.status.should == :active
65
+ number.deallocate!.should == true
66
+ number.status.should == :deallocated
67
+ end
68
+
69
+ it 'reloads a number' do
70
+ stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers").
71
+ with(:headers => {'Accept'=>'application/json'}).
72
+ to_return(fixture('gets_allocated_numbers.txt'))
73
+ stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers/nea19c8e291676fb7003fa1d63bba7899").
74
+ with(:headers => {'Accept'=>'application/json'}).
75
+ to_return(fixture('reloads_a_number.txt'))
76
+
77
+ number = described_class.all[0]
78
+ object_id = number.object_id
79
+ loaded_at = number.loaded_at
80
+ number.country = 'blah'
81
+ number.reload.should == true
82
+ number.country.should == 'se'
83
+ number.object_id.should == object_id
84
+ number.loaded_at.should_not == loaded_at
85
+ end
86
+
87
+ it 'has wrong password' do
88
+ stub_request(:get, "https://USERNAME:WRONG@api.46elks.com/a1/Numbers").
89
+ with(:headers => {'Accept'=>'application/json'}).
90
+ to_return(fixture('auth_error.txt'))
91
+
92
+ Elk.configure do |config|
93
+ config.username = 'USERNAME'
94
+ config.password = 'WRONG'
95
+ end
96
+
97
+ expect {
98
+ described_class.all
99
+ }.to raise_error(Elk::AuthError)
100
+ end
101
+
102
+ it 'gets server error when looking for all numbers' do
103
+ stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers").
104
+ with(:headers => {'Accept'=>'application/json'}).
105
+ to_return(fixture('server_error.txt'))
106
+
107
+ expect {
108
+ described_class.all
109
+ }.to raise_error(Elk::ServerError)
110
+ end
111
+
112
+ it 'should handle no parameters' do
113
+ expect {
114
+ sms = described_class.allocate({})
115
+ }.to raise_error(Elk::MissingParameter)
116
+ end
117
+ end
@@ -0,0 +1,168 @@
1
+ require 'spec_helper'
2
+ require 'elk'
3
+
4
+ describe Elk::SMS do
5
+ before { configure_elk }
6
+ let(:url) { "https://USERNAME:PASSWORD@api.46elks.com/a1/SMS" }
7
+
8
+ it 'sends a SMS' do
9
+ stub_request(:post, url).
10
+ with(:body => {:from => "+46761042247", :message => "Your order #171 has now been sent!", :to => "+46704508449"},
11
+ :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
12
+ to_return(fixture('sends_a_sms.txt'))
13
+
14
+ # Fake $stderr to check warnings
15
+ begin
16
+ old_stderr, $stderr = $stderr, StringIO.new
17
+
18
+ sms = described_class.send(:from => '+46761042247',
19
+ :to => '+46704508449',
20
+ :message => 'Your order #171 has now been sent!')
21
+
22
+ $stderr.string.should == ""
23
+ ensure
24
+ $stderr = old_stderr
25
+ end
26
+
27
+ sms.class.should == described_class
28
+ sms.from.should == '+46761042247'
29
+ sms.to.should == '+46704508449'
30
+ sms.message.should == 'Your order #171 has now been sent!'
31
+ sms.direction.should == 'outgoing'
32
+ sms.status.should == 'delivered'
33
+ end
34
+
35
+ it "sends a flash SMS" do
36
+ stub = stub_request(:post, url).
37
+ to_return(fixture('sends_a_sms.txt'))
38
+
39
+ described_class.send(
40
+ :from => '+46761042247',
41
+ :to => '+46704508449',
42
+ :message => 'Your order #171 has now been sent!',
43
+ :flash => true
44
+ )
45
+
46
+ stub.with(
47
+ :body => {
48
+ :from => '+46761042247',
49
+ :to => '+46704508449',
50
+ :message => 'Your order #171 has now been sent!',
51
+ :flashsms => 'yes'
52
+ },
53
+ :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
54
+ should have_been_made
55
+ end
56
+
57
+ context 'when sending a SMS to multiple recipients' do
58
+ before do
59
+ stub_request(:post, url).
60
+ with(:body => {:from => "+46761042247", :message => "Your order #171 has now been sent!", :to => "+46704508449,+46704508449"},
61
+ :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
62
+ to_return(fixture('sends_a_sms_to_multiple_recipients.txt'))
63
+ end
64
+
65
+ it "sends the SMS when passing `to` as comma separated string" do
66
+ smses = described_class.send(:from => '+46761042247',
67
+ :to => '+46704508449,+46704508449',
68
+ :message => 'Your order #171 has now been sent!')
69
+
70
+ smses.size.should == 2
71
+ smses[0].class.should == described_class
72
+ smses[0].to.should == "+46704508449"
73
+
74
+ smses[0].message_id.should == "sb326c7a214f9f4abc90a11bd36d6abc3"
75
+ smses[1].message_id.should == "s47a89d6cc51d8db395d45ae7e16e86b7"
76
+ end
77
+
78
+ it "sends the SMS when passing `to` as array" do
79
+ smses = described_class.send(:from => '+46761042247',
80
+ :to => ['+46704508449', '+46704508449'],
81
+ :message => 'Your order #171 has now been sent!')
82
+
83
+ smses.size.should == 2
84
+ smses[0].class.should == described_class
85
+ smses[0].to.should == "+46704508449"
86
+
87
+ smses[0].message_id.should == "sb326c7a214f9f4abc90a11bd36d6abc3"
88
+ smses[1].message_id.should == "s47a89d6cc51d8db395d45ae7e16e86b7"
89
+ end
90
+ end
91
+
92
+ it 'gets SMS-history' do
93
+ stub_request(:get, url).
94
+ with(:headers => {'Accept'=>'application/json'}).
95
+ to_return(fixture('sms_history.txt'))
96
+
97
+ sms_history = described_class.all
98
+
99
+ sms_history.size.should == 3
100
+ sms_history[0].class.should == described_class
101
+ sms_history[0].created_at.class.should == Time
102
+
103
+ sms_history[0].message.should == "Your order #171 has now been sent!"
104
+ sms_history[1].message.should == "I'd like to order a pair of elks!"
105
+ sms_history[2].message.should == "Want an elk?"
106
+ end
107
+
108
+ it 'reloads a SMS' do
109
+ stub_request(:get, url).
110
+ with(:headers => {'Accept'=>'application/json'}).
111
+ to_return(fixture('sms_history.txt'))
112
+ stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/SMS/s8952031bb83bf3e64f8e13b071c131c0").
113
+ with(:headers => {'Accept'=>'application/json'}).
114
+ to_return(fixture('reloads_a_sms.txt'))
115
+
116
+ sms_history = described_class.all
117
+ sms = sms_history[0]
118
+ loaded_at = sms.loaded_at
119
+ object_id = sms.object_id
120
+ sms.reload.should == true
121
+ sms.object_id.should == object_id
122
+ sms.loaded_at.should_not == loaded_at
123
+ end
124
+
125
+ it 'should warn about capped sms sender' do
126
+ stub_request(:post, url).
127
+ with(:body => {:from => "VeryVeryVeryVeryLongSenderName", :message => "Your order #171 has now been sent!", :to => "+46704508449"},
128
+ :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
129
+ to_return(fixture('sends_a_sms_with_long_sender.txt'))
130
+
131
+ # Fake $stderr to check warnings
132
+ begin
133
+ old_stderr, $stderr = $stderr, StringIO.new
134
+
135
+ sms = described_class.send(:from => 'VeryVeryVeryVeryLongSenderName',
136
+ :to => '+46704508449',
137
+ :message => 'Your order #171 has now been sent!')
138
+
139
+ $stderr.string.should == "SMS 'from' value VeryVeryVeryVeryLongSenderName will be capped at 11 chars\n"
140
+ ensure
141
+ $stderr = old_stderr
142
+ end
143
+
144
+ sms.class.should == described_class
145
+ sms.from.should == 'VeryVeryVeryVeryLongSenderName'
146
+ sms.to.should == '+46704508449'
147
+ sms.message.should == 'Your order #171 has now been sent!'
148
+ end
149
+
150
+ it 'should handle invalid to number' do
151
+ stub_request(:post, url).
152
+ with(:body => {:from => "+46761042247", :message => "Your order #171 has now been sent!", :to => "monkey"},
153
+ :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
154
+ to_return(fixture('invalid_to_number.txt'))
155
+
156
+ expect {
157
+ sms = described_class.send(:from => '+46761042247',
158
+ :to => 'monkey',
159
+ :message => 'Your order #171 has now been sent!')
160
+ }.to raise_error(Elk::BadRequest, 'Invalid to number')
161
+ end
162
+
163
+ it 'should handle no parameters' do
164
+ expect {
165
+ sms = described_class.send({})
166
+ }.to raise_error(Elk::MissingParameter)
167
+ end
168
+ end
@@ -2,319 +2,57 @@ require 'spec_helper'
2
2
  require 'elk'
3
3
 
4
4
  describe Elk do
5
- it 'should detect missing username and/or password' do
6
- expect { Elk.base_url }.to raise_error(Elk::AuthError)
7
-
8
- Elk.configure do |config|
9
- config.username = nil
10
- config.password = 'PASSWORD'
11
- end
12
-
13
- expect { Elk.base_url }.to raise_error(Elk::AuthError)
14
-
15
- Elk.configure do |config|
16
- config.username = 'USERNAME'
17
- config.password = nil
18
- end
19
-
20
- expect { Elk.base_url }.to raise_error(Elk::AuthError)
21
-
22
- Elk.configure do |config|
23
- config.username = 'USERNAME'
24
- config.password = 'PASSWORD'
25
- end
26
-
27
- expect { Elk.base_url }.to_not raise_error(Elk::AuthError)
28
- end
29
-
30
- it 'should handle garbage json' do
31
- bad_response_body = fixture('bad_response_body.txt').read
32
-
33
- expect {
34
- Elk.parse_json(bad_response_body)
35
- }.to raise_error(Elk::BadResponse)
36
- end
37
-
38
- describe Elk::Number do
39
- it 'allocates a number' do
40
- stub_request(:post, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers").
41
- with(:body => {"country" => "se", "sms_url" => "http://localhost/receive"},
42
- :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
43
- to_return(fixture('allocates_a_number.txt'))
44
-
45
- configure_elk
46
-
47
- number = Elk::Number.allocate(:sms_url => 'http://localhost/receive', :country => 'se')
48
- number.status.should == :active
49
- number.sms_url.should == 'http://localhost/receive'
50
- number.country.should == 'se'
51
- number.number.should == '+46766861012'
52
- number.capabilities.should == [:sms]
53
- end
54
-
55
- it 'gets allocated numbers' do
56
- stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers").
57
- with(:headers => {'Accept'=>'application/json'}).
58
- to_return(fixture('gets_allocated_numbers.txt'))
59
-
60
- configure_elk
61
-
62
- numbers = Elk::Number.all
63
- numbers.size.should == 2
64
- numbers[0].number_id.should == 'nea19c8e291676fb7003fa1d63bba7899'
65
- numbers[0].number.should == '+46704508449'
66
- numbers[0].sms_url == 'http://localhost/receive1'
67
-
68
- numbers[1].number_id.should == 'nea19c8e291676fb7003fa1d63bba789A'
69
- numbers[1].number.should == '+46761042247'
70
- numbers[0].sms_url == 'http://localhost/receive2'
71
- end
72
-
73
- it 'updates a number' do
74
- stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers").
75
- with(:headers => {'Accept'=>'application/json'}).
76
- to_return(fixture('gets_allocated_numbers.txt'))
77
- stub_request(:post, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers/nea19c8e291676fb7003fa1d63bba7899").
78
- with(:body => {"sms_url" => "http://otherhost/receive", "voice_start" => ""},
79
- :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
80
- to_return(fixture('updates_a_number.txt'))
81
-
82
- configure_elk
83
-
84
- number = Elk::Number.all[0]
85
- number.country = 'no'
86
- number.sms_url = 'http://otherhost/receive'
87
- number.save.should == true
88
- number.country.should == 'no'
89
- number.sms_url.should == 'http://otherhost/receive'
90
- end
91
-
92
- it 'deallocates a number' do
93
- stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers").
94
- with(:headers => {'Accept'=>'application/json'}).
95
- to_return(fixture('gets_allocated_numbers.txt'))
96
- stub_request(:post, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers/nea19c8e291676fb7003fa1d63bba7899").
97
- with(:body => {"active" => "no"},
98
- :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
99
- to_return(fixture('deallocates_a_number.txt'))
100
-
101
- configure_elk
102
-
103
- number = Elk::Number.all[0]
104
- number.status.should == :active
105
- number.deallocate!.should == true
106
- number.status.should == :deallocated
107
- end
108
-
109
- it 'reloads a number' do
110
- stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers").
111
- with(:headers => {'Accept'=>'application/json'}).
112
- to_return(fixture('gets_allocated_numbers.txt'))
113
- stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers/nea19c8e291676fb7003fa1d63bba7899").
114
- with(:headers => {'Accept'=>'application/json'}).
115
- to_return(fixture('reloads_a_number.txt'))
116
-
117
- configure_elk
118
-
119
- number = Elk::Number.all[0]
120
- object_id = number.object_id
121
- loaded_at = number.loaded_at
122
- number.country = 'blah'
123
- number.reload.should == true
124
- number.country.should == 'se'
125
- number.object_id.should == object_id
126
- number.loaded_at.should_not == loaded_at
127
- end
128
-
129
- it 'has wrong password' do
130
- stub_request(:get, "https://USERNAME:WRONG@api.46elks.com/a1/Numbers").
131
- with(:headers => {'Accept'=>'application/json'}).
132
- to_return(fixture('auth_error.txt'))
133
-
134
- Elk.configure do |config|
135
- config.username = 'USERNAME'
136
- config.password = 'WRONG'
5
+ context "detect missing username and/or password" do
6
+ context "when nothing is configured" do
7
+ specify do
8
+ Elk.configure do |config|
9
+ config.username = nil
10
+ config.password = nil
11
+ end
12
+
13
+ expect { Elk.base_url }.to raise_error(Elk::AuthError)
137
14
  end
138
-
139
- expect {
140
- Elk::Number.all
141
- }.to raise_error(Elk::AuthError)
142
15
  end
143
16
 
144
- it 'gets server error when looking for all numbers' do
145
- stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/Numbers").
146
- with(:headers => {'Accept'=>'application/json'}).
147
- to_return(fixture('server_error.txt'))
17
+ context "when username is missing" do
18
+ specify do
19
+ Elk.configure do |config|
20
+ config.username = nil
21
+ config.password = 'PASSWORD'
22
+ end
148
23
 
149
- configure_elk
150
-
151
- expect {
152
- Elk::Number.all
153
- }.to raise_error(Elk::ServerError)
154
- end
155
-
156
- it 'should handle no parameters' do
157
- configure_elk
158
-
159
- expect {
160
- sms = Elk::Number.allocate({})
161
- }.to raise_error(Elk::MissingParameter)
162
- end
163
- end
164
-
165
- describe Elk::SMS do
166
- it 'sends a SMS' do
167
- stub_request(:post, "https://USERNAME:PASSWORD@api.46elks.com/a1/SMS").
168
- with(:body => {"from" => "+46761042247", :message => "Your order #171 has now been sent!", :to => "+46704508449"},
169
- :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
170
- to_return(fixture('sends_a_sms.txt'))
171
-
172
- configure_elk
173
-
174
- # Fake $stderr to check warnings
175
- begin
176
- old_stderr, $stderr = $stderr, StringIO.new
177
-
178
- sms = Elk::SMS.send(:from => '+46761042247',
179
- :to => '+46704508449',
180
- :message => 'Your order #171 has now been sent!')
181
-
182
- $stderr.string.should == ""
183
- ensure
184
- $stderr = old_stderr
24
+ expect { Elk.base_url }.to raise_error(Elk::AuthError)
185
25
  end
186
-
187
- sms.class.should == Elk::SMS
188
- sms.from.should == '+46761042247'
189
- sms.to.should == '+46704508449'
190
- sms.message.should == 'Your order #171 has now been sent!'
191
- sms.direction.should == 'outgoing'
192
- sms.status.should == 'delivered'
193
26
  end
194
27
 
28
+ context "when password is missing" do
29
+ specify do
30
+ Elk.configure do |config|
31
+ config.username = 'USERNAME'
32
+ config.password = nil
33
+ end
195
34
 
196
- context 'when sending a SMS to multiple recipients' do
197
- before do
198
- stub_request(:post, "https://USERNAME:PASSWORD@api.46elks.com/a1/SMS").
199
- with(:body => {"from" => "+46761042247", :message => "Your order #171 has now been sent!", :to => "+46704508449,+46704508449"},
200
- :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
201
- to_return(fixture('sends_a_sms_to_multiple_recipients.txt'))
202
-
203
- configure_elk
204
- end
205
-
206
- it "sends the SMS when passing `to` as comma separated string" do
207
- smses = Elk::SMS.send(:from => '+46761042247',
208
- :to => '+46704508449,+46704508449',
209
- :message => 'Your order #171 has now been sent!')
210
-
211
- smses.size.should == 2
212
- smses[0].class.should == Elk::SMS
213
- smses[0].to.should == "+46704508449"
214
-
215
- smses[0].message_id.should == "sb326c7a214f9f4abc90a11bd36d6abc3"
216
- smses[1].message_id.should == "s47a89d6cc51d8db395d45ae7e16e86b7"
217
- end
218
-
219
- it "sends the SMS when passing `to` as array" do
220
- smses = Elk::SMS.send(:from => '+46761042247',
221
- :to => ['+46704508449', '+46704508449'],
222
- :message => 'Your order #171 has now been sent!')
223
-
224
- smses.size.should == 2
225
- smses[0].class.should == Elk::SMS
226
- smses[0].to.should == "+46704508449"
227
-
228
- smses[0].message_id.should == "sb326c7a214f9f4abc90a11bd36d6abc3"
229
- smses[1].message_id.should == "s47a89d6cc51d8db395d45ae7e16e86b7"
35
+ expect { Elk.base_url }.to raise_error(Elk::AuthError)
230
36
  end
231
37
  end
232
38
 
233
- it 'gets SMS-history' do
234
- stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/SMS").
235
- with(:headers => {'Accept'=>'application/json'}).
236
- to_return(fixture('sms_history.txt'))
237
-
238
- configure_elk
239
-
240
- sms_history = Elk::SMS.all
39
+ context "when all is configured" do
40
+ specify do
41
+ Elk.configure do |config|
42
+ config.username = 'USERNAME'
43
+ config.password = 'PASSWORD'
44
+ end
241
45
 
242
- sms_history.size.should == 3
243
- sms_history[0].class.should == Elk::SMS
244
- sms_history[0].created_at.class.should == Time
245
-
246
- sms_history[0].message.should == "Your order #171 has now been sent!"
247
- sms_history[1].message.should == "I'd like to order a pair of elks!"
248
- sms_history[2].message.should == "Want an elk?"
249
- end
250
-
251
- it 'reloads a SMS' do
252
- stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/SMS").
253
- with(:headers => {'Accept'=>'application/json'}).
254
- to_return(fixture('sms_history.txt'))
255
- stub_request(:get, "https://USERNAME:PASSWORD@api.46elks.com/a1/SMS/s8952031bb83bf3e64f8e13b071c131c0").
256
- with(:headers => {'Accept'=>'application/json'}).
257
- to_return(fixture('reloads_a_sms.txt'))
258
-
259
- configure_elk
260
-
261
- sms_history = Elk::SMS.all
262
- sms = sms_history[0]
263
- loaded_at = sms.loaded_at
264
- object_id = sms.object_id
265
- sms.reload.should == true
266
- sms.object_id.should == object_id
267
- sms.loaded_at.should_not == loaded_at
268
- end
269
-
270
- it 'should warn about capped sms sender' do
271
- stub_request(:post, "https://USERNAME:PASSWORD@api.46elks.com/a1/SMS").
272
- with(:body => {"from" => "VeryVeryVeryVeryLongSenderName", :message => "Your order #171 has now been sent!", :to => "+46704508449"},
273
- :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
274
- to_return(fixture('sends_a_sms_with_long_sender.txt'))
275
-
276
- configure_elk
277
-
278
- # Fake $stderr to check warnings
279
- begin
280
- old_stderr, $stderr = $stderr, StringIO.new
281
-
282
- sms = Elk::SMS.send(:from => 'VeryVeryVeryVeryLongSenderName',
283
- :to => '+46704508449',
284
- :message => 'Your order #171 has now been sent!')
285
-
286
- $stderr.string.should == "SMS 'from' value VeryVeryVeryVeryLongSenderName will be capped at 11 chars\n"
287
- ensure
288
- $stderr = old_stderr
46
+ expect { Elk.base_url }.to_not raise_error(Elk::AuthError)
289
47
  end
290
-
291
- sms.class.should == Elk::SMS
292
- sms.from.should == 'VeryVeryVeryVeryLongSenderName'
293
- sms.to.should == '+46704508449'
294
- sms.message.should == 'Your order #171 has now been sent!'
295
- end
296
-
297
- it 'should handle invalid to number' do
298
- stub_request(:post, "https://USERNAME:PASSWORD@api.46elks.com/a1/SMS").
299
- with(:body => {"from" => "+46761042247", :message => "Your order #171 has now been sent!", :to => "monkey"},
300
- :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/x-www-form-urlencoded'}).
301
- to_return(fixture('invalid_to_number.txt'))
302
-
303
- configure_elk
304
-
305
- expect {
306
- sms = Elk::SMS.send(:from => '+46761042247',
307
- :to => 'monkey',
308
- :message => 'Your order #171 has now been sent!')
309
- }.to raise_error(Elk::BadRequest, 'Invalid to number')
310
48
  end
49
+ end
311
50
 
312
- it 'should handle no parameters' do
313
- configure_elk
51
+ it 'should handle garbage json' do
52
+ bad_response_body = fixture('bad_response_body.txt').read
314
53
 
315
- expect {
316
- sms = Elk::SMS.send({})
317
- }.to raise_error(Elk::MissingParameter)
318
- end
54
+ expect {
55
+ Elk.parse_json(bad_response_body)
56
+ }.to raise_error(Elk::BadResponse)
319
57
  end
320
- end
58
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johan Eckerstroem
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-09 00:00:00.000000000 Z
11
+ date: 2013-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json
@@ -16,70 +16,70 @@ dependencies:
16
16
  requirements:
17
17
  - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: 1.5.0
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
- version: 1.5.0
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rest-client
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: 1.6.3
33
+ version: '1.6'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ~>
39
39
  - !ruby/object:Gem::Version
40
- version: 1.6.3
40
+ version: '1.6'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: 0.9.2
47
+ version: '10.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 0.9.2
54
+ version: '10.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: 2.6.0
61
+ version: '2.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: 2.6.0
68
+ version: '2.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: webmock
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ~>
74
74
  - !ruby/object:Gem::Version
75
- version: 1.6.4
75
+ version: '1.0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ~>
81
81
  - !ruby/object:Gem::Version
82
- version: 1.6.4
82
+ version: '1.0'
83
83
  description: Elk can be used to allocate a phone numbers, manage the numbers and send
84
84
  SMS through these numbers.
85
85
  email: johan@duh.se
@@ -96,6 +96,8 @@ files:
96
96
  - lib/elk/util.rb
97
97
  - lib/elk/version.rb
98
98
  - lib/elk.rb
99
+ - spec/elk/number_spec.rb
100
+ - spec/elk/sms_spec.rb
99
101
  - spec/elk_spec.rb
100
102
  - spec/fixtures/allocates_a_number.txt
101
103
  - spec/fixtures/auth_error.txt
@@ -135,8 +137,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
137
  requirements:
136
138
  - API account at 46elks.com
137
139
  rubyforge_project:
138
- rubygems_version: 2.0.0
140
+ rubygems_version: 2.0.3
139
141
  signing_key:
140
142
  specification_version: 4
141
143
  summary: Client library for 46elks SMS/MMS/Voice service.
142
144
  test_files: []
145
+ has_rdoc: true