koala 1.1.0 → 1.2.0beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/.travis.yml +2 -1
  2. data/CHANGELOG +26 -0
  3. data/Gemfile +6 -2
  4. data/Rakefile +0 -1
  5. data/koala.gemspec +8 -8
  6. data/lib/koala.rb +42 -45
  7. data/lib/koala/batch_operation.rb +15 -15
  8. data/lib/koala/graph_api.rb +81 -58
  9. data/lib/koala/graph_batch_api.rb +10 -10
  10. data/lib/koala/graph_collection.rb +6 -6
  11. data/lib/koala/http_service.rb +177 -0
  12. data/lib/koala/oauth.rb +2 -2
  13. data/lib/koala/realtime_updates.rb +20 -17
  14. data/lib/koala/rest_api.rb +1 -1
  15. data/lib/koala/test_users.rb +33 -16
  16. data/lib/koala/uploadable_io.rb +47 -42
  17. data/lib/koala/utils.rb +11 -0
  18. data/readme.md +38 -38
  19. data/spec/cases/api_base_spec.rb +2 -2
  20. data/spec/cases/error_spec.rb +32 -0
  21. data/spec/cases/graph_and_rest_api_spec.rb +20 -3
  22. data/spec/cases/graph_api_batch_spec.rb +88 -97
  23. data/spec/cases/graph_api_spec.rb +21 -4
  24. data/spec/cases/http_service_spec.rb +446 -0
  25. data/spec/cases/koala_spec.rb +33 -38
  26. data/spec/cases/oauth_spec.rb +219 -200
  27. data/spec/cases/realtime_updates_spec.rb +45 -31
  28. data/spec/cases/rest_api_spec.rb +23 -7
  29. data/spec/cases/test_users_spec.rb +112 -52
  30. data/spec/cases/uploadable_io_spec.rb +49 -36
  31. data/spec/cases/utils_spec.rb +10 -0
  32. data/spec/fixtures/facebook_data.yml +23 -22
  33. data/spec/fixtures/mock_facebook_responses.yml +126 -96
  34. data/spec/spec_helper.rb +29 -5
  35. data/spec/support/graph_api_shared_examples.rb +59 -52
  36. data/spec/support/json_testing_fix.rb +35 -11
  37. data/spec/support/koala_test.rb +163 -0
  38. data/spec/support/mock_http_service.rb +6 -4
  39. data/spec/support/ordered_hash.rb +205 -0
  40. data/spec/support/rest_api_shared_examples.rb +37 -37
  41. data/spec/support/uploadable_io_shared_examples.rb +2 -8
  42. metadata +78 -79
  43. data/lib/koala/http_services.rb +0 -46
  44. data/lib/koala/http_services/net_http_service.rb +0 -92
  45. data/lib/koala/http_services/typhoeus_service.rb +0 -37
  46. data/spec/cases/http_services/http_service_spec.rb +0 -129
  47. data/spec/cases/http_services/net_http_service_spec.rb +0 -532
  48. data/spec/cases/http_services/typhoeus_service_spec.rb +0 -152
  49. data/spec/support/live_testing_data_helper.rb +0 -40
  50. data/spec/support/setup_mocks_or_live.rb +0 -51
@@ -2,54 +2,49 @@ require 'spec_helper'
2
2
 
3
3
  describe "Koala" do
4
4
  it "has an http_service accessor" do
5
- Koala.respond_to?(:http_service)
5
+ Koala.should respond_to(:http_service)
6
+ Koala.should respond_to(:http_service=)
6
7
  end
7
-
8
- it "should let an http service be set" do
9
- current_service = Koala.http_service
10
- Koala.http_service = Koala::MockHTTPService
11
- Koala.http_service.should == Koala::MockHTTPService
12
- # reset the service back to the original one (important for live tests)
13
- Koala.http_service = current_service
14
- end
15
-
16
- it "sets Net::HTTP as the base service" do
17
- Koala.base_http_service.should == Koala::NetHTTPService
18
- end
19
-
20
- describe ".always_use_ssl" do
21
- it "should be added" do
22
- # in Ruby 1.8, .methods returns strings
23
- # in Ruby 1.9, .method returns symbols
24
- Koala.methods.collect {|m| m.to_sym}.should include(:always_use_ssl)
25
- Koala.methods.collect {|m| m.to_sym}.should include(:always_use_ssl=)
26
- end
27
- end
28
-
29
- describe ".make_request" do
30
-
8
+
9
+ context "for deprecated services" do
31
10
  before :each do
