koala 1.2.0 → 1.2.1
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.
- data/CHANGELOG +15 -0
- data/koala.gemspec +1 -1
- data/lib/koala/http_service.rb +3 -2
- data/lib/koala/multipart_request.rb +35 -0
- data/lib/koala/oauth.rb +5 -2
- data/lib/koala/rest_api.rb +5 -0
- data/lib/koala/test_users.rb +1 -1
- data/lib/koala/version.rb +1 -1
- data/lib/koala.rb +1 -0
- data/readme.md +22 -5
- data/spec/cases/api_spec.rb +10 -10
- data/spec/cases/http_service_spec.rb +13 -12
- data/spec/cases/multipart_request_spec.rb +66 -0
- data/spec/cases/oauth_spec.rb +105 -67
- data/spec/cases/rest_api_spec.rb +0 -19
- data/spec/cases/test_users_spec.rb +15 -13
- data/spec/fixtures/mock_facebook_responses.yml +13 -0
- data/spec/support/graph_api_shared_examples.rb +82 -56
- data/spec/support/koala_test.rb +17 -15
- data/spec/support/rest_api_shared_examples.rb +69 -25
- metadata +89 -57
data/spec/cases/oauth_spec.rb
CHANGED
@@ -30,21 +30,21 @@ describe "Koala::Facebook::OAuth" do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
# initialization
|
33
|
-
it "
|
33
|
+
it "properly initializes" do
|
34
34
|
@oauth.should
|
35
35
|
end
|
36
36
|
|
37
|
-
it "
|
37
|
+
it "properly sets attributes" do
|
38
38
|
(@oauth.app_id == @app_id &&
|
39
39
|
@oauth.app_secret == @secret &&
|
40
40
|
@oauth.oauth_callback_url == @callback_url).should be_true
|
41
41
|
end
|
42
42
|
|
43
|
-
it "
|
43
|
+
it "properly initializes without a callback_url" do
|
44
44
|
@oauth = Koala::Facebook::OAuth.new(@app_id, @secret)
|
45
45
|
end
|
46
46
|
|
47
|
-
it "
|
47
|
+
it "properly sets attributes without a callback URL" do
|
48
48
|
@oauth = Koala::Facebook::OAuth.new(@app_id, @secret)
|
49
49
|
(@oauth.app_id == @app_id &&
|
50
50
|
@oauth.app_secret == @secret &&
|
@@ -109,7 +109,7 @@ describe "Koala::Facebook::OAuth" do
|
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
112
|
-
it "
|
112
|
+
it "doesn't parse invalid cookies" do
|
113
113
|
# make an invalid string by replacing some values
|
114
114
|
bad_cookie_hash = @cookie.inject({}) { |hash, value| hash[value[0]] = value[1].gsub(/[0-9]/, "3") }
|
115
115
|
result = @oauth.get_user_info_from_cookies(bad_cookie_hash)
|
@@ -118,37 +118,37 @@ describe "Koala::Facebook::OAuth" do
|
|
118
118
|
end
|
119
119
|
|
120
120
|
context "for unsigned cookies" do
|
121
|
-
it "
|
121
|
+
it "properly parses valid cookies" do
|
122
122
|
result = @oauth.get_user_info_from_cookies(KoalaTest.oauth_test_data["valid_cookies"])
|
123
123
|
result.should be_a(Hash)
|
124
124
|
end
|
125
125
|
|
126
|
-
it "
|
126
|
+
it "returns all the cookie components from valid cookie string" do
|
127
127
|
cookie_data = KoalaTest.oauth_test_data["valid_cookies"]
|
128
128
|
parsing_results = @oauth.get_user_info_from_cookies(cookie_data)
|
129
129
|
number_of_components = cookie_data["fbs_#{@app_id.to_s}"].scan(/\=/).length
|
130
130
|
parsing_results.length.should == number_of_components
|
131
131
|
end
|
132
132
|
|
133
|
-
it "
|
133
|
+
it "properly parses valid offline access cookies (e.g. no expiration)" do
|
134
134
|
result = @oauth.get_user_info_from_cookies(KoalaTest.oauth_test_data["offline_access_cookies"])
|
135
135
|
result["uid"].should
|
136
136
|
end
|
137
137
|
|
138
|
-
it "
|
138
|
+
it "returns all the cookie components from offline access cookies" do
|
139
139
|
cookie_data = KoalaTest.oauth_test_data["offline_access_cookies"]
|
140
140
|
parsing_results = @oauth.get_user_info_from_cookies(cookie_data)
|
141
141
|
number_of_components = cookie_data["fbs_#{@app_id.to_s}"].scan(/\=/).length
|
142
142
|
parsing_results.length.should == number_of_components
|
143
143
|
end
|
144
144
|
|
145
|
-
it "
|
145
|
+
it "doesn't parse expired cookies" do
|
146
146
|
new_time = @time.to_i * 2
|
147
147
|
@time.stub(:to_i).and_return(new_time)
|
148
148
|
@oauth.get_user_info_from_cookies(KoalaTest.oauth_test_data["valid_cookies"]).should be_nil
|
149
149
|
end
|
150
150
|
|
151
|
-
it "
|
151
|
+
it "doesn't parse invalid cookies" do
|
152
152
|
# make an invalid string by replacing some values
|
153
153
|
bad_cookie_hash = KoalaTest.oauth_test_data["valid_cookies"].inject({}) { |hash, value| hash[value[0]] = value[1].gsub(/[0-9]/, "3") }
|
154
154
|
result = @oauth.get_user_info_from_cookies(bad_cookie_hash)
|
@@ -158,22 +158,53 @@ describe "Koala::Facebook::OAuth" do
|
|
158
158
|
end
|
159
159
|
|
160
160
|
describe "get_user_from_cookies" do
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
161
|
+
describe "for signed cookies" do
|
162
|
+
before :each do
|
163
|
+
# we don't actually want to make requests to Facebook to redeem the code
|
164
|
+
@cookie = KoalaTest.oauth_test_data["valid_signed_cookies"]
|
165
|
+
@oauth.stub(:get_access_token_info).and_return("access_token" => "my token")
|
166
|
+
end
|
166
167
|
|
167
|
-
|
168
|
-
|
169
|
-
|
168
|
+
it "uses get_user_info_from_cookies to parse the cookies" do
|
169
|
+
@oauth.should_receive(:get_user_info_from_cookies).with(@cookie).and_return({})
|
170
|
+
@oauth.get_user_from_cookies(@cookie)
|
171
|
+
end
|
172
|
+
|
173
|
+
it "uses return the token string if the cookies are valid" do
|
174
|
+
result = @oauth.get_user_from_cookies(@cookie)
|
175
|
+
result.should == "2905623" # the user who generated the original test cookie
|
176
|
+
end
|
177
|
+
|
178
|
+
it "returns nil if the cookies are invalid" do
|
179
|
+
# make an invalid string by replacing some values
|
180
|
+
bad_cookie_hash = @cookie.inject({}) { |hash, value| hash[value[0]] = value[1].gsub(/[0-9]/, "3") }
|
181
|
+
result = @oauth.get_user_from_cookies(bad_cookie_hash)
|
182
|
+
result.should be_nil
|
183
|
+
end
|
170
184
|
end
|
185
|
+
|
186
|
+
describe "for unsigned cookies" do
|
187
|
+
before :each do
|
188
|
+
# we don't actually want to make requests to Facebook to redeem the code
|
189
|
+
@cookie = KoalaTest.oauth_test_data["valid_cookies"]
|
190
|
+
end
|
191
|
+
|
192
|
+
it "uses get_user_info_from_cookies to parse the cookies" do
|
193
|
+
@oauth.should_receive(:get_user_info_from_cookies).with(@cookie).and_return({})
|
194
|
+
@oauth.get_user_from_cookies(@cookie)
|
195
|
+
end
|
196
|
+
|
197
|
+
it "uses return a string if the cookies are valid" do
|
198
|
+
result = @oauth.get_user_from_cookies(@cookie)
|
199
|
+
result.should == "2905623" # the user who generated the original test cookie
|
200
|
+
end
|
171
201
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
202
|
+
it "returns nil if the cookies are invalid" do
|
203
|
+
# make an invalid string by replacing some values
|
204
|
+
bad_cookie_hash = @cookie.inject({}) { |hash, value| hash[value[0]] = value[1].gsub(/[0-9]/, "3") }
|
205
|
+
result = @oauth.get_user_from_cookies(bad_cookie_hash)
|
206
|
+
result.should be_nil
|
207
|
+
end
|
177
208
|
end
|
178
209
|
end
|
179
210
|
end
|
@@ -184,42 +215,42 @@ describe "Koala::Facebook::OAuth" do
|
|
184
215
|
|
185
216
|
describe "for OAuth codes" do
|
186
217
|
# url_for_oauth_code
|
187
|
-
it "
|
218
|
+
it "generates a properly formatted OAuth code URL with the default values" do
|
188
219
|
url = @oauth.url_for_oauth_code
|
189
220
|
url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/authorize?client_id=#{@app_id}&redirect_uri=#{@callback_url}"
|
190
221
|
end
|
191
222
|
|
192
|
-
it "
|
223
|
+
it "generates a properly formatted OAuth code URL when a callback is given" do
|
193
224
|
callback = "foo.com"
|
194
225
|
url = @oauth.url_for_oauth_code(:callback => callback)
|
195
226
|
url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/authorize?client_id=#{@app_id}&redirect_uri=#{callback}"
|
196
227
|
end
|
197
228
|
|
198
|
-
it "
|
229
|
+
it "generates a properly formatted OAuth code URL when permissions are requested as a string" do
|
199
230
|
permissions = "publish_stream,read_stream"
|
200
231
|
url = @oauth.url_for_oauth_code(:permissions => permissions)
|
201
232
|
url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/authorize?client_id=#{@app_id}&redirect_uri=#{@callback_url}&scope=#{permissions}"
|
202
233
|
end
|
203
234
|
|
204
|
-
it "
|
235
|
+
it "generates a properly formatted OAuth code URL when permissions are requested as a string" do
|
205
236
|
permissions = ["publish_stream", "read_stream"]
|
206
237
|
url = @oauth.url_for_oauth_code(:permissions => permissions)
|
207
238
|
url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/authorize?client_id=#{@app_id}&redirect_uri=#{@callback_url}&scope=#{permissions.join(",")}"
|
208
239
|
end
|
209
240
|
|
210
|
-
it "
|
241
|
+
it "generates a properly formatted OAuth code URL when both permissions and callback are provided" do
|
211
242
|
permissions = "publish_stream,read_stream"
|
212
243
|
callback = "foo.com"
|
213
244
|
url = @oauth.url_for_oauth_code(:callback => callback, :permissions => permissions)
|
214
245
|
url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/authorize?client_id=#{@app_id}&redirect_uri=#{callback}&scope=#{permissions}"
|
215
246
|
end
|
216
247
|
|
217
|
-
it "
|
248
|
+
it "generates a properly formatted OAuth code URL when a display is given as a string" do
|
218
249
|
url = @oauth.url_for_oauth_code(:display => "page")
|
219
250
|
url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/authorize?client_id=#{@app_id}&redirect_uri=#{@callback_url}&display=page"
|
220
251
|
end
|
221
252
|
|
222
|
-
it "
|
253
|
+
it "raises an exception if no callback is given in initialization or the call" do
|
223
254
|
oauth2 = Koala::Facebook::OAuth.new(@app_id, @secret)
|
224
255
|
lambda { oauth2.url_for_oauth_code }.should raise_error(ArgumentError)
|
225
256
|
end
|
@@ -232,12 +263,12 @@ describe "Koala::Facebook::OAuth" do
|
|
232
263
|
end
|
233
264
|
|
234
265
|
# url_for_access_token
|
235
|
-
it "
|
266
|
+
it "generates a properly formatted OAuth token URL when provided a code" do
|
236
267
|
url = @oauth.url_for_access_token(@code)
|
237
268
|
url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/access_token?client_id=#{@app_id}&redirect_uri=#{@callback_url}&client_secret=#{@secret}&code=#{@code}"
|
238
269
|
end
|
239
270
|
|
240
|
-
it "
|
271
|
+
it "generates a properly formatted OAuth token URL when provided a callback" do
|
241
272
|
callback = "foo.com"
|
242
273
|
url = @oauth.url_for_access_token(@code, :callback => callback)
|
243
274
|
url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/access_token?client_id=#{@app_id}&redirect_uri=#{callback}&client_secret=#{@secret}&code=#{@code}"
|
@@ -264,16 +295,17 @@ describe "Koala::Facebook::OAuth" do
|
|
264
295
|
end
|
265
296
|
|
266
297
|
if KoalaTest.code
|
267
|
-
it "
|
298
|
+
it "properly gets and parses an access token token results into a hash" do
|
268
299
|
result = @oauth.get_access_token_info(@code)
|
269
300
|
result.should be_a(Hash)
|
270
301
|
end
|
271
302
|
|
272
|
-
it "
|
303
|
+
it "properly includes the access token results" do
|
273
304
|
result = @oauth.get_access_token_info(@code)
|
274
305
|
result["access_token"].should
|
275
306
|
end
|
276
|
-
|
307
|
+
|
308
|
+
it "raises an error when get_access_token is called with a bad code" do
|
277
309
|
lambda { @oauth.get_access_token_info("foo") }.should raise_error(Koala::Facebook::APIError)
|
278
310
|
end
|
279
311
|
end
|
@@ -281,7 +313,7 @@ describe "Koala::Facebook::OAuth" do
|
|
281
313
|
|
282
314
|
describe ".get_access_token" do
|
283
315
|
# TODO refactor these to be proper tests with stubs and tests against real data
|
284
|
-
it "
|
316
|
+
it "passes on any options provided to make_request" do
|
285
317
|
options = {:a => 2}
|
286
318
|
Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "", {}))
|
287
319
|
@oauth.get_access_token(@code, options)
|
@@ -310,17 +342,17 @@ describe "Koala::Facebook::OAuth" do
|
|
310
342
|
end
|
311
343
|
|
312
344
|
describe "get_app_access_token_info" do
|
313
|
-
it "
|
345
|
+
it "properly gets and parses an app's access token as a hash" do
|
314
346
|
result = @oauth.get_app_access_token_info
|
315
347
|
result.should be_a(Hash)
|
316
348
|
end
|
317
349
|
|
318
|
-
it "
|
350
|
+
it "includes the access token" do
|
319
351
|
result = @oauth.get_app_access_token_info
|
320
352
|
result["access_token"].should
|
321
353
|
end
|
322
354
|
|
323
|
-
it "
|
355
|
+
it "passes on any options provided to make_request" do
|
324
356
|
options = {:a => 2}
|
325
357
|
Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "", {}))
|
326
358
|
@oauth.get_app_access_token_info(options)
|
@@ -328,18 +360,18 @@ describe "Koala::Facebook::OAuth" do
|
|
328
360
|
end
|
329
361
|
|
330
362
|
describe "get_app_acess_token" do
|
331
|
-
it "
|
363
|
+
it "uses get_access_token_info to get and parse an access token token results" do
|
332
364
|
result = @oauth.get_app_access_token
|
333
365
|
result.should be_a(String)
|
334
366
|
end
|
335
367
|
|
336
|
-
it "
|
368
|
+
it "returns the access token as a string" do
|
337
369
|
result = @oauth.get_app_access_token
|
338
370
|
original = @oauth.get_app_access_token_info
|
339
371
|
result.should == original["access_token"]
|
340
372
|
end
|
341
373
|
|
342
|
-
it "
|
374
|
+
it "passes on any options provided to make_request" do
|
343
375
|
options = {:a => 2}
|
344
376
|
Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "", {}))
|
345
377
|
@oauth.get_app_access_token(options)
|
@@ -352,13 +384,13 @@ describe "Koala::Facebook::OAuth" do
|
|
352
384
|
# since these are pretty fundamental and pretty testable, we want to test them
|
353
385
|
|
354
386
|
# parse_access_token
|
355
|
-
it "
|
387
|
+
it "properly parses access token results" do
|
356
388
|
result = @oauth.send(:parse_access_token, @raw_token_string)
|
357
389
|
has_both_parts = result["access_token"] && result["expires"]
|
358
390
|
has_both_parts.should
|
359
391
|
end
|
360
392
|
|
361
|
-
it "
|
393
|
+
it "properly parses offline access token results" do
|
362
394
|
result = @oauth.send(:parse_access_token, @raw_offline_access_token_string)
|
363
395
|
has_both_parts = result["access_token"] && !result["expires"]
|
364
396
|
has_both_parts.should
|
@@ -368,7 +400,7 @@ describe "Koala::Facebook::OAuth" do
|
|
368
400
|
# somewhat duplicative with the tests for get_access_token and get_app_access_token
|
369
401
|
# but no harm in thoroughness
|
370
402
|
if KoalaTest.code
|
371
|
-
it "
|
403
|
+
it "fetches a proper token string from Facebook when given a code" do
|
372
404
|
result = @oauth.send(:fetch_token_string, :code => @code, :redirect_uri => @callback_url)
|
373
405
|
result.should =~ /^access_token/
|
374
406
|
end
|
@@ -376,7 +408,7 @@ describe "Koala::Facebook::OAuth" do
|
|
376
408
|
it "fetch_token_string code test will not be run since the code field in facebook_data.yml is blank."
|
377
409
|
end
|
378
410
|
|
379
|
-
it "
|
411
|
+
it "fetches a proper token string from Facebook when asked for the app token" do
|
380
412
|
result = @oauth.send(:fetch_token_string, {:type => 'client_cred'}, true)
|
381
413
|
result.should =~ /^access_token/
|
382
414
|
end
|
@@ -386,41 +418,41 @@ describe "Koala::Facebook::OAuth" do
|
|
386
418
|
describe "for exchanging session keys" do
|
387
419
|
if KoalaTest.session_key
|
388
420
|
describe "with get_token_info_from_session_keys" do
|
389
|
-
it "
|
421
|
+
it "gets an array of session keys from Facebook when passed a single key" do
|
390
422
|
result = @oauth.get_tokens_from_session_keys([KoalaTest.session_key])
|
391
423
|
result.should be_an(Array)
|
392
424
|
result.length.should == 1
|
393
425
|
end
|
394
426
|
|
395
|
-
it "
|
427
|
+
it "gets an array of session keys from Facebook when passed multiple keys" do
|
396
428
|
result = @oauth.get_tokens_from_session_keys(@multiple_session_keys)
|
397
429
|
result.should be_an(Array)
|
398
430
|
result.length.should == 2
|
399
431
|
end
|
400
432
|
|
401
|
-
it "
|
433
|
+
it "returns the original hashes" do
|
402
434
|
result = @oauth.get_token_info_from_session_keys(@multiple_session_keys)
|
403
435
|
result[0].should be_a(Hash)
|
404
436
|
end
|
405
437
|
|
406
|
-
it "
|
438
|
+
it "properly handles invalid session keys" do
|
407
439
|
result = @oauth.get_token_info_from_session_keys(["foo", "bar"])
|
408
440
|
#it should return nil for each of the invalid ones
|
409
441
|
result.each {|r| r.should be_nil}
|
410
442
|
end
|
411
443
|
|
412
|
-
it "
|
444
|
+
it "properly handles a mix of valid and invalid session keys" do
|
413
445
|
result = @oauth.get_token_info_from_session_keys(["foo"].concat(@multiple_session_keys))
|
414
446
|
# it should return nil for each of the invalid ones
|
415
447
|
result.each_with_index {|r, index| index > 0 ? r.should(be_a(Hash)) : r.should(be_nil)}
|
416
448
|
end
|
417
449
|
|
418
|
-
it "
|
450
|
+
it "throws an APIError if Facebook returns an empty body (as happens for instance when the API breaks)" do
|
419
451
|
@oauth.should_receive(:fetch_token_string).and_return("")
|
420
452
|
lambda { @oauth.get_token_info_from_session_keys(@multiple_session_keys) }.should raise_error(Koala::Facebook::APIError)
|
421
453
|
end
|
422
454
|
|
423
|
-
it "
|
455
|
+
it "passes on any options provided to make_request" do
|
424
456
|
options = {:a => 2}
|
425
457
|
Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "[{}]", {}))
|
426
458
|
@oauth.get_token_info_from_session_keys([], options)
|
@@ -428,31 +460,31 @@ describe "Koala::Facebook::OAuth" do
|
|
428
460
|
end
|
429
461
|
|
430
462
|
describe "with get_tokens_from_session_keys" do
|
431
|
-
it "
|
463
|
+
it "calls get_token_info_from_session_keys" do
|
432
464
|
args = @multiple_session_keys
|
433
465
|
@oauth.should_receive(:get_token_info_from_session_keys).with(args, anything).and_return([])
|
434
466
|
@oauth.get_tokens_from_session_keys(args)
|
435
467
|
end
|
436
468
|
|
437
|
-
it "
|
469
|
+
it "returns an array of strings" do
|
438
470
|
args = @multiple_session_keys
|
439
471
|
result = @oauth.get_tokens_from_session_keys(args)
|
440
472
|
result.each {|r| r.should be_a(String) }
|
441
473
|
end
|
442
474
|
|
443
|
-
it "
|
475
|
+
it "properly handles invalid session keys" do
|
444
476
|
result = @oauth.get_tokens_from_session_keys(["foo", "bar"])
|
445
477
|
# it should return nil for each of the invalid ones
|
446
478
|
result.each {|r| r.should be_nil}
|
447
479
|
end
|
448
480
|
|
449
|
-
it "
|
481
|
+
it "properly handles a mix of valid and invalid session keys" do
|
450
482
|
result = @oauth.get_tokens_from_session_keys(["foo"].concat(@multiple_session_keys))
|
451
483
|
# it should return nil for each of the invalid ones
|
452
484
|
result.each_with_index {|r, index| index > 0 ? r.should(be_a(String)) : r.should(be_nil)}
|
453
485
|
end
|
454
486
|
|
455
|
-
it "
|
487
|
+
it "passes on any options provided to make_request" do
|
456
488
|
options = {:a => 2}
|
457
489
|
Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "[{}]", {}))
|
458
490
|
@oauth.get_tokens_from_session_keys([], options)
|
@@ -460,29 +492,29 @@ describe "Koala::Facebook::OAuth" do
|
|
460
492
|
end
|
461
493
|
|
462
494
|
describe "get_token_from_session_key" do
|
463
|
-
it "
|
495
|
+
it "calls get_tokens_from_session_keys when the get_token_from_session_key is called" do
|
464
496
|
key = KoalaTest.session_key
|
465
497
|
@oauth.should_receive(:get_tokens_from_session_keys).with([key], anything).and_return([])
|
466
498
|
@oauth.get_token_from_session_key(key)
|
467
499
|
end
|
468
500
|
|
469
|
-
it "
|
501
|
+
it "gets back the access token string from get_token_from_session_key" do
|
470
502
|
result = @oauth.get_token_from_session_key(KoalaTest.session_key)
|
471
503
|
result.should be_a(String)
|
472
504
|
end
|
473
505
|
|
474
|
-
it "
|
506
|
+
it "returns the first value in the array" do
|
475
507
|
result = @oauth.get_token_from_session_key(KoalaTest.session_key)
|
476
508
|
array = @oauth.get_tokens_from_session_keys([KoalaTest.session_key])
|
477
509
|
result.should == array[0]
|
478
510
|
end
|
479
511
|
|
480
|
-
it "
|
512
|
+
it "properly handles an invalid session key" do
|
481
513
|
result = @oauth.get_token_from_session_key("foo")
|
482
514
|
result.should be_nil
|
483
515
|
end
|
484
516
|
|
485
|
-
it "
|
517
|
+
it "passes on any options provided to make_request" do
|
486
518
|
options = {:a => 2}
|
487
519
|
Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "[{}]", {}))
|
488
520
|
@oauth.get_token_from_session_key("", options)
|
@@ -496,15 +528,21 @@ describe "Koala::Facebook::OAuth" do
|
|
496
528
|
describe "for parsing signed requests" do
|
497
529
|
# the signed request code is ported directly from Facebook
|
498
530
|
# so we only need to test at a high level that it works
|
499
|
-
it "
|
531
|
+
it "throws an error if the algorithm is unsupported" do
|
500
532
|
MultiJson.stub(:decode).and_return("algorithm" => "my fun algorithm")
|
501
533
|
lambda { @oauth.parse_signed_request(@signed_request) }.should raise_error
|
502
534
|
end
|
503
535
|
|
504
|
-
it "
|
536
|
+
it "throws an error if the signature is invalid" do
|
505
537
|
OpenSSL::HMAC.stub!(:hexdigest).and_return("i'm an invalid signature")
|
506
538
|
lambda { @oauth.parse_signed_request(@signed_request) }.should raise_error
|
507
539
|
end
|
540
|
+
|
541
|
+
it "throws an error if the signature string is empty" do
|
542
|
+
# this occasionally happens due to Facebook error
|
543
|
+
lambda { @oauth.parse_signed_request("") }.should raise_error
|
544
|
+
lambda { @oauth.parse_signed_request("abc-def") }.should raise_error
|
545
|
+
end
|
508
546
|
|
509
547
|
it "properly parses requests" do
|
510
548
|
@oauth = Koala::Facebook::OAuth.new(@app_id, @secret || @app_secret)
|
@@ -512,4 +550,4 @@ describe "Koala::Facebook::OAuth" do
|
|
512
550
|
end
|
513
551
|
end
|
514
552
|
|
515
|
-
end # describe
|
553
|
+
end # describe
|
data/spec/cases/rest_api_spec.rb
CHANGED
@@ -19,23 +19,4 @@ describe "Koala::Facebook::RestAPI" do
|
|
19
19
|
api = Koala::Facebook::RestAPI.new("token")
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
23
|
-
context "without an access token" do
|
24
|
-
before :each do
|
25
|
-
@api = Koala::Facebook::API.new
|
26
|
-
end
|
27
|
-
|
28
|
-
it_should_behave_like "Koala RestAPI"
|
29
|
-
it_should_behave_like "Koala RestAPI without an access token"
|
30
|
-
end
|
31
|
-
|
32
|
-
context "with an access token" do
|
33
|
-
before :each do
|
34
|
-
@api = Koala::Facebook::API.new(@token)
|
35
|
-
end
|
36
|
-
|
37
|
-
it_should_behave_like "Koala RestAPI"
|
38
|
-
it_should_behave_like "Koala RestAPI with an access token"
|
39
|
-
end
|
40
|
-
|
41
22
|
end
|
@@ -17,7 +17,7 @@ describe "Koala::Facebook::TestUsers" do
|
|
17
17
|
after :each do
|
18
18
|
# clean up any test users
|
19
19
|
((@network || []) + [@user1, @user2]).each do |u|
|
20
|
-
puts "Unable to delete test user #{u.inspect}" if u && (
|
20
|
+
puts "Unable to delete test user #{u.inspect}" if u && !(@test_users.delete(u) rescue false)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -90,14 +90,14 @@ describe "Koala::Facebook::TestUsers" do
|
|
90
90
|
describe ".create" do
|
91
91
|
it "should create a test user when not given installed" do
|
92
92
|
result = @test_users.create(false)
|
93
|
-
@
|
93
|
+
@user1 = result["id"]
|
94
94
|
result.should be_a(Hash)
|
95
95
|
(result["id"] && result["access_token"] && result["login_url"]).should
|
96
96
|
end
|
97
97
|
|
98
98
|
it "should create a test user when not given installed, ignoring permissions" do
|
99
99
|
result = @test_users.create(false, "read_stream")
|
100
|
-
@
|
100
|
+
@user1 = result["id"]
|
101
101
|
result.should be_a(Hash)
|
102
102
|
(result["id"] && result["access_token"] && result["login_url"]).should
|
103
103
|
end
|
@@ -114,7 +114,7 @@ describe "Koala::Facebook::TestUsers" do
|
|
114
114
|
|
115
115
|
it "should create a test user when given installed and a permission" do
|
116
116
|
result = @test_users.create(true, "read_stream")
|
117
|
-
@
|
117
|
+
@user1 = result["id"]
|
118
118
|
result.should be_a(Hash)
|
119
119
|
(result["id"] && result["access_token"] && result["login_url"]).should
|
120
120
|
end
|
@@ -165,24 +165,26 @@ describe "Koala::Facebook::TestUsers" do
|
|
165
165
|
describe ".update" do
|
166
166
|
before :each do
|
167
167
|
@updates = {:name => "Foo Baz"}
|
168
|
+
# we stub out :graph_call, but still need to be able to delete the users
|
169
|
+
@test_users2 = Koala::Facebook::TestUsers.new(:app_id => @test_users.app_id, :app_access_token => @test_users.app_access_token)
|
168
170
|
end
|
169
171
|
|
170
172
|
it "makes a POST with the test user Graph API " do
|
171
|
-
|
172
|
-
@
|
173
|
-
@
|
173
|
+
@user1 = @test_users2.create(true)
|
174
|
+
@test_users2.graph_api.should_receive(:graph_call).with(anything, anything, "post", anything)
|
175
|
+
@test_users2.update(@user1, @updates)
|
174
176
|
end
|
175
177
|
|
176
178
|
it "makes a request to the test user with the update params " do
|
177
|
-
|
178
|
-
@
|
179
|
-
@
|
179
|
+
@user1 = @test_users2.create(true)
|
180
|
+
@test_users2.graph_api.should_receive(:graph_call).with(@user1["id"], @updates, anything, anything)
|
181
|
+
@test_users2.update(@user1, @updates)
|
180
182
|
end
|
181
183
|
|
182
184
|
it "works" do
|
183
|
-
|
184
|
-
@test_users.update(
|
185
|
-
user_info = Koala::Facebook::API.new(
|
185
|
+
@user1 = @test_users.create(true)
|
186
|
+
@test_users.update(@user1, @updates)
|
187
|
+
user_info = Koala::Facebook::API.new(@user1["access_token"]).get_object(@user1["id"])
|
186
188
|
user_info["name"].should == @updates[:name]
|
187
189
|
end
|
188
190
|
end
|
@@ -33,6 +33,10 @@ rest_api:
|
|
33
33
|
get:
|
34
34
|
with_token: '[{"name":"query1", "fql_result_set":[{"first_name":"Luke"}]},{"name":"query2", "fql_result_set":[{"first_name":"Alex"}]}]'
|
35
35
|
no_token: '[{"name":"query1", "fql_result_set":[{"first_name":"Luke"}]},{"name":"query2", "fql_result_set":[{"first_name":"Alex"}]}]'
|
36
|
+
/method/admin.setAppProperties:
|
37
|
+
'properties={"desktop":0}':
|
38
|
+
post:
|
39
|
+
with_token: 'true'
|
36
40
|
|
37
41
|
|
38
42
|
|
@@ -148,6 +152,12 @@ graph_api:
|
|
148
152
|
message=Hello, world, from the test suite, testing comments!:
|
149
153
|
post:
|
150
154
|
with_token: '{"id": "MOCK_FEED_ITEM"}'
|
155
|
+
message=Hello, world, from the test suite, testing comments again!:
|
156
|
+
post:
|
157
|
+
with_token: '{"id": "MOCK_FEED_ITEM"}'
|
158
|
+
message=Hello, world, from the test suite, testing liking!:
|
159
|
+
post:
|
160
|
+
with_token: '{"id": "MOCK_FEED_ITEM"}'
|
151
161
|
message=the cats are asleep:
|
152
162
|
post:
|
153
163
|
with_token: '{"id": "FEED_ITEM_CATS"}'
|
@@ -160,6 +170,9 @@ graph_api:
|
|
160
170
|
link=http://oauth.twoalex.com/&message=Hello, world, from the test suite again!&name=OAuth Playground:
|
161
171
|
post:
|
162
172
|
with_token: '{"id": "FEED_ITEM_CONTEXT"}'
|
173
|
+
link=http://oauth.twoalex.com/&message=body&name=It's a big question&picture=http://oauth.twoalex.com//images/logo.png&properties=<%= {"name"=>"Link1'", "text"=>"Left", "href"=>"http://oauth.twoalex.com/"}.to_s %>=<%= {"name"=>"other", "text"=>"Straight ahead"}.to_s %>&type=link:
|
174
|
+
post:
|
175
|
+
with_token: '{"id": "FEED_ITEM_CONTEXT"}'
|
163
176
|
|
164
177
|
/me/photos:
|
165
178
|
source=[FILE]:
|