djanowski-facebooker 1.0.4 → 1.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +3 -0
- data/generators/xd_receiver/templates/xd_receiver.html +10 -0
- data/generators/xd_receiver/xd_receiver_generator.rb +9 -0
- data/lib/facebooker/models/user.rb +1 -1
- data/lib/facebooker/rails/controller.rb +31 -4
- data/lib/facebooker/rails/helpers.rb +32 -5
- data/lib/facebooker/rails/helpers/fb_connect.rb +34 -0
- data/lib/facebooker/rails/publisher.rb +13 -3
- data/test/publisher_test.rb +22 -0
- data/test/rails_integration_test.rb +108 -13
- data/test/user_test.rb +17 -0
- metadata +4 -1
data/Manifest.txt
CHANGED
@@ -37,6 +37,8 @@ generators/facebook_scaffold/templates/view_new.fbml.erb
|
|
37
37
|
generators/facebook_scaffold/templates/view_new.html.erb
|
38
38
|
generators/facebook_scaffold/templates/view_show.fbml.erb
|
39
39
|
generators/facebook_scaffold/templates/view_show.html.erb
|
40
|
+
generators/xd_receiver/xd_receiver_generator.rb
|
41
|
+
generators/xd_receiver/templates/xd_receiver.html
|
40
42
|
init.rb
|
41
43
|
install.rb
|
42
44
|
lib/facebooker.rb
|
@@ -75,6 +77,7 @@ lib/facebooker/rails/facebook_request_fix.rb
|
|
75
77
|
lib/facebooker/rails/facebook_session_handling.rb
|
76
78
|
lib/facebooker/rails/facebook_url_rewriting.rb
|
77
79
|
lib/facebooker/rails/helpers.rb
|
80
|
+
lib/facebooker/rails/helpers/fb_connect.rb
|
78
81
|
lib/facebooker/rails/profile_publisher_extensions.rb
|
79
82
|
lib/facebooker/rails/publisher.rb
|
80
83
|
lib/facebooker/rails/routing.rb
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" >
|
4
|
+
<head>
|
5
|
+
<title>Cross-Domain Receiver Page</title>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.debug.js" type="text/javascript"></script>
|
9
|
+
</body>
|
10
|
+
</html>
|
@@ -10,7 +10,7 @@ module Facebooker
|
|
10
10
|
include Model
|
11
11
|
attr_accessor :message, :time, :status_id
|
12
12
|
end
|
13
|
-
FIELDS = [:status, :political, :pic_small, :name, :quotes, :is_app_user, :tv, :profile_update_time, :meeting_sex, :hs_info, :timezone, :relationship_status, :hometown_location, :about_me, :wall_count, :significant_other_id, :pic_big, :music, :uid, :work_history, :sex, :religion, :notes_count, :activities, :pic_square, :movies, :has_added_app, :education_history, :birthday, :first_name, :meeting_for, :last_name, :interests, :current_location, :pic, :books, :affiliations]
|
13
|
+
FIELDS = [:status, :political, :pic_small, :name, :quotes, :is_app_user, :tv, :profile_update_time, :meeting_sex, :hs_info, :timezone, :relationship_status, :hometown_location, :about_me, :wall_count, :significant_other_id, :pic_big, :music, :uid, :work_history, :sex, :religion, :notes_count, :activities, :pic_square, :movies, :has_added_app, :education_history, :birthday, :first_name, :meeting_for, :last_name, :interests, :current_location, :pic, :books, :affiliations, :locale, :profile_url, :proxied_email]
|
14
14
|
STANDARD_FIELDS = [:uid, :first_name, :last_name, :name, :timezone, :birthday, :sex, :affiliations, :locale, :profile_url]
|
15
15
|
attr_accessor :id, :session
|
16
16
|
populating_attr_accessor *FIELDS
|
@@ -23,8 +23,7 @@ module Facebooker
|
|
23
23
|
|
24
24
|
|
25
25
|
def set_facebook_session
|
26
|
-
|
27
|
-
returning session_set = session_already_secured? || secure_with_facebook_params! ||secure_with_token! do
|
26
|
+
returning session_set = session_already_secured? || secure_with_facebook_params! || secure_with_cookies! || secure_with_token! do
|
28
27
|
if session_set
|
29
28
|
capture_facebook_friends_if_available!
|
30
29
|
Session.current = facebook_session
|
@@ -72,7 +71,35 @@ module Facebooker
|
|
72
71
|
!session[:facebook_session].blank? && (params[:fb_sig_session_key].blank? || session[:facebook_session].session_key == facebook_params[:session_key])
|
73
72
|
end
|
74
73
|
end
|
75
|
-
|
74
|
+
|
75
|
+
def clear_fb_cookies!
|
76
|
+
fb_cookie_names.each {|name| cookies[name] = nil }
|
77
|
+
end
|
78
|
+
|
79
|
+
def fb_cookie_prefix
|
80
|
+
Facebooker.api_key+"_"
|
81
|
+
end
|
82
|
+
|
83
|
+
def fb_cookie_names
|
84
|
+
fb_cookie_names = cookies.keys.select{|k| k.starts_with?(fb_cookie_prefix)}
|
85
|
+
end
|
86
|
+
|
87
|
+
def secure_with_cookies!
|
88
|
+
parsed = {}
|
89
|
+
|
90
|
+
fb_cookie_names.each { |key| parsed[key[fb_cookie_prefix.size,key.size]] = cookies[key] }
|
91
|
+
|
92
|
+
#returning gracefully if the cookies aren't set or have expired
|
93
|
+
return unless parsed['session_key'] && parsed['user'] && parsed['expires'] && parsed['ss']
|
94
|
+
return unless Time.at(parsed['expires'].to_f) > Time.now
|
95
|
+
|
96
|
+
#if we have the unexpired cookies, we'll throw an exception if the sig doesn't verify
|
97
|
+
verify_signature(parsed,cookies[Facebooker.api_key])
|
98
|
+
|
99
|
+
@facebook_session = new_facebook_session
|
100
|
+
@facebook_session.secure_with!(parsed['session_key'],parsed['user'],parsed['expires'],parsed['ss'])
|
101
|
+
end
|
102
|
+
|
76
103
|
def secure_with_token!
|
77
104
|
if params['auth_token']
|
78
105
|
@facebook_session = new_facebook_session
|
@@ -142,7 +169,7 @@ module Facebooker
|
|
142
169
|
raw_string = facebook_sig_params.map{ |*args| args.join('=') }.sort.join
|
143
170
|
actual_sig = Digest::MD5.hexdigest([raw_string, Facebooker::Session.secret_key].join)
|
144
171
|
raise Facebooker::Session::IncorrectSignature if actual_sig != expected_signature
|
145
|
-
raise Facebooker::Session::SignatureTooOld if Time.at(facebook_sig_params['time'].to_f) < earliest_valid_session
|
172
|
+
raise Facebooker::Session::SignatureTooOld if facebook_sig_params['time'] && Time.at(facebook_sig_params['time'].to_f) < earliest_valid_session
|
146
173
|
true
|
147
174
|
end
|
148
175
|
|
@@ -8,6 +8,7 @@ module Facebooker
|
|
8
8
|
#
|
9
9
|
module Helpers
|
10
10
|
|
11
|
+
include Facebooker::Rails::Helpers::FbConnect
|
11
12
|
|
12
13
|
# Create an fb:dialog
|
13
14
|
# id must be a unique name e.g. "my_dialog"
|
@@ -111,7 +112,7 @@ module Facebooker
|
|
111
112
|
# <em> Note: </em> I don't think the block is used here.
|
112
113
|
def fb_multi_friend_selector(message,options={},&block)
|
113
114
|
options = options.dup
|
114
|
-
tag("fb:multi-friend-selector",stringify_vals(
|
115
|
+
tag("fb:multi-friend-selector",stringify_vals({:showborder=>false,:actiontext=>message,:max=>20}.merge(options)))
|
115
116
|
end
|
116
117
|
|
117
118
|
# Render a condensed <fb:multi-friend-selector> with the passed in welcome message
|
@@ -196,7 +197,7 @@ module Facebooker
|
|
196
197
|
options.transform_keys!(FB_NAME_OPTION_KEYS_TO_TRANSFORM)
|
197
198
|
options.assert_valid_keys(FB_NAME_VALID_OPTION_KEYS)
|
198
199
|
options.merge!(:uid => cast_to_facebook_id(user))
|
199
|
-
|
200
|
+
content_tag("fb:name",nil, stringify_vals(options))
|
200
201
|
end
|
201
202
|
|
202
203
|
FB_NAME_OPTION_KEYS_TO_TRANSFORM = {:first_name_only => :firstnameonly,
|
@@ -217,7 +218,7 @@ module Facebooker
|
|
217
218
|
options.transform_keys!(FB_PRONOUN_OPTION_KEYS_TO_TRANSFORM)
|
218
219
|
options.assert_valid_keys(FB_PRONOUN_VALID_OPTION_KEYS)
|
219
220
|
options.merge!(:uid => cast_to_facebook_id(user))
|
220
|
-
|
221
|
+
content_tag("fb:pronoun",nil, stringify_vals(options))
|
221
222
|
end
|
222
223
|
|
223
224
|
FB_PRONOUN_OPTION_KEYS_TO_TRANSFORM = {:use_you => :useyou, :use_they => :usethey}
|
@@ -259,7 +260,7 @@ module Facebooker
|
|
259
260
|
options = options.dup
|
260
261
|
validate_fb_profile_pic_size(options)
|
261
262
|
options.merge!(:uid => cast_to_facebook_id(user))
|
262
|
-
|
263
|
+
content_tag("fb:profile-pic", nil,stringify_vals(options))
|
263
264
|
end
|
264
265
|
|
265
266
|
# Render an fb:photo tag.
|
@@ -271,7 +272,7 @@ module Facebooker
|
|
271
272
|
options.merge!(:pid => cast_to_photo_id(photo))
|
272
273
|
validate_fb_photo_size(options)
|
273
274
|
validate_fb_photo_align_value(options)
|
274
|
-
|
275
|
+
content_tag("fb:photo",nil, stringify_vals(options))
|
275
276
|
end
|
276
277
|
|
277
278
|
FB_PHOTO_VALID_OPTION_KEYS = [:uid, :size, :align]
|
@@ -544,6 +545,32 @@ module Facebooker
|
|
544
545
|
content_tag("fb:prompt-permission",message,args)
|
545
546
|
end
|
546
547
|
|
548
|
+
def fb_eventlink(eid)
|
549
|
+
content_tag "fb:eventlink",nil,:eid=>eid
|
550
|
+
end
|
551
|
+
|
552
|
+
def fb_grouplink(gid)
|
553
|
+
content_tag "fb:grouplink",nil,:gid=>gid
|
554
|
+
end
|
555
|
+
|
556
|
+
def fb_user_status(user,linked=true)
|
557
|
+
content_tag "fb:user-status",nil,stringify_vals(:uid=>cast_to_facebook_id(user), :linked=>linked)
|
558
|
+
end
|
559
|
+
|
560
|
+
def fb_share_button(url)
|
561
|
+
content_tag "fb:share-button",nil,:class=>"url",:href=>url
|
562
|
+
end
|
563
|
+
|
564
|
+
def fb_serverfbml(options={},&proc)
|
565
|
+
inner = capture(&proc)
|
566
|
+
concat(content_tag("fb:serverfbml",inner,options),&proc.binding)
|
567
|
+
end
|
568
|
+
|
569
|
+
def fb_container(options={},&proc)
|
570
|
+
inner = capture(&proc)
|
571
|
+
concat(content_tag("fb:container",inner,options),&proc.binding)
|
572
|
+
end
|
573
|
+
|
547
574
|
protected
|
548
575
|
|
549
576
|
def cast_to_facebook_id(object)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Facebooker
|
2
|
+
module Rails
|
3
|
+
module Helpers
|
4
|
+
module FbConnect
|
5
|
+
|
6
|
+
def fb_connect_javascript_tag
|
7
|
+
javascript_include_tag "http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php"
|
8
|
+
end
|
9
|
+
|
10
|
+
def init_fb_connect(*required_features)
|
11
|
+
init_string = "FB.Facebook.init('#{Facebooker.api_key}','/xd_receiver.html');"
|
12
|
+
unless required_features.blank?
|
13
|
+
init_string = <<-FBML
|
14
|
+
Element.observe(window,'load', function() {
|
15
|
+
FB_RequireFeatures(#{required_features.to_json}, function() {
|
16
|
+
#{init_string}
|
17
|
+
});
|
18
|
+
});
|
19
|
+
FBML
|
20
|
+
end
|
21
|
+
javascript_tag init_string
|
22
|
+
end
|
23
|
+
|
24
|
+
def fb_login_button(callback=nil)
|
25
|
+
content_tag("fb:login-button",nil,(callback.nil? ? {} : {:onlogin=>callback}))
|
26
|
+
end
|
27
|
+
|
28
|
+
def fb_unconnected_friends_count
|
29
|
+
content_tag "fb:unconnected-friends-count",nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -34,6 +34,7 @@ module Facebooker
|
|
34
34
|
# def publish_action(f)
|
35
35
|
# send_as :user_action
|
36
36
|
# from f
|
37
|
+
# story_size SHORT # or ONE_LINE or FULL
|
37
38
|
# data :friend=>"Mike"
|
38
39
|
# end
|
39
40
|
#
|
@@ -87,6 +88,12 @@ module Facebooker
|
|
87
88
|
#
|
88
89
|
# Publisher makes many helpers available, including the linking and asset helpers
|
89
90
|
class Publisher
|
91
|
+
|
92
|
+
#story sizes from the Facebooker API
|
93
|
+
ONE_LINE=1
|
94
|
+
SHORT=2
|
95
|
+
FULL=4
|
96
|
+
|
90
97
|
def initialize
|
91
98
|
@controller = PublisherController.new
|
92
99
|
end
|
@@ -213,11 +220,14 @@ module Facebooker
|
|
213
220
|
attr_accessor :body_general
|
214
221
|
attr_accessor :template_id
|
215
222
|
attr_accessor :template_name
|
216
|
-
|
223
|
+
attr_accessor :story_size
|
217
224
|
def target_ids=(val)
|
218
225
|
@target_ids = val.is_a?(Array) ? val.join(",") : val
|
219
226
|
end
|
220
|
-
|
227
|
+
def data_hash
|
228
|
+
default_data = story_size.nil? ? {} : {:story_size=>story_size}
|
229
|
+
default_data.merge(data||{})
|
230
|
+
end
|
221
231
|
end
|
222
232
|
|
223
233
|
cattr_accessor :ignore_errors
|
@@ -351,7 +361,7 @@ module Facebooker
|
|
351
361
|
when Ref
|
352
362
|
Facebooker::Session.create.server_cache.set_ref_handle(_body.handle,_body.fbml)
|
353
363
|
when UserAction
|
354
|
-
@from.session.publish_user_action(_body.template_id,_body.
|
364
|
+
@from.session.publish_user_action(_body.template_id,_body.data_hash,_body.target_ids,_body.body_general)
|
355
365
|
else
|
356
366
|
raise UnspecifiedBodyType.new("You must specify a valid send_as")
|
357
367
|
end
|
data/test/publisher_test.rb
CHANGED
@@ -6,6 +6,7 @@ require 'action_controller/test_process'
|
|
6
6
|
require 'active_record'
|
7
7
|
require File.dirname(__FILE__)+'/../init'
|
8
8
|
require 'facebooker/rails/controller'
|
9
|
+
require 'facebooker/rails/helpers/fb_connect'
|
9
10
|
require 'facebooker/rails/helpers'
|
10
11
|
require 'facebooker/rails/publisher'
|
11
12
|
|
@@ -118,6 +119,14 @@ class TestPublisher < Facebooker::Rails::Publisher
|
|
118
119
|
from user
|
119
120
|
data :friend=>"Mike"
|
120
121
|
end
|
122
|
+
def user_action_with_story_size(user)
|
123
|
+
send_as :user_action
|
124
|
+
from user
|
125
|
+
story_size ONE_LINE
|
126
|
+
story_size FULL
|
127
|
+
story_size SHORT
|
128
|
+
data :friend=>"Mike"
|
129
|
+
end
|
121
130
|
def user_action_no_data(user)
|
122
131
|
send_as :user_action
|
123
132
|
from user
|
@@ -353,6 +362,19 @@ class PublisherTest < Test::Unit::TestCase
|
|
353
362
|
TestPublisher.deliver_user_action(@from_user)
|
354
363
|
end
|
355
364
|
|
365
|
+
def test_publish_user_action_with_story_size
|
366
|
+
@from_user = Facebooker::User.new
|
367
|
+
@session = Facebooker::Session.new("","")
|
368
|
+
@from_user.stubs(:session).returns(@session)
|
369
|
+
@session.expects(:publish_user_action).with(20309041537,{:friend=>"Mike", :story_size=>2},nil,nil)
|
370
|
+
|
371
|
+
Facebooker::Rails::Publisher::FacebookTemplate.expects(:bundle_id_for_class_and_method).
|
372
|
+
with(TestPublisher, 'user_action_with_story_size').
|
373
|
+
returns(20309041537)
|
374
|
+
TestPublisher.deliver_user_action_with_story_size(@from_user)
|
375
|
+
|
376
|
+
end
|
377
|
+
|
356
378
|
def test_publishing_user_data_no_action_gives_nil_hash
|
357
379
|
@from_user = Facebooker::User.new
|
358
380
|
@session = Facebooker::Session.new("","")
|
@@ -3,6 +3,7 @@ begin
|
|
3
3
|
require 'action_controller'
|
4
4
|
require 'action_controller/test_process'
|
5
5
|
require 'facebooker/rails/controller'
|
6
|
+
require 'facebooker/rails/helpers/fb_connect'
|
6
7
|
require 'facebooker/rails/helpers'
|
7
8
|
require 'facebooker/rails/facebook_form_builder'
|
8
9
|
require File.dirname(__FILE__)+'/../init'
|
@@ -363,6 +364,32 @@ class RailsIntegrationTest < Test::Unit::TestCase
|
|
363
364
|
get :index, modified_params
|
364
365
|
end
|
365
366
|
|
367
|
+
def test_session_secured_with_auth_token_if_cookies_expired
|
368
|
+
auth_token = 'ohaiauthtokenhere111'
|
369
|
+
modified_params = example_rails_params_including_fb
|
370
|
+
modified_params.delete('fb_sig_session_key')
|
371
|
+
modified_params['auth_token'] = auth_token
|
372
|
+
session_mock = flexmock(session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY']))
|
373
|
+
session_params = { 'session_key' => '123', 'uid' => '321' }
|
374
|
+
session_mock.should_receive(:post).with('facebook.auth.getSession', :auth_token => auth_token).once.and_return(session_params).ordered
|
375
|
+
flexmock(@controller).should_receive(:new_facebook_session).once.and_return(session).ordered
|
376
|
+
expired_cookie_hash_for_auth.each {|k,v| @request.cookies[ENV['FACEBOOK_API_KEY']+k] = CGI::Cookie.new(ENV['FACEBOOK_API_KEY']+k,v)}
|
377
|
+
get :index, modified_params
|
378
|
+
assert_equal(321, @controller.facebook_session.user.id)
|
379
|
+
end
|
380
|
+
|
381
|
+
def test_session_can_be_secured_with_cookies
|
382
|
+
cookie_hash_for_auth.each {|k,v| @request.cookies[ENV['FACEBOOK_API_KEY']+k] = CGI::Cookie.new(ENV['FACEBOOK_API_KEY']+k,v)}
|
383
|
+
get :index, example_rails_params_for_fb_connect
|
384
|
+
assert_equal(77777, @controller.facebook_session.user.id)
|
385
|
+
end
|
386
|
+
|
387
|
+
def test_session_does_NOT_secure_with_expired_cookies
|
388
|
+
expired_cookie_hash_for_auth.each {|k,v| @request.cookies[ENV['FACEBOOK_API_KEY']+k] = CGI::Cookie.new(ENV['FACEBOOK_API_KEY']+k,v)}
|
389
|
+
get :index, example_rails_params_for_fb_connect
|
390
|
+
assert_nil(@controller.facebook_session)
|
391
|
+
end
|
392
|
+
|
366
393
|
def test_user_friends_can_be_populated_from_facebook_params_if_available
|
367
394
|
get :index, example_rails_params_including_fb
|
368
395
|
assert_not_nil(friends = @controller.facebook_session.user.friends)
|
@@ -436,6 +463,18 @@ class RailsIntegrationTest < Test::Unit::TestCase
|
|
436
463
|
end
|
437
464
|
|
438
465
|
private
|
466
|
+
def example_rails_params_for_fb_connect
|
467
|
+
{"action"=>"index", "controller"=>"controller_which_requires_facebook_authentication"}
|
468
|
+
end
|
469
|
+
|
470
|
+
def expired_cookie_hash_for_auth
|
471
|
+
{"_ss" => "not_used", "_session_key"=> "whatever", "_user"=>"77777", "_expires"=>"#{1.day.ago.to_i}"}
|
472
|
+
end
|
473
|
+
|
474
|
+
def cookie_hash_for_auth
|
475
|
+
{"_ss" => "not_used", "_session_key"=> "whatever", "_user"=>"77777", "_expires"=>"#{1.day.from_now.to_i}"}
|
476
|
+
end
|
477
|
+
|
439
478
|
def example_rails_params_including_fb_for_user_not_logged_into_application
|
440
479
|
{"fb_sig_time"=>"1186588275.5988", "fb_sig"=>"7371a6400329b229f800a5ecafe03b0a", "action"=>"index", "fb_sig_in_canvas"=>"1", "controller"=>"controller_which_requires_facebook_authentication", "fb_sig_added"=>"0", "fb_sig_api_key"=>"b6c9c857ac543ca806f4d3187cd05e09"}
|
441
480
|
end
|
@@ -490,6 +529,7 @@ class RailsHelperTest < Test::Unit::TestCase
|
|
490
529
|
include ActionView::Helpers::CaptureHelper
|
491
530
|
include ActionView::Helpers::TagHelper
|
492
531
|
include ActionView::Helpers::AssetTagHelper
|
532
|
+
include ActionView::Helpers::JavaScriptHelper
|
493
533
|
include Facebooker::Rails::Helpers
|
494
534
|
attr_accessor :flash, :output_buffer
|
495
535
|
def initialize
|
@@ -524,11 +564,11 @@ class RailsHelperTest < Test::Unit::TestCase
|
|
524
564
|
end
|
525
565
|
|
526
566
|
def test_fb_profile_pic
|
527
|
-
assert_equal "<fb:profile-pic uid=\"1234\"
|
567
|
+
assert_equal "<fb:profile-pic uid=\"1234\"></fb:profile-pic>", @h.fb_profile_pic("1234")
|
528
568
|
end
|
529
569
|
|
530
570
|
def test_fb_profile_pic_with_valid_size
|
531
|
-
assert_equal "<fb:profile-pic size=\"small\" uid=\"1234\"
|
571
|
+
assert_equal "<fb:profile-pic size=\"small\" uid=\"1234\"></fb:profile-pic>", @h.fb_profile_pic("1234", :size => :small)
|
532
572
|
end
|
533
573
|
|
534
574
|
def test_fb_profile_pic_with_invalid_size
|
@@ -536,12 +576,12 @@ class RailsHelperTest < Test::Unit::TestCase
|
|
536
576
|
end
|
537
577
|
|
538
578
|
def test_fb_photo
|
539
|
-
assert_equal "<fb:photo pid=\"1234\"
|
579
|
+
assert_equal "<fb:photo pid=\"1234\"></fb:photo>",@h.fb_photo("1234")
|
540
580
|
end
|
541
581
|
|
542
582
|
def test_fb_photo_with_object_responding_to_photo_id
|
543
583
|
photo = flexmock("photo", :photo_id => "5678")
|
544
|
-
assert_equal "<fb:photo pid=\"5678\"
|
584
|
+
assert_equal "<fb:photo pid=\"5678\"></fb:photo>", @h.fb_photo(photo)
|
545
585
|
end
|
546
586
|
|
547
587
|
def test_fb_photo_with_invalid_size
|
@@ -557,14 +597,14 @@ class RailsHelperTest < Test::Unit::TestCase
|
|
557
597
|
end
|
558
598
|
|
559
599
|
def test_fb_photo_with_valid_align_value
|
560
|
-
assert_equal "<fb:photo align=\"right\" pid=\"1234\"
|
600
|
+
assert_equal "<fb:photo align=\"right\" pid=\"1234\"></fb:photo>",@h.fb_photo("1234", :align => :right)
|
561
601
|
end
|
562
602
|
|
563
603
|
def test_fb_photo_with_class
|
564
|
-
assert_equal "<fb:photo class=\"picky\" pid=\"1234\"
|
604
|
+
assert_equal "<fb:photo class=\"picky\" pid=\"1234\"></fb:photo>",@h.fb_photo("1234", :class => :picky)
|
565
605
|
end
|
566
606
|
def test_fb_photo_with_style
|
567
|
-
assert_equal "<fb:photo pid=\"1234\" style=\"some=css;put=here;\"
|
607
|
+
assert_equal "<fb:photo pid=\"1234\" style=\"some=css;put=here;\"></fb:photo>",@h.fb_photo("1234", :style => "some=css;put=here;")
|
568
608
|
end
|
569
609
|
|
570
610
|
def test_fb_prompt_permission_valid_no_callback
|
@@ -593,16 +633,16 @@ class RailsHelperTest < Test::Unit::TestCase
|
|
593
633
|
end
|
594
634
|
|
595
635
|
def test_fb_name
|
596
|
-
assert_equal "<fb:name uid=\"1234\"
|
636
|
+
assert_equal "<fb:name uid=\"1234\"></fb:name>",@h.fb_name("1234")
|
597
637
|
end
|
598
638
|
|
599
639
|
def test_fb_name_with_transformed_key
|
600
|
-
assert_equal "<fb:name uid=\"1234\" useyou=\"true\"
|
640
|
+
assert_equal "<fb:name uid=\"1234\" useyou=\"true\"></fb:name>", @h.fb_name(1234, :use_you => true)
|
601
641
|
end
|
602
642
|
|
603
643
|
def test_fb_name_with_user_responding_to_facebook_id
|
604
644
|
user = flexmock("user", :facebook_id => "5678")
|
605
|
-
assert_equal "<fb:name uid=\"5678\"
|
645
|
+
assert_equal "<fb:name uid=\"5678\"></fb:name>", @h.fb_name(user)
|
606
646
|
end
|
607
647
|
|
608
648
|
def test_fb_name_with_invalid_key
|
@@ -698,16 +738,16 @@ class RailsHelperTest < Test::Unit::TestCase
|
|
698
738
|
end
|
699
739
|
|
700
740
|
def test_fb_pronoun
|
701
|
-
assert_equal "<fb:pronoun uid=\"1234\"
|
741
|
+
assert_equal "<fb:pronoun uid=\"1234\"></fb:pronoun>", @h.fb_pronoun(1234)
|
702
742
|
end
|
703
743
|
|
704
744
|
def test_fb_pronoun_with_transformed_key
|
705
|
-
assert_equal "<fb:pronoun uid=\"1234\" usethey=\"true\"
|
745
|
+
assert_equal "<fb:pronoun uid=\"1234\" usethey=\"true\"></fb:pronoun>", @h.fb_pronoun(1234, :use_they => true)
|
706
746
|
end
|
707
747
|
|
708
748
|
def test_fb_pronoun_with_user_responding_to_facebook_id
|
709
749
|
user = flexmock("user", :facebook_id => "5678")
|
710
|
-
assert_equal "<fb:pronoun uid=\"5678\"
|
750
|
+
assert_equal "<fb:pronoun uid=\"5678\"></fb:pronoun>", @h.fb_pronoun(user)
|
711
751
|
end
|
712
752
|
|
713
753
|
def test_fb_pronoun_with_invalid_key
|
@@ -880,6 +920,58 @@ class RailsHelperTest < Test::Unit::TestCase
|
|
880
920
|
end
|
881
921
|
assert_equal "<fb:narrow>narrow profile content</fb:narrow>", @h.output_buffer
|
882
922
|
end
|
923
|
+
|
924
|
+
def test_fb_login_button
|
925
|
+
assert_equal "<fb:login-button onlogin=\"somejs\"></fb:login-button>",@h.fb_login_button("somejs")
|
926
|
+
end
|
927
|
+
|
928
|
+
def test_init_fb_connect_no_features
|
929
|
+
assert ! @h.init_fb_connect.match(/XFBML/)
|
930
|
+
end
|
931
|
+
|
932
|
+
def test_init_fb_connect_with_features
|
933
|
+
assert @h.init_fb_connect("XFBML").match(/XFBML/)
|
934
|
+
end
|
935
|
+
|
936
|
+
def test_fb_connect_javascript_tag
|
937
|
+
assert_equal "<script src=\"http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php\" type=\"text/javascript\"></script>",
|
938
|
+
@h.fb_connect_javascript_tag
|
939
|
+
end
|
940
|
+
|
941
|
+
def test_fb_container
|
942
|
+
@h.expects(:capture).returns("Inner Stuff")
|
943
|
+
@h.fb_container(:condition=>"somejs") do
|
944
|
+
end
|
945
|
+
assert_equal "<fb:container condition=\"somejs\">Inner Stuff</fb:container>",@h.output_buffer
|
946
|
+
end
|
947
|
+
|
948
|
+
def test_fb_eventlink
|
949
|
+
assert_equal '<fb:eventlink eid="21150032416"></fb:eventlink>',@h.fb_eventlink("21150032416")
|
950
|
+
end
|
951
|
+
|
952
|
+
def test_fb_grouplink
|
953
|
+
assert_equal '<fb:grouplink gid="2541896821"></fb:grouplink>',@h.fb_grouplink("2541896821")
|
954
|
+
end
|
955
|
+
|
956
|
+
def test_fb_serverfbml
|
957
|
+
@h.expects(:capture).returns("Inner Stuff")
|
958
|
+
@h.fb_serverfbml(:condition=>"somejs") do
|
959
|
+
end
|
960
|
+
assert_equal "<fb:serverfbml condition=\"somejs\">Inner Stuff</fb:serverfbml>",@h.output_buffer
|
961
|
+
end
|
962
|
+
|
963
|
+
def test_fb_share_button
|
964
|
+
assert_equal "<fb:share-button class=\"url\" href=\"http://www.elevatedrails.com\"></fb:share-button>",@h.fb_share_button("http://www.elevatedrails.com")
|
965
|
+
end
|
966
|
+
|
967
|
+
def test_fb_unconnected_friends_count_without_condition
|
968
|
+
assert_equal "<fb:unconnected-friends-count></fb:unconnected-friends-count>",@h.fb_unconnected_friends_count
|
969
|
+
end
|
970
|
+
|
971
|
+
def test_fb_user_status
|
972
|
+
user=flexmock("user", :facebook_id => "5678")
|
973
|
+
assert_equal '<fb:user-status linked="false" uid="5678"></fb:user-status>',@h.fb_user_status(user,false)
|
974
|
+
end
|
883
975
|
end
|
884
976
|
class TestModel
|
885
977
|
attr_accessor :name,:facebook_id
|
@@ -958,6 +1050,8 @@ class RailsFacebookFormbuilderTest < Test::Unit::TestCase
|
|
958
1050
|
def test_multi_friend_input
|
959
1051
|
assert_equal "<fb:editor-custom label=\"Friends\"><fb:multi-friend-input></fb:multi-friend-input></fb:editor-custom>",@form_builder.multi_friend_input
|
960
1052
|
end
|
1053
|
+
|
1054
|
+
|
961
1055
|
end
|
962
1056
|
|
963
1057
|
class RailsPrettyErrorsTest < Test::Unit::TestCase
|
@@ -1118,6 +1212,7 @@ class RailsUrlHelperExtensionsTest < Test::Unit::TestCase
|
|
1118
1212
|
def test_link_to_if_with_false
|
1119
1213
|
assert_equal @label, @u.link_to_if(false,@label,@url)
|
1120
1214
|
end
|
1215
|
+
|
1121
1216
|
end
|
1122
1217
|
|
1123
1218
|
|
data/test/user_test.rb
CHANGED
@@ -169,6 +169,17 @@ class UserTest < Test::Unit::TestCase
|
|
169
169
|
assert_equal({:email=>"mike@example.com",:account_id=>2},e.failed_users.first)
|
170
170
|
end
|
171
171
|
|
172
|
+
def test_get_locale
|
173
|
+
@user = Facebooker::User.new(9507801, @session)
|
174
|
+
expect_http_posts_with_responses(example_users_get_info_xml)
|
175
|
+
assert_equal "en_US", @user.locale
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_get_profile_url
|
179
|
+
@user = Facebooker::User.new(8055, @session)
|
180
|
+
expect_http_posts_with_responses(example_users_get_info_xml)
|
181
|
+
assert_equal "http://www.facebook.com/profile.php?id=8055", @user.profile_url
|
182
|
+
end
|
172
183
|
|
173
184
|
private
|
174
185
|
def example_profile_photos_get_xml
|
@@ -233,6 +244,12 @@ class UserTest < Test::Unit::TestCase
|
|
233
244
|
</events_get_response>"
|
234
245
|
end
|
235
246
|
|
247
|
+
def example_users_get_info_xml
|
248
|
+
<<-XML
|
249
|
+
<?xml version="1.0" encoding="UTF-8"?> <users_getInfo_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd" list="true"> <user> <uid>8055</uid> <about_me>This field perpetuates the glorification of the ego. Also, it has a character limit.</about_me> <activities>Here: facebook, etc. There: Glee Club, a capella, teaching.</activities> <affiliations list="true"> <affiliation> <nid>50453093</nid> <name>Facebook Developers</name> <type>work</type> <status/> <year/> </affiliation> </affiliations> <birthday>November 3</birthday> <books>The Brothers K, GEB, Ken Wilber, Zen and the Art, Fitzgerald, The Emporer's New Mind, The Wonderful Story of Henry Sugar</books> <current_location> <city>Palo Alto</city> <state>CA</state> <country>United States</country> <zip>94303</zip> </current_location> <education_history list="true"> <education_info> <name>Harvard</name> <year>2003</year> <concentrations list="true"> <concentration>Applied Mathematics</concentration> <concentration>Computer Science</concentration> </concentrations> </education_info> </education_history> <first_name>Dave</first_name> <hometown_location> <city>York</city> <state>PA</state> <country>United States</country> </hometown_location> <hs_info> <hs1_name>Central York High School</hs1_name> <hs2_name/> <grad_year>1999</grad_year> <hs1_id>21846</hs1_id> <hs2_id>0</hs2_id> </hs_info> <is_app_user>1</is_app_user> <has_added_app>1</has_added_app> <interests>coffee, computers, the funny, architecture, code breaking,snowboarding, philosophy, soccer, talking to strangers</interests> <last_name>Fetterman</last_name> <locale>en_US</locale> <meeting_for list="true"> <seeking>Friendship</seeking> </meeting_for> <meeting_sex list="true"> <sex>female</sex> </meeting_sex> <movies>Tommy Boy, Billy Madison, Fight Club, Dirty Work, Meet the Parents, My Blue Heaven, Office Space </movies> <music>New Found Glory, Daft Punk, Weezer, The Crystal Method, Rage, the KLF, Green Day, Live, Coldplay, Panic at the Disco, Family Force 5</music> <name>Dave Fetterman</name> <notes_count>0</notes_count> <pic>http://photos-055.facebook.com/ip007/profile3/1271/65/s8055_39735.jpg</pic> <pic_big>http://photos-055.facebook.com/ip007/profile3/1271/65/n8055_39735.jpg</pic_big> <pic_small>http://photos-055.facebook.com/ip007/profile3/1271/65/t8055_39735.jpg</pic_small> <pic_square>http://photos-055.facebook.com/ip007/profile3/1271/65/q8055_39735.jpg</pic_square> <political>Moderate</political> <profile_update_time>1170414620</profile_update_time> <profile_url>http://www.facebook.com/profile.php?id=8055</profile_url> <quotes/> <relationship_status>In a Relationship</relationship_status> <religion/> <sex>male</sex> <significant_other_id xsi:nil="true"/> <status> <message>Fast Company, November issue, page 84</message> <time>1193075616</time> </status> <timezone>-8</timezone> <tv>cf. Bob Trahan</tv> <wall_count>121</wall_count> <work_history list="true"> <work_info> <location> <city>Palo Alto</city> <state>CA</state> <country>United States</country> </location> <company_name>Facebook</company_name> <position>Software Engineer</position> <description>Tech Lead, Facebook Platform</description> <start_date>2006-01</start_date> <end_date/> </work_info> </work_history> </user> </users_getInfo_response>
|
250
|
+
XML
|
251
|
+
end
|
252
|
+
|
236
253
|
def register_response_xml
|
237
254
|
<<-XML
|
238
255
|
<?xml version="1.0" encoding="UTF-8"?>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: djanowski-facebooker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chad Fowler
|
@@ -79,6 +79,8 @@ files:
|
|
79
79
|
- generators/facebook_scaffold/templates/view_new.html.erb
|
80
80
|
- generators/facebook_scaffold/templates/view_show.fbml.erb
|
81
81
|
- generators/facebook_scaffold/templates/view_show.html.erb
|
82
|
+
- generators/xd_receiver/xd_receiver_generator.rb
|
83
|
+
- generators/xd_receiver/templates/xd_receiver.html
|
82
84
|
- init.rb
|
83
85
|
- install.rb
|
84
86
|
- lib/facebooker.rb
|
@@ -117,6 +119,7 @@ files:
|
|
117
119
|
- lib/facebooker/rails/facebook_session_handling.rb
|
118
120
|
- lib/facebooker/rails/facebook_url_rewriting.rb
|
119
121
|
- lib/facebooker/rails/helpers.rb
|
122
|
+
- lib/facebooker/rails/helpers/fb_connect.rb
|
120
123
|
- lib/facebooker/rails/profile_publisher_extensions.rb
|
121
124
|
- lib/facebooker/rails/publisher.rb
|
122
125
|
- lib/facebooker/rails/routing.rb
|