32
- @old_service = Koala.http_service
33
- Koala.http_service = Koala::MockHTTPService
11
+ @service = Koala.http_service
34
12
  end
35
13
 
36
14
  after :each do
37
- Koala.http_service = @old_service
15
+ Koala.http_service = @service
38
16
  end
39
17
 
40
- it "should use SSL if Koala.always_use_ssl is set to true, even if there's no token" do
41
- Koala.http_service.should_receive(:make_request).with(anything, anything, anything, hash_including(:use_ssl => true))
42
-
43
- Koala.always_use_ssl = true
44
- Koala.make_request('anything', {}, 'anything')
18
+ it "invokes deprecated_interface if present" do
19
+ mock_service = stub("http service")
20
+ mock_service.should_receive(:deprecated_interface)
21
+ Koala.http_service = mock_service
22
+ end
23
+
24
+ it "does not set the service if it's deprecated" do
25
+ mock_service = stub("http service")
26
+ mock_service.stub(:deprecated_interface)
27
+ Koala.http_service = mock_service
28
+ Koala.http_service.should == @service
45
29
  end
46
30
 
47
- it "should allow the caller to override the http_service" do
48
- http_service = stub
49
- http_service.should_receive(:make_request)
50
-
51
- Koala.make_request(anything, anything, anything, :http_service => http_service)
31
+ it "sets the service if it's not deprecated" do
32
+ mock_service = stub("http service")
33
+ Koala.http_service = mock_service
34
+ Koala.http_service.should == mock_service
52
35
  end
36
+ end
53
37
 
38
+ define "make_request" do
39
+ it "passes all its arguments to the http_service" do
40
+ http_service = stub("http_service")
41
+ path = "foo"
42
+ args = {:a => 2}
43
+ verb = "get"
44
+ options = {:c => :d}
45
+ http_service.should_receive(:make_request).with(path, args, verb, options)
46
+ Koala.make_request(path, args, verb, options)
47
+ end
54
48
  end
49
+
55
50
  end
@@ -3,38 +3,40 @@ require 'spec_helper'
3
3
  describe "Koala::Facebook::OAuth" do
4
4
  before :each do
5
5
  # make the relevant test data easily accessible
6
- @oauth_data = $testing_data["oauth_test_data"]
7
- @app_id = @oauth_data["app_id"]
8
- @secret = @oauth_data["secret"]
9
- @code = @oauth_data["code"]
10
- @callback_url = @oauth_data["callback_url"]
11
- @raw_token_string = @oauth_data["raw_token_string"]
12
- @raw_offline_access_token_string = @oauth_data["raw_offline_access_token_string"]
13
-
6
+ @app_id = KoalaTest.app_id
7
+ @secret = KoalaTest.secret
8
+ @code = KoalaTest.code
9
+ @callback_url = KoalaTest.oauth_test_data["callback_url"]
10
+ @raw_token_string = KoalaTest.oauth_test_data["raw_token_string"]
11
+ @raw_offline_access_token_string = KoalaTest.oauth_test_data["raw_offline_access_token_string"]
12
+
14
13
  # for signed requests (http://developers.facebook.com/docs/authentication/canvas/encryption_proposal)
15
- @signed_params = @oauth_data["signed_params"]
16
- @signed_params_result = @oauth_data["signed_params_result"]
17
-
14
+ @signed_params = KoalaTest.oauth_test_data["signed_params"]
15
+ @signed_params_result = KoalaTest.oauth_test_data["signed_params_result"]
16
+
18
17
  # this should expanded to cover all variables
19
- raise Exception, "Must supply app data to run FacebookOAuthTests!" unless @app_id && @secret && @callback_url &&
20
- @code && @raw_token_string &&
18
+ raise Exception, "Must supply app data to run FacebookOAuthTests!" unless @app_id && @secret && @callback_url &&
19
+ @raw_token_string &&
21
20
  @raw_offline_access_token_string
22
21
 
22
+ # we can just test against the same key twice
23
+ @multiple_session_keys = [KoalaTest.session_key, KoalaTest.session_key] if KoalaTest.session_key
24
+
23
25
  @oauth = Koala::Facebook::OAuth.new(@app_id, @secret, @callback_url)
24
26
 
25
27
  @time = Time.now
26
28
  Time.stub!(:now).and_return(@time)
27
29
  @time.stub!(:to_i).and_return(1273363199)
28
30
  end
29
-
31
+
30
32
  # initialization
31
33
  it "should properly initialize" do
32
34
  @oauth.should
33
35
  end
34
36
 
35
37
  it "should properly set attributes" do
36
- (@oauth.app_id == @app_id &&
37
- @oauth.app_secret == @secret &&
38
+ (@oauth.app_id == @app_id &&
39
+ @oauth.app_secret == @secret &&
38
40
  @oauth.oauth_callback_url == @callback_url).should be_true
39
41
  end
40
42
 
@@ -44,126 +46,131 @@ describe "Koala::Facebook::OAuth" do
44
46
 
45
47
  it "should properly set attributes without a callback URL" do
46
48
  @oauth = Koala::Facebook::OAuth.new(@app_id, @secret)
47
- (@oauth.app_id == @app_id &&
48
- @oauth.app_secret == @secret &&
49
+ (@oauth.app_id == @app_id &&
50
+ @oauth.app_secret == @secret &&
49
51
  @oauth.oauth_callback_url == nil).should be_true
50
52
  end
51
-
53
+
52
54
  describe "for cookie parsing" do
53
55
  describe "get_user_info_from_cookies" do
54
56
  it "should properly parse valid cookies" do
55
- result = @oauth.get_user_info_from_cookies(@oauth_data["valid_cookies"])
57
+ result = @oauth.get_user_info_from_cookies(KoalaTest.oauth_test_data["valid_cookies"])
56
58
  result.should be_a(Hash)
57
59
  end
58
-
60
+
59
61
  it "should return all the cookie components from valid cookie string" do
60
- cookie_data = @oauth_data["valid_cookies"]
62
+ cookie_data = KoalaTest.oauth_test_data["valid_cookies"]
61
63
  parsing_results = @oauth.get_user_info_from_cookies(cookie_data)
62
64
  number_of_components = cookie_data["fbs_#{@app_id.to_s}"].scan(/\=/).length
63
65
  parsing_results.length.should == number_of_components
64
66
  end
65
67
 
66
- it "should properly parse valid offline access cookies (e.g. no expiration)" do
67
- result = @oauth.get_user_info_from_cookies(@oauth_data["offline_access_cookies"])
68
- result["uid"].should
68
+ it "should properly parse valid offline access cookies (e.g. no expiration)" do
69
+ result = @oauth.get_user_info_from_cookies(KoalaTest.oauth_test_data["offline_access_cookies"])
70
+ result["uid"].should
69
71
  end
70
72
 
71
73
  it "should return all the cookie components from offline access cookies" do
72
- cookie_data = @oauth_data["offline_access_cookies"]
74
+ cookie_data = KoalaTest.oauth_test_data["offline_access_cookies"]
73
75
  parsing_results = @oauth.get_user_info_from_cookies(cookie_data)
74
76
  number_of_components = cookie_data["fbs_#{@app_id.to_s}"].scan(/\=/).length
75
77
  parsing_results.length.should == number_of_components
76
78
  end
77
79
 
78
80
  it "shouldn't parse expired cookies" do
79
- result = @oauth.get_user_info_from_cookies(@oauth_data["expired_cookies"])
81
+ result = @oauth.get_user_info_from_cookies(KoalaTest.oauth_test_data["expired_cookies"])
80
82
  result.should be_nil
81
83
  end
82
-
84
+
83
85
  it "shouldn't parse invalid cookies" do
84
86
  # make an invalid string by replacing some values
85
- bad_cookie_hash = @oauth_data["valid_cookies"].inject({}) { |hash, value| hash[value[0]] = value[1].gsub(/[0-9]/, "3") }
87
+ bad_cookie_hash = KoalaTest.oauth_test_data["valid_cookies"].inject({}) { |hash, value| hash[value[0]] = value[1].gsub(/[0-9]/, "3") }
86
88
  result = @oauth.get_user_info_from_cookies(bad_cookie_hash)
87
89
  result.should be_nil
88
90
  end
89
91
  end
90
-
92
+
91
93
  describe "get_user_from_cookies" do
92
94
  it "should use get_user_info_from_cookies to parse the cookies" do
93
- data = @oauth_data["valid_cookies"]
95
+ data = KoalaTest.oauth_test_data["valid_cookies"]
94
96
  @oauth.should_receive(:get_user_info_from_cookies).with(data).and_return({})
95
97
  @oauth.get_user_from_cookies(data)
96
98
  end
97
99
 
98
100
  it "should use return a string if the cookies are valid" do
99
- result = @oauth.get_user_from_cookies(@oauth_data["valid_cookies"])
101
+ result = @oauth.get_user_from_cookies(KoalaTest.oauth_test_data["valid_cookies"])
100
102
  result.should be_a(String)
101
103
  end
102
-
104
+
103
105
  it "should return nil if the cookies are invalid" do
104
106
  # make an invalid string by replacing some values
105
- bad_cookie_hash = @oauth_data["valid_cookies"].inject({}) { |hash, value| hash[value[0]] = value[1].gsub(/[0-9]/, "3") }
107
+ bad_cookie_hash = KoalaTest.oauth_test_data["valid_cookies"].inject({}) { |hash, value| hash[value[0]] = value[1].gsub(/[0-9]/, "3") }
106
108
  result = @oauth.get_user_from_cookies(bad_cookie_hash)
107
109
  result.should be_nil
108
- end
110
+ end
109
111
  end
110
112
  end
111
-
113
+
112
114
  # OAuth URLs
113
-
115
+
114
116
  describe "for URL generation" do
115
117
 
116
- describe "for OAuth codes" do
118
+ describe "for OAuth codes" do
117
119
  # url_for_oauth_code
118
- it "should generate a properly formatted OAuth code URL with the default values" do
120
+ it "should generate a properly formatted OAuth code URL with the default values" do
119
121
  url = @oauth.url_for_oauth_code
120
122
  url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/authorize?client_id=#{@app_id}&redirect_uri=#{@callback_url}"
121
123
  end
122
124
 
123
- it "should generate a properly formatted OAuth code URL when a callback is given" do
125
+ it "should generate a properly formatted OAuth code URL when a callback is given" do
124
126
  callback = "foo.com"
125
127
  url = @oauth.url_for_oauth_code(:callback => callback)
126
128
  url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/authorize?client_id=#{@app_id}&redirect_uri=#{callback}"
127
129
  end
128
130
 
129
- it "should generate a properly formatted OAuth code URL when permissions are requested as a string" do
131
+ it "should generate a properly formatted OAuth code URL when permissions are requested as a string" do
130
132
  permissions = "publish_stream,read_stream"
131
133
  url = @oauth.url_for_oauth_code(:permissions => permissions)
132
134
  url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/authorize?client_id=#{@app_id}&redirect_uri=#{@callback_url}&scope=#{permissions}"
133
135
  end
134
136
 
135
- it "should generate a properly formatted OAuth code URL when permissions are requested as a string" do
137
+ it "should generate a properly formatted OAuth code URL when permissions are requested as a string" do
136
138
  permissions = ["publish_stream", "read_stream"]
137
139
  url = @oauth.url_for_oauth_code(:permissions => permissions)
138
140
  url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/authorize?client_id=#{@app_id}&redirect_uri=#{@callback_url}&scope=#{permissions.join(",")}"
139
141
  end
140
142
 
141
- it "should generate a properly formatted OAuth code URL when both permissions and callback are provided" do
143
+ it "should generate a properly formatted OAuth code URL when both permissions and callback are provided" do
142
144
  permissions = "publish_stream,read_stream"
143
145
  callback = "foo.com"
144
146
  url = @oauth.url_for_oauth_code(:callback => callback, :permissions => permissions)
145
147
  url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/authorize?client_id=#{@app_id}&redirect_uri=#{callback}&scope=#{permissions}"
146
148
  end
147
149
 
148
- it "should generate a properly formatted OAuth code URL when a display is given as a string" do
150
+ it "should generate a properly formatted OAuth code URL when a display is given as a string" do
149
151
  url = @oauth.url_for_oauth_code(:display => "page")
150
152
  url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/authorize?client_id=#{@app_id}&redirect_uri=#{@callback_url}&display=page"
151
153
  end
152
154
 
153
- it "should raise an exception if no callback is given in initialization or the call" do
155
+ it "should raise an exception if no callback is given in initialization or the call" do
154
156
  oauth2 = Koala::Facebook::OAuth.new(@app_id, @secret)
155
157
  lambda { oauth2.url_for_oauth_code }.should raise_error(ArgumentError)
156
158
  end
157
159
  end
158
-
160
+
159
161
  describe "for access token URLs" do
162
+ before :each do
163
+ # since we're just composing a URL here, we don't need to have a real code
164
+ @code ||= "test_code"
165
+ end
166
+
160
167
  # url_for_access_token
161
- it "should generate a properly formatted OAuth token URL when provided a code" do
168
+ it "should generate a properly formatted OAuth token URL when provided a code" do
162
169
  url = @oauth.url_for_access_token(@code)
163
170
  url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/access_token?client_id=#{@app_id}&redirect_uri=#{@callback_url}&client_secret=#{@secret}&code=#{@code}"
164
171
  end
165
172
 
166
- it "should generate a properly formatted OAuth token URL when provided a callback" do
173
+ it "should generate a properly formatted OAuth token URL when provided a callback" do
167
174
  callback = "foo.com"
168
175
  url = @oauth.url_for_access_token(@code, :callback => callback)
169
176
  url.should == "https://#{Koala::Facebook::GRAPH_SERVER}/oauth/access_token?client_id=#{@app_id}&redirect_uri=#{callback}&client_secret=#{@secret}&code=#{@code}"
@@ -171,44 +178,48 @@ describe "Koala::Facebook::OAuth" do
171
178
  end
172
179
  end
173
180
 
174
- describe "for fetching access tokens" do
175
- describe "get_access_token_info" do
176
- it "should properly get and parse an access token token results into a hash" do
177
- result = @oauth.get_access_token_info(@code)
178
- result.should be_a(Hash)
179
- end
180
-
181
- it "should properly include the access token results" do
182
- result = @oauth.get_access_token_info(@code)
183
- result["access_token"].should
184
- end
185
-
186
- it "should raise an error when get_access_token is called with a bad code" do
187
- lambda { @oauth.get_access_token_info("foo") }.should raise_error(Koala::Facebook::APIError)
188
- end
189
- end
190
-
191
- describe "get_access_token" do
192
- it "should use get_access_token_info to get and parse an access token token results" do
193
- result = @oauth.get_access_token(@code)
194
- result.should be_a(String)
195
- end
196
-
197
- it "should return the access token as a string" do
198
- result = @oauth.get_access_token(@code)
199
- original = @oauth.get_access_token_info(@code)
200
- result.should == original["access_token"]
201
- end
202
-
203
- it "should raise an error when get_access_token is called with a bad code" do
204
- lambda { @oauth.get_access_token("foo") }.should raise_error(Koala::Facebook::APIError)
205
- end
206
-
207
- it "should pass on any options provided to make_request" do
208
- options = {:a => 2}
209
- Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "", {}))
210
- @oauth.get_access_token(@code, options)
211
- end
181
+ describe "for fetching access tokens" do
182
+ if KoalaTest.code
183
+ describe "get_access_token_info" do
184
+ it "should properly get and parse an access token token results into a hash" do
185
+ result = @oauth.get_access_token_info(@code)
186
+ result.should be_a(Hash)
187
+ end
188
+
189
+ it "should properly include the access token results" do
190
+ result = @oauth.get_access_token_info(@code)
191
+ result["access_token"].should
192
+ end
193
+
194
+ it "should raise an error when get_access_token is called with a bad code" do
195
+ lambda { @oauth.get_access_token_info("foo") }.should raise_error(Koala::Facebook::APIError)
196
+ end
197
+ end
198
+
199
+ describe "get_access_token" do
200
+ it "should use get_access_token_info to get and parse an access token token results" do
201
+ result = @oauth.get_access_token(@code)
202
+ result.should be_a(String)
203
+ end
204
+
205
+ it "should return the access token as a string" do
206
+ result = @oauth.get_access_token(@code)
207
+ original = @oauth.get_access_token_info(@code)
208
+ result.should == original["access_token"]
209
+ end
210
+
211
+ it "should raise an error when get_access_token is called with a bad code" do
212
+ lambda { @oauth.get_access_token("foo") }.should raise_error(Koala::Facebook::APIError)
213
+ end
214
+
215
+ it "should pass on any options provided to make_request" do
216
+ options = {:a => 2}
217
+ Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "", {}))
218
+ @oauth.get_access_token(@code, options)
219
+ end
220
+ end
221
+ else
222
+ it "OAuth code tests will not be run since the code field in facebook_data.yml is blank."
212
223
  end
213
224
 
214
225
  describe "get_app_access_token_info" do
@@ -216,19 +227,19 @@ describe "Koala::Facebook::OAuth" do
216
227
  result = @oauth.get_app_access_token_info
217
228
  result.should be_a(Hash)
218
229
  end
219
-
230
+
220
231
  it "should include the access token" do
221
232
  result = @oauth.get_app_access_token_info
222
233
  result["access_token"].should
223
234
  end
224
-
235
+
225
236
  it "should pass on any options provided to make_request" do
226
237
  options = {:a => 2}
227
238
  Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "", {}))
228
239
  @oauth.get_app_access_token_info(options)
229
240
  end
230
241
  end
231
-
242
+
232
243
  describe "get_app_acess_token" do
233
244
  it "should use get_access_token_info to get and parse an access token token results" do
234
245
  result = @oauth.get_app_access_token
@@ -240,16 +251,16 @@ describe "Koala::Facebook::OAuth" do
240
251
  original = @oauth.get_app_access_token_info
241
252
  result.should == original["access_token"]
242
253
  end
243
-
254
+
244
255
  it "should pass on any options provided to make_request" do
245
256
  options = {:a => 2}
246
257
  Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "", {}))
247
258
  @oauth.get_app_access_token(options)
248
259
  end
249
260
  end
