koala 1.0.0.beta → 1.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.
Files changed (52) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGELOG +17 -3
  3. data/Gemfile +3 -0
  4. data/LICENSE +1 -1
  5. data/Manifest +5 -2
  6. data/Rakefile +13 -14
  7. data/koala.gemspec +35 -20
  8. data/lib/koala/graph_api.rb +183 -131
  9. data/lib/koala/http_services.rb +46 -55
  10. data/lib/koala/test_users.rb +21 -8
  11. data/lib/koala/uploadable_io.rb +115 -0
  12. data/lib/koala.rb +52 -84
  13. data/readme.md +19 -6
  14. data/spec/cases/api_base_spec.rb +101 -0
  15. data/spec/cases/graph_and_rest_api_spec.rb +31 -0
  16. data/spec/cases/graph_api_spec.rb +25 -0
  17. data/spec/cases/http_services/http_service_spec.rb +54 -0
  18. data/spec/cases/http_services/net_http_service_spec.rb +350 -0
  19. data/spec/cases/http_services/typhoeus_service_spec.rb +144 -0
  20. data/spec/cases/oauth_spec.rb +409 -0
  21. data/spec/cases/realtime_updates_spec.rb +184 -0
  22. data/spec/cases/rest_api_spec.rb +25 -0
  23. data/spec/{koala/test_users/test_users_tests.rb → cases/test_users_spec.rb} +46 -33
  24. data/spec/cases/uploadable_io_spec.rb +151 -0
  25. data/spec/{facebook_data.yml → fixtures/facebook_data.yml} +12 -14
  26. data/spec/{mock_facebook_responses.yml → fixtures/mock_facebook_responses.yml} +313 -306
  27. data/spec/spec_helper.rb +18 -0
  28. data/spec/support/graph_api_shared_examples.rb +424 -0
  29. data/spec/{koala → support}/live_testing_data_helper.rb +39 -42
  30. data/spec/{mock_http_service.rb → support/mock_http_service.rb} +94 -95
  31. data/spec/{koala/rest_api/rest_api_tests.rb → support/rest_api_shared_examples.rb} +43 -0
  32. data/spec/support/setup_mocks_or_live.rb +52 -0
  33. data/spec/support/uploadable_io_shared_examples.rb +76 -0
  34. metadata +107 -48
  35. data/init.rb +0 -2
  36. data/spec/koala/api_base_tests.rb +0 -102
  37. data/spec/koala/graph_and_rest_api/graph_and_rest_api_no_token_tests.rb +0 -14
  38. data/spec/koala/graph_and_rest_api/graph_and_rest_api_with_token_tests.rb +0 -16
  39. data/spec/koala/graph_api/graph_api_no_access_token_tests.rb +0 -63
  40. data/spec/koala/graph_api/graph_api_tests.rb +0 -86
  41. data/spec/koala/graph_api/graph_api_with_access_token_tests.rb +0 -154
  42. data/spec/koala/graph_api/graph_collection_tests.rb +0 -104
  43. data/spec/koala/net_http_service_tests.rb +0 -430
  44. data/spec/koala/oauth/oauth_tests.rb +0 -409
  45. data/spec/koala/realtime_updates/realtime_updates_tests.rb +0 -187
  46. data/spec/koala/rest_api/rest_api_no_access_token_tests.rb +0 -25
  47. data/spec/koala/rest_api/rest_api_with_access_token_tests.rb +0 -38
  48. data/spec/koala/typhoeus_service_tests.rb +0 -156
  49. data/spec/koala_spec.rb +0 -18
  50. data/spec/koala_spec_helper.rb +0 -70
  51. data/spec/koala_spec_without_mocks.rb +0 -19
  52. /data/spec/{koala/assets → fixtures}/beach.jpg +0 -0
