facebooker-lite 1.0.67

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 (118) hide show
  1. data/.autotest +15 -0
  2. data/CHANGELOG.rdoc +24 -0
  3. data/COPYING.rdoc +19 -0
  4. data/Manifest.txt +114 -0
  5. data/README.rdoc +120 -0
  6. data/Rakefile +94 -0
  7. data/TODO.rdoc +4 -0
  8. data/facebooker.gemspec +42 -0
  9. data/generators/xd_receiver/templates/xd_receiver.html +10 -0
  10. data/generators/xd_receiver/templates/xd_receiver_ssl.html +10 -0
  11. data/generators/xd_receiver/xd_receiver_generator.rb +10 -0
  12. data/init.rb +25 -0
  13. data/install.rb +12 -0
  14. data/lib/facebooker.rb +261 -0
  15. data/lib/facebooker/adapters/adapter_base.rb +91 -0
  16. data/lib/facebooker/adapters/bebo_adapter.rb +77 -0
  17. data/lib/facebooker/adapters/facebook_adapter.rb +60 -0
  18. data/lib/facebooker/admin.rb +42 -0
  19. data/lib/facebooker/application.rb +37 -0
  20. data/lib/facebooker/attachment.rb +51 -0
  21. data/lib/facebooker/batch_request.rb +45 -0
  22. data/lib/facebooker/data.rb +57 -0
  23. data/lib/facebooker/feed.rb +78 -0
  24. data/lib/facebooker/logging.rb +44 -0
  25. data/lib/facebooker/mobile.rb +20 -0
  26. data/lib/facebooker/mock/service.rb +50 -0
  27. data/lib/facebooker/mock/session.rb +18 -0
  28. data/lib/facebooker/model.rb +139 -0
  29. data/lib/facebooker/models/affiliation.rb +10 -0
  30. data/lib/facebooker/models/album.rb +11 -0
  31. data/lib/facebooker/models/applicationproperties.rb +39 -0
  32. data/lib/facebooker/models/applicationrestrictions.rb +10 -0
  33. data/lib/facebooker/models/comment.rb +9 -0
  34. data/lib/facebooker/models/cookie.rb +10 -0
  35. data/lib/facebooker/models/education_info.rb +11 -0
  36. data/lib/facebooker/models/event.rb +28 -0
  37. data/lib/facebooker/models/family_relative_info.rb +7 -0
  38. data/lib/facebooker/models/friend_list.rb +16 -0
  39. data/lib/facebooker/models/group.rb +36 -0
  40. data/lib/facebooker/models/info_item.rb +10 -0
  41. data/lib/facebooker/models/info_section.rb +10 -0
  42. data/lib/facebooker/models/location.rb +8 -0
  43. data/lib/facebooker/models/message_thread.rb +89 -0
  44. data/lib/facebooker/models/notifications.rb +17 -0
  45. data/lib/facebooker/models/page.rb +46 -0
  46. data/lib/facebooker/models/photo.rb +19 -0
  47. data/lib/facebooker/models/tag.rb +12 -0
  48. data/lib/facebooker/models/user.rb +751 -0
  49. data/lib/facebooker/models/video.rb +9 -0
  50. data/lib/facebooker/models/work_info.rb +10 -0
  51. data/lib/facebooker/parser.rb +970 -0
  52. data/lib/facebooker/rails/backwards_compatible_param_checks.rb +31 -0
  53. data/lib/facebooker/rails/controller.rb +353 -0
  54. data/lib/facebooker/rails/extensions/action_controller.rb +47 -0
  55. data/lib/facebooker/rails/extensions/rack_setup.rb +16 -0
  56. data/lib/facebooker/rails/extensions/routing.rb +15 -0
  57. data/lib/facebooker/rails/facebook_pretty_errors.rb +22 -0
  58. data/lib/facebooker/rails/facebook_request_fix.rb +28 -0
  59. data/lib/facebooker/rails/facebook_request_fix_2-3.rb +31 -0
  60. data/lib/facebooker/rails/facebook_session_handling.rb +68 -0
  61. data/lib/facebooker/rails/facebook_url_rewriting.rb +60 -0
  62. data/lib/facebooker/rails/helpers/fb_connect.rb +75 -0
  63. data/lib/facebooker/rails/integration_session.rb +38 -0
  64. data/lib/facebooker/rails/profile_publisher_extensions.rb +42 -0
  65. data/lib/facebooker/rails/publisher.rb +608 -0
  66. data/lib/facebooker/rails/routing.rb +49 -0
  67. data/lib/facebooker/rails/test_helpers.rb +68 -0
  68. data/lib/facebooker/rails/utilities.rb +22 -0
  69. data/lib/facebooker/server_cache.rb +24 -0
  70. data/lib/facebooker/service.rb +103 -0
  71. data/lib/facebooker/service/base_service.rb +19 -0
  72. data/lib/facebooker/service/curl_service.rb +44 -0
  73. data/lib/facebooker/service/net_http_service.rb +12 -0
  74. data/lib/facebooker/service/typhoeus_multi_service.rb +27 -0
  75. data/lib/facebooker/service/typhoeus_service.rb +17 -0
  76. data/lib/facebooker/session.rb +786 -0
  77. data/lib/facebooker/stream_post.rb +19 -0
  78. data/lib/facebooker/version.rb +9 -0
  79. data/lib/net/http_multipart_post.rb +123 -0
  80. data/lib/rack/facebook.rb +89 -0
  81. data/lib/rack/facebook_session.rb +21 -0
  82. data/lib/tasks/facebooker.rake +19 -0
  83. data/lib/tasks/facebooker.rb +2 -0
  84. data/lib/tasks/tunnel.rake +46 -0
  85. data/rails/init.rb +1 -0
  86. data/setup.rb +1585 -0
  87. data/templates/layout.erb +24 -0
  88. data/test/facebooker/adapters_test.rb +191 -0
  89. data/test/facebooker/admin_test.rb +102 -0
  90. data/test/facebooker/application_test.rb +110 -0
  91. data/test/facebooker/attachment_test.rb +72 -0
  92. data/test/facebooker/batch_request_test.rb +83 -0
  93. data/test/facebooker/data_test.rb +86 -0
  94. data/test/facebooker/logging_test.rb +43 -0
  95. data/test/facebooker/mobile_test.rb +45 -0
  96. data/test/facebooker/model_test.rb +133 -0
  97. data/test/facebooker/models/event_test.rb +15 -0
  98. data/test/facebooker/models/page_test.rb +56 -0
  99. data/test/facebooker/models/photo_test.rb +16 -0
  100. data/test/facebooker/models/user_test.rb +1074 -0
  101. data/test/facebooker/rails/facebook_request_fix_2-3_test.rb +25 -0
  102. data/test/facebooker/rails/facebook_url_rewriting_test.rb +76 -0
  103. data/test/facebooker/rails/integration_session_test.rb +13 -0
  104. data/test/facebooker/rails/publisher_test.rb +538 -0
  105. data/test/facebooker/rails_integration_test.rb +1543 -0
  106. data/test/facebooker/server_cache_test.rb +44 -0
  107. data/test/facebooker/service_test.rb +58 -0
  108. data/test/facebooker/session_test.rb +883 -0
  109. data/test/facebooker_test.rb +1263 -0
  110. data/test/fixtures/multipart_post_body_with_only_parameters.txt +33 -0
  111. data/test/fixtures/multipart_post_body_with_single_file.txt +38 -0
  112. data/test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt +38 -0
  113. data/test/net/http_multipart_post_test.rb +52 -0
  114. data/test/rack/facebook_session_test.rb +34 -0
  115. data/test/rack/facebook_test.rb +73 -0
  116. data/test/rails_test_helper.rb +36 -0
  117. data/test/test_helper.rb +74 -0
  118. metadata +278 -0
