fs-facebooker 1.0.37
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/.autotest +15 -0
- data/CHANGELOG.rdoc +24 -0
- data/COPYING.rdoc +19 -0
- data/Manifest.txt +133 -0
- data/README.rdoc +104 -0
- data/Rakefile +85 -0
- data/TODO.rdoc +4 -0
- data/examples/desktop_login.rb +14 -0
- data/facebooker.gemspec +38 -0
- data/generators/facebook/facebook_generator.rb +14 -0
- data/generators/facebook/templates/config/facebooker.yml +49 -0
- data/generators/facebook/templates/public/javascripts/facebooker.js +83 -0
- data/generators/facebook_controller/USAGE +33 -0
- data/generators/facebook_controller/facebook_controller_generator.rb +40 -0
- data/generators/facebook_controller/templates/controller.rb +7 -0
- data/generators/facebook_controller/templates/functional_test.rb +11 -0
- data/generators/facebook_controller/templates/helper.rb +2 -0
- data/generators/facebook_controller/templates/view.fbml.erb +2 -0
- data/generators/facebook_controller/templates/view.html.erb +2 -0
- data/generators/facebook_publisher/facebook_publisher_generator.rb +14 -0
- data/generators/facebook_publisher/templates/create_facebook_templates.rb +15 -0
- data/generators/facebook_publisher/templates/publisher.rb +3 -0
- data/generators/facebook_scaffold/USAGE +27 -0
- data/generators/facebook_scaffold/facebook_scaffold_generator.rb +118 -0
- data/generators/facebook_scaffold/templates/controller.rb +93 -0
- data/generators/facebook_scaffold/templates/facebook_style.css +2579 -0
- data/generators/facebook_scaffold/templates/functional_test.rb +89 -0
- data/generators/facebook_scaffold/templates/helper.rb +2 -0
- data/generators/facebook_scaffold/templates/layout.fbml.erb +6 -0
- data/generators/facebook_scaffold/templates/layout.html.erb +17 -0
- data/generators/facebook_scaffold/templates/style.css +74 -0
- data/generators/facebook_scaffold/templates/view_edit.fbml.erb +13 -0
- data/generators/facebook_scaffold/templates/view_edit.html.erb +18 -0
- data/generators/facebook_scaffold/templates/view_index.fbml.erb +24 -0
- data/generators/facebook_scaffold/templates/view_index.html.erb +24 -0
- data/generators/facebook_scaffold/templates/view_new.fbml.erb +12 -0
- data/generators/facebook_scaffold/templates/view_new.html.erb +17 -0
- data/generators/facebook_scaffold/templates/view_show.fbml.erb +10 -0
- data/generators/facebook_scaffold/templates/view_show.html.erb +10 -0
- data/generators/publisher/publisher_generator.rb +14 -0
- data/generators/xd_receiver/templates/xd_receiver.html +10 -0
- data/generators/xd_receiver/xd_receiver_generator.rb +10 -0
- data/init.rb +25 -0
- data/install.rb +12 -0
- data/lib/facebooker.rb +179 -0
- data/lib/facebooker/adapters/adapter_base.rb +91 -0
- data/lib/facebooker/adapters/bebo_adapter.rb +77 -0
- data/lib/facebooker/adapters/facebook_adapter.rb +52 -0
- data/lib/facebooker/admin.rb +42 -0
- data/lib/facebooker/batch_request.rb +45 -0
- data/lib/facebooker/data.rb +57 -0
- data/lib/facebooker/feed.rb +78 -0
- data/lib/facebooker/logging.rb +44 -0
- data/lib/facebooker/mobile.rb +20 -0
- data/lib/facebooker/mock/service.rb +50 -0
- data/lib/facebooker/mock/session.rb +18 -0
- data/lib/facebooker/model.rb +139 -0
- data/lib/facebooker/models/affiliation.rb +10 -0
- data/lib/facebooker/models/album.rb +11 -0
- data/lib/facebooker/models/applicationproperties.rb +39 -0
- data/lib/facebooker/models/applicationrestrictions.rb +10 -0
- data/lib/facebooker/models/cookie.rb +10 -0
- data/lib/facebooker/models/education_info.rb +11 -0
- data/lib/facebooker/models/event.rb +28 -0
- data/lib/facebooker/models/friend_list.rb +16 -0
- data/lib/facebooker/models/group.rb +36 -0
- data/lib/facebooker/models/info_item.rb +10 -0
- data/lib/facebooker/models/info_section.rb +10 -0
- data/lib/facebooker/models/location.rb +8 -0
- data/lib/facebooker/models/notifications.rb +17 -0
- data/lib/facebooker/models/page.rb +28 -0
- data/lib/facebooker/models/photo.rb +19 -0
- data/lib/facebooker/models/tag.rb +12 -0
- data/lib/facebooker/models/user.rb +497 -0
- data/lib/facebooker/models/video.rb +9 -0
- data/lib/facebooker/models/work_info.rb +10 -0
- data/lib/facebooker/parser.rb +642 -0
- data/lib/facebooker/rails/backwards_compatible_param_checks.rb +31 -0
- data/lib/facebooker/rails/controller.rb +344 -0
- data/lib/facebooker/rails/cucumber.rb +28 -0
- data/lib/facebooker/rails/cucumber/world.rb +46 -0
- data/lib/facebooker/rails/extensions/action_controller.rb +48 -0
- data/lib/facebooker/rails/extensions/rack_setup.rb +6 -0
- data/lib/facebooker/rails/extensions/routing.rb +15 -0
- data/lib/facebooker/rails/facebook_form_builder.rb +112 -0
- data/lib/facebooker/rails/facebook_pretty_errors.rb +22 -0
- data/lib/facebooker/rails/facebook_request_fix.rb +30 -0
- data/lib/facebooker/rails/facebook_request_fix_2-3.rb +31 -0
- data/lib/facebooker/rails/facebook_session_handling.rb +68 -0
- data/lib/facebooker/rails/facebook_url_helper.rb +192 -0
- data/lib/facebooker/rails/facebook_url_rewriting.rb +60 -0
- data/lib/facebooker/rails/helpers.rb +794 -0
- data/lib/facebooker/rails/helpers/fb_connect.rb +118 -0
- data/lib/facebooker/rails/integration_session.rb +38 -0
- data/lib/facebooker/rails/profile_publisher_extensions.rb +42 -0
- data/lib/facebooker/rails/publisher.rb +550 -0
- data/lib/facebooker/rails/routing.rb +49 -0
- data/lib/facebooker/rails/test_helpers.rb +68 -0
- data/lib/facebooker/rails/utilities.rb +22 -0
- data/lib/facebooker/server_cache.rb +24 -0
- data/lib/facebooker/service.rb +102 -0
- data/lib/facebooker/session.rb +606 -0
- data/lib/facebooker/version.rb +9 -0
- data/lib/net/http_multipart_post.rb +123 -0
- data/lib/rack/facebook.rb +77 -0
- data/lib/tasks/facebooker.rake +18 -0
- data/lib/tasks/tunnel.rake +46 -0
- data/rails/init.rb +1 -0
- data/setup.rb +1585 -0
- data/templates/layout.erb +24 -0
- data/test/facebooker/adapters_test.rb +96 -0
- data/test/facebooker/admin_test.rb +102 -0
- data/test/facebooker/batch_request_test.rb +83 -0
- data/test/facebooker/data_test.rb +86 -0
- data/test/facebooker/logging_test.rb +43 -0
- data/test/facebooker/mobile_test.rb +45 -0
- data/test/facebooker/model_test.rb +133 -0
- data/test/facebooker/models/event_test.rb +15 -0
- data/test/facebooker/models/photo_test.rb +16 -0
- data/test/facebooker/models/user_test.rb +343 -0
- data/test/facebooker/rails/facebook_request_fix_2-3_test.rb +24 -0
- data/test/facebooker/rails/facebook_url_rewriting_test.rb +39 -0
- data/test/facebooker/rails/publisher_test.rb +481 -0
- data/test/facebooker/rails_integration_test.rb +1398 -0
- data/test/facebooker/server_cache_test.rb +44 -0
- data/test/facebooker/session_test.rb +614 -0
- data/test/facebooker_test.rb +951 -0
- data/test/fixtures/multipart_post_body_with_only_parameters.txt +33 -0
- data/test/fixtures/multipart_post_body_with_single_file.txt +38 -0
- data/test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt +38 -0
- data/test/net/http_multipart_post_test.rb +52 -0
- data/test/rack/facebook_test.rb +61 -0
- data/test/rails_test_helper.rb +27 -0
- data/test/test_helper.rb +74 -0
- metadata +232 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
|
2
|
+
|
|
3
|
+
class Facebooker::ModelTest < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
class ComplexThing
|
|
6
|
+
include Facebooker::Model
|
|
7
|
+
attr_accessor :weight, :height
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class Thing
|
|
11
|
+
include Facebooker::Model
|
|
12
|
+
attr_accessor :name, :job
|
|
13
|
+
hash_settable_accessor :complex_thing, ComplexThing
|
|
14
|
+
hash_settable_list_accessor :list_of_complex_things, ComplexThing
|
|
15
|
+
|
|
16
|
+
def initialize *args
|
|
17
|
+
@session = nil
|
|
18
|
+
super
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class PopulatingThing
|
|
23
|
+
include Facebooker::Model
|
|
24
|
+
populating_attr_accessor :first_name
|
|
25
|
+
|
|
26
|
+
def initialize
|
|
27
|
+
@first_name = nil
|
|
28
|
+
@populated = false
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_can_instantiate_an_object_with_a_hash
|
|
33
|
+
h = {:name => "Blob", :job => "Monster"}
|
|
34
|
+
assert_equal("Blob", Thing.from_hash(h).name)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_ignores_non_model_keys
|
|
38
|
+
h = {:name => "Blob", :job => "Monster", :not_there=>true}
|
|
39
|
+
assert_equal("Blob", Thing.from_hash(h).name)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_logs_non_model_keys
|
|
43
|
+
flexmock(Facebooker::Logging).should_receive(:log_info)
|
|
44
|
+
h = {:name => "Blob", :job => "Monster", :not_there=>true}
|
|
45
|
+
Thing.from_hash(h)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_if_no_hash_is_given_to_model_constructor_no_attributes_are_set
|
|
50
|
+
assert_nothing_raised {
|
|
51
|
+
t = Thing.new
|
|
52
|
+
assert_nil(t.name)
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_can_declare_hash_settable_attributes
|
|
57
|
+
t = Thing.new({})
|
|
58
|
+
t.complex_thing = {:weight => 123, :height => 5.4}
|
|
59
|
+
assert_equal(123, t.complex_thing.weight)
|
|
60
|
+
t.complex_thing = ComplexThing.new(:weight => 321)
|
|
61
|
+
assert_equal(321, t.complex_thing.weight)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_can_declare_attributes_which_are_settable_via_a_list_of_hashes
|
|
65
|
+
t = Thing.new
|
|
66
|
+
t.list_of_complex_things = [{:weight => 444, :height => 123.0}, {:weight => 222, :height => 321.1}]
|
|
67
|
+
assert_equal("123.0, 321.1", t.list_of_complex_things.map{|ct| ct.height.to_s}.sort.join(', '))
|
|
68
|
+
t.list_of_complex_things = [ComplexThing.new(:weight => 555), ComplexThing.new(:weight => 111)]
|
|
69
|
+
assert_equal("111, 555", t.list_of_complex_things.map{|ct| ct.weight.to_s}.sort.join(', '))
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def test_if_you_try_to_use_a_models_session_without_initializing_it_first_you_get_a_descriptive_error
|
|
73
|
+
t = Thing.new
|
|
74
|
+
assert_raises(Facebooker::Model::UnboundSessionException) {
|
|
75
|
+
t.session
|
|
76
|
+
}
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def test_populating_reader_will_call_populate_if_model_was_not_previously_populated
|
|
80
|
+
t = PopulatingThing.new
|
|
81
|
+
flexmock(t).should_receive(:populate).once
|
|
82
|
+
t.first_name
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_populating_reader_will_not_call_populate_if_model_was_previously_populated
|
|
86
|
+
t = PopulatingThing.new
|
|
87
|
+
flexmock(t).should_receive(:populated?).and_return(true)
|
|
88
|
+
flexmock(t).should_receive(:populate).never
|
|
89
|
+
t.first_name
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def test_attempting_to_access_a_populating_reader_will_raise_an_exception_if_populate_was_not_defined
|
|
93
|
+
t = PopulatingThing.new
|
|
94
|
+
assert_raises(NotImplementedError) {
|
|
95
|
+
t.first_name
|
|
96
|
+
}
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def test_populate_from_hash_e_should_call_a_setter_for_a_key
|
|
100
|
+
t = PopulatingThing.new
|
|
101
|
+
flexmock(t).should_receive('mykey=').with('a value')
|
|
102
|
+
t.populate_from_hash!({ :mykey => 'a value' })
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def test_populate_from_hash_e_should_call_a_setter_for_a_key_if_the_value_is_false
|
|
106
|
+
t = PopulatingThing.new
|
|
107
|
+
flexmock(t).should_receive('mykey=').with(false)
|
|
108
|
+
t.populate_from_hash!({ :mykey => false })
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def test_populate_from_hash_e_should_call_not_a_setter_for_a_key_if_the_value_is_nil
|
|
112
|
+
t = PopulatingThing.new
|
|
113
|
+
flexmock(t).should_receive('mykey=').never
|
|
114
|
+
t.populate_from_hash!({ :mykey => nil })
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def test_populate_from_hash_should_check_for_an_empty_hash
|
|
118
|
+
t = PopulatingThing.new
|
|
119
|
+
hash = {}
|
|
120
|
+
flexmock(hash).should_receive('empty?')
|
|
121
|
+
t.populate_from_hash!(hash)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def test_populate_from_hash_should_check_for_a_nil_param
|
|
125
|
+
t = PopulatingThing.new
|
|
126
|
+
hash = nil
|
|
127
|
+
assert_nothing_raised do
|
|
128
|
+
t.populate_from_hash!(hash)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
|
|
2
|
+
|
|
3
|
+
class Facebooker::EventTest < Test::Unit::TestCase
|
|
4
|
+
def test_attendance_will_query_for_event_when_asked_for_full_event_object
|
|
5
|
+
session = flexmock("a session object")
|
|
6
|
+
eid = 123
|
|
7
|
+
attendance = Facebooker::Event::Attendance.new
|
|
8
|
+
attendance.eid = eid
|
|
9
|
+
attendance.session = session
|
|
10
|
+
event = Facebooker::Event.new
|
|
11
|
+
event.eid = eid
|
|
12
|
+
session.should_receive(:post).once.with('facebook.events.get', :eids => [eid]).and_return([{:eid => eid}])
|
|
13
|
+
assert_equal(123, attendance.event.eid)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
|
|
2
|
+
require 'active_support'
|
|
3
|
+
|
|
4
|
+
class Facebooker::UserTest < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
def test_pid_should_be_treated_as_a_string
|
|
7
|
+
@photo = Facebooker::Photo.new(:pid=>"100000025509592_6801")
|
|
8
|
+
assert_equal("100000025509592_6801",@photo.pid)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_setting_id_should_also_use_new_method
|
|
12
|
+
@photo = Facebooker::Photo.new(:id=>"100000025509592_6801")
|
|
13
|
+
assert_equal("100000025509592_6801",@photo.id)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
|
|
2
|
+
require 'active_support'
|
|
3
|
+
|
|
4
|
+
class Facebooker::UserTest < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
@session = Facebooker::Session.create('apikey', 'secretkey')
|
|
8
|
+
@user = Facebooker::User.new(1234, @session)
|
|
9
|
+
@other_user = Facebooker::User.new(4321, @session)
|
|
10
|
+
ENV['FACEBOOK_CANVAS_PATH'] ='facebook_app_name'
|
|
11
|
+
ENV['FACEBOOK_API_KEY'] = '1234567'
|
|
12
|
+
ENV['FACEBOOK_SECRET_KEY'] = '7654321'
|
|
13
|
+
|
|
14
|
+
@user.friends = [@other_user]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_has_permission
|
|
18
|
+
expect_http_posts_with_responses(has_app_permission_response_xml)
|
|
19
|
+
assert @user.has_permission?("status_update")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_can_ask_user_if_he_or_she_is_friends_with_another_user
|
|
23
|
+
assert(@user.friends_with?(@other_user))
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_can_ask_user_if_he_or_she_is_friends_with_another_user_by_user_id
|
|
27
|
+
assert(@user.friends_with?(@other_user.id))
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_does_not_query_facebook_for_uid
|
|
31
|
+
@session.expects(:post).never
|
|
32
|
+
assert_equal 1234, Facebooker::User.new(1234, @session).uid
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_uid_is_always_an_integer
|
|
36
|
+
assert_equal 1234, Facebooker::User.new(:uid => "1234").uid
|
|
37
|
+
assert_equal 1234, Facebooker::User.new(:id => "1234").uid
|
|
38
|
+
|
|
39
|
+
assert_equal 1234, Facebooker::User.new(:uid => "1234").id
|
|
40
|
+
assert_equal 1234, Facebooker::User.new(:id => "1234").id
|
|
41
|
+
|
|
42
|
+
assert_equal 1234, Facebooker::User.new(:uid => "1234").facebook_id
|
|
43
|
+
assert_equal 1234, Facebooker::User.new(:id => "1234").facebook_id
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_cast_to_friend_list_id_with_nil
|
|
47
|
+
assert_nil @user.cast_to_friend_list_id(nil)
|
|
48
|
+
end
|
|
49
|
+
def test_cast_to_friend_list_id_with_integer
|
|
50
|
+
assert_equal 14,@user.cast_to_friend_list_id(14)
|
|
51
|
+
end
|
|
52
|
+
def test_cast_to_friend_list_id_with_string
|
|
53
|
+
@user.expects(:friend_lists).returns([Facebooker::FriendList.new(:flid=>199,:name=>"Work")])
|
|
54
|
+
assert_equal 199,@user.cast_to_friend_list_id("Work")
|
|
55
|
+
end
|
|
56
|
+
def test_cast_to_friend_list_id_with_friend_list
|
|
57
|
+
assert_equal 199,@user.cast_to_friend_list_id(Facebooker::FriendList.new(:flid=>199,:name=>"Work"))
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_cast_to_friend_list_id_with_invalid_string_raises
|
|
61
|
+
@user.expects(:friend_lists).returns([Facebooker::FriendList.new(:flid=>1,:name=>"Not Picked")])
|
|
62
|
+
assert_nil @user.cast_to_friend_list_id("Something")
|
|
63
|
+
fail("No exception raised, Expected Facebooker::Session::InvalidFriendList")
|
|
64
|
+
rescue Facebooker::Session::InvalidFriendList
|
|
65
|
+
nil
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_can_create_from_current_session
|
|
69
|
+
Facebooker::Session.expects(:current).returns("current")
|
|
70
|
+
user=Facebooker::User.new(1)
|
|
71
|
+
assert_equal("current",user.session)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_raises_when_no_session_bound
|
|
75
|
+
assert_raises(Facebooker::Model::UnboundSessionException) { Facebooker::User.new(1, nil).populate }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def test_can_set_mobile_fbml
|
|
79
|
+
@user.expects(:set_profile_fbml).with(nil,"test",nil,nil)
|
|
80
|
+
@user.mobile_fbml="test"
|
|
81
|
+
end
|
|
82
|
+
def test_can_set_profile_action
|
|
83
|
+
@user.expects(:set_profile_fbml).with(nil,nil,"test",nil)
|
|
84
|
+
@user.profile_action="test"
|
|
85
|
+
end
|
|
86
|
+
def test_can_set_profile_fbml
|
|
87
|
+
@user.expects(:set_profile_fbml).with("test",nil,nil,nil)
|
|
88
|
+
@user.profile_fbml="test"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def test_can_set_profile_main
|
|
92
|
+
@user.expects(:set_profile_fbml).with(nil,nil,nil,"test")
|
|
93
|
+
@user.profile_main="test"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_can_call_set_profile_fbml
|
|
97
|
+
@session.expects(:post).with('facebook.profile.setFBML', {:uid=>1234,:profile=>"profile",:profile_action=>"action",:mobile_profile=>"mobile"},false)
|
|
98
|
+
@user.set_profile_fbml("profile","mobile","action")
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_can_call_set_profile_fbml_with_profile_main
|
|
102
|
+
@session.expects(:post).with('facebook.profile.setFBML', {:uid=>1234,:profile=>"profile",:profile_action=>"action",:mobile_profile=>"mobile", :profile_main => 'profile_main'},false)
|
|
103
|
+
@user.set_profile_fbml("profile","mobile","action",'profile_main')
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test_can_get_profile_photos
|
|
107
|
+
@user.expects(:profile_photos)
|
|
108
|
+
@user.profile_photos
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def test_can_set_cookie
|
|
112
|
+
@user.expects(:set_cookie).with('name', 'value')
|
|
113
|
+
@user.set_cookie('name', 'value')
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def test_can_get_cookies
|
|
117
|
+
@user.expects(:get_cookies).with('name')
|
|
118
|
+
@user.get_cookies('name')
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def test_get_profile_photos
|
|
122
|
+
@user = Facebooker::User.new(548871286, @session)
|
|
123
|
+
expect_http_posts_with_responses(example_profile_photos_get_xml)
|
|
124
|
+
photos = @user.profile_photos
|
|
125
|
+
assert_equal "2357384227378429949", photos.first.aid
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def test_publish_to
|
|
129
|
+
@user = Facebooker::User.new(548871286, @session)
|
|
130
|
+
expect_http_posts_with_responses(example_profile_publish_to_get_xml)
|
|
131
|
+
@user.publish_to(@other_user, :message => 'i love you man')
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def test_can_send_email
|
|
135
|
+
@user.expects(:send_email).with("subject", "body text")
|
|
136
|
+
@user.send_email("subject", "body text")
|
|
137
|
+
|
|
138
|
+
@user.expects(:send_email).with("subject", nil, "body fbml")
|
|
139
|
+
@user.send_email("subject", nil, "body fbml")
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def test_doesnt_post_to_facebook_when_assigning_status
|
|
143
|
+
@session.expects(:post).never
|
|
144
|
+
@user.status="my status"
|
|
145
|
+
end
|
|
146
|
+
def test_can_set_status_with_string
|
|
147
|
+
@session.expects(:post).with('facebook.users.setStatus', {:status=>"my status",:status_includes_verb=>1, :uid => @user.uid}, false)
|
|
148
|
+
@user.set_status("my status")
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def test_get_events
|
|
152
|
+
@user = Facebooker::User.new(9507801, @session)
|
|
153
|
+
expect_http_posts_with_responses(example_events_get_xml)
|
|
154
|
+
events = @user.events
|
|
155
|
+
assert_equal 29511517904, events.first.eid
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def test_events_caching_honors_params
|
|
159
|
+
@user = Facebooker::User.new(9507801, @session)
|
|
160
|
+
@session.expects(:post).returns([{:eid=>1}])
|
|
161
|
+
assert_equal 1,@user.events.first.eid
|
|
162
|
+
@session.expects(:post).returns([{:eid=>2}])
|
|
163
|
+
assert_equal 2,@user.events(:start_time=>1.day.ago).first.eid
|
|
164
|
+
@session.expects(:post).never
|
|
165
|
+
assert_equal 1,@user.events.first.eid
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def test_to_s
|
|
170
|
+
assert_equal("1234",@user.to_s)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def test_equality_with_same_id
|
|
174
|
+
assert_equal @user, @user.dup
|
|
175
|
+
assert_equal @user, Facebooker::User.new(:id => @user.id)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def test_not_equal_to_differnt_class
|
|
179
|
+
assert_not_equal @user, flexmock(:id => @user.id)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def test_hash_email
|
|
183
|
+
assert_equal "4228600737_c96da02bba97aedfd26136e980ae3761", Facebooker::User.hash_email("mary@example.com")
|
|
184
|
+
end
|
|
185
|
+
def test_hash_email_not_normalized
|
|
186
|
+
assert_equal "4228600737_c96da02bba97aedfd26136e980ae3761", Facebooker::User.hash_email(" MaRy@example.com ")
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def test_register_with_array
|
|
190
|
+
expect_http_posts_with_responses(register_response_xml)
|
|
191
|
+
assert_equal ["4228600737_c96da02bba97aedfd26136e980ae3761"],Facebooker::User.register([{:email=>"mary@example.com",:account_id=>1}])
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def test_unregister_with_array
|
|
195
|
+
expect_http_posts_with_responses(unregister_response_xml)
|
|
196
|
+
assert_equal ["4228600737_c96da02bba97aedfd26136e980ae3761"],Facebooker::User.unregister(["4228600737_c96da02bba97aedfd26136e980ae3761"])
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def test_unregister_emails_with_array
|
|
200
|
+
expect_http_posts_with_responses(unregister_response_xml)
|
|
201
|
+
assert_equal ["mary@example.com"],Facebooker::User.unregister_emails(["mary@example.com"])
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def test_register_with_array_raises_if_not_all_success
|
|
205
|
+
expect_http_posts_with_responses(register_response_xml)
|
|
206
|
+
assert_equal ["4228600737_c96da02bba97aedfd26136e980ae3761"],Facebooker::User.register([{:email=>"mary@example.com",:account_id=>1},{:email=>"mike@example.com",:account_id=>2}])
|
|
207
|
+
fail "Should have raised Facebooker::Session::UserRegistrationFailed"
|
|
208
|
+
rescue Facebooker::Session::UserRegistrationFailed => e
|
|
209
|
+
assert_equal({:email=>"mike@example.com",:account_id=>2},e.failed_users.first)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def test_unregister_with_array_raises_if_not_all_success
|
|
213
|
+
expect_http_posts_with_responses(unregister_response_xml)
|
|
214
|
+
assert_equal ["4228600737_c96da02bba97aedfd26136e980ae3761"],Facebooker::User.unregister(["4228600737_c96da02bba97aedfd26136e980ae3761","3587916587_791214eb452bf4de30e957d65a0234d4"])
|
|
215
|
+
fail "Should have raised Facebooker::Session::UserUnRegistrationFailed"
|
|
216
|
+
rescue Facebooker::Session::UserUnRegistrationFailed => e
|
|
217
|
+
assert_equal("3587916587_791214eb452bf4de30e957d65a0234d4",e.failed_users.first)
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def test_unregister_emails_with_array_raises_if_not_all_success
|
|
221
|
+
expect_http_posts_with_responses(unregister_response_xml)
|
|
222
|
+
assert_equal ["mary@example.com"],Facebooker::User.unregister_emails(["mary@example.com","mike@example.com"])
|
|
223
|
+
fail "Should have raised Facebooker::Session::UserUnRegistrationFailed"
|
|
224
|
+
rescue Facebooker::Session::UserUnRegistrationFailed => e
|
|
225
|
+
assert_equal("mike@example.com",e.failed_users.first)
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def test_get_locale
|
|
230
|
+
@user = Facebooker::User.new(9507801, @session)
|
|
231
|
+
expect_http_posts_with_responses(example_users_get_info_xml)
|
|
232
|
+
assert_equal "en_US", @user.locale
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def test_get_profile_url
|
|
236
|
+
@user = Facebooker::User.new(8055, @session)
|
|
237
|
+
expect_http_posts_with_responses(example_users_get_info_xml)
|
|
238
|
+
assert_equal "http://www.facebook.com/profile.php?id=8055", @user.profile_url
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
private
|
|
242
|
+
def example_profile_photos_get_xml
|
|
243
|
+
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
|
|
244
|
+
<photos_get_response xmlns=\"http://api.facebook.com/1.0/\"
|
|
245
|
+
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
|
|
246
|
+
xsi:schemaLocation=\"http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd\" list=\"true\">
|
|
247
|
+
<photo>
|
|
248
|
+
<pid>34585991612804</pid>
|
|
249
|
+
<aid>2357384227378429949</aid>
|
|
250
|
+
<owner>1240077</owner>
|
|
251
|
+
<src>http://ip002.facebook.com/v11/135/18/8055/s1240077_30043524_2020.jpg</src>
|
|
252
|
+
<src_big>http://ip002.facebook.com/v11/135/18/8055/n1240077_30043524_2020.jpg</src_big>
|
|
253
|
+
<src_small>http://ip002.facebook.com/v11/135/18/8055/t1240077_30043524_2020.jpg</src_small>
|
|
254
|
+
<link>http://www.facebook.com/photo.php?pid=30043524&id=8055</link>
|
|
255
|
+
<caption>From The Deathmatch (Trailer) (1999)</caption>
|
|
256
|
+
<created>1132553361</created>
|
|
257
|
+
</photo>
|
|
258
|
+
<photo>
|
|
259
|
+
<pid>34585991612805</pid>
|
|
260
|
+
<aid>2357384227378429949</aid>
|
|
261
|
+
<owner>1240077</owner>
|
|
262
|
+
<src>http://ip002.facebook.com/v11/135/18/8055/s1240077_30043525_2184.jpg</src>
|
|
263
|
+
<src_big>http://ip002.facebook.com/v11/135/18/8055/n1240077_30043525_2184.jpg</src_big>
|
|
264
|
+
<src_small>http://ip002.facebook.com/v11/135/18/8055/t1240077_30043525_2184.jpg</src_small>
|
|
265
|
+
<link>http://www.facebook.com/photo.php?pid=30043525&id=8055</link>
|
|
266
|
+
<caption>Mexico City, back cover of the CYHS Student Underground 1999.</caption>
|
|
267
|
+
<created>1132553362</created>
|
|
268
|
+
</photo>
|
|
269
|
+
</photos_get_response>"
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def example_events_get_xml
|
|
273
|
+
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
|
|
274
|
+
<events_get_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\">
|
|
275
|
+
<event>
|
|
276
|
+
<eid>29511517904</eid>
|
|
277
|
+
<name>PUMA SALE</name>
|
|
278
|
+
<tagline/>
|
|
279
|
+
<nid>0</nid>
|
|
280
|
+
<pic>http://profile.ak.facebook.com/object3/370/66/s29511517904_6952.jpg</pic>
|
|
281
|
+
<pic_big>http://profile.ak.facebook.com/object3/370/66/n29511517904_6952.jpg</pic_big>
|
|
282
|
+
<pic_small>http://profile.ak.facebook.com/object3/370/66/t29511517904_6952.jpg</pic_small>
|
|
283
|
+
<host>PUMA</host>
|
|
284
|
+
<description>PUMA SALE</description>
|
|
285
|
+
<event_type>Education</event_type>
|
|
286
|
+
<event_subtype>Study Group</event_subtype>
|
|
287
|
+
<start_time>1212166800</start_time>
|
|
288
|
+
<end_time>1212364800</end_time>
|
|
289
|
+
<creator>1234261165</creator>
|
|
290
|
+
<update_time>1209768148</update_time>
|
|
291
|
+
<location>PUMA LOT</location>
|
|
292
|
+
<venue>
|
|
293
|
+
<street>5 LYBERTY WAY</street>
|
|
294
|
+
<city>Westford</city>
|
|
295
|
+
<state>Massachusetts</state>
|
|
296
|
+
<country>United States</country>
|
|
297
|
+
<latitude>42.5792</latitude>
|
|
298
|
+
<longitude>-71.4383</longitude>
|
|
299
|
+
</venue>
|
|
300
|
+
</event>
|
|
301
|
+
</events_get_response>"
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def example_users_get_info_xml
|
|
305
|
+
<<-XML
|
|
306
|
+
<?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>
|
|
307
|
+
XML
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
def register_response_xml
|
|
311
|
+
<<-XML
|
|
312
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
313
|
+
<connect_registerUsers_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/facebook.xsd" list="true">
|
|
314
|
+
<connect_registerUsers_response_elt>4228600737_c96da02bba97aedfd26136e980ae3761</connect_registerUsers_response_elt>
|
|
315
|
+
</connect_registerUsers_response>
|
|
316
|
+
XML
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def unregister_response_xml
|
|
320
|
+
<<-XML
|
|
321
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
322
|
+
<connect_unregisterUsers_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/facebook.xsd" list="true">
|
|
323
|
+
<connect_unregisterUsers_response_elt>4228600737_c96da02bba97aedfd26136e980ae3761</connect_unregisterUsers_response_elt>
|
|
324
|
+
</connect_unregisterUsers_response>
|
|
325
|
+
XML
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
def has_app_permission_response_xml
|
|
329
|
+
<<-XML
|
|
330
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
331
|
+
<users_hasAppPermission_response xmlns="http://api.facebook.com/1.0/"
|
|
332
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
333
|
+
xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd">1</users_hasAppPermission_response>
|
|
334
|
+
XML
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
def example_profile_publish_to_get_xml
|
|
338
|
+
<<-eoxml
|
|
339
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
340
|
+
<stream_publish_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">703826862_78463536862</stream_publish_response>
|
|
341
|
+
eoxml
|
|
342
|
+
end
|
|
343
|
+
end
|