@@ -0,0 +1,184 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Koala::Facebook::RealtimeUpdates" do
4
+ before :all do
5
+ # get oauth data
6
+ @oauth_data = $testing_data["oauth_test_data"]
7
+ @app_id = @oauth_data["app_id"]
8
+ @secret = @oauth_data["secret"]
9
+ @callback_url = @oauth_data["callback_url"]
10
+ @app_access_token = @oauth_data["app_access_token"]
11
+
12
+ # check OAuth data
13
+ unless @app_id && @secret && @callback_url && @app_access_token
14
+ raise Exception, "Must supply OAuth app id, secret, app_access_token, and callback to run live subscription tests!"
15
+ end
16
+
17
+ # get subscription data
18
+ @subscription_data = $testing_data["subscription_test_data"]
19
+ @verify_token = @subscription_data["verify_token"]
20
+ @challenge_data = @subscription_data["challenge_data"]
21
+ @subscription_path = @subscription_data["subscription_path"]
22
+
23
+ # check subscription data
24
+ unless @verify_token && @challenge_data && @subscription_path
25
+ raise Exception, "Must supply verify_token and equivalent challenge_data to run live subscription tests!"
26
+ end
27
+ end
28
+
29
+ describe "when initializing" do
30
+ # basic initialization
31
+ it "should initialize properly with an app_id and an app_access_token" do
32
+ updates = Koala::Facebook::RealtimeUpdates.new(:app_id => @app_id, :app_access_token => @app_access_token)
33
+ updates.should be_a(Koala::Facebook::RealtimeUpdates)
34
+ end
35
+
36
+ # attributes
37
+ it "should allow read access to app_id, app_access_token, and secret" do
38
+ updates = Koala::Facebook::RealtimeUpdates.new(:app_id => @app_id, :app_access_token => @app_access_token)
39
+ # this should not throw errors
40
+ updates.app_id && updates.app_access_token && updates.secret
41
+ end
42
+
43
+ it "should not allow write access to app_id" do
44
+ updates = Koala::Facebook::RealtimeUpdates.new(:app_id => @app_id, :app_access_token => @app_access_token)
45
+ # this should not throw errors
46
+ lambda { updates.app_id = 2 }.should raise_error(NoMethodError)
47
+ end
48
+
49
+ it "should not allow write access to app_access_token" do
50
+ updates = Koala::Facebook::RealtimeUpdates.new(:app_id => @app_id, :app_access_token => @app_access_token)
51
+ # this should not throw errors
52
+ lambda { updates.app_access_token = 2 }.should raise_error(NoMethodError)
53
+ end
54
+
55
+ it "should not allow write access to secret" do
56
+ updates = Koala::Facebook::RealtimeUpdates.new(:app_id => @app_id, :app_access_token => @app_access_token)
57
+ # this should not throw errors
58
+ lambda { updates.secret = 2 }.should raise_error(NoMethodError)
59
+ end
60
+
61
+ # init with secret / fetching the token
62
+ it "should initialize properly with an app_id and a secret" do
63
+ updates = Koala::Facebook::RealtimeUpdates.new(:app_id => @app_id, :secret => @secret)
64
+ updates.should be_a(Koala::Facebook::RealtimeUpdates)
65
+ end
66
+
67
+ it "should fetch an app_token from Facebook when provided an app_id and a secret" do
68
+ updates = Koala::Facebook::RealtimeUpdates.new(:app_id => @app_id, :secret => @secret)
69
+ updates.app_access_token.should_not be_nil
70
+ end
71
+
72
+ it "should use the OAuth class to fetch a token when provided an app_id and a secret" do
73
+ oauth = Koala::Facebook::OAuth.new(@app_id, @secret)
74
+ token = oauth.get_app_access_token
75
+ oauth.should_receive(:get_app_access_token).and_return(token)
76
+ Koala::Facebook::OAuth.should_receive(:new).with(@app_id, @secret).and_return(oauth)
77
+ updates = Koala::Facebook::RealtimeUpdates.new(:app_id => @app_id, :secret => @secret)
78
+ end
79
+ end
80
+
81
+ describe "when used" do
82
+ before :each do
83
+ @updates = Koala::Facebook::RealtimeUpdates.new(:app_id => @app_id, :secret => @secret)
84
+ end
85
+
86
+ it "should send a subscription request to a valid server" do
87
+ result = @updates.subscribe("user", "name", @subscription_path, @verify_token)
88
+ result.should be_true
89
+ end
90
+
91
+ it "should send a subscription request to a valid server" do
92
+ result = @updates.subscribe("user", "name", @subscription_path, @verify_token)
93
+ result.should be_true
94
+ end
95
+
96
+ it "should send a subscription request to an invalid path on a valid server" do
97
+ lambda { result = @updates.subscribe("user", "name", @subscription_path + "foo", @verify_token) }.should raise_exception(Koala::Facebook::APIError)
98
+ end
99
+
100
+ it "should fail to send a subscription request to an invalid server" do
101
+ lambda { @updates.subscribe("user", "name", "foo", @verify_token) }.should raise_exception(Koala::Facebook::APIError)
102
+ end
103
+
104
+ it "should unsubscribe a valid individual object successfully" do
105
+ @updates.unsubscribe("user").should be_true
106
+ end
107
+
108
+ it "should unsubscribe all subscriptions successfully" do
109
+ @updates.unsubscribe.should be_true
110
+ end
111
+
112
+ it "should fail when an invalid object is provided to unsubscribe" do
113
+ lambda { @updates.unsubscribe("kittens") }.should raise_error(Koala::Facebook::APIError)
114
+ end
115
+
116
+ it "should is subscriptions properly" do
117
+ @updates.list_subscriptions.should be_a(Array)
118
+ end
119
+ end # describe "when used"
120
+
121
+ describe "when meeting challenge" do
122
+ it "should return false if hub.mode isn't subscribe" do
123
+ params = {'hub.mode' => 'not subscribe'}
124
+ Koala::Facebook::RealtimeUpdates.meet_challenge(params).should be_false
125
+ end
126
+
127
+ it "should return false if not given a verify_token or block" do
128
+ params = {'hub.mode' => 'subscribe'}
129
+ Koala::Facebook::RealtimeUpdates.meet_challenge(params).should be_false
130
+ end
131
+
132
+ describe "and mode is 'subscribe'" do
133
+ before(:each) do
134
+ @params = {'hub.mode' => 'subscribe'}
135
+ end
136
+
137
+ describe "and a token is given" do
138
+ before(:each) do
139
+ @token = 'token'
140
+ @params['hub.verify_token'] = @token
141
+ end
142
+
143
+ it "should return false if the given verify token doesn't match" do
144
+ Koala::Facebook::RealtimeUpdates.meet_challenge(@params, @token + '1').should be_false
145
+ end
146
+
147
+ it "should return the challenge if the given verify token matches" do
148
+ @params['hub.challenge'] = 'challenge val'
149
+ Koala::Facebook::RealtimeUpdates.meet_challenge(@params, @token).should == @params['hub.challenge']
150
+ end
151
+ end
152
+
153
+ describe "and a block is given" do
154
+ it "should give the block the token as a parameter" do
155
+ Koala::Facebook::RealtimeUpdates.meet_challenge(@params)do |token|
156
+ token.should == @token
157
+ end
158
+ end
159
+
160
+ it "should return false if the given block return false" do
161
+ Koala::Facebook::RealtimeUpdates.meet_challenge(@params)do |token|
162
+ false
163
+ end.should be_false
164
+ end
165
+
166
+ it "should return false if the given block returns nil" do
167
+ Koala::Facebook::RealtimeUpdates.meet_challenge(@params)do |token|
168
+ nil
169
+ end.should be_false
170
+ end
171
+
172
+ it "should return the challenge if the given block returns true" do
173
+ @params['hub.challenge'] = 'challenge val'
174
+ Koala::Facebook::RealtimeUpdates.meet_challenge(@params) do |token|
175
+ true
176
+ end.should be_true
177
+ end
178
+ end
179
+
180
+ end # describe "and mode is subscribe"
181
+
182
+ end # describe "when meeting challenge"
183
+
184
+ end # describe
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Koala::Facebook::RestAPI" do
4
+
5
+ context "without an access token" do
6
+ before :each do
7
+ @api = Koala::Facebook::RestAPI.new
8
+ end
9
+
10
+ it_should_behave_like "Koala RestAPI"
11
+ it_should_behave_like "Koala RestAPI without an access token"
12
+ end
13
+
14
+ context "with an access token" do
15
+ include LiveTestingDataHelper
16
+
17
+ before :each do
18
+ @api = Koala::Facebook::RestAPI.new(@token)
19
+ end
20
+
21
+ it_should_behave_like "Koala RestAPI"
22
+ it_should_behave_like "Koala RestAPI with an access token"
23
+ end
24
+
25
+ end
@@ -1,7 +1,7 @@
1
- class TestUsersTests < Test::Unit::TestCase
2
- include Koala
1
+ require 'spec_helper'
3
2
 
