nexmo 1.3.0 → 2.0.0
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 +4 -4
- data/README.md +15 -83
- data/lib/nexmo.rb +62 -75
- data/nexmo.gemspec +2 -10
- data/spec/nexmo_spec.rb +129 -172
- metadata +4 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47f16f5764c3fe417e459938495ca477c35fe795
|
4
|
+
data.tar.gz: ff55281f11a6bde0f430d0b532105055f4e11d81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fbe03e55277356116df31c26682b2c0ba77adb28e34c854d6f9b7324095add975100e5ad527fa1f74e02e38c0669d78560939813537089c2f7409489001bd62d
|
7
|
+
data.tar.gz: 5fc3ff3f2db8e057f92d8910e2a4821319f5c61c0c3fa7b21cfdb3ab73457a8e9a518487ce33616e44f32f385a11476ff0ff1fec8b0d010f13a9fb9c754b2b8e
|
data/README.md
CHANGED
@@ -11,99 +11,34 @@ Installation
|
|
11
11
|
$ gem install nexmo
|
12
12
|
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
Sending a message
|
15
|
+
-----------------
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
Construct a Nexmo::Client object and use the #send_message method to
|
18
|
+
send a message. For example:
|
19
19
|
|
20
20
|
```ruby
|
21
21
|
require 'nexmo'
|
22
22
|
|
23
|
-
nexmo = Nexmo::Client.new('
|
24
|
-
```
|
25
|
-
|
26
|
-
Then you have a choice. For a "fire and forget" approach to sending a message,
|
27
|
-
use the `send_message!` method, like this:
|
23
|
+
nexmo = Nexmo::Client.new(key: 'YOUR API KEY', secret: 'YOUR API SECRET')
|
28
24
|
|
29
|
-
|
30
|
-
nexmo.send_message!({:to => '...NUMBER...', :from => 'Ruby', :text => 'Hello world'})
|
25
|
+
nexmo.send_message(from: 'Ruby', to: 'YOUR NUMBER', text: 'Hello world')
|
31
26
|
```
|
32
27
|
|
33
28
|
This method call returns the message id if the message was sent successfully,
|
34
|
-
or raises an exception if there was an error.
|
35
|
-
|
36
|
-
|
37
|
-
```ruby
|
38
|
-
response = nexmo.send_message({:to => '...NUMBER...', :from => 'Ruby', :text => 'Hello world'})
|
39
|
-
|
40
|
-
if response.ok?
|
41
|
-
# do something with response.object
|
42
|
-
else
|
43
|
-
# handle the error
|
44
|
-
end
|
45
|
-
```
|
29
|
+
or raises an exception if there was an error. The Nexmo documentation contains
|
30
|
+
a [list of error codes](https://docs.nexmo.com/index.php/sms-api/send-message#response_code)
|
31
|
+
which may be useful for debugging exceptions.
|
46
32
|
|
47
|
-
This method call returns a `Nexmo::Response` object, which wraps the underlying
|
48
|
-
Net::HTTP response and adds a few convenience methods. Additional methods are
|
49
|
-
also provided for managing your account and messages.
|
50
33
|
|
51
|
-
|
52
|
-
Authenticating with OAuth (beta)
|
34
|
+
Production environment variables
|
53
35
|
--------------------------------
|
54
36
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
to the API that are authenticated using OAuth. For example:
|
61
|
-
|
62
|
-
```ruby
|
63
|
-
require 'nexmo'
|
64
|
-
require 'oauth'
|
65
|
-
|
66
|
-
nexmo = Nexmo::Client.new
|
67
|
-
nexmo.oauth_access_token = OAuth::AccessToken.new(consumer, token, secret)
|
68
|
-
|
69
|
-
response = nexmo.get_balance
|
70
|
-
|
71
|
-
if response.ok?
|
72
|
-
# do something with response.object
|
73
|
-
else
|
74
|
-
# handle the error
|
75
|
-
end
|
76
|
-
```
|
77
|
-
|
78
|
-
The OAuth::Consumer object should be pointed at `rest.nexmo.com` with the `:scheme` option set to `:header`, like this:
|
79
|
-
|
80
|
-
```ruby
|
81
|
-
OAuth::Consumer.new(consumer_key, consumer_secret, {
|
82
|
-
:site => 'https://rest.nexmo.com',
|
83
|
-
:scheme => :header
|
84
|
-
})
|
85
|
-
```
|
86
|
-
|
87
|
-
Using the `:body` or `:query_string` authorization mechanisms is not supported.
|
88
|
-
|
89
|
-
|
90
|
-
Custom response behaviour
|
91
|
-
-------------------------
|
92
|
-
|
93
|
-
You can customise the response handling by passing a block when constructing
|
94
|
-
a Nexmo::Client object. For example, if you want to use an alternative JSON
|
95
|
-
implementation to decode response bodies, you could do this:
|
96
|
-
|
97
|
-
```ruby
|
98
|
-
nexmo = Nexmo::Client.new do |response|
|
99
|
-
response.object = MultiJson.load(response.body) if response.ok? && response.json?
|
100
|
-
response
|
101
|
-
end
|
102
|
-
```
|
103
|
-
|
104
|
-
This might also be useful if you prefer a different style of error handling
|
105
|
-
(e.g. raising exceptions on error and returning the response object directly
|
106
|
-
for 200 OK responses), if you need to log responses etc.
|
37
|
+
Best practice for storing credentials for external services in production is
|
38
|
+
to use environment variables, as described by [12factor.net/config](http://12factor.net/config).
|
39
|
+
Nexmo::Client defaults to extracting the api key/secret it needs from the
|
40
|
+
NEXMO_API_KEY and NEXMO_API_SECRET environment variables if the key/secret
|
41
|
+
options were not specified explicitly.
|
107
42
|
|
108
43
|
|
109
44
|
Troubleshooting
|
@@ -111,7 +46,4 @@ Troubleshooting
|
|
111
46
|
|
112
47
|
Remember that phone numbers should be specified in international format.
|
113
48
|
|
114
|
-
The Nexmo documentation contains a [list of error codes](https://docs.nexmo.com/index.php/sms-api/send-message#response_code)
|
115
|
-
which may be useful if you have problems sending a message.
|
116
|
-
|
117
49
|
Please report all bugs/issues via the GitHub issue tracker.
|
data/lib/nexmo.rb
CHANGED
@@ -1,20 +1,19 @@
|
|
1
1
|
require 'net/http'
|
2
|
-
require 'net/https' if RUBY_VERSION == '1.8.7'
|
3
2
|
require 'json'
|
4
3
|
require 'cgi'
|
5
4
|
|
6
5
|
module Nexmo
|
6
|
+
class Error < StandardError; end
|
7
|
+
|
8
|
+
class AuthenticationError < Error; end
|
9
|
+
|
7
10
|
class Client
|
8
|
-
|
9
|
-
@key, @secret, @block = key, secret, block
|
11
|
+
attr_accessor :key, :secret, :http
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
+
def initialize(options = {})
|
14
|
+
@key = options.fetch(:key) { ENV.fetch('NEXMO_API_KEY') }
|
13
15
|
|
14
|
-
|
15
|
-
else
|
16
|
-
@json = JSON
|
17
|
-
end
|
16
|
+
@secret = options.fetch(:secret) { ENV.fetch('NEXMO_API_SECRET') }
|
18
17
|
|
19
18
|
@host = options.fetch(:host) { 'rest.nexmo.com' }
|
20
19
|
|
@@ -23,27 +22,17 @@ module Nexmo
|
|
23
22
|
@http.use_ssl = true
|
24
23
|
end
|
25
24
|
|
26
|
-
attr_accessor :key, :secret, :http, :oauth_access_token
|
27
|
-
|
28
25
|
def send_message(params)
|
29
|
-
post('/sms/json', params)
|
30
|
-
end
|
31
|
-
|
32
|
-
def send_message!(params)
|
33
|
-
response = send_message(params)
|
26
|
+
response = post('/sms/json', params)
|
34
27
|
|
35
|
-
|
36
|
-
item = response.object['messages'].first
|
28
|
+
item = response['messages'].first
|
37
29
|
|
38
|
-
|
30
|
+
status = item['status'].to_i
|
39
31
|
|
40
|
-
|
41
|
-
|
42
|
-
else
|
43
|
-
raise Error, "#{item['error-text']} (status=#{status})"
|
44
|
-
end
|
32
|
+
if status == 0
|
33
|
+
item['message-id']
|
45
34
|
else
|
46
|
-
raise Error, "
|
35
|
+
raise Error, "#{item['error-text']} (status=#{status})"
|
47
36
|
end
|
48
37
|
end
|
49
38
|
|
@@ -91,32 +80,63 @@ module Nexmo
|
|
91
80
|
get('/search/messages', Hash === params ? params : {:ids => Array(params)})
|
92
81
|
end
|
93
82
|
|
83
|
+
def send_ussd_push_message(params)
|
84
|
+
post('/ussd/json', params)
|
85
|
+
end
|
86
|
+
|
87
|
+
def send_ussd_prompt_message(params)
|
88
|
+
post('/ussd-prompt/json', params)
|
89
|
+
end
|
90
|
+
|
91
|
+
def send_2fa_message(params)
|
92
|
+
post('/sc/us/2fa/json', params)
|
93
|
+
end
|
94
|
+
|
95
|
+
def send_event_alert_message(params)
|
96
|
+
post('/sc/us/alert/json', params)
|
97
|
+
end
|
98
|
+
|
99
|
+
def send_marketing_message(params)
|
100
|
+
post('/sc/us/marketing/json', params)
|
101
|
+
end
|
102
|
+
|
103
|
+
def initiate_call(params)
|
104
|
+
post('/call/json', params)
|
105
|
+
end
|
106
|
+
|
107
|
+
def initiate_tts_call(params)
|
108
|
+
post('/tts/json', params)
|
109
|
+
end
|
110
|
+
|
111
|
+
def initiate_tts_prompt_call(params)
|
112
|
+
post('/tts-prompt/json', params)
|
113
|
+
end
|
114
|
+
|
94
115
|
private
|
95
116
|
|
96
117
|
def get(path, params = {})
|
97
|
-
|
98
|
-
oauth_access_token.get(request_uri(path, params))
|
99
|
-
else
|
100
|
-
@http.get(request_uri(path, params.merge(:api_key => @key, :api_secret => @secret)))
|
101
|
-
end
|
102
|
-
|
103
|
-
decode(http_response)
|
118
|
+
parse @http.get(request_uri(path, params.merge(:api_key => @key, :api_secret => @secret)))
|
104
119
|
end
|
105
120
|
|
106
121
|
def post(path, params)
|
107
|
-
|
108
|
-
oauth_access_token.post(path, @json.dump(params), {'Content-Type' => 'application/json'})
|
109
|
-
else
|
110
|
-
@http.post(path, @json.dump(params.merge(:api_key => @key, :api_secret => @secret)), {'Content-Type' => 'application/json'})
|
111
|
-
end
|
122
|
+
body = URI.encode_www_form(params.merge(:api_key => @key, :api_secret => @secret))
|
112
123
|
|
113
|
-
|
124
|
+
parse @http.post(path, body, {'Content-Type' => 'application/x-www-form-urlencoded'})
|
114
125
|
end
|
115
126
|
|
116
|
-
def
|
117
|
-
|
118
|
-
|
119
|
-
|
127
|
+
def parse(http_response)
|
128
|
+
case http_response
|
129
|
+
when Net::HTTPSuccess
|
130
|
+
if http_response['Content-Type'].split(';').first == 'application/json'
|
131
|
+
JSON.parse(http_response.body)
|
132
|
+
else
|
133
|
+
http_response.body
|
134
|
+
end
|
135
|
+
when Net::HTTPUnauthorized
|
136
|
+
raise AuthenticationError
|
137
|
+
else
|
138
|
+
raise Error, "Unexpected HTTP response (code=#{http_response.code})"
|
139
|
+
end
|
120
140
|
end
|
121
141
|
|
122
142
|
def request_uri(path, hash = {})
|
@@ -135,37 +155,4 @@ module Nexmo
|
|
135
155
|
CGI.escape(component.to_s)
|
136
156
|
end
|
137
157
|
end
|
138
|
-
|
139
|
-
class Response
|
140
|
-
attr_writer :object
|
141
|
-
|
142
|
-
def initialize(http_response, options = {})
|
143
|
-
@http_response = http_response
|
144
|
-
|
145
|
-
@json = options.fetch(:json) { JSON }
|
146
|
-
end
|
147
|
-
|
148
|
-
def respond_to_missing?(name, include_private = false)
|
149
|
-
@http_response.respond_to?(name)
|
150
|
-
end
|
151
|
-
|
152
|
-
def method_missing(name, *args, &block)
|
153
|
-
@http_response.send(name, *args, &block)
|
154
|
-
end
|
155
|
-
|
156
|
-
def ok?
|
157
|
-
code.to_i == 200
|
158
|
-
end
|
159
|
-
|
160
|
-
def json?
|
161
|
-
self['Content-Type'].split(';').first == 'application/json'
|
162
|
-
end
|
163
|
-
|
164
|
-
def object
|
165
|
-
@object ||= @json.parse(body)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
class Error < StandardError
|
170
|
-
end
|
171
158
|
end
|
data/nexmo.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'nexmo'
|
3
|
-
s.version = '
|
3
|
+
s.version = '2.0.0'
|
4
4
|
s.platform = Gem::Platform::RUBY
|
5
5
|
s.authors = ['Tim Craft']
|
6
6
|
s.email = ['mail@timcraft.com']
|
@@ -9,14 +9,6 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.summary = 'See description'
|
10
10
|
s.files = Dir.glob('{lib,spec}/**/*') + %w(README.md nexmo.gemspec)
|
11
11
|
s.add_development_dependency('rake', '>= 0.9.3')
|
12
|
-
s.add_development_dependency('
|
13
|
-
s.add_development_dependency('oauth', '~> 0.4.7')
|
14
|
-
s.add_development_dependency('faux', '~> 1.1.0')
|
15
|
-
s.add_development_dependency('webmock', '~> 1.17.0')
|
12
|
+
s.add_development_dependency('webmock', '~> 1.18.0')
|
16
13
|
s.require_path = 'lib'
|
17
|
-
|
18
|
-
if RUBY_VERSION == '1.8.7'
|
19
|
-
s.add_development_dependency('minitest', '~> 4.2.0')
|
20
|
-
s.add_development_dependency('json', '~> 1.8.0')
|
21
|
-
end
|
22
14
|
end
|
data/spec/nexmo_spec.rb
CHANGED
@@ -1,22 +1,24 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
2
|
require 'webmock/minitest'
|
3
|
-
require 'mocha/setup'
|
4
|
-
require 'faux'
|
5
3
|
require 'nexmo'
|
6
|
-
require 'oauth'
|
7
|
-
require 'json'
|
8
4
|
|
9
5
|
describe 'Nexmo::Client' do
|
6
|
+
def json_response_body(content)
|
7
|
+
{headers: {'Content-Type' => 'application/json;charset=utf-8'}, body: content}
|
8
|
+
end
|
9
|
+
|
10
10
|
before do
|
11
11
|
@base_url = 'https://rest.nexmo.com'
|
12
12
|
|
13
|
-
@
|
13
|
+
@form_urlencoded_data = {body: /(.+?)=(.+?)(&(.+?)=(.+?))+/, headers: {'Content-Type' => 'application/x-www-form-urlencoded'}}
|
14
14
|
|
15
|
-
@
|
15
|
+
@json_response_body = json_response_body('{"key":"value"}')
|
16
|
+
|
17
|
+
@json_response_object = {'key' => 'value'}
|
16
18
|
|
17
19
|
@example_message_hash = {:from => 'ruby', :to => 'number', :text => 'Hey!'}
|
18
20
|
|
19
|
-
@client = Nexmo::Client.new('key', 'secret')
|
21
|
+
@client = Nexmo::Client.new(key: 'key', secret: 'secret')
|
20
22
|
end
|
21
23
|
|
22
24
|
describe 'http method' do
|
@@ -28,283 +30,238 @@ describe 'Nexmo::Client' do
|
|
28
30
|
end
|
29
31
|
|
30
32
|
describe 'send_message method' do
|
31
|
-
it 'posts to the sms json resource and returns a response object' do
|
32
|
-
stub_request(:post, "#@base_url/sms/json").with(@json_object)
|
33
|
-
|
34
|
-
@client.send_message(@example_message_hash).must_be_instance_of(Nexmo::Response)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe 'send_message bang method' do
|
39
|
-
before do
|
40
|
-
@http_response = stub(:code => '200', :[] => 'application/json;charset=utf-8')
|
41
|
-
end
|
42
|
-
|
43
33
|
it 'posts to the sms json resource and returns the message id' do
|
44
|
-
|
45
|
-
:headers => {'Content-Type' => 'application/json'},
|
46
|
-
:body => '{"messages":[{"status":0,"message-id":"id"}]}'
|
47
|
-
})
|
48
|
-
|
49
|
-
@client.send_message!(@example_message_hash).must_equal('id')
|
50
|
-
end
|
34
|
+
response_body = json_response_body('{"messages":[{"status":0,"message-id":"id"}]}')
|
51
35
|
|
52
|
-
|
53
|
-
stub_request(:post, "#@base_url/sms/json").with(@json_object).to_return(:status => 500)
|
36
|
+
stub_request(:post, "#@base_url/sms/json").with(@form_urlencoded_data).to_return(response_body)
|
54
37
|
|
55
|
-
|
38
|
+
@client.send_message(@example_message_hash).must_equal('id')
|
56
39
|
end
|
57
40
|
|
58
41
|
it 'raises an exception if the response body contains an error' do
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
})
|
42
|
+
response_body = json_response_body('{"messages":[{"status":2,"error-text":"Missing from param"}]}')
|
43
|
+
|
44
|
+
stub_request(:post, "#@base_url/sms/json").with(@form_urlencoded_data).to_return(response_body)
|
63
45
|
|
64
|
-
proc { @client.send_message
|
46
|
+
exception = proc { @client.send_message(@example_message_hash) }.must_raise(Nexmo::Error)
|
47
|
+
|
48
|
+
exception.message.must_include('Missing from param')
|
65
49
|
end
|
66
50
|
end
|
67
51
|
|
68
52
|
describe 'get_balance method' do
|
69
|
-
it 'fetches the account balance resource and returns
|
70
|
-
|
53
|
+
it 'fetches the account balance resource and returns the response object' do
|
54
|
+
url = "#@base_url/account/get-balance?api_key=key&api_secret=secret"
|
55
|
+
|
56
|
+
stub_request(:get, url).to_return(@json_response_body)
|
71
57
|
|
72
|
-
@client.get_balance.
|
58
|
+
@client.get_balance.must_equal(@json_response_object)
|
73
59
|
end
|
74
60
|
end
|
75
61
|
|
76
62
|
describe 'get_country_pricing method' do
|
77
|
-
it 'fetches the outbound pricing resource for the given country and returns
|
78
|
-
|
63
|
+
it 'fetches the outbound pricing resource for the given country and returns the response object' do
|
64
|
+
url = "#@base_url/account/get-pricing/outbound?api_key=key&api_secret=secret&country=CA"
|
65
|
+
|
66
|
+
stub_request(:get, url).to_return(@json_response_body)
|
79
67
|
|
80
|
-
@client.get_country_pricing(:CA).
|
68
|
+
@client.get_country_pricing(:CA).must_equal(@json_response_object)
|
81
69
|
end
|
82
70
|
end
|
83
71
|
|
84
72
|
describe 'get_prefix_pricing method' do
|
85
|
-
it 'fetches the outbound pricing resource for the given prefix and returns
|
86
|
-
|
73
|
+
it 'fetches the outbound pricing resource for the given prefix and returns the response object' do
|
74
|
+
url = "#@base_url/account/get-prefix-pricing/outbound?api_key=key&api_secret=secret&prefix=44"
|
87
75
|
|
88
|
-
|
76
|
+
stub_request(:get, url).to_return(@json_response_body)
|
77
|
+
|
78
|
+
@client.get_prefix_pricing(44).must_equal(@json_response_object)
|
89
79
|
end
|
90
80
|
end
|
91
81
|
|
92
82
|
describe 'get_account_numbers method' do
|
93
|
-
it 'fetches the account numbers resource with the given parameters and returns
|
94
|
-
|
83
|
+
it 'fetches the account numbers resource with the given parameters and returns the response object' do
|
84
|
+
url = "#@base_url/account/numbers?api_key=key&api_secret=secret&size=25&pattern=33"
|
85
|
+
|
86
|
+
stub_request(:get, url).to_return(@json_response_body)
|
95
87
|
|
96
|
-
@client.get_account_numbers(:size => 25, :pattern => 33).
|
88
|
+
@client.get_account_numbers(:size => 25, :pattern => 33).must_equal(@json_response_object)
|
97
89
|
end
|
98
90
|
end
|
99
91
|
|
100
92
|
describe 'number_search method' do
|
101
|
-
it 'fetches the number search resource for the given country with the given parameters and returns
|
102
|
-
|
93
|
+
it 'fetches the number search resource for the given country with the given parameters and returns the response object' do
|
94
|
+
url = "#@base_url/number/search?api_key=key&api_secret=secret&country=CA&size=25"
|
103
95
|
|
104
|
-
|
96
|
+
stub_request(:get, url).to_return(@json_response_body)
|
97
|
+
|
98
|
+
@client.number_search(:CA, :size => 25).must_equal(@json_response_object)
|
105
99
|
end
|
106
100
|
end
|
107
101
|
|
108
102
|
describe 'buy_number method' do
|
109
|
-
it 'purchases the number requested with the given parameters and returns
|
110
|
-
|
103
|
+
it 'purchases the number requested with the given parameters and returns the response object' do
|
104
|
+
url = "#@base_url/number/buy"
|
105
|
+
|
106
|
+
stub_request(:post, url).with(@form_urlencoded_data).to_return(@json_response_body)
|
111
107
|
|
112
|
-
@client.buy_number(:country => 'US', :msisdn => 'number').
|
108
|
+
@client.buy_number(:country => 'US', :msisdn => 'number').must_equal(@json_response_object)
|
113
109
|
end
|
114
110
|
end
|
115
111
|
|
116
112
|
describe 'cancel_number method' do
|
117
|
-
it 'cancels the number requested with the given parameters and returns
|
118
|
-
|
113
|
+
it 'cancels the number requested with the given parameters and returns the response object' do
|
114
|
+
url = "#@base_url/number/cancel"
|
119
115
|
|
120
|
-
|
116
|
+
stub_request(:post, url).with(@form_urlencoded_data).to_return(@json_response_body)
|
117
|
+
|
118
|
+
@client.cancel_number(:country => 'US', :msisdn => 'number').must_equal(@json_response_object)
|
121
119
|
end
|
122
120
|
end
|
123
121
|
|
124
122
|
describe 'update_number method' do
|
125
|
-
it 'updates the number requested with the given parameters and returns
|
126
|
-
|
123
|
+
it 'updates the number requested with the given parameters and returns the response object' do
|
124
|
+
url = "#@base_url/number/update"
|
125
|
+
|
126
|
+
stub_request(:post, url).with(@form_urlencoded_data).to_return(@json_response_body)
|
127
127
|
|
128
|
-
@client.update_number(:country => 'US', :msisdn => 'number', :moHttpUrl => 'callback').
|
128
|
+
@client.update_number(:country => 'US', :msisdn => 'number', :moHttpUrl => 'callback').must_equal(@json_response_object)
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
132
|
describe 'get_message method' do
|
133
|
-
it 'fetches the message search resource for the given message id and returns
|
134
|
-
|
133
|
+
it 'fetches the message search resource for the given message id and returns the response object' do
|
134
|
+
url = "#@base_url/search/message?api_key=key&api_secret=secret&id=00A0B0C0"
|
135
135
|
|
136
|
-
|
136
|
+
stub_request(:get, url).to_return(@json_response_body)
|
137
|
+
|
138
|
+
@client.get_message('00A0B0C0').must_equal(@json_response_object)
|
137
139
|
end
|
138
140
|
end
|
139
141
|
|
140
142
|
describe 'get_message_rejections method' do
|
141
|
-
it 'fetches the message rejections resource with the given parameters and returns
|
142
|
-
|
143
|
+
it 'fetches the message rejections resource with the given parameters and returns the response object' do
|
144
|
+
url = "#@base_url/search/rejections?api_key=key&api_secret=secret&date=YYYY-MM-DD"
|
145
|
+
|
146
|
+
stub_request(:get, url).to_return(@json_response_body)
|
143
147
|
|
144
|
-
@client.get_message_rejections(:date => 'YYYY-MM-DD').
|
148
|
+
@client.get_message_rejections(:date => 'YYYY-MM-DD').must_equal(@json_response_object)
|
145
149
|
end
|
146
150
|
end
|
147
151
|
|
148
152
|
describe 'search_messages method' do
|
149
|
-
it 'fetches the search messages resource with the given parameters and returns
|
150
|
-
|
153
|
+
it 'fetches the search messages resource with the given parameters and returns the response object' do
|
154
|
+
url = "#@base_url/search/messages?api_key=key&api_secret=secret&date=YYYY-MM-DD&to=1234567890"
|
151
155
|
|
152
|
-
|
156
|
+
stub_request(:get, url).to_return(@json_response_body)
|
157
|
+
|
158
|
+
@client.search_messages(:date => 'YYYY-MM-DD', :to => 1234567890).must_equal(@json_response_object)
|
153
159
|
end
|
154
160
|
|
155
161
|
it 'should encode a non hash argument as a list of ids' do
|
156
|
-
|
162
|
+
url = "#@base_url/search/messages?api_key=key&api_secret=secret&ids=id1&ids=id2"
|
163
|
+
|
164
|
+
stub_request(:get, url).to_return(@json_response_body)
|
157
165
|
|
158
166
|
@client.search_messages(%w(id1 id2))
|
159
167
|
end
|
160
168
|
end
|
161
169
|
|
162
|
-
describe '
|
163
|
-
|
164
|
-
|
170
|
+
describe 'send_ussd_push_message method' do
|
171
|
+
it 'posts to the ussd json resource and returns the response object' do
|
172
|
+
url = "#@base_url/ussd/json"
|
165
173
|
|
166
|
-
|
174
|
+
stub_request(:post, url).with(@form_urlencoded_data).to_return(@json_response_body)
|
167
175
|
|
168
|
-
@client
|
169
|
-
|
170
|
-
@client.oauth_access_token = @oauth_access_token
|
171
|
-
end
|
172
|
-
|
173
|
-
it 'makes get requests through the access token and returns a response object' do
|
174
|
-
stub_request(:get, "#@base_url/account/get-pricing/outbound?country=CA").with(:headers => @oauth_header)
|
175
|
-
|
176
|
-
@client.get_country_pricing(:CA).must_be_instance_of(Nexmo::Response)
|
176
|
+
@client.send_ussd_push_message(from: 'MyCompany20', to: '447525856424', text: 'Hello')
|
177
177
|
end
|
178
|
+
end
|
178
179
|
|
179
|
-
|
180
|
-
|
180
|
+
describe 'send_ussd_prompt_message method' do
|
181
|
+
it 'posts to the ussd prompt json resource and returns the response object' do
|
182
|
+
url = "#@base_url/ussd-prompt/json"
|
181
183
|
|
182
|
-
stub_request(:post,
|
184
|
+
stub_request(:post, url).with(@form_urlencoded_data).to_return(@json_response_body)
|
183
185
|
|
184
|
-
@client.
|
186
|
+
@client.send_ussd_prompt_message(from: 'Nexmo long virtual number', to: '447525856424', text: 'Hello')
|
185
187
|
end
|
186
188
|
end
|
187
189
|
|
188
|
-
describe '
|
189
|
-
it '
|
190
|
-
|
190
|
+
describe 'send_2fa_message method' do
|
191
|
+
it 'posts to the short code two factor authentication json resource and returns the response object' do
|
192
|
+
url = "#@base_url/sc/us/2fa/json"
|
191
193
|
|
192
|
-
|
193
|
-
end
|
194
|
-
|
195
|
-
describe 'send_message method' do
|
196
|
-
it 'encodes the request body using the alternative json implementation' do
|
197
|
-
Kernel.stubs(:warn)
|
198
|
-
|
199
|
-
@json = faux(JSON)
|
200
|
-
|
201
|
-
@json.expects(:dump).with(instance_of(Hash))
|
194
|
+
stub_request(:post, url).with(@form_urlencoded_data).to_return(@json_response_body)
|
202
195
|
|
203
|
-
|
204
|
-
|
205
|
-
@client.http.stubs(:post)
|
206
|
-
|
207
|
-
@client.send_message(@example_message_hash)
|
208
|
-
end
|
196
|
+
@client.send_2fa_message(to: '16365553226', pin: 1234)
|
209
197
|
end
|
210
198
|
end
|
211
199
|
|
212
|
-
describe '
|
213
|
-
it '
|
214
|
-
|
215
|
-
response.must_be_instance_of(Nexmo::Response)
|
200
|
+
describe 'send_event_alert_message method' do
|
201
|
+
it 'posts to the short code alert json resource and returns the response object' do
|
202
|
+
url = "#@base_url/sc/us/alert/json"
|
216
203
|
|
217
|
-
|
218
|
-
end
|
204
|
+
stub_request(:post, url).with(@form_urlencoded_data).to_return(@json_response_body)
|
219
205
|
|
220
|
-
@client.
|
221
|
-
|
222
|
-
@client.get_balance.must_equal(:return_value)
|
206
|
+
@client.send_event_alert_message(to: '16365553226', server: 'host', link: 'http://example.com/')
|
223
207
|
end
|
224
208
|
end
|
225
209
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
@client.http.address.must_equal('rest-sandbox.nexmo.com')
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
|
-
describe 'Nexmo::Response' do
|
234
|
-
before do
|
235
|
-
@http_response = mock()
|
236
|
-
|
237
|
-
@response = Nexmo::Response.new(@http_response)
|
238
|
-
end
|
210
|
+
describe 'send_marketing_message method' do
|
211
|
+
it 'posts to the short code marketing json resource and returns the response object' do
|
212
|
+
url = "#@base_url/sc/us/marketing/json"
|
239
213
|
|
240
|
-
|
241
|
-
@http_response.expects(:code).returns('200')
|
214
|
+
stub_request(:post, url).with(@form_urlencoded_data).to_return(@json_response_body)
|
242
215
|
|
243
|
-
|
244
|
-
|
216
|
+
@client.send_marketing_message(from: '666', to: '16365553226', keyword: 'NEXMO', text: 'Hello')
|
217
|
+
end
|
245
218
|
end
|
246
219
|
|
247
|
-
describe '
|
248
|
-
it '
|
249
|
-
|
250
|
-
|
251
|
-
@response.ok?.must_equal(true)
|
252
|
-
end
|
220
|
+
describe 'initiate_call method' do
|
221
|
+
it 'posts to the call json resource and returns the response object' do
|
222
|
+
url = "#@base_url/call/json"
|
253
223
|
|
254
|
-
|
255
|
-
@http_response.expects(:code).returns('400')
|
224
|
+
stub_request(:post, url).with(@form_urlencoded_data).to_return(@json_response_body)
|
256
225
|
|
257
|
-
@
|
226
|
+
@client.initiate_call(to: '16365553226', answer_url: 'http://example.com/answer')
|
258
227
|
end
|
259
228
|
end
|
260
229
|
|
261
|
-
describe '
|
262
|
-
it '
|
263
|
-
|
230
|
+
describe 'initiate_tts_call method' do
|
231
|
+
it 'posts to the tts json resource and returns the response object' do
|
232
|
+
url = "#@base_url/tts/json"
|
264
233
|
|
265
|
-
@
|
266
|
-
end
|
267
|
-
|
268
|
-
it 'returns false otherwise' do
|
269
|
-
@http_response.expects(:[]).with('Content-Type').returns('text/html')
|
234
|
+
stub_request(:post, url).with(@form_urlencoded_data).to_return(@json_response_body)
|
270
235
|
|
271
|
-
@
|
236
|
+
@client.initiate_tts_call(to: '16365553226', text: 'Hello')
|
272
237
|
end
|
273
238
|
end
|
274
239
|
|
275
|
-
describe '
|
276
|
-
it '
|
277
|
-
|
240
|
+
describe 'initiate_tts_prompt_call method' do
|
241
|
+
it 'posts to the tts prompt json resource and returns the response object' do
|
242
|
+
url = "#@base_url/tts-prompt/json"
|
278
243
|
|
279
|
-
@
|
244
|
+
stub_request(:post, url).with(@form_urlencoded_data).to_return(@json_response_body)
|
245
|
+
|
246
|
+
@client.initiate_tts_prompt_call(to: '16365553226', text: 'Hello', max_digits: 4, bye_text: 'Goodbye')
|
280
247
|
end
|
281
248
|
end
|
282
249
|
|
283
|
-
|
284
|
-
|
285
|
-
@object = stub
|
286
|
-
|
287
|
-
@response.object = @object
|
250
|
+
it 'raises an exception if the response code is not 2xx' do
|
251
|
+
stub_request(:post, "#@base_url/sms/json").with(@form_urlencoded_data).to_return(status: 500)
|
288
252
|
|
289
|
-
|
290
|
-
end
|
253
|
+
proc { @client.send_message(@example_message_hash) }.must_raise(Nexmo::Error)
|
291
254
|
end
|
292
255
|
|
293
|
-
|
294
|
-
|
295
|
-
@json = faux(JSON)
|
296
|
-
|
297
|
-
@response = Nexmo::Response.new(@http_response, :json => @json)
|
298
|
-
end
|
256
|
+
it 'raises an authentication error exception if the response code is 401' do
|
257
|
+
stub_request(:post, "#@base_url/sms/json").with(@form_urlencoded_data).to_return(status: 401)
|
299
258
|
|
300
|
-
|
301
|
-
|
302
|
-
@json.expects(:parse).with('{"value":0.0}')
|
259
|
+
proc { @client.send_message(@example_message_hash) }.must_raise(Nexmo::AuthenticationError)
|
260
|
+
end
|
303
261
|
|
304
|
-
|
262
|
+
it 'provides an option for specifying a different hostname to connect to' do
|
263
|
+
@client = Nexmo::Client.new(key: 'key', secret: 'secret', host: 'rest-sandbox.nexmo.com')
|
305
264
|
|
306
|
-
|
307
|
-
end
|
308
|
-
end
|
265
|
+
@client.http.address.must_equal('rest-sandbox.nexmo.com')
|
309
266
|
end
|
310
267
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nexmo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Craft
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -24,62 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.9.3
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: mocha
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 0.13.2
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 0.13.2
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: oauth
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 0.4.7
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 0.4.7
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: faux
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 1.1.0
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 1.1.0
|
69
27
|
- !ruby/object:Gem::Dependency
|
70
28
|
name: webmock
|
71
29
|
requirement: !ruby/object:Gem::Requirement
|
72
30
|
requirements:
|
73
31
|
- - "~>"
|
74
32
|
- !ruby/object:Gem::Version
|
75
|
-
version: 1.
|
33
|
+
version: 1.18.0
|
76
34
|
type: :development
|
77
35
|
prerelease: false
|
78
36
|
version_requirements: !ruby/object:Gem::Requirement
|
79
37
|
requirements:
|
80
38
|
- - "~>"
|
81
39
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.
|
40
|
+
version: 1.18.0
|
83
41
|
description: A Ruby wrapper for the Nexmo API
|
84
42
|
email:
|
85
43
|
- mail@timcraft.com
|