@@ -0,0 +1,1263 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+ require 'net/http_multipart_post'
3
+ class TestFacebooker < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @api_key = "95a71599e8293s66f1f0a6f4aeab3df7"
7
+ @secret_key = "3e4du8eea435d8e205a6c9b5d095bed1"
8
+ ENV["FACEBOOK_API_KEY"] = @api_key
9
+ ENV["FACEBOOK_SECRET_KEY"] = @secret_key
10
+ @session = Facebooker::Session.create(@api_key, @secret_key)
11
+ @desktop_session = Facebooker::Session::Desktop.create(@api_key, @secret_key)
12
+ @service = Facebooker::Service.new('http://apibase.com', '/api/path', @api_key)
13
+ @desktop_session.instance_variable_set("@service", @service)
14
+ end
15
+
16
+ def test_asset_host_callback_url
17
+ Facebooker.set_asset_host_to_callback_url = true
18
+ assert_equal true, Facebooker.set_asset_host_to_callback_url
19
+
20
+ Facebooker.set_asset_host_to_callback_url = false
21
+ assert_equal false, Facebooker.set_asset_host_to_callback_url
22
+ end
23
+
24
+ def test_session_must_be_created_from_api_key_and_secret_key
25
+ assert_kind_of(Facebooker::Session, @session)
26
+ end
27
+
28
+ def test_session_can_tell_you_its_login_url
29
+ assert_not_nil(@session.login_url)
30
+ assert_equal("http://www.facebook.com/login.php?api_key=#{@api_key}&v=1.0", @session.login_url)
31
+ end
32
+
33
+ def test_desktop_session_returns_auth_toke_as_part_of_login_url
34
+ @service = flexmock(@service).should_receive(:post).at_least.once.and_return(123)
35
+ assert_kind_of(Facebooker::Session::Desktop, @desktop_session)
36
+ assert_match(/auth_token=[a-z0-9A-Z]/, @desktop_session.login_url)
37
+ end
38
+
39
+ def test_service_posts_data_to_http_location
40
+ flexmock(Net::HTTP).should_receive(:post_form).and_return(example_auth_token_xml)
41
+ assert_equal("http://www.facebook.com/login.php?api_key=#{@api_key}&v=1.0&auth_token=3e4a22bb2f5ed75114b0fc9995ea85f1", @desktop_session.login_url)
42
+ end
43
+
44
+ # def test_serivce_post_file_delegates_to_post_multipart_form
45
+ # # flexmock(@service).should_receive(:url).and_return('url')
46
+ # # flexmock(Net::HTTP).expects(:post_multipart_form).with('url', {:method => 'facebook.auth.createToken'}).returns(example_auth_token_xml)
47
+ #
48
+ # res = mock(:content_type => 'text/html', :code => '200', :body => '<html><body>my blog</body></html>')
49
+ # Net::HTTP.stubs(:get_response).once.with(uri).returns res
50
+ #
51
+ # @service.post_file(:method => 'facebook.auth.createToken')
52
+ # end
53
+
54
+ def test_desktop_session_be_secured_and_activated_after_receiving_auth_token_and_logging_in
55
+ establish_session
56
+ assert_equal("5f34e11bfb97c762e439e6a5-8055", @session.instance_variable_get("@session_key"))
57
+ end
58
+
59
+ def test_desktop_session_uses_secret_api_key_for_hashing_until_user_authenticates
60
+ assert_equal(@secret_key, @desktop_session.secret_for_method('facebook.auth.createToken'))
61
+ establish_session(@desktop_session)
62
+ assert_equal("ohairoflamao12345", @desktop_session.secret_for_method('anyNonAuthMethodName'))
63
+ end
64
+
65
+ def test_session_can_get_current_logged_in_user_id_and_will_cache
66
+ establish_session
67
+ flexmock(Net::HTTP).should_receive(:post_form).and_return(example_get_logged_in_user_xml)
68
+ assert_equal(8055, @session.user.id)
69
+ end
70
+
71
+ def test_can_get_current_users_friends
72
+ expect_http_posts_with_responses(example_friends_xml)
73
+ assert_equal([222333, 1240079], @session.user.friends.map{|friend| friend.id})
74
+ end
75
+
76
+ def test_can_get_current_users_friend_lists
77
+ expect_http_posts_with_responses(example_friend_lists_xml)
78
+ assert_equal([12089150545, 16361710545], @session.user.friend_lists.map{|friend_list| friend_list.flid})
79
+ end
80
+
81
+ def test_can_get_info_for_instance_of_user
82
+ populate_user_info
83
+ @session.user.first_name = "Dave"
84
+ end
85
+
86
+ def test_can_get_info_for_one_or_more_users
87
+ friends = populate_session_friends
88
+ friend = friends.detect{|f| f.id == 222333}
89
+ assert_equal('This field perpetuates the glorification of the ego. Also, it has a character limit.',
90
+ friend.about_me)
91
+ assert_equal('Facebook Developers', friend.affiliations.first.name)
92
+ assert_equal('Friendship', friend.meeting_for.first)
93
+ assert_equal('94303', friend.current_location.zip)
94
+ assert_equal('York', friend.hometown_location.city)
95
+ assert_equal('Harvard', friend.education_history.first.name)
96
+ assert(friend.education_history.first.concentrations.include?("Computer Science"))
97
+ assert_equal('Central York High School', friend.hs_info.hs1_name)
98
+ assert_equal('female', friend.meeting_sex.first)
99
+ assert_equal('I rule', friend.status.message)
100
+ end
101
+
102
+ def test_can_get_specific_info_for_one_or_more_users
103
+ friends = populate_session_friends_with_limited_fields
104
+ friend = friends.detect{|f| f.id == 222333}
105
+ assert_equal('I rule', friend.status.message)
106
+ assert_equal(nil, friend.hometown_location)
107
+ end
108
+
109
+ def test_can_handle_nil_data
110
+ friends = populate_session_friends_with_nil_data
111
+ friend = friends.detect{|f| f.id == 222333}
112
+ assert_equal(nil,friend.current_location)
113
+ assert_equal(nil,friend.pic)
114
+ end
115
+
116
+ def test_session_can_expire_on_server_and_client_handles_appropriately
117
+ expect_http_posts_with_responses(example_session_expired_error_response)
118
+ assert_raises(Facebooker::Session::SessionExpired) {
119
+ @session.user.friends
120
+ }
121
+ end
122
+
123
+
124
+ def test_can_publish_story_to_users_feed
125
+ expect_http_posts_with_responses(example_publish_story_xml)
126
+ assert_nothing_raised {
127
+ assert(@session.user.publish_story((s = Facebooker::Feed::Story.new; s.title = 'o hai'; s.body = '4srsly'; s)))
128
+ }
129
+ end
130
+
131
+
132
+ def test_can_publish_action_to_users_feed
133
+ expect_http_posts_with_responses(example_publish_action_xml)
134
+ assert_nothing_raised {
135
+ assert(@session.user.publish_action((s = Facebooker::Feed::Action.new; s.title = 'o hai'; s.body = '4srsly'; s)))
136
+ }
137
+ end
138
+
139
+ def test_can_publish_templatized_action_to_users_feed
140
+ expect_http_posts_with_responses(example_publish_templatized_action_xml)
141
+ assert_nothing_raised {
142
+ action = Facebooker::Feed::TemplatizedAction.new
143
+ action.title_template = "{actor} did something"
144
+ assert(@session.user.publish_templatized_action(action))
145
+ }
146
+ end
147
+
148
+ def test_can_publish_templatized_action_to_users_feed_with_params_as_string
149
+ json_data="{\"move\": \"punch\"}"
150
+ action = Facebooker::Feed::TemplatizedAction.new
151
+ action.title_template = "{actor} did something "
152
+ action.title_data=json_data
153
+ assert_equal action.to_params[:title_data],json_data
154
+ end
155
+
156
+ def test_can_publish_templatized_action_to_users_feed_with_params_as_hash
157
+ json_data="{\"move\": \"punch\"}"
158
+ hash={:move=>"punch"}
159
+ hash.expects(:to_json).returns(json_data)
160
+ action = Facebooker::Feed::TemplatizedAction.new
161
+ action.title_template = "{actor} did something "
162
+ action.title_data=hash
163
+ assert_equal action.to_params[:title_data],json_data
164
+ end
165
+
166
+ def test_can_deactivate_template_bundle_by_id
167
+ expect_http_posts_with_responses(example_deactivate_template_bundle_by_id_xml)
168
+ assert_equal true, @session.post('facebook.feed.deactivateTemplateBundleByID', :template_bundle_id => 123)
169
+ end
170
+
171
+ def test_can_get_notifications_for_logged_in_user
172
+ expect_http_posts_with_responses(example_notifications_get_xml)
173
+ assert_equal("1", @session.user.notifications.messages.unread)
174
+ assert_equal("0", @session.user.notifications.pokes.unread)
175
+ assert_equal("1", @session.user.notifications.shares.unread)
176
+ end
177
+
178
+ def test_can_send_notifications
179
+ expect_http_posts_with_responses(example_notifications_send_xml)
180
+ assert_nothing_raised {
181
+ user_ids = [123, 321]
182
+ notification_fbml = "O HAI!!!"
183
+ optional_email_fbml = "This would be in the email. If this is not passed, facebook sends no mailz!"
184
+ assert_equal('http://www.facebook.com/send_email.php?from=211031&id=52', @session.send_notification(user_ids, notification_fbml, optional_email_fbml))
185
+ }
186
+ end
187
+
188
+ def test_can_send_emails
189
+ expect_http_posts_with_responses(example_notifications_send_email_xml)
190
+ assert_nothing_raised {
191
+ user_ids = [123, 321]
192
+ text = "Hi I am the text part of the email."
193
+ fbml = "Hi I am the fbml version of the <b>email</a>"
194
+ subject = "Somethign you should really pay attention to."
195
+ assert_equal('123,321', @session.send_email(user_ids, subject,text,fbml ))
196
+ }
197
+ end
198
+
199
+ def test_can_find_friends_who_have_installed_app
200
+ expect_http_posts_with_responses(example_app_users_xml)
201
+ assert_equal(2, @session.user.friends_with_this_app.size)
202
+ assert_equal([222333, 1240079], @session.user.friends_with_this_app.map{|f| f.id})
203
+ end
204
+
205
+ def test_when_marshaling_a_session_object_only_enough_data_to_stay_authenticated_is_stored
206
+ populate_session_friends
207
+ assert_equal(2, @session.user.friends.size)
208
+ reloaded_session = Marshal.load(Marshal.dump(@session))
209
+ %w(@session_key @uid @expires @secret_from_session @auth_token).each do |iv_name|
210
+ assert_not_nil(reloaded_session.instance_variable_get(iv_name))
211
+ end
212
+ assert_nil(reloaded_session.user.instance_variable_get("@friends"))
213
+ end
214
+
215
+ def test_sessions_can_be_infinite_or_can_expire
216
+ establish_session
217
+ assert(@session.expired?, "Session with expiry time #{@session.instance_variable_get('@expires')} occurred in the past and should be expired.")
218
+ @session.instance_variable_set("@expires", 0)
219
+ assert(@session.infinite?)
220
+ assert(!@session.expired?)
221
+ end
222
+
223
+ def test_session_can_tell_you_if_it_has_been_secured
224
+ mock = flexmock(Net::HTTP).should_receive(:post_form).and_return(example_auth_token_xml).once.ordered(:posts)
225
+ mock.should_receive(:post_form).and_return(example_get_session_xml.sub(/1173309298/, (Time.now + 60).to_i.to_s)).once.ordered(:posts)
226
+ @session.secure!
227
+ assert(@session.secured?)
228
+ end
229
+
230
+ def test_can_get_photos_by_pids
231
+ expect_http_posts_with_responses(example_get_photo_xml)
232
+ photos = @session.get_photos([97503428461115590, 97503428461115573])
233
+ assert_equal 2, photos.size
234
+ assert_equal "Rooftop barbecues make me act funny", photos.first.caption
235
+ assert_equal "97503428461115590", photos[0].id
236
+ end
237
+
238
+ def test_can_get_photos_by_subject_and_album
239
+ expect_http_posts_with_responses(example_get_photo_xml)
240
+ photos = @session.get_photos(nil, 22701786, 97503428432802022 )
241
+ assert_equal '97503428432802022', photos.first.aid
242
+ end
243
+
244
+ def test_getting_photos_requires_arguments
245
+ mock_http = establish_session
246
+ assert_raise(ArgumentError) { @session.get_photos() }
247
+ end
248
+
249
+ def test_can_get_comments_by_xid
250
+ expect_http_posts_with_responses(example_comments_xml)
251
+ comments = @session.get_comments('pete_comments')
252
+ assert_equal('Hola', comments[0].text)
253
+ assert_equal(2, comments.size)
254
+ end
255
+
256
+ def test_can_get_albums_for_user
257
+ expect_http_posts_with_responses(example_user_albums_xml)
258
+ assert_equal('Summertime is Best', @session.user.albums.first.name)
259
+ assert_equal(2, @session.user.albums.size)
260
+ end
261
+
262
+ def test_can_get_albums_by_album_ids
263
+ expect_http_posts_with_responses(example_user_albums_xml)
264
+ albums = @session.get_albums([97503428432802022, 97503428432797817] )
265
+ assert_equal('Summertime is Best', albums[0].name)
266
+ assert_equal('Bonofon\'s Recital', albums[1].name)
267
+ end
268
+
269
+ def test_can_get_stream
270
+ expect_http_posts_with_responses(example_user_stream_xml)
271
+ stream = @session.get_stream(100000637452380)
272
+ assert stream[:albums].empty?
273
+ assert_equal('The bbc home page', stream[:posts].first['message'])
274
+ end
275
+
276
+ def test_can_get_user_stream
277
+ expect_http_posts_with_responses(example_user_stream_xml)
278
+ stream = @session.user.stream
279
+ assert stream[:albums].empty?
280
+ assert_equal('The bbc home page', stream[:posts].first['message'])
281
+ end
282
+
283
+ def test_can_create_album
284
+ expect_http_posts_with_responses(example_new_album_xml)
285
+ assert_equal "My Empty Album", @session.user.create_album(:name => "My Empty Album", :location => "Limboland").name
286
+ end
287
+
288
+ def test_can_upload_photo
289
+ mock_http = establish_session
290
+ mock_http.should_receive(:post_multipart_form).and_return(example_upload_photo_xml).once.ordered(:posts)
291
+ f = Net::HTTP::MultipartPostFile.new("image.jpg", "image/jpeg", "RAW DATA")
292
+ assert_equal "Under the sunset", @session.user.upload_photo(f).caption
293
+ end
294
+
295
+ def test_can_upload_native_strings
296
+ expect_http_posts_with_responses(example_upload_native_string_xml)
297
+ assert_equal "1", @session.upload_native_strings([:text => "Hello!", :description => "A common salutation."])
298
+ end
299
+
300
+ def test_can_get_photo_tags
301
+ expect_http_posts_with_responses(example_photo_tags_xml)
302
+ assert_instance_of Facebooker::Tag, @session.get_tags(:pids => 97503428461115571 ).first
303
+ end
304
+
305
+ # TODO: how to test that tags were created properly? Response doesn't contain much
306
+ def test_can_tag_a_user_in_a_photo
307
+ expect_http_posts_with_responses(example_add_tag_xml)
308
+ assert !@session.add_tags(pid = 97503428461115571, x= 30.0, y = 62.5, tag_uid = 1234567890).nil?
309
+ end
310
+
311
+ def test_can_add_multiple_tags_to_photos
312
+ end
313
+
314
+ def test_can_get_coordinates_for_photo_tags
315
+ expect_http_posts_with_responses(example_photo_tags_xml)
316
+ tag = @session.get_tags([97503428461115571]).first
317
+ assert_equal ['65.4248', '16.8627'], tag.coordinates
318
+ end
319
+
320
+ def test_can_upload_video
321
+ mock_http = establish_session
322
+ mock_http.should_receive(:post_multipart_form).and_return(example_upload_video_xml).once
323
+ f = Net::HTTP::MultipartPostFile.new("party.mp4", "video/mpeg", "RAW DATA")
324
+ assert_equal "Some Epic", @session.user.upload_video(f).title
325
+ end
326
+
327
+ def test_can_get_app_profile_fbml_for_user
328
+ expect_http_posts_with_responses(example_get_fbml_xml)
329
+ assert_match(/My profile!/, @session.user.profile_fbml)
330
+ end
331
+
332
+ def test_can_set_app_profile_fbml_for_user
333
+ expect_http_posts_with_responses(example_set_fbml_xml)
334
+ assert_nothing_raised {
335
+ @session.user.profile_fbml = 'aha!'
336
+ }
337
+ end
338
+
339
+ def test_get_logged_in_user
340
+ expect_http_posts_with_responses(example_get_logged_in_user_xml)
341
+ assert_equal 1240077, @session.post('facebook.users.getLoggedInUser', :session_key => @session.session_key)
342
+ end
343
+
344
+ def test_pages_get_info
345
+ expect_http_posts_with_responses(example_pages_get_info_xml)
346
+ info = {
347
+ 'page_id' => '4846711747',
348
+ 'name' => 'Kronos Quartet',
349
+ 'website' => 'http://www.kronosquartet.org',
350
+ 'company_overview' => ""
351
+ }
352
+ assert_equal [info], @session.post('facebook.pages.getInfo', :fields => ['company_overview', 'website', 'name', 'page_id'].join(','), :page_ids => [4846711747].join(','))
353
+ end
354
+
355
+ def test_pages_is_admin_true
356
+ expect_http_posts_with_responses(example_pages_is_admin_true_xml)
357
+ assert_equal true, @session.post('facebook.pages.isAdmin', :page_id => 123)
358
+ end
359
+
360
+ def test_pages_is_admin_false
361
+ expect_http_posts_with_responses(example_pages_is_admin_false_xml)
362
+ assert_equal false, @session.post('facebook.pages.isAdmin', :page_id => 123)
363
+ end
364
+
365
+ def test_pages_is_fan_true
366
+ expect_http_posts_with_responses(example_pages_is_fan_true_xml)
367
+ assert_equal true, @session.post('facebook.pages.isFan', :page_id => 123)
368
+ end
369
+
370
+ def test_pages_is_fan_false
371
+ expect_http_posts_with_responses(example_pages_is_fan_false_xml)
372
+ assert_equal false, @session.post('facebook.pages.isFan', :page_id => 123)
373
+ end
374
+
375
+ def test_users_set_status_true
376
+ expect_http_posts_with_responses(example_users_set_status_true_xml)
377
+ assert_equal true, @session.post('facebook.users.setStatus', :uid => 123, :status => 'message')
378
+ end
379
+
380
+ def test_users_set_status_false
381
+ expect_http_posts_with_responses(example_users_set_status_false_xml)
382
+ assert_equal false, @session.post('facebook.users.setStatus', :uid => 123, :status => 'message')
383
+ end
384
+
385
+ def test_desktop_apps_cannot_request_to_get_or_set_profile_fbml_for_any_user_other_than_logged_in_user
386
+ mock_http = establish_session(@desktop_session)
387
+ mock_http.should_receive(:post_form).and_return(example_friends_xml).once.ordered(:posts)
388
+ assert_raises(Facebooker::NonSessionUser) {
389
+ @desktop_session.user.friends.first.profile_fbml
390
+ }
391
+ assert_raises(Facebooker::NonSessionUser) {
392
+ @desktop_session.user.friends.first.profile_fbml = "O rly"
393
+ }
394
+ end
395
+
396
+ def test_revoke_authorization_true
397
+ expect_http_posts_with_responses(example_revoke_authorization_true)
398
+ assert_equal true, @session.post('facebook.auth.revokeAuthorization', :uid => 123)
399
+ end
400
+
401
+ def test_revoke_authorization_false
402
+ expect_http_posts_with_responses(example_revoke_authorization_false)
403
+ assert_equal false, @session.post('facebook.auth.revokeAuthorization', :uid => 123)
404
+ end
405
+
406
+ def test_revoke_extended_permission
407
+ expect_http_posts_with_responses(example_revoke_extended_permission)
408
+ assert_equal true, @session.post('facebook.auth.revokeExtendedPermission', {:perm => 'email', :uid => 123}, false)
409
+ end
410
+
411
+ def test_remove_comment_true
412
+ expect_http_posts_with_responses(example_remove_comment_true)
413
+ assert_equal true, @session.remove_comment('pete_comments',123)
414
+ end
415
+
416
+ def test_remove_comment_false
417
+ expect_http_posts_with_responses(example_remove_comment_false)
418
+ assert_equal false, @session.remove_comment('pete_comments',123)
419
+ end
420
+
421
+ # We can have lists in not list item, see ewample_with_list_in_none_list_item_xml : there is comment_list in comments node
422
+ def test_parser_with_list_item_in_not_list_item
423
+ expect_http_posts_with_responses(ewample_with_list_in_none_list_item_xml)
424
+ response = @session.fql_query('Lets be frank. We are not testing the query here')
425
+ assert_equal 3, response.first["comments"]['comment_list'].size
426
+ assert_equal "ahahhahaha\n i don't know the original one, but this is awesome (without waiting for it)", response.first["comments"]['comment_list'].first['text']
427
+ end
428
+
429
+
430
+ private
431
+ def populate_user_info
432
+ mock_http = establish_session
433
+ mock_http.should_receive(:post_form).and_return(example_user_info_xml).once
434
+ @session.user.populate
435
+ end
436
+
437
+ def populate_user_info_with_limited_fields
438
+ expect_http_posts_with_responses(example_limited_user_info_xml)
439
+ @session.user.populate(:affiliations, :status, :meeting_for)
440
+ end
441
+
442
+ def populate_session_friends
443
+ expect_http_posts_with_responses(example_friends_xml, example_user_info_xml)
444
+ @session.user.friends!
445
+ end
446
+
447
+ def populate_session_friends_with_limited_fields
448
+ expect_http_posts_with_responses(example_friends_xml, example_limited_user_info_xml)
449
+ @session.user.friends!(:affiliations, :status, :meeting_for)
450
+ end
451
+
452
+ def populate_session_friends_with_nil_data
453
+ expect_http_posts_with_responses(example_friends_xml, example_nil_user_info_xml)
454
+ @session.user.friends!(:name, :current_location, :pic)
455
+ end
456
+
457
+ def sample_args_to_post
458
+ {:method=>"facebook.auth.createToken", :sig=>"18b3dc4f5258a63c0ad641eebd3e3930"}
459
+ end
460
+
461
+ def example_pages_get_info_xml
462
+ <<-XML
463
+ <?xml version="1.0" encoding="UTF-8"?>
464
+ <pages_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">
465
+ <page>
466
+ <page_id>4846711747</page_id>
467
+ <name>Kronos Quartet</name>
468
+ <website>http://www.kronosquartet.org</website>
469
+ <company_overview/>
470
+ </page>
471
+ </pages_getInfo_response>
472
+ XML
473
+ end
474
+
475
+ def example_pages_is_admin_true_xml
476
+ <<-XML
477
+ <?xml version="1.0" encoding="UTF-8"?>
478
+ <pages_isAdmin_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">1</pages_isAdmin_response>
479
+ XML
480
+ end
481
+
482
+ def example_pages_is_admin_false_xml
483
+ <<-XML
484
+ <?xml version="1.0" encoding="UTF-8"?>
485
+ <pages_isAdmin_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">0</pages_isAdmin_response>
486
+ XML
487
+ end
488
+
489
+ def example_pages_is_fan_true_xml
490
+ <<-XML
491
+ <?xml version="1.0" encoding="UTF-8"?>
492
+ <pages_isFan_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">1</pages_isFan_response>
493
+ XML
494
+ end
495
+
496
+ def example_pages_is_fan_false_xml
497
+ <<-XML
498
+ <?xml version="1.0" encoding="UTF-8"?>
499
+ <pages_isFan_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">0</pages_isFan_response>
500
+ XML
501
+ end
502
+
503
+ def example_users_set_status_true_xml
504
+ <<-XML
505
+ <?xml version="1.0" encoding="UTF-8"?>
506
+ <users_setStatus_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">1</users_setStatus_response>
507
+ XML
508
+ end
509
+
510
+ def example_users_set_status_false_xml
511
+ <<-XML
512
+ <?xml version="1.0" encoding="UTF-8"?>
513
+ <users_setStatus_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">0</users_setStatus_response>
514
+ XML
515
+ end
516
+
517
+ def example_set_fbml_xml
518
+ <<-XML
519
+ <?xml version="1.0" encoding="UTF-8"?>
520
+ <profile_setFBML_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">1</profile_setFBML_response>
521
+ XML
522
+ end
523
+
524
+ def example_get_fbml_xml
525
+ <<-XML
526
+ <?xml version="1.0" encoding="UTF-8"?>
527
+ <profile_getFBML_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">
528
+ &lt;fb:if-is-own-profile&gt;My profile!
529
+ &lt;fb:else&gt; Not my profile!&lt;/fb:else&gt;
530
+ &lt;/fb:if-is-own-profile&gt;
531
+ </profile_getFBML_response>
532
+ XML
533
+ end
534
+
535
+ def example_notifications_send_xml
536
+ <<-XML
537
+ <?xml version="1.0" encoding="UTF-8"?>
538
+ <notifications_send_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">http://www.facebook.com/send_email.php?from=211031&amp;id=52</notifications_send_response>
539
+ XML
540
+ end
541
+
542
+ def example_notifications_send_email_xml
543
+ <<-XML
544
+ <?xml version="1.0" encoding="UTF-8"?>
545
+ <notifications_sendEmail_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">123,321</notifications_sendEmail_response>
546
+ XML
547
+ end
548
+
549
+ def example_request_send_xml
550
+ <<-XML
551
+ <?xml version="1.0" encoding="UTF-8"?>
552
+ <notifications_sendRequest_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">http://www.facebook.com/send_req.php?from=211031&id=6</notifications_sendRequest_response>
553
+ XML
554
+ end
555
+
556
+ def example_notifications_get_xml
557
+ <<-XML
558
+ <?xml version="1.0" encoding="UTF-8"?>
559
+ <notifications_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">
560
+ <messages>
561
+ <unread>1</unread>
562
+ <most_recent>1170644932</most_recent>
563
+ </messages>
564
+ <pokes>
565
+ <unread>0</unread>
566
+ <most_recent>0</most_recent>
567
+ </pokes>
568
+ <shares>
569
+ <unread>1</unread>
570
+ <most_recent>1170657686</most_recent>
571
+ </shares>
572
+ <friend_requests list="true">
573
+ <uid>2231342839</uid>
574
+ <uid>2231511925</uid>
575
+ <uid>2239284527</uid>
576
+ </friend_requests>
577
+ <group_invites list="true"/>
578
+ <event_invites list="true"/>
579
+ </notifications_get_response>
580
+ XML
581
+ end
582
+
583
+ def example_publish_story_xml
584
+ <<-XML
585
+ <?xml version="1.0" encoding="UTF-8"?>
586
+ <feed_publishStoryToUser_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">1</feed_publishStoryToUser_response>
587
+ XML
588
+ end
589
+
590
+ def example_publish_action_xml
591
+ <<-XML
592
+ <?xml version="1.0" encoding="UTF-8"?>
593
+ <feed_publishActionOfUser_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">1</feed_publishActionOfUser_response>
594
+ XML
595
+ end
596
+
597
+ def example_publish_templatized_action_xml
598
+ <<-XML
599
+ <?xml version="1.0" encoding="UTF-8"?>
600
+ <feed_publishTemplatizedAction_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">
601
+ <feed_publishTemplatizedAction_response_elt>1</feed_publishTemplatizedAction_response_elt>
602
+ </feed_publishTemplatizedAction_response>
603
+ XML
604
+ end
605
+
606
+ def example_deactivate_template_bundle_by_id_xml
607
+ <<-XML
608
+ <?xml version="1.0" encoding="UTF-8"?>
609
+ <feed_deactivateTemplateBundleByID_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/">1</feed_deactivateTemplateBundleByID_response>
610
+ XML
611
+ end
612
+
613
+ def example_user_info_xml
614
+ <<-XML
615
+ <?xml version="1.0" encoding="UTF-8"?>
616
+ <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">
617
+ <user>
618
+ <uid>222333</uid>
619
+ <about_me>This field perpetuates the glorification of the ego. Also, it has a character limit.</about_me>
620
+ <activities>Here: facebook, etc. There: Glee Club, a capella, teaching.</activities>
621
+ <affiliations list="true">
622
+ <affiliation>
623
+ <nid>50453093</nid>
624
+ <name>Facebook Developers</name>
625
+ <type>work</type>
626
+ <status/>
627
+ <year/>
628
+ </affiliation>
629
+ </affiliations>
630
+ <birthday>November 3</birthday>
631
+ <books>The Brothers K, GEB, Ken Wilber, Zen and the Art, Fitzgerald, The Emporer's New Mind, The Wonderful Story of Henry Sugar</books>
632
+ <current_location>
633
+ <city>Palo Alto</city>
634
+ <state>CA</state>
635
+ <country>United States</country>
636
+ <zip>94303</zip>
637
+ </current_location>
638
+ <education_history list="true">
639
+ <education_info>
640
+ <name>Harvard</name>
641
+ <year>2003</year>
642
+ <concentrations list="true">
643
+ <concentration>Applied Mathematics</concentration>
644
+ <concentration>Computer Science</concentration>
645
+ </concentrations>
646
+ <degree>Masters</degree>
647
+ </education_info>
648
+ </education_history>
649
+ <first_name>Dave</first_name>
650
+ <hometown_location>
651
+ <city>York</city>
652
+ <state>PA</state>
653
+ <country>United States</country>
654
+ <zip>0</zip>
655
+ </hometown_location>
656
+ <hs_info>
657
+ <hs1_name>Central York High School</hs1_name>
658
+ <hs2_name/>
659
+ <grad_year>1999</grad_year>
660
+ <hs1_id>21846</hs1_id>
661
+ <hs2_id>0</hs2_id>
662
+ </hs_info>
663
+ <is_app_user>1</is_app_user>
664
+ <has_added_app>1</has_added_app>
665
+ <interests>coffee, computers, the funny, architecture, code breaking,snowboarding, philosophy, soccer, talking to strangers</interests>
666
+ <last_name>Fetterman</last_name>
667
+ <meeting_for list="true">
668
+ <seeking>Friendship</seeking>
669
+ </meeting_for>
670
+ <meeting_sex list="true">
671
+ <sex>female</sex>
672
+ </meeting_sex>
673
+ <movies>Tommy Boy, Billy Madison, Fight Club, Dirty Work, Meet the Parents, My Blue Heaven, Office Space </movies>
674
+ <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>
675
+ <name>Dave Fetterman</name>
676
+ <notes_count>0</notes_count>
677
+ <pic>http://photos-055.facebook.com/ip007/profile3/1271/65/s8055_39735.jpg</pic>
678
+ <pic_big>http://photos-055.facebook.com/ip007/profile3/1271/65/n8055_39735.jpg</pic_big>
679
+ <pic_small>http://photos-055.facebook.com/ip007/profile3/1271/65/t8055_39735.jpg</pic_small>
680
+ <pic_square>http://photos-055.facebook.com/ip007/profile3/1271/65/q8055_39735.jpg</pic_square>
681
+ <political>Moderate</political>
682
+ <profile_update_time>1170414620</profile_update_time>
683
+ <quotes/>
684
+ <relationship_status>In a Relationship</relationship_status>
685
+ <religion/>
686
+ <sex>male</sex>
687
+ <significant_other_id xsi:nil="true"/>
688
+ <status>
689
+ <message>I rule</message>
690
+ <time>0</time>
691
+ </status>
692
+ <timezone>-8</timezone>
693
+ <tv>cf. Bob Trahan</tv>
694
+ <wall_count>121</wall_count>
695
+ <work_history list="true">
696
+ <work_info>
697
+ <location>
698
+ <city>Palo Alto</city>
699
+ <state>CA</state>
700
+ <country>United States</country>
701
+ </location>
702
+ <company_name>Facebook</company_name>
703
+ <position>Software Engineer</position>
704
+ <description>Tech Lead, Facebook Platform</description>
705
+ <start_date>2006-01</start_date>
706
+ <end_date/>
707
+ </work_info>
708
+ </work_history>
709
+ </user>
710
+ <user>
711
+ <uid>1240079</uid>
712
+ <about_me>I am here.</about_me>
713
+ <activities>Party.</activities>
714
+ </user>
715
+ </users_getInfo_response>
716
+ XML
717
+ end
718
+
719
+ def example_limited_user_info_xml
720
+ <<-XML
721
+ <?xml version="1.0" encoding="UTF-8"?>
722
+ <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">
723
+ <user>
724
+ <uid>222333</uid>
725
+ <affiliations list="true">
726
+ <affiliation>
727
+ <nid>50453093</nid>
728
+ <name>Facebook Developers</name>
729
+ <type>work</type>
730
+ <status/>
731
+ <year/>
732
+ </affiliation>
733
+ </affiliations>
734
+ <meeting_for list="true">
735
+ <seeking>Friendship</seeking>
736
+ </meeting_for>
737
+ <status>
738
+ <message>I rule</message>
739
+ <time>0</time>
740
+ </status>
741
+ </user>
742
+ <user>
743
+ <uid>1240079</uid>
744
+ <activities>Party.</activities>
745
+ </user>
746
+ </users_getInfo_response>
747
+ XML
748
+ end
749
+
750
+
751
+ def example_nil_user_info_xml
752
+ <<-XML
753
+ <?xml version="1.0" encoding="UTF-8"?>
754
+ <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">
755
+ <user>
756
+ <uid>222333</uid>
757
+ <name>Kevin Lochner</name>
758
+ <current_location xsi:nil="true"/>
759
+ <pic xsi:nil="true"/>
760
+ </user>
761
+ </users_getInfo_response>
762
+ XML
763
+ end
764
+
765
+
766
+ def example_friends_xml
767
+ <<-XML
768
+ <?xml version="1.0" encoding="UTF-8"?>
769
+ <friends_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">
770
+ <uid>222333</uid>
771
+ <uid>1240079</uid>
772
+ </friends_get_response>
773
+ XML
774
+ end
775
+
776
+ def example_friend_lists_xml
777
+ <<-XML
778
+ <?xml version="1.0" encoding="UTF-8"?>
779
+ <friends_getLists_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">
780
+ <friendlist>
781
+ <flid>12089150545</flid>
782
+ <name>Family</name>
783
+ </friendlist>
784
+ <friendlist>
785
+ <flid>16361710545</flid>
786
+ <name>Entrepreneuer</name>
787
+ </friendlist>
788
+ </friends_getLists_response>
789
+ XML
790
+ end
791
+
792
+ def example_get_logged_in_user_xml
793
+ <<-XML
794
+ <?xml version="1.0" encoding="UTF-8"?>
795
+ <users_getLoggedInUser_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">1240077</users_getLoggedInUser_response>
796
+ XML
797
+ end
798
+
799
+ def example_invalid_api_key_error_response
800
+ <<-XML
801
+ <?xml version="1.0" encoding="UTF-8"?>
802
+ <error_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">
803
+ <error_code>101</error_code>
804
+ <error_msg>Invalid API key</error_msg>
805
+ <request_args list="true">
806
+ <arg>
807
+ <key>v</key>
808
+ <value>1.0</value>
809
+ </arg>
810
+ <arg>
811
+ <key>method</key>
812
+ <value>facebook.auth.createToken</value>
813
+ </arg>
814
+ <arg>
815
+ <key>sig</key>
816
+ <value>611f5f44e55f3fe17f858a8de84a4b0a</value>
817
+ </arg>
818
+ <arg>
819
+ <key>call_id</key>
820
+ <value>1186088346.82142</value>
821
+ </arg>
822
+ </request_args>
823
+ </error_response>
824
+ XML
825
+ end
826
+
827
+ def example_session_expired_error_response
828
+ <<-XML
829
+ <?xml version="1.0" encoding="UTF-8"?>
830
+ <error_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">
831
+ <error_code>102</error_code>
832
+ <error_msg>Session Expired</error_msg>
833
+ <request_args list="true">
834
+ <arg>
835
+ <key>v</key>
836
+ <value>1.0</value>
837
+ </arg>
838
+ <arg>
839
+ <key>method</key>
840
+ <value>facebook.auth.createToken</value>
841
+ </arg>
842
+ <arg>
843
+ <key>sig</key>
844
+ <value>611f5f44e55f3fe17f858a8de84a4b0a</value>
845
+ </arg>
846
+ <arg>
847
+ <key>call_id</key>
848
+ <value>1186088346.82142</value>
849
+ </arg>
850
+ </request_args>
851
+ </error_response>
852
+ XML
853
+ end
854
+
855
+ def example_app_users_xml
856
+ <<-XML
857
+ <?xml version="1.0" encoding="UTF-8"?>
858
+ <friends_getAppUsers_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">
859
+ <uid>222333</uid>
860
+ <uid>1240079</uid>
861
+ </friends_getAppUsers_response>
862
+ XML
863
+ end
864
+
865
+ def example_comments_xml
866
+ <<-XML
867
+ <?xml version="1.0" encoding="UTF-8"?>
868
+ <comments_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">
869
+ <comment>
870
+ <xid>pete_comments</xid>
871
+ <fromid>563683308</fromid>
872
+ <time>1234227529</time>
873
+ <text>Hola</text>
874
+ <id>65020</id>
875
+ </comment>
876
+ <comment>
877
+ <xid>pete_comments</xid>
878
+ <fromid>563683308</fromid>
879
+ <time>1234227542</time>
880
+ <text>holla</text>
881
+ <id>65021</id>
882
+ </comment>
883
+ </comments_get_response>
884
+ XML
885
+ end
886
+
887
+ def example_user_albums_xml
888
+ <<-XML
889
+ <?xml version="1.0" encoding="UTF-8"?>
890
+ <photos_getAlbums_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">
891
+ <album>
892
+ <aid>97503428432802022</aid>
893
+ <cover_pid>97503428461115574</cover_pid>
894
+ <owner>22701786</owner>
895
+ <name>Summertime is Best</name>
896
+ <created>1184120648</created>
897
+ <modified>1185465771</modified>
898
+ <description>Happenings on or around Summer '07</description>
899
+ <location>Brooklyn, New York</location>
900
+ <link>http://www.facebook.com/album.php?aid=2011366&amp;id=22701786</link>
901
+ <size>49</size>
902
+ </album>
903
+ <album>
904
+ <aid>97503428432797817</aid>
905
+ <cover_pid>97503428460977993</cover_pid>
906
+ <owner>22701786</owner>
907
+ <name>Bonofon's Recital</name>
908
+ <created>1165356279</created>
909
+ <modified>1165382364</modified>
910
+ <description>The whole Ewing fam flies out to flatland to watch the Bonofon's senior recital. That boy sure can tinkle them ivories.</description>
911
+ <location>Grinnell College, Grinnell Iowa</location>
912
+ <link>http://www.facebook.com/album.php?aid=2007161&amp;id=22701786</link>
913
+ <size>14</size>
914
+ </album>
915
+ </photos_getAlbums_response>
916
+ XML
917
+ end
918
+
919
+ def example_user_stream_xml
920
+ <<-XML
921
+ <?xml version="1.0" encoding="UTF-8"?>
922
+ <stream_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">
923
+ <posts list="true">
924
+ <stream_post>
925
+ <post_id>100000637452380_329182455865</post_id>
926
+ <viewer_id>100000637452380</viewer_id>
927
+ <source_id>100000637452380</source_id>
928
+ <type>80</type>
929
+ <app_id>2309869772</app_id>
930
+ <attribution xsi:nil="true"/>
931
+ <actor_id>100000637452380</actor_id>
932
+ <target_id xsi:nil="true"/>
933
+ <message>The bbc home page</message>
934
+ <attachment>
935
+ <media list="true">
936
+ <stream_media>
937
+ <href>http://www.facebook.com/l.php?u=http%253A%252F%252Fwww.bbc.co.uk%252F&amp;h=d6020258c74e511ee6dc1c28746f1e31</href>
938
+ <type>link</type>
939
+ <src>http://external.ak.fbcdn.net/safe_image.php?d=d1e587ce2d7039feaceaf7ef4c2610cd&amp;w=90&amp;h=90&amp;url=http%3A%2F%2Fwww.bbc.co.uk%2Ffeedengine%2Fhomepage%2Fimages%2F_47351229_-1_201x150.jpg</src>
940
+ </stream_media>
941
+ </media>
942
+ <name>BBC - Homepage</name>
943
+ <href>http://www.facebook.com/l.php?u=http%253A%252F%252Fwww.bbc.co.uk%252F&amp;h=d6020258c74e511ee6dc1c28746f1e31</href>
944
+ <caption>www.bbc.co.uk</caption>
945
+ <description>Breaking news, sport, TV, radio and a whole lot more. The BBC informs, educates and entertains - wherever you are, whatever your age.</description>
946
+ <properties list="true"/>
947
+ <icon>http://static.ak.fbcdn.net/rsrc.php/zAXEX/hash/9yvl71tw.png</icon>
948
+ <fb_object_type/>
949
+ <fb_object_id/>
950
+ </attachment>
951
+ <app_data/>
952
+ <action_links xsi:nil="true"/>
953
+ <comments>
954
+ <can_remove>1</can_remove>
955
+ <can_post>1</can_post>
956
+ <count>1</count>
957
+ <comment_list list="true">
958
+ <comment>
959
+ <fromid>100000702701175</fromid>
960
+ <time>1267118534</time>
961
+ <text>I like this website!</text>
962
+ <id>100000637452380_329182455865_11562840</id>
963
+ </comment>
964
+ </comment_list>
965
+ </comments>
966
+ <likes>
967
+ <href>http://www.facebook.com/social_graph.php?node_id=329182455865&amp;class=LikeManager</href>
968
+ <count>1</count>
969
+ <sample list="true"/>
970
+ <friends list="true">
971
+ <uid>100000702701175</uid>
972
+ </friends>
973
+ <user_likes>0</user_likes>
974
+ <can_like>1</can_like>
975
+ </likes>
976
+ <privacy>
977
+ <description>Everyone</description>
978
+ <value>EVERYONE</value>
979
+ <friends>NO_FRIENDS</friends>
980
+ <networks/>
981
+ <allow/>
982
+ <deny/>
983
+ </privacy>
984
+ <updated_time>1267118534</updated_time>
985
+ <created_time>1267103491</created_time>
986
+ <tagged_ids list="true"/>
987
+ <is_hidden>0</is_hidden>
988
+ <filter_key/>
989
+ <permalink>http://www.facebook.com/profile.php?v=feed&amp;story_fbid=329182455865&amp;id=100000637452380</permalink>
990
+ </stream_post>
991
+ <stream_post>
992
+ <post_id>100000637452380_318491734561</post_id>
993
+ <viewer_id>100000637452380</viewer_id>
994
+ <source_id>100000637452380</source_id>
995
+ <type>237</type>
996
+ <app_id>22108119377</app_id>
997
+ <attribution>Digg.com</attribution>
998
+ <actor_id>100000637452380</actor_id>
999
+ <target_id xsi:nil="true"/>
1000
+ <message>What is curling.</message>
1001
+ <attachment>
1002
+ <media list="true">
1003
+ <stream_media>
1004
+ <href>http://digg.com/olympics/Curling_Finally_Explained_InfoGraphic?OTC-fbc8</href>
1005
+ <type>link</type>
1006
+ <src>http://platform.ak.fbcdn.net/www/app_full_proxy.php?app=22108119377&amp;v=1&amp;size=z&amp;cksum=f8ecb50623115ff74e5ea8acd9cf4a2e&amp;src=http%3A%2F%2Fdigg.com%2Folympics%2FCurling_Finally_Explained_InfoGraphic%2Ft.jpg</src>
1007
+ </stream_media>
1008
+ </media>
1009
+ <name>Curling Finally Explained [InfoGraphic]</name>
1010
+ <href>http://digg.com/olympics/Curling_Finally_Explained_InfoGraphic?OTC-fbc1</href>
1011
+ <caption>Phudki dugg this story on Digg</caption>
1012
+ <description>At last, someone makes sense out of the weirdest sport of the Winter Olympics. </description>
1013
+ <properties list="true">
1014
+ <stream_property>
1015
+ <name>Source</name>
1016
+ <text>i.imgur.com</text>
1017
+ </stream_property>
1018
+ <stream_property>
1019
+ <name>Diggs</name>
1020
+ <text>247</text>
1021
+ </stream_property>
1022
+ </properties>
1023
+ <icon>http://photos-b.ak.fbcdn.net/photos-ak-sf2p/v43/113/22108119377/app_2_22108119377_6404.gif</icon>
1024
+ <fb_object_type/>
1025
+ <fb_object_id/>
1026
+ </attachment>
1027
+ <app_data>
1028
+ <attachment_data>{&quot;name&quot;:&quot;Curling Finally Explained [InfoGraphic]&quot;,&quot;href&quot;:&quot;http:\/\/digg.com\/olympics\/Curling_Finally_Explained_InfoGraphic?OTC-fbc1&quot;,&quot;description&quot;:&quot;At last, someone makes sense out of the weirdest sport of the Winter Olympics. &quot;,&quot;media&quot;:[{&quot;type&quot;:&quot;image&quot;,&quot;src&quot;:&quot;http:\/\/digg.com\/olympics\/Curling_Finally_Explained_InfoGraphic\/t.jpg&quot;,&quot;href&quot;:&quot;http:\/\/digg.com\/olympics\/Curling_Finally_Explained_InfoGraphic?OTC-fbc8&quot;}],&quot;caption&quot;:&quot;{*actor*} dugg this story on Digg&quot;,&quot;properties&quot;:{&quot;Source&quot;:&quot;i.imgur.com&quot;,&quot;Diggs&quot;:&quot;247&quot;}}</attachment_data>
1029
+ <images>[{&quot;fbml&quot;:&quot;&lt;img src=\&quot;http:\/\/digg.com\/olympics\/Curling_Finally_Explained_InfoGraphic\/t.jpg\&quot; \/&gt;&quot;,&quot;href&quot;:&quot;http:\/\/digg.com\/olympics\/Curling_Finally_Explained_InfoGraphic?OTC-fbc8&quot;}]</images>
1030
+ </app_data>
1031
+ <action_links xsi:nil="true"/>
1032
+ <comments>
1033
+ <can_remove>1</can_remove>
1034
+ <can_post>1</can_post>
1035
+ <count>0</count>
1036
+ <comment_list list="true"/>
1037
+ </comments>
1038
+ <likes>
1039
+ <href>http://www.facebook.com/social_graph.php?node_id=318491734561&amp;class=LikeManager</href>
1040
+ <count>0</count>
1041
+ <sample list="true"/>
1042
+ <friends list="true"/>
1043
+ <user_likes>0</user_likes>
1044
+ <can_like>1</can_like>
1045
+ </likes>
1046
+ <privacy>
1047
+ <description>Everyone</description>
1048
+ <value>EVERYONE</value>
1049
+ <friends>NO_FRIENDS</friends>
1050
+ <networks/>
1051
+ <allow/>
1052
+ <deny/>
1053
+ </privacy>
1054
+ <updated_time>1266919509</updated_time>
1055
+ <created_time>1266919509</created_time>
1056
+ <tagged_ids list="true"/>
1057
+ <is_hidden>0</is_hidden>
1058
+ <filter_key/>
1059
+ <permalink>http://www.facebook.com/profile.php?v=feed&amp;story_fbid=318491734561&amp;id=100000637452380</permalink>
1060
+ </stream_post>
1061
+ </posts>
1062
+ <profiles list="true">
1063
+ <profile>
1064
+ <id>100000637452380</id>
1065
+ <url>http://www.facebook.com/profile.php?id=100000637452380</url>
1066
+ <name>Phudki Bandar</name>
1067
+ <pic_square>http://profile.ak.fbcdn.net/v22939/1286/112/q100000637452380_2062.jpg</pic_square>
1068
+ <type>user</type>
1069
+ </profile>
1070
+ <profile>
1071
+ <id>100000702701175</id>
1072
+ <url>http://www.facebook.com/profile.php?id=100000702701175</url>
1073
+ <name>Mahmood Tester</name>
1074
+ <pic_square>http://profile.ak.fbcdn.net/v22940/1631/70/q100000702701175_5464.jpg</pic_square>
1075
+ <type>user</type>
1076
+ </profile>
1077
+ </profiles>
1078
+ <albums list="true"/>
1079
+ </stream_get_response>
1080
+ XML
1081
+ end
1082
+
1083
+ def example_upload_photo_xml
1084
+ <<-XML
1085
+ <?xml version="1.0" encoding="UTF-8"?>
1086
+ <photos_upload_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">
1087
+ <pid>940915697041656</pid>
1088
+ <aid>940915667462717</aid>
1089
+ <owner>219074</owner>
1090
+ <src>http://ip002.facebook.com/v67/161/72/219074/s219074_31637752_5455.jpg</src>
1091
+ <src_big>http://ip002.facebook.com/v67/161/72/219074/n219074_31637752_5455.jpg</src_big>
1092
+ <src_small>http://ip002.facebook.com/v67/161/72/219074/t219074_31637752_5455.jpg</src_small>
1093
+ <link>http://www.facebook.com/photo.php?pid=31637752&amp;id=219074</link>
1094
+ <caption>Under the sunset</caption>
1095
+ </photos_upload_response>
1096
+ XML
1097
+ end
1098
+
1099
+ def example_new_album_xml
1100
+ <<-XML
1101
+ <?xml version="1.0" encoding="UTF-8"?>
1102
+ <photos_createAlbum_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">
1103
+ <aid>34595963571485</aid>
1104
+ <cover_pid>0</cover_pid>
1105
+ <owner>8055</owner>
1106
+ <name>My Empty Album</name>
1107
+ <created>1132553109</created>
1108
+ <modified>1132553363</modified>
1109
+ <description>No I will not make out with you</description>
1110
+ <location>York, PA</location>
1111
+ <link>http://www.facebook.com/album.php?aid=2002205&amp;id=8055</link>
1112
+ <size>0</size>
1113
+ </photos_createAlbum_response>
1114
+ XML
1115
+ end
1116
+
1117
+ def example_photo_tags_xml
1118
+ <<-XML
1119
+ <?xml version="1.0" encoding="UTF-8"?>
1120
+ <photos_getTags_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">
1121
+ <photo_tag>
1122
+ <pid>97503428461115571</pid>
1123
+ <subject>570070524</subject>
1124
+ <xcoord>65.4248</xcoord>
1125
+ <ycoord>16.8627</ycoord>
1126
+ </photo_tag>
1127
+ </photos_getTags_response>
1128
+ XML
1129
+ end
1130
+
1131
+ def example_add_tag_xml
1132
+ <<-XML
1133
+ <?xml version="1.0" encoding="UTF-8"?>
1134
+ <photos_addTag_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">1</photos_addTag_response>
1135
+ XML
1136
+ end
1137
+
1138
+ def example_get_photo_xml
1139
+ <<-XML
1140
+ <?xml version="1.0" encoding="UTF-8"?>
1141
+ <photos_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">
1142
+ <photo>
1143
+ <pid>97503428461115590</pid>
1144
+ <aid>97503428432802022</aid>
1145
+ <owner>22701786</owner>
1146
+ <src>http://photos-c.ak.facebook.com/photos-ak-sf2p/v77/74/112/22701786/s22701786_30324934_7816.jpg</src>
1147
+ <src_big>http://photos-c.ak.facebook.com/photos-ak-sf2p/v77/74/112/22701786/n22701786_30324934_7816.jpg</src_big>
1148
+ <src_small>http://photos-c.ak.facebook.com/photos-ak-sf2p/v77/74/112/22701786/t22701786_30324934_7816.jpg</src_small>
1149
+ <link>http://www.facebook.com/photo.php?pid=30324934&amp;id=22701786</link>
1150
+ <caption>Rooftop barbecues make me act funny</caption>
1151
+ <created>1184120987</created>
1152
+ </photo>
1153
+ <photo>
1154
+ <pid>97503428461115573</pid>
1155
+ <aid>97503428432802022</aid>
1156
+ <owner>22701786</owner>
1157
+ <src>http://photos-b.ak.facebook.com/photos-ak-sf2p/v77/74/112/22701786/s22701786_30324917_4555.jpg</src>
1158
+ <src_big>http://photos-b.ak.facebook.com/photos-ak-sf2p/v77/74/112/22701786/n22701786_30324917_4555.jpg</src_big>
1159
+ <src_small>http://photos-b.ak.facebook.com/photos-ak-sf2p/v77/74/112/22701786/t22701786_30324917_4555.jpg</src_small>
1160
+ <link>http://www.facebook.com/photo.php?pid=30324917&amp;id=22701786</link>
1161
+ <caption/>
1162
+ <created>1184120654</created>
1163
+ </photo>
1164
+ </photos_get_response>
1165
+ XML
1166
+ end
1167
+
1168
+ def example_upload_video_xml
1169
+ <<-XML
1170
+ <?xml version="1.0" encoding="UTF-8"?>
1171
+ <video_upload_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">
1172
+ <vid>15943367753</vid>
1173
+ <title>Some Epic</title>
1174
+ <description>Check it out</description>
1175
+ <link>http://www.facebook.com/video/video.php?v=15943367753</link>
1176
+ </video_upload_response>
1177
+ XML
1178
+ end
1179
+
1180
+ def example_upload_native_string_xml
1181
+ <<-XML
1182
+ <?xml version="1.0" encoding="UTF-8"?>
1183
+ <intl_uploadNativeStrings_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">1</intl_uploadNativeStrings_response>
1184
+ XML
1185
+ end
1186
+
1187
+ def example_revoke_authorization_true
1188
+ "1"
1189
+ end
1190
+
1191
+ def example_revoke_authorization_false
1192
+ "0"
1193
+ end
1194
+
1195
+ def example_revoke_extended_permission
1196
+ <<-XML
1197
+ <?xml version="1.0" encoding="UTF-8"?>
1198
+ <auth_revokeExtendedPermission_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">1</auth_revokeExtendedPermission_response>
1199
+ XML
1200
+ end
1201
+
1202
+ def example_remove_comment_true
1203
+ "1"
1204
+ end
1205
+
1206
+ def example_remove_comment_false
1207
+ "0"
1208
+ end
1209
+
1210
+ def ewample_with_list_in_none_list_item_xml
1211
+ <<-XML
1212
+ <?xml version="1.0" encoding="UTF-8"?>
1213
+ <fql_query_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" list="true">
1214
+ <stream_post>
1215
+ <post_id>12345678_901234</post_id>
1216
+ <actor_id>12345</actor_id>
1217
+ <comments>
1218
+ <can_remove>1</can_remove>
1219
+ <can_post>1</can_post>
1220
+ <count>3</count>
1221
+ <comment_list list="true">
1222
+ <comment>
1223
+ <fromid>6667785</fromid>
1224
+ <time>2223332</time>
1225
+ <text>ahahhahaha
1226
+ i don't know the original one, but this is awesome (without waiting for it)</text>
1227
+ <id>12345678_901234_23456</id>
1228
+ </comment>
1229
+ <comment>
1230
+ <fromid>6667785</fromid>
1231
+ <time>1268732285</time>
1232
+ <text>héhé :)
1233
+ Have you listen their Mickeal Jackson's cover ?</text>
1234
+ <id>785637999_368045444730_12404854</id>
1235
+ </comment>
1236
+ <comment>
1237
+ <fromid>1345267</fromid>
1238
+ <time>1268733276</time>
1239
+ <text>not yet!
1240
+ unfortunately i'm at work so i can't go through all of them..
1241
+ but yes, i saw it
1242
+ brilliant!</text>
1243
+ <id>12345678_901234_234567</id>
1244
+ </comment>
1245
+ </comment_list>
1246
+ </comments>
1247
+ <likes>
1248
+ <href>http://www.facebook.com/social_graph.php?node_id=23546&amp;class=LikeManager</href>
1249
+ <count>1</count>
1250
+ <sample list="true"/>
1251
+ <friends list="true">
1252
+ <uid>234567</uid>
1253
+ </friends>
1254
+ <user_likes>0</user_likes>
1255
+ <can_like>1</can_like>
1256
+ </likes>
1257
+ </stream_post>
1258
+ </fql_query_response>
1259
+ XML
1260
+ end
1261
+
1262
+
1263
+ end