4
- describe "Koala TestUsers with access token" do
3
+ describe "Koala::Facebook::TestUsers" do
4
+ context "with access token" do
5
5
  include LiveTestingDataHelper
6
6
 
7
7
  before :all do
@@ -22,28 +22,28 @@ class TestUsersTests < Test::Unit::TestCase
22
22
  describe "when initializing" do
23
23
  # basic initialization
24
24
  it "should initialize properly with an app_id and an app_access_token" do
25
- test_users = Facebook::TestUsers.new(:app_id => @app_id, :app_access_token => @app_access_token)
26
- test_users.should be_a(Facebook::TestUsers)
25
+ test_users = Koala::Facebook::TestUsers.new(:app_id => @app_id, :app_access_token => @app_access_token)
26
+ test_users.should be_a(Koala::Facebook::TestUsers)
27
27
  end
28
28
 
29
29
  # init with secret / fetching the token
30
30
  it "should initialize properly with an app_id and a secret" do
31
- test_users = Facebook::TestUsers.new(:app_id => @app_id, :secret => @secret)
32
- test_users.should be_a(Facebook::TestUsers)
31
+ test_users = Koala::Facebook::TestUsers.new(:app_id => @app_id, :secret => @secret)
32
+ test_users.should be_a(Koala::Facebook::TestUsers)
33
33
  end
