tropo_rest 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/.gitignore +6 -0
  2. data/.rspec +3 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +88 -0
  5. data/LICENSE +19 -0
  6. data/README.md +104 -0
  7. data/Rakefile +35 -0
  8. data/autotest/discover.rb +1 -0
  9. data/lib/faraday/request/serialize_json.rb +17 -0
  10. data/lib/faraday/response/raise_http_errors.rb +52 -0
  11. data/lib/faraday/response/resource.rb +26 -0
  12. data/lib/hashie/twash.rb +61 -0
  13. data/lib/tropo_rest/client/address.rb +76 -0
  14. data/lib/tropo_rest/client/application.rb +72 -0
  15. data/lib/tropo_rest/client/exchange.rb +18 -0
  16. data/lib/tropo_rest/client/session.rb +20 -0
  17. data/lib/tropo_rest/client/signal.rb +26 -0
  18. data/lib/tropo_rest/client.rb +27 -0
  19. data/lib/tropo_rest/configuration.rb +61 -0
  20. data/lib/tropo_rest/connection.rb +28 -0
  21. data/lib/tropo_rest/error.rb +33 -0
  22. data/lib/tropo_rest/request.rb +66 -0
  23. data/lib/tropo_rest/resource/address.rb +20 -0
  24. data/lib/tropo_rest/resource/application.rb +15 -0
  25. data/lib/tropo_rest/resource/exchange.rb +13 -0
  26. data/lib/tropo_rest/utils.rb +33 -0
  27. data/lib/tropo_rest/version.rb +3 -0
  28. data/lib/tropo_rest.rb +31 -0
  29. data/script/console +8 -0
  30. data/spec/spec_helper.rb +64 -0
  31. data/spec/tropo_rest/client/address_spec.rb +172 -0
  32. data/spec/tropo_rest/client/application_spec.rb +210 -0
  33. data/spec/tropo_rest/client/exchange_spec.rb +71 -0
  34. data/spec/tropo_rest/client/session_spec.rb +47 -0
  35. data/spec/tropo_rest/client/signal_spec.rb +34 -0
  36. data/spec/tropo_rest/client_spec.rb +246 -0
  37. data/spec/tropo_rest/resource/address_spec.rb +12 -0
  38. data/spec/tropo_rest/resource/application_spec.rb +12 -0
  39. data/spec/tropo_rest/resource/exchange_spec.rb +12 -0
  40. data/spec/tropo_rest_spec.rb +22 -0
  41. data/tropo_rest.gemspec +50 -0
  42. metadata +343 -0
