koala 1.2.1 → 1.3.0rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -0
- data/CHANGELOG +18 -0
- data/koala.gemspec +3 -3
- data/lib/koala.rb +2 -1
- data/lib/koala/graph_api.rb +21 -2
- data/lib/koala/graph_batch_api.rb +2 -1
- data/lib/koala/graph_collection.rb +5 -1
- data/lib/koala/http_service.rb +1 -2
- data/lib/koala/oauth.rb +33 -13
- data/lib/koala/rest_api.rb +1 -12
- data/lib/koala/utils.rb +7 -4
- data/lib/koala/version.rb +1 -1
- data/readme.md +9 -9
- data/spec/cases/error_spec.rb +10 -0
- data/spec/cases/graph_api_batch_spec.rb +63 -21
- data/spec/cases/graph_collection_spec.rb +23 -7
- data/spec/cases/http_service_spec.rb +4 -4
- data/spec/cases/koala_spec.rb +22 -4
- data/spec/cases/multipart_request_spec.rb +2 -2
- data/spec/cases/oauth_spec.rb +105 -35
- data/spec/cases/test_users_spec.rb +4 -4
- data/spec/cases/uploadable_io_spec.rb +1 -1
- data/spec/cases/utils_spec.rb +29 -5
- data/spec/fixtures/mock_facebook_responses.yml +36 -29
- data/spec/spec_helper.rb +3 -0
- data/spec/support/custom_matchers.rb +28 -0
- data/spec/support/graph_api_shared_examples.rb +184 -11
- data/spec/support/koala_test.rb +9 -0
- data/spec/support/rest_api_shared_examples.rb +4 -164
- metadata +26 -28
data/spec/spec_helper.rb
CHANGED
@@ -21,6 +21,9 @@ end
|
|
21
21
|
# See https://github.com/tenderlove/psych/issues/8 for more details
|
22
22
|
YAML::ENGINE.yamler = 'syck' if RUBY_VERSION == '1.9.2' && RUBY_PATCHLEVEL < 290
|
23
23
|
|
24
|
+
# load custom RSpec matchers
|
25
|
+
require 'support/custom_matchers'
|
26
|
+
|
24
27
|
# load the library
|
25
28
|
require 'koala'
|
26
29
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Verifies that two URLs are equal, ignoring the order of the query string parameters
|
2
|
+
RSpec::Matchers.define :match_url do |url|
|
3
|
+
match do |original_url|
|
4
|
+
base, query_string = url.split("?")
|
5
|
+
original_base, original_query_string = original_url.split("?")
|
6
|
+
query_hash = query_to_params(query_string)
|
7
|
+
original_query_hash = query_to_params(original_query_string)
|
8
|
+
|
9
|
+
# the base URLs need to match
|
10
|
+
base.should == original_base
|
11
|
+
|
12
|
+
# the number of parameters should match (avoid one being a subset of the other)
|
13
|
+
query_hash.values.length.should == original_query_hash.values.length
|
14
|
+
|
15
|
+
# and ensure all the keys and values match
|
16
|
+
query_hash.each_pair do |key, value|
|
17
|
+
original_query_hash[key].should == value
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def query_to_params(query_string)
|
22
|
+
query_string.split("&").inject({}) do |hash, segment|
|
23
|
+
k, v = segment.split("=")
|
24
|
+
hash[k] = v
|
25
|
+
hash
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -86,7 +86,7 @@ shared_examples_for "Koala GraphAPI" do
|
|
86
86
|
end
|
87
87
|
|
88
88
|
it "can access a user's picture" do
|
89
|
-
@api.get_picture(
|
89
|
+
@api.get_picture(KoalaTest.user2).should =~ /http[s]*\:\/\//
|
90
90
|
end
|
91
91
|
|
92
92
|
it "can access a user's picture, given a picture type" do
|
@@ -128,6 +128,63 @@ shared_examples_for "Koala GraphAPI" do
|
|
128
128
|
# the results should have an ID and a name, among other things
|
129
129
|
(result["id"] && result["name"]).should_not be_nil
|
130
130
|
end
|
131
|
+
|
132
|
+
# FQL
|
133
|
+
describe "#fql_query" do
|
134
|
+
it "makes a request to /fql" do
|
135
|
+
@api.should_receive(:get_object).with("fql", anything, anything)
|
136
|
+
@api.fql_query stub('query string')
|
137
|
+
end
|
138
|
+
|
139
|
+
it "passes a query argument" do
|
140
|
+
query = stub('query string')
|
141
|
+
@api.should_receive(:get_object).with(anything, hash_including(:q => query), anything)
|
142
|
+
@api.fql_query(query)
|
143
|
+
end
|
144
|
+
|
145
|
+
it "passes on any other arguments provided" do
|
146
|
+
args = {:a => 2}
|
147
|
+
@api.should_receive(:get_object).with(anything, hash_including(args), anything)
|
148
|
+
@api.fql_query("a query", args)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
describe "#fql_multiquery" do
|
153
|
+
it "makes a request to /fql" do
|
154
|
+
@api.should_receive(:get_object).with("fql", anything, anything)
|
155
|
+
@api.fql_multiquery 'query string'
|
156
|
+
end
|
157
|
+
|
158
|
+
it "passes a queries argument" do
|
159
|
+
queries = stub('query string')
|
160
|
+
queries_json = "some JSON"
|
161
|
+
MultiJson.stub(:encode).with(queries).and_return(queries_json)
|
162
|
+
|
163
|
+
@api.should_receive(:get_object).with(anything, hash_including(:q => queries_json), anything)
|
164
|
+
@api.fql_multiquery(queries)
|
165
|
+
end
|
166
|
+
|
167
|
+
it "simplifies the response format" do
|
168
|
+
raw_results = [
|
169
|
+
{"name" => "query1", "fql_result_set" => [1, 2, 3]},
|
170
|
+
{"name" => "query2", "fql_result_set" => [:a, :b, :c]}
|
171
|
+
]
|
172
|
+
expected_results = {
|
173
|
+
"query1" => [1, 2, 3],
|
174
|
+
"query2" => [:a, :b, :c]
|
175
|
+
}
|
176
|
+
|
177
|
+
@api.stub(:get_object).and_return(raw_results)
|
178
|
+
results = @api.fql_multiquery({:query => true})
|
179
|
+
results.should == expected_results
|
180
|
+
end
|
181
|
+
|
182
|
+
it "passes on any other arguments provided" do
|
183
|
+
args = {:a => 2}
|
184
|
+
@api.should_receive(:get_object).with(anything, hash_including(args), anything)
|
185
|
+
@api.fql_multiquery("a query", args)
|
186
|
+
end
|
187
|
+
end
|
131
188
|
end
|
132
189
|
|
133
190
|
|
@@ -211,7 +268,7 @@ shared_examples_for "Koala GraphAPI with an access token" do
|
|
211
268
|
end
|
212
269
|
|
213
270
|
|
214
|
-
describe "
|
271
|
+
describe "#put_picture" do
|
215
272
|
it "can post photos to the user's wall with an open file object" do
|
216
273
|
content_type = "image/jpg"
|
217
274
|
file = File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "beach.jpg"))
|
@@ -264,7 +321,7 @@ shared_examples_for "Koala GraphAPI with an access token" do
|
|
264
321
|
end
|
265
322
|
end
|
266
323
|
|
267
|
-
describe "
|
324
|
+
describe "#put_video" do
|
268
325
|
before :each do
|
269
326
|
@cat_movie = File.join(File.dirname(__FILE__), "..", "fixtures", "cat.m4v")
|
270
327
|
@content_type = "video/mpeg4"
|
@@ -340,10 +397,90 @@ shared_examples_for "Koala GraphAPI with an access token" do
|
|
340
397
|
end
|
341
398
|
|
342
399
|
# Page Access Token Support
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
400
|
+
describe "#get_page_access_token" do
|
401
|
+
it "gets the page object with the access_token field" do
|
402
|
+
# we can't test this live since test users (or random real users) can't be guaranteed to have pages to manage
|
403
|
+
@api.should_receive(:api).with("my_page", hash_including({:fields => "access_token"}), "get", anything)
|
404
|
+
@api.get_page_access_token("my_page")
|
405
|
+
end
|
406
|
+
|
407
|
+
it "merges in any other arguments" do
|
408
|
+
# we can't test this live since test users (or random real users) can't be guaranteed to have pages to manage
|
409
|
+
args = {:a => 3}
|
410
|
+
@api.should_receive(:api).with("my_page", hash_including(args), "get", anything)
|
411
|
+
@api.get_page_access_token("my_page", args)
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
describe "#set_app_restrictions" do
|
416
|
+
before :all do
|
417
|
+
oauth = Koala::Facebook::OAuth.new(KoalaTest.app_id, KoalaTest.secret)
|
418
|
+
app_token = oauth.get_app_access_token
|
419
|
+
@app_api = Koala::Facebook::API.new(app_token)
|
420
|
+
@restrictions = {"age_distr" => "13+"}
|
421
|
+
end
|
422
|
+
|
423
|
+
it "makes a POST to /app_id" do
|
424
|
+
@app_api.should_receive(:graph_call).with(KoalaTest.app_id, anything, "post", anything)
|
425
|
+
@app_api.set_app_restrictions(KoalaTest.app_id, @restrictions)
|
426
|
+
end
|
427
|
+
|
428
|
+
it "JSON-encodes the restrictions" do
|
429
|
+
@app_api.should_receive(:graph_call).with(anything, hash_including(:restrictions => MultiJson.encode(@restrictions)), anything, anything)
|
430
|
+
@app_api.set_app_restrictions(KoalaTest.app_id, @restrictions)
|
431
|
+
end
|
432
|
+
|
433
|
+
it "includes the other arguments" do
|
434
|
+
args = {:a => 2}
|
435
|
+
@app_api.should_receive(:graph_call).with(anything, hash_including(args), anything, anything)
|
436
|
+
@app_api.set_app_restrictions(KoalaTest.app_id, @restrictions, args)
|
437
|
+
end
|
438
|
+
|
439
|
+
it "works" do
|
440
|
+
@app_api.set_app_restrictions(KoalaTest.app_id, @restrictions).should be_true
|
441
|
+
end
|
442
|
+
end
|
443
|
+
|
444
|
+
it "can access public information via FQL" do
|
445
|
+
result = @api.fql_query("select first_name from user where uid = #{KoalaTest.user2_id}")
|
446
|
+
result.size.should == 1
|
447
|
+
result.first['first_name'].should == KoalaTest.user2_name
|
448
|
+
end
|
449
|
+
|
450
|
+
it "can access public information via FQL.multiquery" do
|
451
|
+
result = @api.fql_multiquery(
|
452
|
+
:query1 => "select first_name from user where uid = #{KoalaTest.user2_id}",
|
453
|
+
:query2 => "select first_name from user where uid = #{KoalaTest.user1_id}"
|
454
|
+
)
|
455
|
+
result.size.should == 2
|
456
|
+
result["query1"].first['first_name'].should == KoalaTest.user2_name
|
457
|
+
result["query2"].first['first_name'].should == KoalaTest.user1_name
|
458
|
+
end
|
459
|
+
|
460
|
+
it "can access protected information via FQL" do
|
461
|
+
# Tests agains the permissions fql table
|
462
|
+
|
463
|
+
# get the current user's ID
|
464
|
+
# we're sneakily using the Graph API, which should be okay since it has its own tests
|
465
|
+
g = Koala::Facebook::API.new(@token)
|
466
|
+
id = g.get_object("me", :fields => "id")["id"]
|
467
|
+
|
468
|
+
# now send a query about your permissions
|
469
|
+
result = @api.fql_query("select read_stream from permissions where uid = #{id}")
|
470
|
+
|
471
|
+
result.size.should == 1
|
472
|
+
# we've verified that you have read_stream permissions, so we can test against that
|
473
|
+
result.first["read_stream"].should == 1
|
474
|
+
end
|
475
|
+
|
476
|
+
it "can access protected information via FQL.multiquery" do
|
477
|
+
result = @api.fql_multiquery(
|
478
|
+
:query1 => "select post_id from stream where source_id = me()",
|
479
|
+
:query2 => "select fromid from comment where post_id in (select post_id from #query1)",
|
480
|
+
:query3 => "select uid, name from user where uid in (select fromid from #query2)"
|
481
|
+
)
|
482
|
+
result.size.should == 3
|
483
|
+
result.keys.should include("query1", "query2", "query3")
|
347
484
|
end
|
348
485
|
|
349
486
|
# test all methods to make sure they pass data through to the API
|
@@ -363,7 +500,11 @@ shared_examples_for "Koala GraphAPI with an access token" do
|
|
363
500
|
:put_comment => 3,
|
364
501
|
:put_like => 2, :delete_like => 2,
|
365
502
|
:search => 3,
|
503
|
+
:set_app_restrictions => 4,
|
504
|
+
:get_page_access_token => 3,
|
505
|
+
:fql_query => 3, :fql_multiquery => 3,
|
366
506
|
# methods that have special arguments
|
507
|
+
:get_comments_for_urls => [["url1", "url2"], {}],
|
367
508
|
:put_picture => ["x.jpg", "image/jpg", {}, "me"],
|
368
509
|
:put_video => ["x.mp4", "video/mpeg4", {}, "me"],
|
369
510
|
:get_objects => [["x"], {}]
|
@@ -433,9 +574,8 @@ end
|
|
433
574
|
|
434
575
|
|
435
576
|
shared_examples_for "Koala GraphAPI without an access token" do
|
436
|
-
|
437
577
|
it "can't get private data about a user" do
|
438
|
-
result = @api.get_object(
|
578
|
+
result = @api.get_object(KoalaTest.user1)
|
439
579
|
# updated_time should be a pretty fixed test case
|
440
580
|
result["updated_time"].should be_nil
|
441
581
|
end
|
@@ -445,11 +585,11 @@ shared_examples_for "Koala GraphAPI without an access token" do
|
|
445
585
|
end
|
446
586
|
|
447
587
|
it "can't access connections from users" do
|
448
|
-
lambda { @api.get_connections(
|
588
|
+
lambda { @api.get_connections(KoalaTest.user2, "friends") }.should raise_error(Koala::Facebook::APIError)
|
449
589
|
end
|
450
590
|
|
451
591
|
it "can't put an object" do
|
452
|
-
lambda { @result = @api.put_object(
|
592
|
+
lambda { @result = @api.put_object(KoalaTest.user2, "feed", :message => "Hello, world") }.should raise_error(Koala::Facebook::APIError)
|
453
593
|
end
|
454
594
|
|
455
595
|
# these are not strictly necessary as the other put methods resolve to put_object, but are here for completeness
|
@@ -478,4 +618,37 @@ shared_examples_for "Koala GraphAPI without an access token" do
|
|
478
618
|
it "can't delete a like" do
|
479
619
|
lambda { @api.delete_like("7204941866_119776748033392") }.should raise_error(Koala::Facebook::APIError)
|
480
620
|
end
|
621
|
+
|
622
|
+
# FQL_QUERY
|
623
|
+
describe "when making a FQL request" do
|
624
|
+
it "can access public information via FQL" do
|
625
|
+
result = @api.fql_query("select first_name from user where uid = #{KoalaTest.user2_id}")
|
626
|
+
result.size.should == 1
|
627
|
+
result.first['first_name'].should == KoalaTest.user2_name
|
628
|
+
end
|
629
|
+
|
630
|
+
it "can access public information via FQL.multiquery" do
|
631
|
+
result = @api.fql_multiquery(
|
632
|
+
:query1 => "select first_name from user where uid = #{KoalaTest.user2_id}",
|
633
|
+
:query2 => "select first_name from user where uid = #{KoalaTest.user1_id}"
|
634
|
+
)
|
635
|
+
result.size.should == 2
|
636
|
+
result["query1"].first['first_name'].should == KoalaTest.user2_name
|
637
|
+
result["query2"].first['first_name'].should == KoalaTest.user1_name
|
638
|
+
end
|
639
|
+
|
640
|
+
it "can't access protected information via FQL" do
|
641
|
+
lambda { @api.fql_query("select read_stream from permissions where uid = #{KoalaTest.user2_id}") }.should raise_error(Koala::Facebook::APIError)
|
642
|
+
end
|
643
|
+
|
644
|
+
it "can't access protected information via FQL.multiquery" do
|
645
|
+
lambda {
|
646
|
+
@api.fql_multiquery(
|
647
|
+
:query1 => "select post_id from stream where source_id = me()",
|
648
|
+
:query2 => "select fromid from comment where post_id in (select post_id from #query1)",
|
649
|
+
:query3 => "select uid, name from user where uid in (select fromid from #query2)"
|
650
|
+
)
|
651
|
+
}.should raise_error(Koala::Facebook::APIError)
|
652
|
+
end
|
653
|
+
end
|
481
654
|
end
|
data/spec/support/koala_test.rb
CHANGED
@@ -4,6 +4,7 @@ module KoalaTest
|
|
4
4
|
class << self
|
5
5
|
attr_accessor :oauth_token, :app_id, :secret, :app_access_token, :code, :session_key
|
6
6
|
attr_accessor :oauth_test_data, :subscription_test_data, :search_time
|
7
|
+
attr_accessor :test_user_api
|
7
8
|
end
|
8
9
|
|
9
10
|
# Test setup
|
@@ -159,10 +160,13 @@ module KoalaTest
|
|
159
160
|
|
160
161
|
# Data for testing
|
161
162
|
def self.user1
|
163
|
+
# user ID, either numeric or username
|
162
164
|
test_user? ? @live_testing_user["id"] : "koppel"
|
163
165
|
end
|
164
166
|
|
165
167
|
def self.user1_id
|
168
|
+
# numerical ID, used for FQL
|
169
|
+
# (otherwise the two IDs are interchangeable)
|
166
170
|
test_user? ? @live_testing_user["id"] : 2905623
|
167
171
|
end
|
168
172
|
|
@@ -171,10 +175,12 @@ module KoalaTest
|
|
171
175
|
end
|
172
176
|
|
173
177
|
def self.user2
|
178
|
+
# see notes for user1
|
174
179
|
test_user? ? @live_testing_friend["id"] : "lukeshepard"
|
175
180
|
end
|
176
181
|
|
177
182
|
def self.user2_id
|
183
|
+
# see notes for user1
|
178
184
|
test_user? ? @live_testing_friend["id"] : 2901279
|
179
185
|
end
|
180
186
|
|
@@ -186,4 +192,7 @@ module KoalaTest
|
|
186
192
|
"contextoptional"
|
187
193
|
end
|
188
194
|
|
195
|
+
def self.app_properties
|
196
|
+
mock_interface? ? {"desktop" => 0} : {"description" => "A test framework for Koala and its users. (#{rand(10000).to_i})"}
|
197
|
+
end
|
189
198
|
end
|
@@ -113,144 +113,17 @@ shared_examples_for "Koala RestAPI" do
|
|
113
113
|
|
114
114
|
it "throws an APIError if the result hash has an error key" do
|
115
115
|
Koala.stub(:make_request).and_return(Koala::Response.new(500, {"error_code" => "An error occurred!"}, {}))
|
116
|
-
lambda { @api.rest_call(
|
117
|
-
end
|
118
|
-
|
119
|
-
describe "when making a FQL request" do
|
120
|
-
it "calls fql.query method" do
|
121
|
-
@api.should_receive(:rest_call).with(
|
122
|
-
"fql.query", anything, anything
|
123
|
-
).and_return(Koala::Response.new(200, "2", {}))
|
124
|
-
|
125
|
-
@api.fql_query stub('query string')
|
126
|
-
end
|
127
|
-
|
128
|
-
it "passes a query argument" do
|
129
|
-
query = stub('query string')
|
130
|
-
|
131
|
-
@api.should_receive(:rest_call).with(
|
132
|
-
anything, hash_including(:query => query), anything
|
133
|
-
)
|
134
|
-
|
135
|
-
@api.fql_query(query)
|
136
|
-
end
|
137
|
-
|
138
|
-
it "passes on any other arguments provided" do
|
139
|
-
args = {:a => 2}
|
140
|
-
@api.should_receive(:rest_call).with(anything, hash_including(args), anything)
|
141
|
-
@api.fql_query("a query", args)
|
142
|
-
end
|
143
|
-
|
144
|
-
it "passes on any http options provided" do
|
145
|
-
opts = {:a => 2}
|
146
|
-
@api.should_receive(:rest_call).with(anything, anything, hash_including(opts))
|
147
|
-
@api.fql_query("a query", {}, opts)
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
describe "when making a FQL-multiquery request" do
|
152
|
-
it "calls fql.multiquery method" do
|
153
|
-
@api.should_receive(:rest_call).with(
|
154
|
-
"fql.multiquery", anything, anything
|
155
|
-
).and_return({})
|
156
|
-
|
157
|
-
@api.fql_multiquery 'query string'
|
158
|
-
end
|
159
|
-
|
160
|
-
it "passes a queries argument" do
|
161
|
-
queries = stub('query string')
|
162
|
-
queries_json = "some JSON"
|
163
|
-
MultiJson.stub(:encode).with(queries).and_return(queries_json)
|
164
|
-
|
165
|
-
@api.should_receive(:rest_call).with(
|
166
|
-
anything,
|
167
|
-
hash_including(:queries => queries_json),
|
168
|
-
anything
|
169
|
-
)
|
170
|
-
|
171
|
-
@api.fql_multiquery(queries)
|
172
|
-
end
|
173
|
-
|
174
|
-
it "simplifies the response format" do
|
175
|
-
raw_results = [
|
176
|
-
{"name" => "query1", "fql_result_set" => [1, 2, 3]},
|
177
|
-
{"name" => "query2", "fql_result_set" => [:a, :b, :c]}
|
178
|
-
]
|
179
|
-
expected_results = {
|
180
|
-
"query1" => [1, 2, 3],
|
181
|
-
"query2" => [:a, :b, :c]
|
182
|
-
}
|
183
|
-
|
184
|
-
@api.stub(:rest_call).and_return(raw_results)
|
185
|
-
results = @api.fql_multiquery({:query => true})
|
186
|
-
results.should == expected_results
|
187
|
-
end
|
188
|
-
|
189
|
-
it "passes on any other arguments provided" do
|
190
|
-
args = {:a => 2}
|
191
|
-
@api.should_receive(:rest_call).with(anything, hash_including(args), anything)
|
192
|
-
@api.fql_multiquery("a query", args)
|
193
|
-
end
|
194
|
-
|
195
|
-
it "passes on any http options provided" do
|
196
|
-
opts = {:a => 2}
|
197
|
-
@api.should_receive(:rest_call).with(anything, anything, hash_including(opts))
|
198
|
-
@api.fql_multiquery("a query", {}, opts)
|
199
|
-
end
|
116
|
+
lambda { @api.rest_call(KoalaTest.user1, {}) }.should raise_exception(Koala::Facebook::APIError)
|
200
117
|
end
|
201
118
|
end
|
202
119
|
|
203
120
|
it "can use the beta tier" do
|
204
|
-
@api.
|
121
|
+
@api.rest_call("fql.query", {:query => "select first_name from user where uid = #{KoalaTest.user2_id}"}, :beta => true)
|
205
122
|
end
|
206
123
|
end
|
207
124
|
|
208
125
|
shared_examples_for "Koala RestAPI with an access token" do
|
209
|
-
#
|
210
|
-
it "can access public information via FQL" do
|
211
|
-
result = @api.fql_query("select first_name from user where uid = #{KoalaTest.user2_id}")
|
212
|
-
result.size.should == 1
|
213
|
-
result.first['first_name'].should == KoalaTest.user2_name
|
214
|
-
end
|
215
|
-
|
216
|
-
it "can access public information via FQL.multiquery" do
|
217
|
-
result = @api.fql_multiquery(
|
218
|
-
:query1 => "select first_name from user where uid = #{KoalaTest.user2_id}",
|
219
|
-
:query2 => "select first_name from user where uid = #{KoalaTest.user1_id}"
|
220
|
-
)
|
221
|
-
result.size.should == 2
|
222
|
-
result["query1"].first['first_name'].should == KoalaTest.user2_name
|
223
|
-
result["query2"].first['first_name'].should == KoalaTest.user1_name
|
224
|
-
end
|
225
|
-
|
226
|
-
it "can access protected information via FQL" do
|
227
|
-
# Tests agains the permissions fql table
|
228
|
-
|
229
|
-
# get the current user's ID
|
230
|
-
# we're sneakily using the Graph API, which should be okay since it has its own tests
|
231
|
-
g = Koala::Facebook::API.new(@token)
|
232
|
-
id = g.get_object("me", :fields => "id")["id"]
|
233
|
-
|
234
|
-
# now send a query about your permissions
|
235
|
-
result = @api.fql_query("select read_stream from permissions where uid = #{id}")
|
236
|
-
|
237
|
-
result.size.should == 1
|
238
|
-
# we've verified that you have read_stream permissions, so we can test against that
|
239
|
-
result.first["read_stream"].should == 1
|
240
|
-
end
|
241
|
-
|
242
|
-
it "can access protected information via FQL.multiquery" do
|
243
|
-
result = @api.fql_multiquery(
|
244
|
-
:query1 => "select post_id from stream where source_id = me()",
|
245
|
-
:query2 => "select fromid from comment where post_id in (select post_id from #query1)",
|
246
|
-
:query3 => "select uid, name from user where uid in (select fromid from #query2)"
|
247
|
-
)
|
248
|
-
result.size.should == 3
|
249
|
-
result.keys.should include("query1", "query2", "query3")
|
250
|
-
end
|
251
|
-
|
252
|
-
|
253
|
-
describe ".set_app_properties" do
|
126
|
+
describe "#set_app_properties" do
|
254
127
|
it "sends Facebook the properties JSON-encoded as :properties" do
|
255
128
|
props = {:a => 2, :c => [1, 2, "d"]}
|
256
129
|
@api.should_receive(:rest_call).with(anything, hash_including(:properties => MultiJson.encode(props)), anything, anything)
|
@@ -283,46 +156,13 @@ shared_examples_for "Koala RestAPI with an access token" do
|
|
283
156
|
oauth = Koala::Facebook::OAuth.new(KoalaTest.app_id, KoalaTest.secret)
|
284
157
|
app_token = oauth.get_app_access_token
|
285
158
|
@app_api = Koala::Facebook::API.new(app_token)
|
286
|
-
@app_api.set_app_properties(
|
159
|
+
@app_api.set_app_properties(KoalaTest.app_properties).should be_true
|
287
160
|
end
|
288
161
|
end
|
289
162
|
end
|
290
163
|
|
291
164
|
|
292
165
|
shared_examples_for "Koala RestAPI without an access token" do
|
293
|
-
# FQL_QUERY
|
294
|
-
describe "when making a FQL request" do
|
295
|
-
it "can access public information via FQL" do
|
296
|
-
result = @api.fql_query("select first_name from user where uid = #{KoalaTest.user2_id}")
|
297
|
-
result.size.should == 1
|
298
|
-
result.first['first_name'].should == KoalaTest.user2_name
|
299
|
-
end
|
300
|
-
|
301
|
-
it "can access public information via FQL.multiquery" do
|
302
|
-
result = @api.fql_multiquery(
|
303
|
-
:query1 => "select first_name from user where uid = #{KoalaTest.user2_id}",
|
304
|
-
:query2 => "select first_name from user where uid = #{KoalaTest.user1_id}"
|
305
|
-
)
|
306
|
-
result.size.should == 2
|
307
|
-
result["query1"].first['first_name'].should == KoalaTest.user2_name
|
308
|
-
result["query2"].first['first_name'].should == KoalaTest.user1_name
|
309
|
-
end
|
310
|
-
|
311
|
-
it "can't access protected information via FQL" do
|
312
|
-
lambda { @api.fql_query("select read_stream from permissions where uid = #{KoalaTest.user2_id}") }.should raise_error(Koala::Facebook::APIError)
|
313
|
-
end
|
314
|
-
|
315
|
-
it "can't access protected information via FQL.multiquery" do
|
316
|
-
lambda {
|
317
|
-
@api.fql_multiquery(
|
318
|
-
:query1 => "select post_id from stream where source_id = me()",
|
319
|
-
:query2 => "select fromid from comment where post_id in (select post_id from #query1)",
|
320
|
-
:query3 => "select uid, name from user where uid in (select fromid from #query2)"
|
321
|
-
)
|
322
|
-
}.should raise_error(Koala::Facebook::APIError)
|
323
|
-
end
|
324
|
-
end
|
325
|
-
|
326
166
|
it "can't use set_app_properties" do
|
327
167
|
lambda { @api.set_app_properties(:desktop => 0) }.should raise_error(Koala::Facebook::APIError)
|
328
168
|
end
|