34
34
 
35
35
  it "should use the OAuth class to fetch a token when provided an app_id and a secret" do
36
- oauth = Facebook::OAuth.new(@app_id, @secret)
36
+ oauth = Koala::Facebook::OAuth.new(@app_id, @secret)
37
37
  token = oauth.get_app_access_token
38
38
  oauth.should_receive(:get_app_access_token).and_return(token)
39
- Facebook::OAuth.should_receive(:new).with(@app_id, @secret).and_return(oauth)
40
- test_users = Facebook::TestUsers.new(:app_id => @app_id, :secret => @secret)
39
+ Koala::Facebook::OAuth.should_receive(:new).with(@app_id, @secret).and_return(oauth)
40
+ test_users = Koala::Facebook::TestUsers.new(:app_id => @app_id, :secret => @secret)
41
41
  end
42
42
  end
43
43
 
44
44
  describe "when used without network" do
45
45
  before :each do
46
- @test_users = Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
46
+ @test_users = Koala::Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
47
47
  end
48
48
 
49
49
  # TEST USER MANAGEMENT
@@ -62,12 +62,12 @@ class TestUsersTests < Test::Unit::TestCase
62
62
  end
63
63
 
64
64
  it "should accept permissions as a string" do
65
- @test_users.graph_api.should_receive(:graph_call).with(anything, hash_including("permissions" => "read_stream,publish_stream"), anything)
65
+ @test_users.graph_api.should_receive(:graph_call).with(anything, hash_including("permissions" => "read_stream,publish_stream"), anything, anything)
66
66
  result = @test_users.create(true, "read_stream,publish_stream")
