nexmo 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +1 -1
  3. data/lib/nexmo.rb +15 -1
  4. data/nexmo.gemspec +4 -3
  5. data/spec/nexmo_spec.rb +58 -29
  6. metadata +31 -28
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ae52a9612e17e4e82d62b525f27b1d02523f6d34
4
+ data.tar.gz: e0fb13b7e0989a6f591102ff5583120006df6270
5
+ SHA512:
6
+ metadata.gz: a9bbfbdf2791eff805283d71bad2812a0900b8e6afee3104e6387136112fe5d303f0557f2a35e09165e57a9e1ab7b693ccea95b7b07c8c79bafaed070be50fc1
7
+ data.tar.gz: dc9656dd961d47e4a908077f0fb1b80f1b7fac12f4d410c75b7495f3a10b3ce1f7ee215e1f02c971f80dd6bf5ba529e7ca2fa4e40fc4f4e84ef443144c0cf645
data/README.md CHANGED
@@ -111,7 +111,7 @@ Troubleshooting
111
111
 
112
112
  Remember that phone numbers should be specified in international format.
113
113
 
114
- The Nexmo documentation contains a [list of error codes](http://nexmo.com/documentation/index.html#response_code)
114
+ The Nexmo documentation contains a [list of error codes](https://docs.nexmo.com/index.php/sms-api/send-message#response_code)
115
115
  which may be useful if you have problems sending a message.
116
116
 
117
117
  Please report all bugs/issues via the GitHub issue tracker.
@@ -16,7 +16,9 @@ module Nexmo
16
16
  @json = JSON
17
17
  end
18
18
 
19
- @http = Net::HTTP.new('rest.nexmo.com', Net::HTTP.https_default_port)
19
+ @host = options.fetch(:host) { 'rest.nexmo.com' }
20
+
21
+ @http = Net::HTTP.new(@host, Net::HTTP.https_default_port)
20
22
 
21
23
  @http.use_ssl = true
22
24
  end
@@ -65,6 +67,18 @@ module Nexmo
65
67
  get('/number/search', {:country => country_code}.merge(params))
66
68
  end
67
69
 
70
+ def buy_number(params)
71
+ post('/number/buy', params)
72
+ end
73
+
74
+ def cancel_number(params)
75
+ post('/number/cancel', params)
76
+ end
77
+
78
+ def update_number(params)
79
+ post('/number/update', params)
80
+ end
81
+
68
82
  def get_message(id)
69
83
  get('/search/message', {:id => id})
70
84
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'nexmo'
3
- s.version = '1.2.0'
3
+ s.version = '1.3.0'
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.authors = ['Tim Craft']
6
6
  s.email = ['mail@timcraft.com']
@@ -12,10 +12,11 @@ Gem::Specification.new do |s|
12
12
  s.add_development_dependency('mocha', '~> 0.13.2')
13
13
  s.add_development_dependency('oauth', '~> 0.4.7')
14
14
  s.add_development_dependency('faux', '~> 1.1.0')
15
+ s.add_development_dependency('webmock', '~> 1.17.0')
15
16
  s.require_path = 'lib'
16
17
 
17
18
  if RUBY_VERSION == '1.8.7'
18
- s.add_development_dependency('minitest', '>= 4.2.0')
19
- s.add_development_dependency('json', '>= 1.6.5')
19
+ s.add_development_dependency('minitest', '~> 4.2.0')
20
+ s.add_development_dependency('json', '~> 1.8.0')
20
21
  end
21
22
  end
@@ -1,4 +1,5 @@
1
1
  require 'minitest/autorun'
2
+ require 'webmock/minitest'
2
3
  require 'mocha/setup'
3
4
  require 'faux'
4
5
  require 'nexmo'
@@ -7,19 +8,17 @@ require 'json'
7
8
 
8
9
  describe 'Nexmo::Client' do
9
10
  before do
10
- @json_encoded_body = regexp_matches(/\{".+?":".+?"(,".+?":".+?")+\}/)
11
+ @base_url = 'https://rest.nexmo.com'
11
12
 
12
- @http_header_hash = has_entry('Content-Type', 'application/json')
13
+ @json_object = {:body => /\{".+?":".+?"(,".+?":".+?")+\}/, :headers => {'Content-Type' => 'application/json'}}
14
+
15
+ @oauth_header = {'Authorization' => /\AOAuth .+\z/}
13
16
 
14
17
  @example_message_hash = {:from => 'ruby', :to => 'number', :text => 'Hey!'}
15
18
 
16
19
  @client = Nexmo::Client.new('key', 'secret')
17
20
  end
18
21
 
19
- def expects_http_get(request_uri)
20
- @client.http.expects(:get).with(has_equivalent_query_string(request_uri)).returns(stub)
21
- end
22
-
23
22
  describe 'http method' do
24
23
  it 'returns a net http object that uses ssl' do
25
24
  @client.http.must_be_instance_of(Net::HTTP)
@@ -30,7 +29,7 @@ describe 'Nexmo::Client' do
30
29
 
31
30
  describe 'send_message method' do
32
31
  it 'posts to the sms json resource and returns a response object' do
33
- @client.http.expects(:post).with('/sms/json', @json_encoded_body, @http_header_hash).returns(stub)
32
+ stub_request(:post, "#@base_url/sms/json").with(@json_object)
34
33
 
35
34
  @client.send_message(@example_message_hash).must_be_instance_of(Nexmo::Response)
36
35
  end
@@ -42,25 +41,25 @@ describe 'Nexmo::Client' do
42
41
  end
43
42
 
44
43
  it 'posts to the sms json resource and returns the message id' do
45
- @http_response.stubs(:body).returns('{"messages":[{"status":0,"message-id":"id"}]}')
46
-
47
- @client.http.expects(:post).with('/sms/json', @json_encoded_body, @http_header_hash).returns(@http_response)
44
+ stub_request(:post, "#@base_url/sms/json").with(@json_object).to_return({
45
+ :headers => {'Content-Type' => 'application/json'},
46
+ :body => '{"messages":[{"status":0,"message-id":"id"}]}'
47
+ })
48
48
 
49
49
  @client.send_message!(@example_message_hash).must_equal('id')
50
50
  end
51
51
 
52
52
  it 'raises an exception if the response code is not expected' do
53
- @http_response.stubs(:code).returns('500')
54
-
55
- @client.http.stubs(:post).returns(@http_response)
53
+ stub_request(:post, "#@base_url/sms/json").with(@json_object).to_return(:status => 500)
56
54
 
57
55
  proc { @client.send_message!(@example_message_hash) }.must_raise(Nexmo::Error)
58
56
  end
59
57
 
60
58
  it 'raises an exception if the response body contains an error' do
61
- @http_response.stubs(:body).returns('{"messages":[{"status":2,"error-text":"Missing from param"}]}')
62
-
63
- @client.http.stubs(:post).returns(@http_response)
59
+ stub_request(:post, "#@base_url/sms/json").with(@json_object).to_return({
60
+ :headers => {'Content-Type' => 'application/json'},
61
+ :body => '{"messages":[{"status":2,"error-text":"Missing from param"}]}'
62
+ })
64
63
 
65
64
  proc { @client.send_message!(@example_message_hash) }.must_raise(Nexmo::Error)
66
65
  end
@@ -68,7 +67,7 @@ describe 'Nexmo::Client' do
68
67
 
69
68
  describe 'get_balance method' do
70
69
  it 'fetches the account balance resource and returns a response object' do
71
- expects_http_get '/account/get-balance?api_key=key&api_secret=secret'
70
+ stub_request(:get, "#@base_url/account/get-balance?api_key=key&api_secret=secret")
72
71
 
73
72
  @client.get_balance.must_be_instance_of(Nexmo::Response)
74
73
  end
@@ -76,7 +75,7 @@ describe 'Nexmo::Client' do
76
75
 
77
76
  describe 'get_country_pricing method' do
78
77
  it 'fetches the outbound pricing resource for the given country and returns a response object' do
79
- expects_http_get '/account/get-pricing/outbound?api_key=key&api_secret=secret&country=CA'
78
+ stub_request(:get, "#@base_url/account/get-pricing/outbound?api_key=key&api_secret=secret&country=CA")
80
79
 
81
80
  @client.get_country_pricing(:CA).must_be_instance_of(Nexmo::Response)
82
81
  end
@@ -84,7 +83,7 @@ describe 'Nexmo::Client' do
84
83
 
85
84
  describe 'get_prefix_pricing method' do
86
85
  it 'fetches the outbound pricing resource for the given prefix and returns a response object' do
87
- expects_http_get '/account/get-prefix-pricing/outbound?api_key=key&api_secret=secret&prefix=44'
86
+ stub_request(:get, "#@base_url/account/get-prefix-pricing/outbound?api_key=key&api_secret=secret&prefix=44")
88
87
 
89
88
  @client.get_prefix_pricing(44).must_be_instance_of(Nexmo::Response)
90
89
  end
@@ -92,7 +91,7 @@ describe 'Nexmo::Client' do
92
91
 
93
92
  describe 'get_account_numbers method' do
94
93
  it 'fetches the account numbers resource with the given parameters and returns a response object' do
95
- expects_http_get '/account/numbers?api_key=key&api_secret=secret&size=25&pattern=33'
94
+ stub_request(:get, "#@base_url/account/numbers?api_key=key&api_secret=secret&size=25&pattern=33")
96
95
 
97
96
  @client.get_account_numbers(:size => 25, :pattern => 33).must_be_instance_of(Nexmo::Response)
98
97
  end
@@ -100,15 +99,39 @@ describe 'Nexmo::Client' do
100
99
 
101
100
  describe 'number_search method' do
102
101
  it 'fetches the number search resource for the given country with the given parameters and returns a response object' do
103
- expects_http_get '/number/search?api_key=key&api_secret=secret&country=CA&size=25'
102
+ stub_request(:get, "#@base_url/number/search?api_key=key&api_secret=secret&country=CA&size=25")
104
103
 
105
104
  @client.number_search(:CA, :size => 25).must_be_instance_of(Nexmo::Response)
106
105
  end
107
106
  end
108
107
 
108
+ describe 'buy_number method' do
109
+ it 'purchases the number requested with the given parameters and returns a response object' do
110
+ stub_request(:post, "#@base_url/number/buy").with(@json_object)
111
+
112
+ @client.buy_number(:country => 'US', :msisdn => 'number').must_be_instance_of(Nexmo::Response)
113
+ end
114
+ end
115
+
116
+ describe 'cancel_number method' do
117
+ it 'cancels the number requested with the given parameters and returns a response object' do
118
+ stub_request(:post, "#@base_url/number/cancel").with(@json_object)
119
+
120
+ @client.cancel_number(:country => 'US', :msisdn => 'number').must_be_instance_of(Nexmo::Response)
121
+ end
122
+ end
123
+
124
+ describe 'update_number method' do
125
+ it 'updates the number requested with the given parameters and returns a response object' do
126
+ stub_request(:post, "#@base_url/number/update").with(@json_object)
127
+
128
+ @client.update_number(:country => 'US', :msisdn => 'number', :moHttpUrl => 'callback').must_be_instance_of(Nexmo::Response)
129
+ end
130
+ end
131
+
109
132
  describe 'get_message method' do
110
133
  it 'fetches the message search resource for the given message id and returns a response object' do
111
- expects_http_get '/search/message?api_key=key&api_secret=secret&id=00A0B0C0'
134
+ stub_request(:get, "#@base_url/search/message?api_key=key&api_secret=secret&id=00A0B0C0")
112
135
 
113
136
  @client.get_message('00A0B0C0').must_be_instance_of(Nexmo::Response)
114
137
  end
@@ -116,7 +139,7 @@ describe 'Nexmo::Client' do
116
139
 
117
140
  describe 'get_message_rejections method' do
118
141
  it 'fetches the message rejections resource with the given parameters and returns a response object' do
119
- expects_http_get '/search/rejections?api_key=key&api_secret=secret&date=YYYY-MM-DD'
142
+ stub_request(:get, "#@base_url/search/rejections?api_key=key&api_secret=secret&date=YYYY-MM-DD")
120
143
 
121
144
  @client.get_message_rejections(:date => 'YYYY-MM-DD').must_be_instance_of(Nexmo::Response)
122
145
  end
@@ -124,13 +147,13 @@ describe 'Nexmo::Client' do
124
147
 
125
148
  describe 'search_messages method' do
126
149
  it 'fetches the search messages resource with the given parameters and returns a response object' do
127
- expects_http_get '/search/messages?api_key=key&api_secret=secret&date=YYYY-MM-DD&to=1234567890'
150
+ stub_request(:get, "#@base_url/search/messages?api_key=key&api_secret=secret&date=YYYY-MM-DD&to=1234567890")
128
151
 
129
152
  @client.search_messages(:date => 'YYYY-MM-DD', :to => 1234567890).must_be_instance_of(Nexmo::Response)
130
153
  end
131
154
 
132
155
  it 'should encode a non hash argument as a list of ids' do
133
- expects_http_get '/search/messages?api_key=key&api_secret=secret&ids=id1&ids=id2'
156
+ stub_request(:get, "#@base_url/search/messages?api_key=key&api_secret=secret&ids=id1&ids=id2")
134
157
 
135
158
  @client.search_messages(%w(id1 id2))
136
159
  end
@@ -145,18 +168,18 @@ describe 'Nexmo::Client' do
145
168
  @client = Nexmo::Client.new
146
169
 
147
170
  @client.oauth_access_token = @oauth_access_token
148
-
149
- @client.http = mock()
150
171
  end
151
172
 
152
173
  it 'makes get requests through the access token and returns a response object' do
153
- @oauth_access_token.expects(:get).with('/account/get-pricing/outbound?country=CA').returns(stub)
174
+ stub_request(:get, "#@base_url/account/get-pricing/outbound?country=CA").with(:headers => @oauth_header)
154
175
 
155
176
  @client.get_country_pricing(:CA).must_be_instance_of(Nexmo::Response)
156
177
  end
157
178
 
158
179
  it 'makes post requests through the access token and returns a response object' do
159
- @oauth_access_token.expects(:post).with('/sms/json', @json_encoded_body, @http_header_hash).returns(stub)
180
+ @json_object[:headers].merge!(@oauth_header)
181
+
182
+ stub_request(:post, "#@base_url/sms/json").with(@json_object)
160
183
 
161
184
  @client.send_message(@example_message_hash).must_be_instance_of(Nexmo::Response)
162
185
  end
@@ -199,6 +222,12 @@ describe 'Nexmo::Client' do
199
222
  @client.get_balance.must_equal(:return_value)
200
223
  end
201
224
  end
225
+
226
+ it 'provides an option for specifying a different hostname to connect to' do
227
+ @client = Nexmo::Client.new('key', 'secret', host: 'rest-sandbox.nexmo.com')
228
+
229
+ @client.http.address.must_equal('rest-sandbox.nexmo.com')
230
+ end
202
231
  end
203
232
 
204
233
  describe 'Nexmo::Response' do
metadata CHANGED
@@ -1,80 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nexmo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
5
- prerelease:
4
+ version: 1.3.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Tim Craft
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-09-02 00:00:00.000000000 Z
11
+ date: 2014-04-22 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rake
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: 0.9.3
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: 0.9.3
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: mocha
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
33
  version: 0.13.2
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
40
  version: 0.13.2
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: oauth
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ~>
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
47
  version: 0.4.7
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ~>
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
54
  version: 0.4.7
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: faux
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ~>
59
+ - - "~>"
68
60
  - !ruby/object:Gem::Version
69
61
  version: 1.1.0
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ~>
66
+ - - "~>"
76
67
  - !ruby/object:Gem::Version
77
68
  version: 1.1.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.17.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.17.0
78
83
  description: A Ruby wrapper for the Nexmo API
79
84
  email:
80
85
  - mail@timcraft.com
@@ -82,33 +87,31 @@ executables: []
82
87
  extensions: []
83
88
  extra_rdoc_files: []
84
89
  files:
85
- - lib/nexmo.rb
86
- - spec/nexmo_spec.rb
87
90
  - README.md
91
+ - lib/nexmo.rb
88
92
  - nexmo.gemspec
93
+ - spec/nexmo_spec.rb
89
94
  homepage: http://github.com/timcraft/nexmo
90
95
  licenses: []
96
+ metadata: {}
91
97
  post_install_message:
92
98
  rdoc_options: []
93
99
  require_paths:
94
100
  - lib
95
101
  required_ruby_version: !ruby/object:Gem::Requirement
96
- none: false
97
102
  requirements:
98
- - - ! '>='
103
+ - - ">="
99
104
  - !ruby/object:Gem::Version
100
105
  version: '0'
101
106
  required_rubygems_version: !ruby/object:Gem::Requirement
102
- none: false
103
107
  requirements:
104
- - - ! '>='
108
+ - - ">="
105
109
  - !ruby/object:Gem::Version
106
110
  version: '0'
107
111
  requirements: []
108
112
  rubyforge_project:
109
- rubygems_version: 1.8.23
113
+ rubygems_version: 2.2.2
110
114
  signing_key:
111
- specification_version: 3
115
+ specification_version: 4
112
116
  summary: See description
113
117
  test_files: []
114
- has_rdoc: