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.
- data/.gitignore +3 -0
- data/CHANGELOG +17 -3
- data/Gemfile +3 -0
- data/LICENSE +1 -1
- data/Manifest +5 -2
- data/Rakefile +13 -14
- data/koala.gemspec +35 -20
- data/lib/koala/graph_api.rb +183 -131
- data/lib/koala/http_services.rb +46 -55
- data/lib/koala/test_users.rb +21 -8
- data/lib/koala/uploadable_io.rb +115 -0
- data/lib/koala.rb +52 -84
- data/readme.md +19 -6
- data/spec/cases/api_base_spec.rb +101 -0
- data/spec/cases/graph_and_rest_api_spec.rb +31 -0
- data/spec/cases/graph_api_spec.rb +25 -0
- data/spec/cases/http_services/http_service_spec.rb +54 -0
- data/spec/cases/http_services/net_http_service_spec.rb +350 -0
- data/spec/cases/http_services/typhoeus_service_spec.rb +144 -0
- data/spec/cases/oauth_spec.rb +409 -0
- data/spec/cases/realtime_updates_spec.rb +184 -0
- data/spec/cases/rest_api_spec.rb +25 -0
- data/spec/{koala/test_users/test_users_tests.rb → cases/test_users_spec.rb} +46 -33
- data/spec/cases/uploadable_io_spec.rb +151 -0
- data/spec/{facebook_data.yml → fixtures/facebook_data.yml} +12 -14
- data/spec/{mock_facebook_responses.yml → fixtures/mock_facebook_responses.yml} +313 -306
- data/spec/spec_helper.rb +18 -0
- data/spec/support/graph_api_shared_examples.rb +424 -0
- data/spec/{koala → support}/live_testing_data_helper.rb +39 -42
- data/spec/{mock_http_service.rb → support/mock_http_service.rb} +94 -95
- data/spec/{koala/rest_api/rest_api_tests.rb → support/rest_api_shared_examples.rb} +43 -0
- data/spec/support/setup_mocks_or_live.rb +52 -0
- data/spec/support/uploadable_io_shared_examples.rb +76 -0
- metadata +107 -48
- data/init.rb +0 -2
- data/spec/koala/api_base_tests.rb +0 -102
- data/spec/koala/graph_and_rest_api/graph_and_rest_api_no_token_tests.rb +0 -14
- data/spec/koala/graph_and_rest_api/graph_and_rest_api_with_token_tests.rb +0 -16
- data/spec/koala/graph_api/graph_api_no_access_token_tests.rb +0 -63
- data/spec/koala/graph_api/graph_api_tests.rb +0 -86
- data/spec/koala/graph_api/graph_api_with_access_token_tests.rb +0 -154
- data/spec/koala/graph_api/graph_collection_tests.rb +0 -104
- data/spec/koala/net_http_service_tests.rb +0 -430
- data/spec/koala/oauth/oauth_tests.rb +0 -409
- data/spec/koala/realtime_updates/realtime_updates_tests.rb +0 -187
- data/spec/koala/rest_api/rest_api_no_access_token_tests.rb +0 -25
- data/spec/koala/rest_api/rest_api_with_access_token_tests.rb +0 -38
- data/spec/koala/typhoeus_service_tests.rb +0 -156
- data/spec/koala_spec.rb +0 -18
- data/spec/koala_spec_helper.rb +0 -70
- data/spec/koala_spec_without_mocks.rb +0 -19
- /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
|
-
|
|
2
|
-
include Koala
|
|
1
|
+
require 'spec_helper'
|
|
3
2
|
|
|
4
|
-
|
|
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
|
|
138
|
-
result = @test_users.befriend(@user1
|
|
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
|
|
143
|
-
|
|
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" =>
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|