67
67
  end
68
68
 
69
69
  it "should accept permissions as an array" do
70
- @test_users.graph_api.should_receive(:graph_call).with(anything, hash_including("permissions" => "read_stream,publish_stream"), anything)
70
+ @test_users.graph_api.should_receive(:graph_call).with(anything, hash_including("permissions" => "read_stream,publish_stream"), anything, anything)
71
71
  result = @test_users.create(true, ["read_stream", "publish_stream"])
72
72
  end
73
73
 
@@ -78,6 +78,18 @@ class TestUsersTests < Test::Unit::TestCase
78
78
  (result["id"] && result["access_token"] && result["login_url"]).should
79
79
  end
80
80
 
81
+ it "lets you specify other graph arguments, like uid and access token" do
82
+ args = {:uid => "some test user ID", :owner_access_token => "some owner access token"}
83
+ @test_users.graph_api.should_receive(:graph_call).with(anything, hash_including(args), anything, anything)
84
+ @test_users.create(true, nil, args)
85
+ end
86
+
87
+ it "lets you specify http options that get passed through to the graph call" do
88
+ options = {:some_http_option => true}
89
+ @test_users.graph_api.should_receive(:graph_call).with(anything, anything, anything, options)
90
+ @test_users.create(true, nil, {}, options)
91
+ end
92
+
81
93
  describe "with a user to delete" do
82
94
  before :each do
83
95
  @user1 = @test_users.create(true, "read_stream")
@@ -85,10 +97,8 @@ class TestUsersTests < Test::Unit::TestCase
85
97
  end
86
98
 
87
99
  after :each do
88
- print "\nCleaning up test users..."
89
100
  @test_users.delete(@user1) if @user1
90
101
  @test_users.delete(@user2) if @user2
91
- puts "done."
92
102
  end
93
103
 
94
104
  it "should delete a user by id" do
@@ -133,31 +143,39 @@ class TestUsersTests < Test::Unit::TestCase
133
143
  (first_user["id"] && first_user["access_token"] && first_user["login_url"]).should
134
144
  (second_user["id"] && second_user["access_token"] && second_user["login_url"]).should
135
145
  end
136
-
137
- it "should make two users into friends by id" do
138
- result = @test_users.befriend(@user1['id'], @user2['id'])
146
+
147
+ it "should make two users into friends with string hashes" do
148
+ result = @test_users.befriend(@user1, @user2)
139
149
  result.should be_true
140
150
  end
141
-
142
- it "should make two users into friends by hash" do
143
- result = @test_users.befriend(@user1, @user2)
151
+
152
+ it "should make two users into friends with symbol hashes" do
153
+ new_user_1 = {}
154
+ @user1.each_pair {|k, v| new_user_1[k.to_sym] = v}
155
+ new_user_2 = {}
156
+ @user2.each_pair {|k, v| new_user_2[k.to_sym] = v}
157
+
158
+ result = @test_users.befriend(new_user_1, new_user_2)
144
159
  result.should be_true
160
+ end
161
+
162
+ it "should not accept user IDs anymore" do
163
+ lambda { @test_users.befriend(@user1["id"], @user2["id"]) }.should raise_exception
145
164
  end
146
-
147
165
  end # with existing users
148
166
 
149
167
  end # when used without network
150
168
 
151
169
  describe "when creating a network of friends" do
152
170
  before :each do
153
- @test_users = Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
171
+ @test_users = Koala::Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
154
172
  @network = []
155
173
 
156
174
  if @is_mock
157
175
  id_counter = 999999900
158
176
  @test_users.stub!(:create).and_return do
159
177
  id_counter += 1
