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.
Files changed (135) hide show
  1. data/.autotest +15 -0
  2. data/CHANGELOG.rdoc +24 -0
  3. data/COPYING.rdoc +19 -0
  4. data/Manifest.txt +133 -0
  5. data/README.rdoc +104 -0
  6. data/Rakefile +85 -0
  7. data/TODO.rdoc +4 -0
  8. data/examples/desktop_login.rb +14 -0
  9. data/facebooker.gemspec +38 -0
  10. data/generators/facebook/facebook_generator.rb +14 -0
  11. data/generators/facebook/templates/config/facebooker.yml +49 -0
  12. data/generators/facebook/templates/public/javascripts/facebooker.js +83 -0
  13. data/generators/facebook_controller/USAGE +33 -0
  14. data/generators/facebook_controller/facebook_controller_generator.rb +40 -0
  15. data/generators/facebook_controller/templates/controller.rb +7 -0
  16. data/generators/facebook_controller/templates/functional_test.rb +11 -0
  17. data/generators/facebook_controller/templates/helper.rb +2 -0
  18. data/generators/facebook_controller/templates/view.fbml.erb +2 -0
  19. data/generators/facebook_controller/templates/view.html.erb +2 -0
  20. data/generators/facebook_publisher/facebook_publisher_generator.rb +14 -0
  21. data/generators/facebook_publisher/templates/create_facebook_templates.rb +15 -0
  22. data/generators/facebook_publisher/templates/publisher.rb +3 -0
  23. data/generators/facebook_scaffold/USAGE +27 -0
  24. data/generators/facebook_scaffold/facebook_scaffold_generator.rb +118 -0
  25. data/generators/facebook_scaffold/templates/controller.rb +93 -0
  26. data/generators/facebook_scaffold/templates/facebook_style.css +2579 -0
  27. data/generators/facebook_scaffold/templates/functional_test.rb +89 -0
  28. data/generators/facebook_scaffold/templates/helper.rb +2 -0
  29. data/generators/facebook_scaffold/templates/layout.fbml.erb +6 -0
  30. data/generators/facebook_scaffold/templates/layout.html.erb +17 -0
  31. data/generators/facebook_scaffold/templates/style.css +74 -0
  32. data/generators/facebook_scaffold/templates/view_edit.fbml.erb +13 -0
  33. data/generators/facebook_scaffold/templates/view_edit.html.erb +18 -0
  34. data/generators/facebook_scaffold/templates/view_index.fbml.erb +24 -0
  35. data/generators/facebook_scaffold/templates/view_index.html.erb +24 -0
  36. data/generators/facebook_scaffold/templates/view_new.fbml.erb +12 -0
  37. data/generators/facebook_scaffold/templates/view_new.html.erb +17 -0
  38. data/generators/facebook_scaffold/templates/view_show.fbml.erb +10 -0
  39. data/generators/facebook_scaffold/templates/view_show.html.erb +10 -0
  40. data/generators/publisher/publisher_generator.rb +14 -0
  41. data/generators/xd_receiver/templates/xd_receiver.html +10 -0
  42. data/generators/xd_receiver/xd_receiver_generator.rb +10 -0
  43. data/init.rb +25 -0
  44. data/install.rb +12 -0
  45. data/lib/facebooker.rb +179 -0
  46. data/lib/facebooker/adapters/adapter_base.rb +91 -0
  47. data/lib/facebooker/adapters/bebo_adapter.rb +77 -0
  48. data/lib/facebooker/adapters/facebook_adapter.rb +52 -0
  49. data/lib/facebooker/admin.rb +42 -0
  50. data/lib/facebooker/batch_request.rb +45 -0
  51. data/lib/facebooker/data.rb +57 -0
  52. data/lib/facebooker/feed.rb +78 -0
  53. data/lib/facebooker/logging.rb +44 -0
  54. data/lib/facebooker/mobile.rb +20 -0
  55. data/lib/facebooker/mock/service.rb +50 -0
  56. data/lib/facebooker/mock/session.rb +18 -0
  57. data/lib/facebooker/model.rb +139 -0
  58. data/lib/facebooker/models/affiliation.rb +10 -0
  59. data/lib/facebooker/models/album.rb +11 -0
  60. data/lib/facebooker/models/applicationproperties.rb +39 -0
  61. data/lib/facebooker/models/applicationrestrictions.rb +10 -0
  62. data/lib/facebooker/models/cookie.rb +10 -0
  63. data/lib/facebooker/models/education_info.rb +11 -0
  64. data/lib/facebooker/models/event.rb +28 -0
  65. data/lib/facebooker/models/friend_list.rb +16 -0
  66. data/lib/facebooker/models/group.rb +36 -0
  67. data/lib/facebooker/models/info_item.rb +10 -0
  68. data/lib/facebooker/models/info_section.rb +10 -0
  69. data/lib/facebooker/models/location.rb +8 -0
  70. data/lib/facebooker/models/notifications.rb +17 -0
  71. data/lib/facebooker/models/page.rb +28 -0
  72. data/lib/facebooker/models/photo.rb +19 -0
  73. data/lib/facebooker/models/tag.rb +12 -0
  74. data/lib/facebooker/models/user.rb +497 -0
  75. data/lib/facebooker/models/video.rb +9 -0
  76. data/lib/facebooker/models/work_info.rb +10 -0
  77. data/lib/facebooker/parser.rb +642 -0
  78. data/lib/facebooker/rails/backwards_compatible_param_checks.rb +31 -0
  79. data/lib/facebooker/rails/controller.rb +344 -0
  80. data/lib/facebooker/rails/cucumber.rb +28 -0
  81. data/lib/facebooker/rails/cucumber/world.rb +46 -0
  82. data/lib/facebooker/rails/extensions/action_controller.rb +48 -0
  83. data/lib/facebooker/rails/extensions/rack_setup.rb +6 -0
  84. data/lib/facebooker/rails/extensions/routing.rb +15 -0
  85. data/lib/facebooker/rails/facebook_form_builder.rb +112 -0
  86. data/lib/facebooker/rails/facebook_pretty_errors.rb +22 -0
  87. data/lib/facebooker/rails/facebook_request_fix.rb +30 -0
  88. data/lib/facebooker/rails/facebook_request_fix_2-3.rb +31 -0
  89. data/lib/facebooker/rails/facebook_session_handling.rb +68 -0
  90. data/lib/facebooker/rails/facebook_url_helper.rb +192 -0
  91. data/lib/facebooker/rails/facebook_url_rewriting.rb +60 -0
  92. data/lib/facebooker/rails/helpers.rb +794 -0
  93. data/lib/facebooker/rails/helpers/fb_connect.rb +118 -0
  94. data/lib/facebooker/rails/integration_session.rb +38 -0
  95. data/lib/facebooker/rails/profile_publisher_extensions.rb +42 -0
  96. data/lib/facebooker/rails/publisher.rb +550 -0
  97. data/lib/facebooker/rails/routing.rb +49 -0
  98. data/lib/facebooker/rails/test_helpers.rb +68 -0
  99. data/lib/facebooker/rails/utilities.rb +22 -0
  100. data/lib/facebooker/server_cache.rb +24 -0
  101. data/lib/facebooker/service.rb +102 -0
  102. data/lib/facebooker/session.rb +606 -0
  103. data/lib/facebooker/version.rb +9 -0
  104. data/lib/net/http_multipart_post.rb +123 -0
  105. data/lib/rack/facebook.rb +77 -0
  106. data/lib/tasks/facebooker.rake +18 -0
  107. data/lib/tasks/tunnel.rake +46 -0
  108. data/rails/init.rb +1 -0
  109. data/setup.rb +1585 -0
  110. data/templates/layout.erb +24 -0
  111. data/test/facebooker/adapters_test.rb +96 -0
  112. data/test/facebooker/admin_test.rb +102 -0
  113. data/test/facebooker/batch_request_test.rb +83 -0
  114. data/test/facebooker/data_test.rb +86 -0
  115. data/test/facebooker/logging_test.rb +43 -0
  116. data/test/facebooker/mobile_test.rb +45 -0
  117. data/test/facebooker/model_test.rb +133 -0
  118. data/test/facebooker/models/event_test.rb +15 -0
  119. data/test/facebooker/models/photo_test.rb +16 -0
  120. data/test/facebooker/models/user_test.rb +343 -0
  121. data/test/facebooker/rails/facebook_request_fix_2-3_test.rb +24 -0
  122. data/test/facebooker/rails/facebook_url_rewriting_test.rb +39 -0
  123. data/test/facebooker/rails/publisher_test.rb +481 -0
  124. data/test/facebooker/rails_integration_test.rb +1398 -0
  125. data/test/facebooker/server_cache_test.rb +44 -0
  126. data/test/facebooker/session_test.rb +614 -0
  127. data/test/facebooker_test.rb +951 -0
  128. data/test/fixtures/multipart_post_body_with_only_parameters.txt +33 -0
  129. data/test/fixtures/multipart_post_body_with_single_file.txt +38 -0
  130. data/test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt +38 -0
  131. data/test/net/http_multipart_post_test.rb +52 -0
  132. data/test/rack/facebook_test.rb +61 -0
  133. data/test/rails_test_helper.rb +27 -0
  134. data/test/test_helper.rb +74 -0
  135. 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