250
-
261
+
251
262
  describe "protected methods" do
252
-
263
+
253
264
  # protected methods
254
265
  # since these are pretty fundamental and pretty testable, we want to test them
255
266
 
@@ -269,9 +280,13 @@ describe "Koala::Facebook::OAuth" do
269
280
  # fetch_token_string
270
281
  # somewhat duplicative with the tests for get_access_token and get_app_access_token
271
282
  # but no harm in thoroughness
272
- it "should fetch a proper token string from Facebook when given a code" do
273
- result = @oauth.send(:fetch_token_string, :code => @code, :redirect_uri => @callback_url)
274
- result.should =~ /^access_token/
283
+ if KoalaTest.code
284
+ it "should fetch a proper token string from Facebook when given a code" do
285
+ result = @oauth.send(:fetch_token_string, :code => @code, :redirect_uri => @callback_url)
286
+ result.should =~ /^access_token/
287
+ end
288
+ else
289
+ it "fetch_token_string code test will not be run since the code field in facebook_data.yml is blank."
275
290
  end
276
291
 
277
292
  it "should fetch a proper token string from Facebook when asked for the app token" do
@@ -282,119 +297,123 @@ describe "Koala::Facebook::OAuth" do
282
297
  end
283
298
 
284
299
  describe "for exchanging session keys" do