160
- {"id" => id_counter, "access_token" => "119908831367602|o3wswWQ88LYjEC9-ukR_gjRIOMw.", "login_url" => "https://www.facebook.com/platform/test_account.."}
178
+ {"id" => id_counter, "access_token" => @token, "login_url" => "https://www.facebook.com/platform/test_account.."}
161
179
  end
162
180
  @test_users.stub!(:befriend).and_return(true)
163
181
  @test_users.stub!(:delete).and_return(true)
@@ -166,17 +184,13 @@ class TestUsersTests < Test::Unit::TestCase
166
184
 
167
185
  describe "tests that create users" do
168
186
  before :each do
169
- print "\nCleaning up test user network..."
170
- test_users = Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
187
+ test_users = Koala::Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
171
188
  test_users.delete_all
172
- puts "done!"
173
189
  end
174
190
 
175
191
  after :each do
176
- print "\nCleaning up test user network..."
177
- test_users = Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
192
+ test_users = Koala::Facebook::TestUsers.new({:app_access_token => @app_access_token, :app_id => @app_id})
178
193
  test_users.delete_all
179
- puts "done!"
180
194
  end
181
195
 
182
196
  it "should create a 5 person network" do
@@ -203,6 +217,5 @@ class TestUsersTests < Test::Unit::TestCase
203
217
  end
204
218
 
205
219
  end # when creating network