@@ -0,0 +1,210 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe TropoRest::Client do
4
+
5
+ before do
6
+ @client = TropoRest::Client.new
7
+ end
8
+
9
+ describe "#applications" do
10
+
11
+ before do
12
+ stub_get("applications").to_return(:body => <<-JSON
13
+ [
14
+ {
15
+ "id": "1",
16
+ "href": "https://api.tropo.com/v1/applications/1",
17
+ "name": "app1",
18
+ "platform": "scripting",
19
+ "voiceUrl": "http://example1.com/voice.rb",
20
+ "messagingUrl": "http://example1.com/messaging.rb",
21
+ "partition": "staging"
22
+ },
23
+ {
24
+ "id": "2",
25
+ "href": "https://api.tropo.com/v1/applications/2",
26
+ "name": "app2",
27
+ "platform": "webapi",
28
+ "voiceUrl": "http://example2.com/voice",
29
+ "messagingUrl": "http://example2.com/messaging",
30
+ "partition": "production"
31
+ }
32
+ ]
33
+ JSON
34
+ )
35
+ end
36
+
37
+ it "should make the request" do
38
+ @client.applications
39
+ a_get("applications").should have_been_made
40
+ end
41
+
42
+ it "should return a collection of applications" do
43
+ @client.applications.should have(2).items
44
+ end
45
+
46
+ it "should return the correct objects" do
47
+ apps = @client.applications
48
+ first = apps.first
49
+ last = apps.last
50
+
51
+ first.should be_instance_of(TropoRest::Resource::Application)
52
+ first.id.should == "1"
53
+ first.href.should == "https://api.tropo.com/v1/applications/1"
54
+ first.name.should == "app1"
55
+ first.platform.should == "scripting"
56
+ first.voice_url.should == "http://example1.com/voice.rb"
57
+ first.messaging_url.should == "http://example1.com/messaging.rb"
58
+ first.partition.should == "staging"
59
+
60
+ last.should be_instance_of(TropoRest::Resource::Application)
61
+ last.id.should == "2"
62
+ last.href.should == "https://api.tropo.com/v1/applications/2"
63
+ last.name.should == "app2"
64
+ last.platform.should == "webapi"
65
+ last.voice_url.should == "http://example2.com/voice"
66
+ last.messaging_url.should == "http://example2.com/messaging"
67
+ last.partition.should == "production"
68
+ end
69
+
70
+ end
71
+
72
+ describe "#application" do
73
+
74
+ before do
75
+ stub_get("applications/1").to_return(:body => <<-JSON
76
+ {
77
+ "id": "1",
78
+ "href": "https://api.tropo.com/v1/applications/1",
79
+ "name": "app1",
80
+ "platform": "scripting",
81
+ "voiceUrl": "http://example1.com/voice.rb",
82
+ "messagingUrl": "http://example1.com/messaging.rb",
83
+ "partition": "staging"
84
+ }
85
+ JSON
86
+ )
87
+ end
88
+
89
+ it "should make the request with an application ID" do
90
+ @client.application(1)
91
+ a_get("applications/1").should have_been_made
92
+ end
93
+
94
+ it "should make the request with an application HREF" do
95
+ @client.application("https://api.tropo.com/v1/applications/1")
96
+ a_get("applications/1").should have_been_made
97
+ end
98
+
99
+ it "should return an application object" do
100
+ app = @client.application(1)
101
+ app.should be_instance_of(TropoRest::Resource::Application)
102
+ app.id.should == "1"
103
+ app.href.should == "https://api.tropo.com/v1/applications/1"
104
+ app.name.should == "app1"
105
+ app.platform.should == "scripting"
106
+ app.voice_url.should == "http://example1.com/voice.rb"
107
+ app.messaging_url.should == "http://example1.com/messaging.rb"
108
+ app.partition.should == "staging"
109
+ end
110
+
111
+ end
112
+
113
+ describe "#create_application" do
114
+
115
+ before do
116
+ @underscore = {
117
+ :name => "new app",
118
+ :voice_url => "http://website.com",
119
+ :messaging_url => "http://website2.com",
120
+ :platform => "scripting",
121
+ :partition => "staging"
122
+ }
123
+ @camel_case = {
124
+ 'name' => "new app",
125
+ 'voiceUrl' => "http://website.com",
126
+ 'messagingUrl' => "http://website2.com",
127
+ 'platform' => "scripting",
128
+ 'partition' => "staging"
129
+ }
130
+ stub_post("applications").
131
+ with(:body => @camel_case).
132
+ to_return(:body => %({"href":"https://api.tropo.com/v1/applications/123456"}))
133
+ end
134
+
135
+ it "should make the request" do
136
+ @client.create_application(@underscore)
137
+ a_post("applications").with(:body => @camel_case).should have_been_made
138
+ end
139
+
140
+ it "should return the href of the application" do
141
+ res = @client.create_application(@underscore)
142
+ res.href.should == "https://api.tropo.com/v1/applications/123456"
143
+ end
144
+
145
+ end
146
+
147
+ describe "#delete_application" do
148
+
149
+ before do
150
+ stub_delete("applications/123456").
151
+ to_return(:body => %({"message": "delete successful"}))
152
+ end
153
+
154
+ it "should make the request with an application ID" do
155
+ @client.delete_application(123456)
156
+ a_delete("applications/123456").should have_been_made
157
+ end
158
+
159
+ it "should make the request with an application HREF" do
160
+ @client.delete_application("https://api.tropo.com/v1/applications/123456")
161
+ a_delete("applications/123456").should have_been_made
162
+ end
163
+
164
+ it "should return a successful message" do
165
+ res = @client.delete_application(123456)
166
+ res.message.should == "delete successful"
167
+ end
168
+
169
+ end
170
+
171
+ describe "#update_application" do
172
+
173
+ before do
174
+ @underscore = {
175
+ :name => "newer app",
176
+ :voice_url => "http://voice.com",
177
+ :messaging_url => "http://messaging.com",
178
+ :platform => "webapi",
179
+ :partition => "production"
180
+ }
181
+ @camel_case = {
182
+ 'name' => "newer app",
183
+ 'voiceUrl' => "http://voice.com",
184
+ 'messagingUrl' => "http://messaging.com",
185
+ 'platform' => "webapi",
186
+ 'partition' => "production"
187
+ }
188
+ stub_put("applications/123456").
189
+ with(:body => @camel_case).
190
+ to_return(:body => %({"href":"https://api.tropo.com/v1/applications/123456"}))
191
+ end
192
+
193
+ it "should make the request with an application ID" do
194
+ @client.update_application(123456, @underscore)
195
+ a_put("applications/123456").with(:body => @camel_case).should have_been_made
196
+ end
197
+
198
+ it "should make the request with an application HREF" do
199
+ @client.update_application("https://api.tropo.com/v1/applications/123456", @underscore)
200
+ a_put("applications/123456").with(:body => @camel_case).should have_been_made
201
+ end
202
+
203
+ it "should return the href of the application" do
204
+ res = @client.update_application(123456, @underscore)
205
+ res.href.should == "https://api.tropo.com/v1/applications/123456"
206
+ end
207
+
208
+ end
209
+
210
+ end
@@ -0,0 +1,71 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe TropoRest::Client do
4
+
5
+ before do
6
+ @client = TropoRest::Client.new
7
+ end
8
+
9
+ describe "#exchanges" do
10
+
11
+ before do
12
+ stub_get("exchanges").to_return(:body => <<-JSON
13
+ [
14
+ {
15
+ "prefix": "1321",
16
+ "city": "Orlando",
17
+ "state": "FL",
18
+ "country": "United States",
19
+ "description": "Phone Number w/ SMS"
20
+ },
21
+ {
22
+ "prefix": "1888",
23
+ "country": "United States",
24
+ "description": "Toll Free Phone Number"
25
+ },
26
+ {
27
+ "prefix": "31",
28
+ "country": "Netherlands",
29
+ "description": "International Phone Number"
30
+ }
31
+ ]
32
+ JSON
33
+ )
34
+ end
35
+
36
+ it "should make the request" do
37
+ @client.exchanges
38
+ a_get("exchanges").should have_been_made
39
+ end
40
+
41
+ it "should return a collection of exchanges" do
42
+ @client.exchanges.should have(3).items
43
+ end
44
+
45
+ it "should return the correct objects" do
46
+ apps = @client.exchanges
47
+ first = apps[0]
48
+ second = apps[1]
49
+ third = apps[2]
50
+
51
+ first.should be_instance_of(TropoRest::Resource::Exchange)
52
+ first.prefix.should == "1321"
53
+ first.city.should == "Orlando"
54
+ first.state.should == "FL"
55
+ first.country.should == "United States"
56
+ first.description.should == "Phone Number w/ SMS"
57
+
58
+ second.should be_instance_of(TropoRest::Resource::Exchange)
59
+ second.prefix.should == "1888"
60
+ second.country.should == "United States"
61
+ second.description.should == "Toll Free Phone Number"
62
+
63
+ third.should be_instance_of(TropoRest::Resource::Exchange)
64
+ third.prefix.should == "31"
65
+ third.country.should == "Netherlands"
66
+ third.description.should == "International Phone Number"
67
+ end
68
+
69
+ end
70
+
71
+ end
@@ -0,0 +1,47 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe TropoRest::Client do
4
+
5
+ before do
6
+ @client = TropoRest::Client.new
7
+ end
8
+
9
+ describe "#create_session" do
10
+
11
+ before do
12
+ @params = {'token' => 'TOKEN', 'action' => 'create'}
13
+ stub_session_get("sessions").
14
+ with(:query => @params).
15
+ to_return(:body => <<-XML
16
+ <session>
17
+ <success>true</success>
18
+ <token>TOKEN</token>
19
+ </session>
20
+ XML
21
+ )
22
+ end
23
+
24
+ it "should make the request" do
25
+ @client.create_session("TOKEN")
26
+ a_session_get("sessions").
27
+ with(:query => @params).should have_been_made
28
+ end
29
+
30
+ it "should make the request with parameters" do
31
+ params = {'phone_number' => '+19995551234', 'name' => 'Billy Gnosis'}
32
+ query = params.merge('action' => 'create', 'token' => 'TOKEN')
33
+ stub_session_get("sessions").
34
+ with(:query => query)
35
+ @client.create_session("TOKEN", params)
36
+ a_session_get("sessions").
37
+ with(:query => query).should have_been_made
38
+ end
39
+
40
+ it "should return the session object" do
41
+ res = @client.create_session("TOKEN")
42
+ res.session.should == {'success' => 'true', 'token' => 'TOKEN'}
43
+ end
44
+
45
+ end
46
+
47
+ end
@@ -0,0 +1,34 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe TropoRest::Client do
4
+
5
+ before do
6
+ @client = TropoRest::Client.new
7
+ end
8
+
9
+ describe "#create_signal" do
10
+
11
+ before do
12
+ @params = {'signal' => 'exit'}
13
+ stub_session_post("sessions/644a27c6da7e505ab432325056671535/signals").
14
+ with(:body => @params).
15
+ to_return(:body => <<-JSON
16
+ {"status": "QUEUED"}
17
+ JSON
18
+ )
19
+ end
20
+
21
+ it "should make the request" do
22
+ @client.create_signal("644a27c6da7e505ab432325056671535", "exit")
23
+ a_session_post("sessions/644a27c6da7e505ab432325056671535/signals").
24
+ with(:body => @params).should have_been_made
25
+ end
26
+
27
+ it "should return the signal object" do
28
+ res = @client.create_signal("644a27c6da7e505ab432325056671535", "exit")
29
+ res.status.should == "QUEUED"
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,246 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe TropoRest::Client do
4
+
5
+ describe "configuration" do
6
+
7
+ before do
8
+ TropoRest.reset
9
+ end
10
+
11
+ it "uses defaults set on TropoRest" do
12
+ TropoRest.configure do |config|
13
+ config.username = "username"
14
+ config.password = "password"
15
+ config.adapter = :em_synchrony
16
+ config.endpoint = "http://api.tropo.com/v1/"
17
+ config.session_endpoint = "http://api.tropo.com/1.0/"
18
+ config.user_agent = "RSpec"
19
+ end
20
+ client = TropoRest::Client.new
21
+ client.username.should == "username"
22
+ client.password.should == "password"
23
+ client.adapter.should == :em_synchrony
24
+ client.endpoint.should == "http://api.tropo.com/v1/"
25
+ client.session_endpoint.should == "http://api.tropo.com/1.0/"
26
+ client.user_agent.should == "RSpec"
27
+ end
28
+
29
+ it "can be initialized with options hash" do
30
+ client = TropoRest::Client.new \
31
+ :username => "username",
32
+ :password => "password",
33
+ :adapter => :em_synchrony,
34
+ :endpoint => "http://api.tropo.com/v1/",
35
+ :session_endpoint => "http://api.tropo.com/1.0/",
36
+ :user_agent => "RSpec"
37
+ client.username.should == "username"
38
+ client.password.should == "password"
39
+ client.adapter.should == :em_synchrony
40
+ client.endpoint.should == "http://api.tropo.com/v1/"
41
+ client.session_endpoint.should == "http://api.tropo.com/1.0/"
42
+ client.user_agent.should == "RSpec"
43
+ end
44
+
45
+ it "should have sensible defaults" do
46
+ client = TropoRest::Client.new
47
+ client.username.should be_nil
48
+ client.password.should be_nil
49
+ client.adapter.should == Faraday.default_adapter
50
+ client.endpoint.should == "https://api.tropo.com/v1/"
51
+ client.session_endpoint.should == "https://api.tropo.com/1.0/"
52
+ client.user_agent.should == "TropoRest Ruby Gem #{TropoRest::VERSION}"
53
+ end
54
+
55
+ end
56
+
57
+ describe "request" do
58
+
59
+ before do
60
+ @client = TropoRest::Client.new
61
+ end
62
+
63
+ it "should respond to GET" do
64
+ @client.should respond_to(:get)
65
+ end
66
+
67
+ it "should perform GET" do
68
+ stub_get("somewhere")
69
+ @client.get("somewhere")
70
+ a_get("somewhere").should have_been_made
71
+ end
72
+
73
+ it "should respond to POST" do
74
+ @client.should respond_to(:post)
75
+ end
76
+
77
+ it "should perform POST" do
78
+ stub_post("somewhere")
79
+ @client.post("somewhere", {:foo => "bar"})
80
+ a_post("somewhere").with(:body => {:foo => "bar"}).should have_been_made
81
+ end
82
+
83
+ it "should respond to PUT" do
84
+ @client.should respond_to(:put)
85
+ end
86
+
87
+ it "should perform PUT" do
88
+ stub_put("somewhere")
89
+ @client.put("somewhere", {:foo => "bar"})
90
+ a_put("somewhere").with(:body => {:foo => "bar"}).should have_been_made
91
+ end
92
+
93
+ it "should respond to DELETE" do
94
+ @client.should respond_to(:delete)
95
+ end
96
+
97
+ it "should perform DELETE" do
98
+ stub_delete("somewhere")
99
+ @client.delete("somewhere")
100
+ a_delete("somewhere").should have_been_made
101
+ end
102
+
103
+ it "should use authenticated URL" do
104
+ stub_request(:get, "https://username:password@api.tropo.com/v1/somewhere")
105
+ client = TropoRest::Client.new :username => "username", :password => "password"
106
+ client.get("somewhere")
107
+ a_request(:get, "https://username:password@api.tropo.com/v1/somewhere").should have_been_made
108
+ end
109
+
110
+ it "should send the correct User-Agent" do
111
+ stub_get("somewhere")
112
+ @client.get("somewhere")
113
+ a_get("somewhere").with(:headers => {"User-Agent" => @client.user_agent}).should have_been_made
114
+ end
115
+
116
+ context "sessions" do
117
+
118
+ it "should use the session URL if the path passed in starts with 'sessions'" do
119
+ stub_request(:get, "https://api.tropo.com/1.0/sessions")
120
+ @client.get("sessions")
121
+ a_request(:get, "https://api.tropo.com/1.0/sessions").should have_been_made
122
+ end
123
+
124
+ it "should send XML Accept header for session requests" do
125
+ params = {'action' => 'create', 'token' => 'TOKEN'}
126
+ stub_session_get("sessions").with(:query => params)
127
+ @client.get("sessions", params)
128
+ a_session_get("sessions").with(:query => params, :headers => {"Accept" => "application/xml"}).should have_been_made
129
+ end
130
+
131
+ context "signals" do
132
+
133
+ it "should send JSON Accept header" do
134
+ params = {"signal" => "exit"}
135
+ stub_session_post("sessions/abcd/signals").with(:body => params)
136
+ @client.post("sessions/abcd/signals", params)
137
+ a_session_post("sessions/abcd/signals").with(:body => params, :headers => {"Accept" => "application/json"}).should have_been_made
138
+ end
139
+
140
+ end
141
+
142
+ end
143
+
144
+ it "should send JSON Accept header" do
145
+ stub_get("somewhere")
146
+ @client.get("somewhere")
147
+ a_get("somewhere").with(:headers => {"Accept" => "application/json"}).should have_been_made
148
+ end
149
+
150
+ it "should send JSON Content-Type header" do
151
+ stub_get("somewhere")
152
+ @client.get("somewhere")
153
+ a_get("somewhere").with(:headers => {"Content-Type" => "application/json"}).should have_been_made
154
+ end
155
+
156
+ it "should use JSON encoded requests" do
157
+ params = {'hello' => 'world', 'array' => [1, 2, 3]}
158
+ stub_post("somewhere")
159
+ @client.post("somewhere", params)
160
+ a_post("somewhere").with(:body => params).should have_been_made
161
+ end
162
+
163
+ it "should decode JSON responses" do
164
+ params = {'hello' => 'world', 'array' => [1, 2, 3]}
165
+ body = MultiJson.encode(params)
166
+ stub_get("somewhere").to_return(:body => body)
167
+ res = @client.get("somewhere")
168
+ res.should == params
169
+ end
170
+
171
+ context "underscore and camel case" do
172
+
173
+ before do
174
+ class TestResource < Hashie::Twash
175
+ property :voice_url, :from => :voiceUrl
176
+ property :messaging_url, :from => :messagingUrl
177
+ end
178
+ @underscore = {'voice_url' => 'http://example.com', 'messaging_url' => 'http://example2.com'}
179
+ @camel_case = {'voiceUrl' => 'http://example.com', 'messagingUrl' => 'http://example2.com'}
180
+ end
181
+
182
+ it "should convert request params to camel case" do
183
+ stub_post("somewhere")
184
+ @client.post("somewhere", TestResource.new(@underscore))
185
+ a_post("somewhere").with(:body => @camel_case).should have_been_made
186
+ end
187
+
188
+ it "should convert response params to underscore" do
189
+ stub_get("somewhere").to_return(:body => MultiJson.encode(@camel_case))
190
+ res = @client.get("somewhere", TestResource)
191
+ res.should == @underscore
192
+ end
193
+
194
+ end
195
+
196
+ end
197
+
198
+ describe "errors" do
199
+
200
+ before do
201
+ @client = TropoRest::Client.new
202
+ end
203
+
204
+ it "should raise Bad Request on 400 status code" do
205
+ stub_get("error").to_return(:status => 400)
206
+ lambda { @client.get("error") }.should raise_error(TropoRest::BadRequest)
207
+ end
208
+
209
+ it "should raise Not Authorized on 401 status code" do
210
+ stub_get("error").to_return(:status => 401)
211
+ lambda { @client.get("error") }.should raise_error(TropoRest::NotAuthorized)
212
+ end
213
+
214
+ it "should raise Access Denied on 403 status code" do
215
+ stub_get("error").to_return(:status => 403)
216
+ lambda { @client.get("error") }.should raise_error(TropoRest::AccessDenied)
217
+ end
218
+
219
+ it "should raise Not Found on 404 status code" do
220
+ stub_get("error").to_return(:status => 404)
221
+ lambda { @client.get("error") }.should raise_error(TropoRest::NotFound)
222
+ end
223
+
224
+ it "should raise Method Not Allowed on 405 status code" do
225
+ stub_get("error").to_return(:status => 405)
226
+ lambda { @client.get("error") }.should raise_error(TropoRest::MethodNotAllowed)
227
+ end
228
+
229
+ it "should raise Unsupported Media Type on 415 status code" do
230
+ stub_get("error").to_return(:status => 415)
231
+ lambda { @client.get("error") }.should raise_error(TropoRest::UnsupportedMediaType)
232
+ end
233
+
234
+ it "should raise Internal Server Error on 500 status code" do
235
+ stub_get("error").to_return(:status => 500)
236
+ lambda { @client.get("error") }.should raise_error(TropoRest::InternalServerError)
237
+ end
238
+
239
+ it "should raise Service Unavailable on 503 status code" do
240
+ stub_get("error").to_return(:status => 503)
241
+ lambda { @client.get("error") }.should raise_error(TropoRest::ServiceUnavailable)
242
+ end
243
+
244
+ end
245
+
246
+ end
@@ -0,0 +1,12 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe TropoRest::Resource::Address do
4
+
5
+ it { should be_kind_of(Hashie::Twash) }
6
+
7
+ %w[href type prefix number address city state channel username password token application_id].each do |param|
8
+ it { should respond_to(param) }
9
+ it { should respond_to("#{param}=") }
10
+ end
11
+
12
+ end
@@ -0,0 +1,12 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe TropoRest::Resource::Application do
4
+
5
+ it { should be_kind_of(Hashie::Twash) }
6
+
7
+ %w[id href name voice_url messaging_url platform partition].each do |param|
8
+ it { should respond_to(param) }
9
+ it { should respond_to("#{param}=") }
10
+ end
11
+
12
+ end
@@ -0,0 +1,12 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe TropoRest::Resource::Exchange do
4
+
5
+ it { should be_kind_of(Hashie::Twash) }
6
+
7
+ %w[prefix city state country description].each do |param|
8
+ it { should respond_to(param) }
9
+ it { should respond_to("#{param}=") }
10
+ end
11
+
12
+ end
@@ -0,0 +1,22 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ describe TropoRest do
4
+
5
+ describe ".client" do
6
+
7
+ it "should be a TropoRest::Client" do
8
+ TropoRest.client.should be_kind_of(TropoRest::Client)
9
+ end
10
+
11
+ end
12
+
13
+ it "should delegate methods to the client" do
14
+ client = double("TropoRest::Client")
15
+ client.stub(:client_method)
16
+ TropoRest.stub(:client).and_return(client)
17
+
18
+ client.should_receive(:client_method)
19
+ TropoRest.client_method
20
+ end
21
+
22
+ end