285
- describe "with get_token_info_from_session_keys" do
286
- it "should get an array of session keys from Facebook when passed a single key" do
287
- result = @oauth.get_tokens_from_session_keys([@oauth_data["session_key"]])
288
- result.should be_an(Array)
289
- result.length.should == 1
290
- end
291
-
292
- it "should get an array of session keys from Facebook when passed multiple keys" do
293
- result = @oauth.get_tokens_from_session_keys(@oauth_data["multiple_session_keys"])
294
- result.should be_an(Array)
295
- result.length.should == 2
296
- end
297
-
298
- it "should return the original hashes" do
299
- result = @oauth.get_token_info_from_session_keys(@oauth_data["multiple_session_keys"])
300
- result[0].should be_a(Hash)
301
- end
302
-
303
- it "should properly handle invalid session keys" do
304
- result = @oauth.get_token_info_from_session_keys(["foo", "bar"])
305
- #it should return nil for each of the invalid ones
306
- result.each {|r| r.should be_nil}
307
- end
308
-
309
- it "should properly handle a mix of valid and invalid session keys" do
310
- result = @oauth.get_token_info_from_session_keys(["foo"].concat(@oauth_data["multiple_session_keys"]))
311
- # it should return nil for each of the invalid ones
312
- result.each_with_index {|r, index| index > 0 ? r.should(be_a(Hash)) : r.should(be_nil)}
313
- end
314
-
315
- it "should throw an APIError if Facebook returns an empty body (as happens for instance when the API breaks)" do
316
- @oauth.should_receive(:fetch_token_string).and_return("")
317
- lambda { @oauth.get_token_info_from_session_keys(@oauth_data["multiple_session_keys"]) }.should raise_error(Koala::Facebook::APIError)
318
- end
319
-
320
- it "should pass on any options provided to make_request" do
321
- options = {:a => 2}
322
- Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "[{}]", {}))
323
- @oauth.get_token_info_from_session_keys([], options)
324
- end
300
+ if KoalaTest.session_key
301
+ describe "with get_token_info_from_session_keys" do
302
+ it "should get an array of session keys from Facebook when passed a single key" do
303
+ result = @oauth.get_tokens_from_session_keys([KoalaTest.session_key])
304
+ result.should be_an(Array)
305
+ result.length.should == 1
306
+ end
307
+
308
+ it "should get an array of session keys from Facebook when passed multiple keys" do
309
+ result = @oauth.get_tokens_from_session_keys(@multiple_session_keys)
310
+ result.should be_an(Array)
311
+ result.length.should == 2
312
+ end
313
+
314
+ it "should return the original hashes" do
315
+ result = @oauth.get_token_info_from_session_keys(@multiple_session_keys)
316
+ result[0].should be_a(Hash)
317
+ end
318
+
319
+ it "should properly handle invalid session keys" do
320
+ result = @oauth.get_token_info_from_session_keys(["foo", "bar"])
321
+ #it should return nil for each of the invalid ones
322
+ result.each {|r| r.should be_nil}
323
+ end
324
+
325
+ it "should properly handle a mix of valid and invalid session keys" do
326
+ result = @oauth.get_token_info_from_session_keys(["foo"].concat(@multiple_session_keys))
327
+ # it should return nil for each of the invalid ones
328
+ result.each_with_index {|r, index| index > 0 ? r.should(be_a(Hash)) : r.should(be_nil)}
329
+ end
330
+
331
+ it "should throw an APIError if Facebook returns an empty body (as happens for instance when the API breaks)" do
332
+ @oauth.should_receive(:fetch_token_string).and_return("")
333
+ lambda { @oauth.get_token_info_from_session_keys(@multiple_session_keys) }.should raise_error(Koala::Facebook::APIError)
334
+ end
335
+
336
+ it "should pass on any options provided to make_request" do
337
+ options = {:a => 2}
338
+ Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "[{}]", {}))
339
+ @oauth.get_token_info_from_session_keys([], options)
340
+ end
341
+ end
342
+
343
+ describe "with get_tokens_from_session_keys" do
344
+ it "should call get_token_info_from_session_keys" do
345
+ args = @multiple_session_keys
346
+ @oauth.should_receive(:get_token_info_from_session_keys).with(args, anything).and_return([])
347
+ @oauth.get_tokens_from_session_keys(args)
348
+ end
349
+
350
+ it "should return an array of strings" do
351
+ args = @multiple_session_keys
352
+ result = @oauth.get_tokens_from_session_keys(args)
353
+ result.each {|r| r.should be_a(String) }
354
+ end
355
+
356
+ it "should properly handle invalid session keys" do
357
+ result = @oauth.get_tokens_from_session_keys(["foo", "bar"])
358
+ # it should return nil for each of the invalid ones
359
+ result.each {|r| r.should be_nil}
360
+ end
361
+
362
+ it "should properly handle a mix of valid and invalid session keys" do
363
+ result = @oauth.get_tokens_from_session_keys(["foo"].concat(@multiple_session_keys))
364
+ # it should return nil for each of the invalid ones
365
+ result.each_with_index {|r, index| index > 0 ? r.should(be_a(String)) : r.should(be_nil)}
366
+ end
367
+
368
+ it "should pass on any options provided to make_request" do
369
+ options = {:a => 2}
370
+ Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "[{}]", {}))
371
+ @oauth.get_tokens_from_session_keys([], options)
372
+ end
373
+ end
374
+
375
+ describe "get_token_from_session_key" do
376
+ it "should call get_tokens_from_session_keys when the get_token_from_session_key is called" do
377
+ key = KoalaTest.session_key
378
+ @oauth.should_receive(:get_tokens_from_session_keys).with([key], anything).and_return([])
379
+ @oauth.get_token_from_session_key(key)
380
+ end
381
+
382
+ it "should get back the access token string from get_token_from_session_key" do
383
+ result = @oauth.get_token_from_session_key(KoalaTest.session_key)
384
+ result.should be_a(String)
385
+ end
386
+
387
+ it "should be the first value in the array" do
388
+ result = @oauth.get_token_from_session_key(KoalaTest.session_key)
389
+ array = @oauth.get_tokens_from_session_keys([KoalaTest.session_key])
390
+ result.should == array[0]
391
+ end
392
+
393
+ it "should properly handle an invalid session key" do
394
+ result = @oauth.get_token_from_session_key("foo")
395
+ result.should be_nil
396
+ end
397
+
398
+ it "should pass on any options provided to make_request" do
399
+ options = {:a => 2}
400
+ Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "[{}]", {}))
401
+ @oauth.get_token_from_session_key("", options)
402
+ end
403
+ end
404
+ else
405
+ it "Session key exchange tests will not be run since the session key in facebook_data.yml is blank."
325
406
  end