206
-
207
- end # describe Koala TestUsers
208
- end # class
220
+ end
221
+ end # describe Koala TestUsers
@@ -0,0 +1,151 @@
1
+ # fake MIME::Types
2
+ module Koala::MIME
3
+ module Types
4
+ def self.type_for(type)
5
+ # this should be faked out in tests
6
+ nil
7
+ end
8
+ end
9
+ end
10
+
11
+ describe "Koala::UploadableIO" do
12
+ describe "the constructor" do
13
+ describe "when given a file path" do
14
+ before(:each) do
15
+ @koala_io_params = [File.open(BEACH_BALL_PATH)]
16
+ end
17
+
18
+ describe "and a content type" do
19
+ before :each do
20
+ @koala_io_params.concat([stub("image/jpg")])
21
+ end
22
+
23
+ it "should return an UploadIO with the same file path" do
24
+ stub_path = @koala_io_params[0] = "/stub/path/to/file"
25
+ Koala::UploadableIO.new(*@koala_io_params).io_or_path.should == stub_path
26
+ end
27
+
28
+ it "should return an UploadIO with the same content type" do
29
+ stub_type = @koala_io_params[1] = stub('Content Type')
30
+ Koala::UploadableIO.new(*@koala_io_params).content_type.should == stub_type
31
+ end
32
+ end
33
+
34
+ describe "and no content type" do
35
+ it_should_behave_like "determining a mime type"
36
+ end
37
+ end
38
+
39
+ describe "when given a File object" do
40
+ before(:each) do
41
+ @koala_io_params = [File.open(BEACH_BALL_PATH)]
42
+ end
43
+
44
+ describe "and a content type" do
45
+ before :each do
46
+ @koala_io_params.concat(["image/jpg"])
47
+ end
48
+
49
+ it "should return an UploadIO with the same io" do
50
+ Koala::UploadableIO.new(*@koala_io_params).io_or_path.should == @koala_io_params[0]
51
+ end
52
+
53
+ it "should return an UplaodIO with the same content_type" do
54
+ content_stub = @koala_io_params[1] = stub('Content Type')
55
+ Koala::UploadableIO.new(*@koala_io_params).content_type.should == content_stub
56
+ end
57
+ end
58
+
59
+ describe "and no content type" do
60
+ it_should_behave_like "determining a mime type"
61
+ end
62
+ end
63
+
64
+ describe "when given a Rails 3 ActionDispatch::Http::UploadedFile" do
65
+ before(:each) do
66
+ @tempfile = stub('Tempfile', :path => "foo")
67
+ @uploaded_file = stub('ActionDispatch::Http::UploadedFile',
68
+ :content_type => true,
69
+ :tempfile => @tempfile
70
+ )
71
+
72
+ @tempfile.stub!(:respond_to?).with(:path).and_return(true)
73
+ end
74
+
75
+ it "should get the content type via the content_type method" do
76
+ expected_content_type = stub('Content Type')
77
+ @uploaded_file.should_receive(:content_type).and_return(expected_content_type)
78
+ Koala::UploadableIO.new(@uploaded_file).content_type.should == expected_content_type
79
+ end
80
+
81
+ it "should get the path from the tempfile associated with the UploadedFile" do
82
+ expected_path = stub('Tempfile')
83
+ @tempfile.should_receive(:path).and_return(expected_path)
84
+ Koala::UploadableIO.new(@uploaded_file).io_or_path.should == expected_path
85
+ end
86
+ end
87
+
88
+ describe "when given a Sinatra file parameter hash" do
89
+ before(:each) do
90
+ @file_hash = {
91
+ :type => "type",
92
+ :tempfile => "Tempfile"
93
+ }
94
+ end
95
+
96
+ it "should get the content type from the :type key" do
97
+ expected_content_type = stub('Content Type')
98
+ @file_hash[:type] = expected_content_type
99
+
100
+ uploadable = Koala::UploadableIO.new(@file_hash)
101
+ uploadable.content_type.should == expected_content_type
102
+ end
103
+
104
+ it "should get the io_or_path from the :tempfile key" do
105
+ expected_file = stub('File')
106
+ @file_hash[:tempfile] = expected_file
107
+
108
+ uploadable = Koala::UploadableIO.new(@file_hash)
109
+ uploadable.io_or_path.should == expected_file
110
+ end
111
+ end
112
+
113
+ describe "for files with with recognizable MIME types" do
114
+ # what that means is tested below
115
+ it "should accept a file object alone" do
116
+ params = [BEACH_BALL_PATH]
117
+ lambda { Koala::UploadableIO.new(*params) }.should_not raise_exception(Koala::KoalaError)
118
+ end
119
+
120
+ it "should accept a file path alone" do
121
+ params = [BEACH_BALL_PATH]
122
+ lambda { Koala::UploadableIO.new(*params) }.should_not raise_exception(Koala::KoalaError)
123
+ end
124
+ end
125
+ end
126
+
127
+ describe "getting an UploadableIO" do
128
+ before(:each) do
129
+ @upload_io = stub("UploadIO")
130
+ UploadIO.stub!(:new).with(anything, anything, anything).and_return(@upload_io)
131
+ end
132
+
133
+ it "should call the constructor with the content type, file name, and a dummy file name" do
134
+ UploadIO.should_receive(:new).with(BEACH_BALL_PATH, "content/type", anything).and_return(@upload_io)
135
+ Koala::UploadableIO.new(BEACH_BALL_PATH, "content/type").to_upload_io.should == @upload_io
136
+ end
137
+ end
138
+
139
+ describe "getting a file" do
140
+ it "should return the File if initialized with a file" do
141
+ f = File.new(BEACH_BALL_PATH)
142
+ Koala::UploadableIO.new(f).to_file.should == f
143
+ end
144
+
145
+ it "should open up and return a file corresponding to the path if io_or_path is a path" do
146
+ result = stub("File")
147
+ File.should_receive(:open).with(BEACH_BALL_PATH).and_return(result)
148
+ Koala::UploadableIO.new(BEACH_BALL_PATH).to_file.should == result
149
+ end
150
+ end
151
+ end # describe UploadableIO
@@ -35,23 +35,21 @@ oauth_test_data:
35
35
  # note: I've revoked the offline access for security reasons, so you can't make calls against this :)
36
36
  fbs_119908831367602: '"access_token=119908831367602|08170230801eb225068e7a70-2905623|Q3LDCYYF8CX9cstxnZLsxiR0nwg.&expires=0&secret=78abaee300b392e275072a9f2727d436&session_key=08170230801eb225068e7a70-2905623&sig=423b8aa4b6fa1f9a571955f8e929d567&uid=2905623"'
37
37
 
38
- # These values will work out of the box
39
- # They're from Facebook's example at http://developers.facebook.com/docs/authentication/canvas
38
+ # These values from the OAuth Playground (see above) will work out of the box
40
39
  # You can update this to live data if desired
41
40
  # request_secret is optional and will fall back to the secret above if absent
42
- request_secret: "secret"
43
- signed_request: "vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsIjAiOiJwYXlsb2FkIn0"
44
- signed_request_result:
45
- "0": payload
46
- algorithm: HMAC-SHA256
47
- # signed params
48
- # examples from http://developers.facebook.com/docs/authentication/canvas/encryption_proposal
49
- signed_params: t63pZQ4Q3ZTHJt0hOsKrY2pb28xRlduW0pg4lL_Zhl4.eyJhbGdvcml0aG0iOiJBRVMtMjU2LUNCQyBITUFDLVNIQTI1NiIsImlzc3VlZF9hdCI6MTI4NzYwMTk4OCwiaXYiOiJmRExKQ1cteWlYbXVOYTI0ZVNhckpnIiwicGF5bG9hZCI6IllHeW00cG9Rbk1UckVnaUFPa0ZUVkk4NWxsNVJ1VWlFbC1JZ3FmeFRPVEhRTkl2VlZJOFk4a1Z1T29lS2FXT2Vhc3NXRlRFdjBRZ183d0NDQkVlbjdsVUJCemxGSjFWNjNISjNBZjBTSW5nY3hXVEo3TDZZTGF0TW13WGdEQXZXbjVQc2ZxeldrNG1sOWg5RExuWXB0V0htREdMNmlCaU9oTjdXeUk3cDZvRXBWcmlGdUp3X2NoTG9QYjhhM3ZHRG5vVzhlMlN4eDA2QTJ4MnhraWFwdmcifQ
50
- signed_params_secret: 13750c9911fec5865d01f3bd00bdf4db
41
+ signed_params: "zWRm0gd5oHW_jzXP_WA9CirO7c5CLHotn-SKRqH2NmU.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImV4cGlyZXMiOjEzMDE5MjIwMDAsImlzc3VlZF9hdCI6MTMwMTkxNzI5OSwib2F1dGhfdG9rZW4iOiIxMTk5MDg4MzEzNjc2MDJ8Mi56VkZfNk5yTUVMSHVKYTRnSVU5dEt3X18uMzYwMC4xMzAxOTIyMDAwLTI5MDU2MjN8emdxUHNyMkJHOUxvT0s5a2VrR2dSVVJaeDBrIiwidXNlciI6eyJjb3VudHJ5IjoiZGUiLCJsb2NhbGUiOiJkZV9ERSIsImFnZSI6eyJtaW4iOjIxfX0sInVzZXJfaWQiOiIyOTA1NjIzIn0"
51
42
  signed_params_result:
52
- access_token: "101244219942650|2.wdrSr7KyE_VwQ0fjwOfW9A__.3600.1287608400-499091902|XzxMQd-_4tjlC2VEgide4rmg6LI"
53
- expires_in: 6412
54
- user_id: "499091902"
43
+ expires: 1301922000
44
+ algorithm: HMAC-SHA256
45
+ user_id: "2905623"
46
+ oauth_token: 119908831367602|2.zVF_6NrMELHuJa4gIU9tKw__.3600.1301922000-2905623|zgqPsr2BG9LoOK9kekGgRURZx0k
47
+ user:
48
+ country: de
49
+ locale: de_DE
50
+ age:
51
+ min: 21
52
+ issued_at: 1301917299
55
53
 
56
54
  subscription_test_data:
57
55
  subscription_path: http://oauth.twoalex.com/subscriptions