326
-
327
- describe "with get_tokens_from_session_keys" do
328
- it "should call get_token_info_from_session_keys" do
329
- args = @oauth_data["multiple_session_keys"]
330
- @oauth.should_receive(:get_token_info_from_session_keys).with(args, anything).and_return([])
331
- @oauth.get_tokens_from_session_keys(args)
332
- end
333
-
334
- it "should return an array of strings" do
335
- args = @oauth_data["multiple_session_keys"]
336
- result = @oauth.get_tokens_from_session_keys(args)
337
- result.each {|r| r.should be_a(String) }
338
- end
339
-
340
- it "should properly handle invalid session keys" do
341
- result = @oauth.get_tokens_from_session_keys(["foo", "bar"])
342
- # it should return nil for each of the invalid ones
343
- result.each {|r| r.should be_nil}
344
- end
345
-
346
- it "should properly handle a mix of valid and invalid session keys" do
347
- result = @oauth.get_tokens_from_session_keys(["foo"].concat(@oauth_data["multiple_session_keys"]))
348
- # it should return nil for each of the invalid ones
349
- result.each_with_index {|r, index| index > 0 ? r.should(be_a(String)) : r.should(be_nil)}
350
- end
351
-
352
- it "should pass on any options provided to make_request" do
353
- options = {:a => 2}
354
- Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "[{}]", {}))
355
- @oauth.get_tokens_from_session_keys([], options)
356
- end
357
- end
358
-
359
- describe "get_token_from_session_key" do
360
- it "should call get_tokens_from_session_keys when the get_token_from_session_key is called" do
361
- key = @oauth_data["session_key"]
362
- @oauth.should_receive(:get_tokens_from_session_keys).with([key], anything).and_return([])
363
- @oauth.get_token_from_session_key(key)
364
- end
365
-
366
- it "should get back the access token string from get_token_from_session_key" do
367
- result = @oauth.get_token_from_session_key(@oauth_data["session_key"])
368
- result.should be_a(String)
369
- end
370
-
371
- it "should be the first value in the array" do
372
- result = @oauth.get_token_from_session_key(@oauth_data["session_key"])
373
- array = @oauth.get_tokens_from_session_keys([@oauth_data["session_key"]])
374
- result.should == array[0]
375
- end
376
-
377
- it "should properly handle an invalid session key" do
378
- result = @oauth.get_token_from_session_key("foo")
379
- result.should be_nil
380
- end
381
-
382
- it "should pass on any options provided to make_request" do
383
- options = {:a => 2}
384
- Koala.should_receive(:make_request).with(anything, anything, anything, hash_including(options)).and_return(Koala::Response.new(200, "[{}]", {}))
385
- @oauth.get_token_from_session_key("", options)
386
- end
387
- end
388
407
  end
389
-
408
+
390
409
  describe "for parsing signed requests" do
391
410
  # the signed request code is ported directly from Facebook
392
- # so we only need to test at a high level that it works
411
+ # so we only need to test at a high level that it works
393
412
  it "should throw an error if the algorithm is unsupported" do
394
413
  MultiJson.stub(:decode).and_return("algorithm" => "my fun algorithm")
395
414
  lambda { @oauth.parse_signed_request(@signed_request) }.should raise_error
396
415
  end
397
-
416
+
398
417
  it "should throw an error if the signature is invalid" do
399
418
  OpenSSL::HMAC.stub!(:hexdigest).and_return("i'm an invalid signature")
400
419
  lambda { @oauth.parse_signed_request(@signed_request) }.should raise_error