tenderlove-facebooker 1.0.16.20090319151701

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 (124) hide show
  1. data/CHANGELOG.rdoc +17 -0
  2. data/COPYING.rdoc +19 -0
  3. data/Manifest.txt +123 -0
  4. data/README.rdoc +103 -0
  5. data/Rakefile +86 -0
  6. data/TODO.rdoc +4 -0
  7. data/examples/desktop_login.rb +14 -0
  8. data/facebooker.gemspec +38 -0
  9. data/generators/facebook/facebook_generator.rb +14 -0
  10. data/generators/facebook/templates/config/facebooker.yml +46 -0
  11. data/generators/facebook/templates/public/javascripts/facebooker.js +99 -0
  12. data/generators/facebook_controller/USAGE +33 -0
  13. data/generators/facebook_controller/facebook_controller_generator.rb +40 -0
  14. data/generators/facebook_controller/templates/controller.rb +7 -0
  15. data/generators/facebook_controller/templates/functional_test.rb +11 -0
  16. data/generators/facebook_controller/templates/helper.rb +2 -0
  17. data/generators/facebook_controller/templates/view.fbml.erb +2 -0
  18. data/generators/facebook_controller/templates/view.html.erb +2 -0
  19. data/generators/facebook_publisher/facebook_publisher_generator.rb +14 -0
  20. data/generators/facebook_publisher/templates/create_facebook_templates.rb +15 -0
  21. data/generators/facebook_publisher/templates/publisher.rb +3 -0
  22. data/generators/facebook_scaffold/USAGE +27 -0
  23. data/generators/facebook_scaffold/facebook_scaffold_generator.rb +118 -0
  24. data/generators/facebook_scaffold/templates/controller.rb +93 -0
  25. data/generators/facebook_scaffold/templates/facebook_style.css +2579 -0
  26. data/generators/facebook_scaffold/templates/functional_test.rb +89 -0
  27. data/generators/facebook_scaffold/templates/helper.rb +2 -0
  28. data/generators/facebook_scaffold/templates/layout.fbml.erb +6 -0
  29. data/generators/facebook_scaffold/templates/layout.html.erb +17 -0
  30. data/generators/facebook_scaffold/templates/style.css +74 -0
  31. data/generators/facebook_scaffold/templates/view_edit.fbml.erb +13 -0
  32. data/generators/facebook_scaffold/templates/view_edit.html.erb +18 -0
  33. data/generators/facebook_scaffold/templates/view_index.fbml.erb +24 -0
  34. data/generators/facebook_scaffold/templates/view_index.html.erb +24 -0
  35. data/generators/facebook_scaffold/templates/view_new.fbml.erb +12 -0
  36. data/generators/facebook_scaffold/templates/view_new.html.erb +17 -0
  37. data/generators/facebook_scaffold/templates/view_show.fbml.erb +10 -0
  38. data/generators/facebook_scaffold/templates/view_show.html.erb +10 -0
  39. data/generators/publisher/publisher_generator.rb +14 -0
  40. data/generators/xd_receiver/templates/xd_receiver.html +10 -0
  41. data/generators/xd_receiver/xd_receiver_generator.rb +9 -0
  42. data/init.rb +72 -0
  43. data/install.rb +12 -0
  44. data/lib/facebooker/adapters/adapter_base.rb +87 -0
  45. data/lib/facebooker/adapters/bebo_adapter.rb +75 -0
  46. data/lib/facebooker/adapters/facebook_adapter.rb +52 -0
  47. data/lib/facebooker/admin.rb +42 -0
  48. data/lib/facebooker/batch_request.rb +44 -0
  49. data/lib/facebooker/data.rb +57 -0
  50. data/lib/facebooker/feed.rb +78 -0
  51. data/lib/facebooker/logging.rb +51 -0
  52. data/lib/facebooker/mobile.rb +20 -0
  53. data/lib/facebooker/mock/service.rb +50 -0
  54. data/lib/facebooker/mock/session.rb +18 -0
  55. data/lib/facebooker/model.rb +135 -0
  56. data/lib/facebooker/models/affiliation.rb +10 -0
  57. data/lib/facebooker/models/album.rb +11 -0
  58. data/lib/facebooker/models/applicationproperties.rb +39 -0
  59. data/lib/facebooker/models/applicationrestrictions.rb +10 -0
  60. data/lib/facebooker/models/cookie.rb +10 -0
  61. data/lib/facebooker/models/education_info.rb +11 -0
  62. data/lib/facebooker/models/event.rb +28 -0
  63. data/lib/facebooker/models/friend_list.rb +16 -0
  64. data/lib/facebooker/models/group.rb +36 -0
  65. data/lib/facebooker/models/info_item.rb +10 -0
  66. data/lib/facebooker/models/info_section.rb +10 -0
  67. data/lib/facebooker/models/location.rb +8 -0
  68. data/lib/facebooker/models/notifications.rb +17 -0
  69. data/lib/facebooker/models/page.rb +27 -0
  70. data/lib/facebooker/models/photo.rb +12 -0
  71. data/lib/facebooker/models/tag.rb +12 -0
  72. data/lib/facebooker/models/user.rb +426 -0
  73. data/lib/facebooker/models/video.rb +9 -0
  74. data/lib/facebooker/models/work_info.rb +9 -0
  75. data/lib/facebooker/parser.rb +589 -0
  76. data/lib/facebooker/rails/controller.rb +304 -0
  77. data/lib/facebooker/rails/cucumber/world.rb +46 -0
  78. data/lib/facebooker/rails/cucumber.rb +28 -0
  79. data/lib/facebooker/rails/facebook_form_builder.rb +112 -0
  80. data/lib/facebooker/rails/facebook_pretty_errors.rb +22 -0
  81. data/lib/facebooker/rails/facebook_request_fix.rb +24 -0
  82. data/lib/facebooker/rails/facebook_session_handling.rb +69 -0
  83. data/lib/facebooker/rails/facebook_url_helper.rb +192 -0
  84. data/lib/facebooker/rails/facebook_url_rewriting.rb +39 -0
  85. data/lib/facebooker/rails/helpers/fb_connect.rb +89 -0
  86. data/lib/facebooker/rails/helpers.rb +762 -0
  87. data/lib/facebooker/rails/integration_session.rb +38 -0
  88. data/lib/facebooker/rails/profile_publisher_extensions.rb +42 -0
  89. data/lib/facebooker/rails/publisher.rb +526 -0
  90. data/lib/facebooker/rails/routing.rb +49 -0
  91. data/lib/facebooker/rails/test_helpers.rb +68 -0
  92. data/lib/facebooker/rails/utilities.rb +22 -0
  93. data/lib/facebooker/server_cache.rb +24 -0
  94. data/lib/facebooker/service.rb +94 -0
  95. data/lib/facebooker/session.rb +584 -0
  96. data/lib/facebooker/version.rb +9 -0
  97. data/lib/facebooker.rb +174 -0
  98. data/lib/net/http_multipart_post.rb +123 -0
  99. data/lib/tasks/facebooker.rake +18 -0
  100. data/lib/tasks/tunnel.rake +46 -0
  101. data/rails/init.rb +1 -0
  102. data/setup.rb +1585 -0
  103. data/templates/layout.erb +24 -0
  104. data/test/facebooker/adapters_test.rb +96 -0
  105. data/test/facebooker/admin_test.rb +102 -0
  106. data/test/facebooker/batch_request_test.rb +83 -0
  107. data/test/facebooker/data_test.rb +86 -0
  108. data/test/facebooker/logging_test.rb +43 -0
  109. data/test/facebooker/mobile_test.rb +45 -0
  110. data/test/facebooker/model_test.rb +123 -0
  111. data/test/facebooker/models/event_test.rb +15 -0
  112. data/test/facebooker/models/user_test.rb +295 -0
  113. data/test/facebooker/rails/publisher_test.rb +452 -0
  114. data/test/facebooker/rails_integration_test.rb +1312 -0
  115. data/test/facebooker/server_cache_test.rb +44 -0
  116. data/test/facebooker/session_test.rb +614 -0
  117. data/test/facebooker_test.rb +925 -0
  118. data/test/fixtures/multipart_post_body_with_only_parameters.txt +33 -0
  119. data/test/fixtures/multipart_post_body_with_single_file.txt +38 -0
  120. data/test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt +38 -0
  121. data/test/net/http_multipart_post_test.rb +52 -0
  122. data/test/rails_test_helper.rb +11 -0
  123. data/test/test_helper.rb +66 -0
  124. metadata +217 -0
@@ -0,0 +1,925 @@
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_session_must_be_created_from_api_key_and_secret_key
17
+ assert_kind_of(Facebooker::Session, @session)
18
+ end
19
+
20
+ def test_session_can_tell_you_its_login_url
21
+ assert_not_nil(@session.login_url)
22
+ assert_equal("http://www.facebook.com/login.php?api_key=#{@api_key}&v=1.0", @session.login_url)
23
+ end
24
+
25
+ def test_desktop_session_returns_auth_toke_as_part_of_login_url
26
+ @service = flexmock(@service).should_receive(:post).at_least.once.and_return(123)
27
+ assert_kind_of(Facebooker::Session::Desktop, @desktop_session)
28
+ assert_match(/auth_token=[a-z0-9A-Z]/, @desktop_session.login_url)
29
+ end
30
+
31
+ def test_service_posts_data_to_http_location
32
+ flexmock(Net::HTTP).should_receive(:post_form).and_return(example_auth_token_xml)
33
+ assert_equal("http://www.facebook.com/login.php?api_key=#{@api_key}&v=1.0&auth_token=3e4a22bb2f5ed75114b0fc9995ea85f1", @desktop_session.login_url)
34
+ end
35
+
36
+ # def test_serivce_post_file_delegates_to_post_multipart_form
37
+ # # flexmock(@service).should_receive(:url).and_return('url')
38
+ # # flexmock(Net::HTTP).expects(:post_multipart_form).with('url', {:method => 'facebook.auth.createToken'}).returns(example_auth_token_xml)
39
+ #
40
+ # res = mock(:content_type => 'text/html', :code => '200', :body => '<html><body>my blog</body></html>')
41
+ # Net::HTTP.stubs(:get_response).once.with(uri).returns res
42
+ #
43
+ # @service.post_file(:method => 'facebook.auth.createToken')
44
+ # end
45
+
46
+ def test_desktop_session_be_secured_and_activated_after_receiving_auth_token_and_logging_in
47
+ establish_session
48
+ assert_equal("5f34e11bfb97c762e439e6a5-8055", @session.instance_variable_get("@session_key"))
49
+ end
50
+
51
+ def test_desktop_session_uses_secret_api_key_for_hashing_until_user_authenticates
52
+ assert_equal(@secret_key, @desktop_session.secret_for_method('facebook.auth.createToken'))
53
+ establish_session(@desktop_session)
54
+ assert_equal("ohairoflamao12345", @desktop_session.secret_for_method('anyNonAuthMethodName'))
55
+ end
56
+
57
+ def test_session_can_get_current_logged_in_user_id_and_will_cache
58
+ establish_session
59
+ flexmock(Net::HTTP).should_receive(:post_form).and_return(example_get_logged_in_user_xml)
60
+ assert_equal(8055, @session.user.id)
61
+ end
62
+
63
+ def test_can_get_current_users_friends
64
+ expect_http_posts_with_responses(example_friends_xml)
65
+ assert_equal([222333, 1240079], @session.user.friends.map{|friend| friend.id})
66
+ end
67
+
68
+ def test_can_get_current_users_friend_lists
69
+ expect_http_posts_with_responses(example_friend_lists_xml)
70
+ assert_equal([12089150545, 16361710545], @session.user.friend_lists.map{|friend_list| friend_list.flid})
71
+ end
72
+
73
+ def test_can_get_info_for_instance_of_user
74
+ populate_user_info
75
+ @session.user.first_name = "Dave"
76
+ end
77
+
78
+ def test_can_get_info_for_one_or_more_users
79
+ friends = populate_session_friends
80
+ friend = friends.detect{|f| f.id == 222333}
81
+ assert_equal('This field perpetuates the glorification of the ego. Also, it has a character limit.',
82
+ friend.about_me)
83
+ assert_equal('Facebook Developers', friend.affiliations.first.name)
84
+ assert_equal('Friendship', friend.meeting_for.first)
85
+ assert_equal('94303', friend.current_location.zip)
86
+ assert_equal('York', friend.hometown_location.city)
87
+ assert_equal('Harvard', friend.education_history.first.name)
88
+ assert(friend.education_history.first.concentrations.include?("Computer Science"))
89
+ assert_equal('Central York High School', friend.hs_info.hs1_name)
90
+ assert_equal('female', friend.meeting_sex.first)
91
+ assert_equal('I rule', friend.status.message)
92
+ end
93
+
94
+ def test_can_get_specific_info_for_one_or_more_users
95
+ friends = populate_session_friends_with_limited_fields
96
+ friend = friends.detect{|f| f.id == 222333}
97
+ assert_equal('I rule', friend.status.message)
98
+ assert_equal(nil, friend.hometown_location)
99
+ end
100
+
101
+ def test_can_handle_nil_data
102
+ friends = populate_session_friends_with_nil_data
103
+ friend = friends.detect{|f| f.id == 222333}
104
+ assert_equal(nil,friend.current_location)
105
+ assert_equal(nil,friend.pic)
106
+ end
107
+
108
+ def test_session_can_expire_on_server_and_client_handles_appropriately
109
+ expect_http_posts_with_responses(example_session_expired_error_response)
110
+ assert_raises(Facebooker::Session::SessionExpired) {
111
+ @session.user.friends
112
+ }
113
+ end
114
+
115
+
116
+ def test_can_publish_story_to_users_feed
117
+ expect_http_posts_with_responses(example_publish_story_xml)
118
+ assert_nothing_raised {
119
+ assert(@session.user.publish_story((s = Facebooker::Feed::Story.new; s.title = 'o hai'; s.body = '4srsly'; s)))
120
+ }
121
+ end
122
+
123
+
124
+ def test_can_publish_action_to_users_feed
125
+ expect_http_posts_with_responses(example_publish_action_xml)
126
+ assert_nothing_raised {
127
+ assert(@session.user.publish_action((s = Facebooker::Feed::Action.new; s.title = 'o hai'; s.body = '4srsly'; s)))
128
+ }
129
+ end
130
+
131
+ def test_can_publish_templatized_action_to_users_feed
132
+ expect_http_posts_with_responses(example_publish_templatized_action_xml)
133
+ assert_nothing_raised {
134
+ action = Facebooker::Feed::TemplatizedAction.new
135
+ action.title_template = "{actor} did something"
136
+ assert(@session.user.publish_templatized_action(action))
137
+ }
138
+ end
139
+
140
+ def test_can_publish_templatized_action_to_users_feed_with_params_as_string
141
+ json_data="{\"move\": \"punch\"}"
142
+ action = Facebooker::Feed::TemplatizedAction.new
143
+ action.title_template = "{actor} did something "
144
+ action.title_data=json_data
145
+ assert_equal action.to_params[:title_data],json_data
146
+ end
147
+
148
+ def test_can_publish_templatized_action_to_users_feed_with_params_as_hash
149
+ json_data="{\"move\": \"punch\"}"
150
+ hash={:move=>"punch"}
151
+ hash.expects(:to_json).returns(json_data)
152
+ action = Facebooker::Feed::TemplatizedAction.new
153
+ action.title_template = "{actor} did something "
154
+ action.title_data=hash
155
+ assert_equal action.to_params[:title_data],json_data
156
+ end
157
+
158
+ def test_can_deactivate_template_bundle_by_id
159
+ expect_http_posts_with_responses(example_deactivate_template_bundle_by_id_xml)
160
+ assert_equal true, @session.post('facebook.feed.deactivateTemplateBundleByID', :template_bundle_id => 123)
161
+ end
162
+
163
+ def test_can_get_notifications_for_logged_in_user
164
+ expect_http_posts_with_responses(example_notifications_get_xml)
165
+ assert_equal("1", @session.user.notifications.messages.unread)
166
+ assert_equal("0", @session.user.notifications.pokes.unread)
167
+ assert_equal("1", @session.user.notifications.shares.unread)
168
+ end
169
+
170
+ def test_can_send_notifications
171
+ expect_http_posts_with_responses(example_notifications_send_xml)
172
+ assert_nothing_raised {
173
+ user_ids = [123, 321]
174
+ notification_fbml = "O HAI!!!"
175
+ optional_email_fbml = "This would be in the email. If this is not passed, facebook sends no mailz!"
176
+ assert_equal('http://www.facebook.com/send_email.php?from=211031&id=52', @session.send_notification(user_ids, notification_fbml, optional_email_fbml))
177
+ }
178
+ end
179
+
180
+ def test_can_send_emails
181
+ expect_http_posts_with_responses(example_notifications_send_email_xml)
182
+ assert_nothing_raised {
183
+ user_ids = [123, 321]
184
+ text = "Hi I am the text part of the email."
185
+ fbml = "Hi I am the fbml version of the <b>email</a>"
186
+ subject = "Somethign you should really pay attention to."
187
+ assert_equal('123,321', @session.send_email(user_ids, subject,text,fbml ))
188
+ }
189
+ end
190
+
191
+ def test_can_find_friends_who_have_installed_app
192
+ expect_http_posts_with_responses(example_app_users_xml)
193
+ assert_equal(2, @session.user.friends_with_this_app.size)
194
+ assert_equal([222333, 1240079], @session.user.friends_with_this_app.map{|f| f.id})
195
+ end
196
+
197
+ def test_when_marshaling_a_session_object_only_enough_data_to_stay_authenticated_is_stored
198
+ populate_session_friends
199
+ assert_equal(2, @session.user.friends.size)
200
+ reloaded_session = Marshal.load(Marshal.dump(@session))
201
+ %w(@session_key @uid @expires @secret_from_session @auth_token).each do |iv_name|
202
+ assert_not_nil(reloaded_session.instance_variable_get(iv_name))
203
+ end
204
+ assert_nil(reloaded_session.user.instance_variable_get("@friends"))
205
+ end
206
+
207
+ def test_sessions_can_be_infinite_or_can_expire
208
+ establish_session
209
+ assert(@session.expired?, "Session with expiry time #{@session.instance_variable_get('@expires')} occurred in the past and should be expired.")
210
+ @session.instance_variable_set("@expires", 0)
211
+ assert(@session.infinite?)
212
+ assert(!@session.expired?)
213
+ end
214
+
215
+ def test_session_can_tell_you_if_it_has_been_secured
216
+ mock = flexmock(Net::HTTP).should_receive(:post_form).and_return(example_auth_token_xml).once.ordered(:posts)
217
+ mock.should_receive(:post_form).and_return(example_get_session_xml.sub(/1173309298/, (Time.now + 60).to_i.to_s)).once.ordered(:posts)
218
+ @session.secure!
219
+ assert(@session.secured?)
220
+ end
221
+
222
+ def test_can_get_photos_by_pids
223
+ expect_http_posts_with_responses(example_get_photo_xml)
224
+ photos = @session.get_photos([97503428461115590, 97503428461115573])
225
+ assert_equal 2, photos.size
226
+ assert_equal "Rooftop barbecues make me act funny", photos.first.caption
227
+ assert_equal 97503428461115590, photos[0].id
228
+ end
229
+
230
+ def test_can_get_photos_by_subject_and_album
231
+ expect_http_posts_with_responses(example_get_photo_xml)
232
+ photos = @session.get_photos(nil, 22701786, 97503428432802022 )
233
+ assert_equal '97503428432802022', photos.first.aid
234
+ end
235
+
236
+ def test_getting_photos_requires_arguments
237
+ mock_http = establish_session
238
+ assert_raise(ArgumentError) { @session.get_photos() }
239
+ end
240
+
241
+ def test_can_get_albums_for_user
242
+ expect_http_posts_with_responses(example_user_albums_xml)
243
+ assert_equal('Summertime is Best', @session.user.albums.first.name)
244
+ assert_equal(2, @session.user.albums.size)
245
+ end
246
+
247
+ def test_can_get_albums_by_album_ids
248
+ expect_http_posts_with_responses(example_user_albums_xml)
249
+ albums = @session.get_albums([97503428432802022, 97503428432797817] )
250
+ assert_equal('Summertime is Best', albums[0].name)
251
+ assert_equal('Bonofon\'s Recital', albums[1].name)
252
+ end
253
+
254
+ def test_can_create_album
255
+ expect_http_posts_with_responses(example_new_album_xml)
256
+ assert_equal "My Empty Album", @session.user.create_album(:name => "My Empty Album", :location => "Limboland").name
257
+ end
258
+
259
+ def test_can_upload_photo
260
+ mock_http = establish_session
261
+ mock_http.should_receive(:post_multipart_form).and_return(example_upload_photo_xml).once.ordered(:posts)
262
+ f = Net::HTTP::MultipartPostFile.new("image.jpg", "image/jpeg", "RAW DATA")
263
+ assert_equal "Under the sunset", @session.user.upload_photo(f).caption
264
+ end
265
+
266
+ def test_can_get_photo_tags
267
+ expect_http_posts_with_responses(example_photo_tags_xml)
268
+ assert_instance_of Facebooker::Tag, @session.get_tags(:pids => 97503428461115571 ).first
269
+ end
270
+
271
+ # TODO: how to test that tags were created properly? Response doesn't contain much
272
+ def test_can_tag_a_user_in_a_photo
273
+ expect_http_posts_with_responses(example_add_tag_xml)
274
+ assert !@session.add_tags(pid = 97503428461115571, x= 30.0, y = 62.5, tag_uid = 1234567890).nil?
275
+ end
276
+
277
+ def test_can_add_multiple_tags_to_photos
278
+ end
279
+
280
+ def test_can_get_coordinates_for_photo_tags
281
+ expect_http_posts_with_responses(example_photo_tags_xml)
282
+ tag = @session.get_tags([97503428461115571]).first
283
+ assert_equal ['65.4248', '16.8627'], tag.coordinates
284
+ end
285
+
286
+ def test_can_upload_video
287
+ mock_http = establish_session
288
+ mock_http.should_receive(:post_multipart_form).and_return(example_upload_video_xml).once
289
+ f = Net::HTTP::MultipartPostFile.new("party.mp4", "video/mpeg", "RAW DATA")
290
+ assert_equal "Some Epic", @session.user.upload_video(f).title
291
+ end
292
+
293
+ def test_can_get_app_profile_fbml_for_user
294
+ expect_http_posts_with_responses(example_get_fbml_xml)
295
+ assert_match(/My profile!/, @session.user.profile_fbml)
296
+ end
297
+
298
+ def test_can_set_app_profile_fbml_for_user
299
+ expect_http_posts_with_responses(example_set_fbml_xml)
300
+ assert_nothing_raised {
301
+ @session.user.profile_fbml = 'aha!'
302
+ }
303
+ end
304
+
305
+ def test_get_logged_in_user
306
+ expect_http_posts_with_responses(example_get_logged_in_user_xml)
307
+ assert_equal 1240077, @session.post('facebook.users.getLoggedInUser', :session_key => @session.session_key)
308
+ end
309
+
310
+ def test_pages_get_info
311
+ expect_http_posts_with_responses(example_pages_get_info_xml)
312
+ info = {
313
+ 'page_id' => '4846711747',
314
+ 'name' => 'Kronos Quartet',
315
+ 'website' => 'http://www.kronosquartet.org',
316
+ 'company_overview' => ""
317
+ }
318
+ assert_equal [info], @session.post('facebook.pages.getInfo', :fields => ['company_overview', 'website', 'name', 'page_id'].join(','), :page_ids => [4846711747].join(','))
319
+ end
320
+
321
+ def test_pages_is_admin_true
322
+ expect_http_posts_with_responses(example_pages_is_admin_true_xml)
323
+ assert_equal true, @session.post('facebook.pages.isAdmin', :page_id => 123)
324
+ end
325
+
326
+ def test_pages_is_admin_false
327
+ expect_http_posts_with_responses(example_pages_is_admin_false_xml)
328
+ assert_equal false, @session.post('facebook.pages.isAdmin', :page_id => 123)
329
+ end
330
+
331
+ def test_pages_is_fan_true
332
+ expect_http_posts_with_responses(example_pages_is_fan_true_xml)
333
+ assert_equal true, @session.post('facebook.pages.isFan', :page_id => 123)
334
+ end
335
+
336
+ def test_pages_is_fan_false
337
+ expect_http_posts_with_responses(example_pages_is_fan_false_xml)
338
+ assert_equal false, @session.post('facebook.pages.isFan', :page_id => 123)
339
+ end
340
+
341
+ def test_users_set_status_true
342
+ expect_http_posts_with_responses(example_users_set_status_true_xml)
343
+ assert_equal true, @session.post('facebook.users.setStatus', :uid => 123, :status => 'message')
344
+ end
345
+
346
+ def test_users_set_status_false
347
+ expect_http_posts_with_responses(example_users_set_status_false_xml)
348
+ assert_equal false, @session.post('facebook.users.setStatus', :uid => 123, :status => 'message')
349
+ end
350
+
351
+ def test_desktop_apps_cannot_request_to_get_or_set_profile_fbml_for_any_user_other_than_logged_in_user
352
+ mock_http = establish_session(@desktop_session)
353
+ mock_http.should_receive(:post_form).and_return(example_friends_xml).once.ordered(:posts)
354
+ assert_raises(Facebooker::NonSessionUser) {
355
+ @desktop_session.user.friends.first.profile_fbml
356
+ }
357
+ assert_raises(Facebooker::NonSessionUser) {
358
+ @desktop_session.user.friends.first.profile_fbml = "O rly"
359
+ }
360
+ end
361
+
362
+ private
363
+ def populate_user_info
364
+ mock_http = establish_session
365
+ mock_http.should_receive(:post_form).and_return(example_user_info_xml).once
366
+ @session.user.populate
367
+ end
368
+
369
+ def populate_user_info_with_limited_fields
370
+ expect_http_posts_with_responses(example_limited_user_info_xml)
371
+ @session.user.populate(:affiliations, :status, :meeting_for)
372
+ end
373
+
374
+ def populate_session_friends
375
+ expect_http_posts_with_responses(example_friends_xml, example_user_info_xml)
376
+ @session.user.friends!
377
+ end
378
+
379
+ def populate_session_friends_with_limited_fields
380
+ expect_http_posts_with_responses(example_friends_xml, example_limited_user_info_xml)
381
+ @session.user.friends!(:affiliations, :status, :meeting_for)
382
+ end
383
+
384
+ def populate_session_friends_with_nil_data
385
+ expect_http_posts_with_responses(example_friends_xml, example_nil_user_info_xml)
386
+ @session.user.friends!(:name, :current_location, :pic)
387
+ end
388
+
389
+ def sample_args_to_post
390
+ {:method=>"facebook.auth.createToken", :sig=>"18b3dc4f5258a63c0ad641eebd3e3930"}
391
+ end
392
+
393
+ def example_pages_get_info_xml
394
+ <<-XML
395
+ <?xml version="1.0" encoding="UTF-8"?>
396
+ <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">
397
+ <page>
398
+ <page_id>4846711747</page_id>
399
+ <name>Kronos Quartet</name>
400
+ <website>http://www.kronosquartet.org</website>
401
+ <company_overview/>
402
+ </page>
403
+ </pages_getInfo_response>
404
+ XML
405
+ end
406
+
407
+ def example_pages_is_admin_true_xml
408
+ <<-XML
409
+ <?xml version="1.0" encoding="UTF-8"?>
410
+ <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>
411
+ XML
412
+ end
413
+
414
+ def example_pages_is_admin_false_xml
415
+ <<-XML
416
+ <?xml version="1.0" encoding="UTF-8"?>
417
+ <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>
418
+ XML
419
+ end
420
+
421
+ def example_pages_is_fan_true_xml
422
+ <<-XML
423
+ <?xml version="1.0" encoding="UTF-8"?>
424
+ <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>
425
+ XML
426
+ end
427
+
428
+ def example_pages_is_fan_false_xml
429
+ <<-XML
430
+ <?xml version="1.0" encoding="UTF-8"?>
431
+ <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>
432
+ XML
433
+ end
434
+
435
+ def example_users_set_status_true_xml
436
+ <<-XML
437
+ <?xml version="1.0" encoding="UTF-8"?>
438
+ <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>
439
+ XML
440
+ end
441
+
442
+ def example_users_set_status_false_xml
443
+ <<-XML
444
+ <?xml version="1.0" encoding="UTF-8"?>
445
+ <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>
446
+ XML
447
+ end
448
+
449
+ def example_set_fbml_xml
450
+ <<-XML
451
+ <?xml version="1.0" encoding="UTF-8"?>
452
+ <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>
453
+ XML
454
+ end
455
+
456
+ def example_get_fbml_xml
457
+ <<-XML
458
+ <?xml version="1.0" encoding="UTF-8"?>
459
+ <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">
460
+ &lt;fb:if-is-own-profile&gt;My profile!
461
+ &lt;fb:else&gt; Not my profile!&lt;/fb:else&gt;
462
+ &lt;/fb:if-is-own-profile&gt;
463
+ </profile_getFBML_response>
464
+ XML
465
+ end
466
+
467
+ def example_notifications_send_xml
468
+ <<-XML
469
+ <?xml version="1.0" encoding="UTF-8"?>
470
+ <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&id=52</notifications_send_response>
471
+ XML
472
+ end
473
+
474
+ def example_notifications_send_email_xml
475
+ <<-XML
476
+ <?xml version="1.0" encoding="UTF-8"?>
477
+ <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>
478
+ XML
479
+ end
480
+
481
+ def example_request_send_xml
482
+ <<-XML
483
+ <?xml version="1.0" encoding="UTF-8"?>
484
+ <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>
485
+ XML
486
+ end
487
+
488
+ def example_notifications_get_xml
489
+ <<-XML
490
+ <?xml version="1.0" encoding="UTF-8"?>
491
+ <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">
492
+ <messages>
493
+ <unread>1</unread>
494
+ <most_recent>1170644932</most_recent>
495
+ </messages>
496
+ <pokes>
497
+ <unread>0</unread>
498
+ <most_recent>0</most_recent>
499
+ </pokes>
500
+ <shares>
501
+ <unread>1</unread>
502
+ <most_recent>1170657686</most_recent>
503
+ </shares>
504
+ <friend_requests list="true">
505
+ <uid>2231342839</uid>
506
+ <uid>2231511925</uid>
507
+ <uid>2239284527</uid>
508
+ </friend_requests>
509
+ <group_invites list="true"/>
510
+ <event_invites list="true"/>
511
+ </notifications_get_response>
512
+ XML
513
+ end
514
+
515
+ def example_publish_story_xml
516
+ <<-XML
517
+ <?xml version="1.0" encoding="UTF-8"?>
518
+ <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>
519
+ XML
520
+ end
521
+
522
+ def example_publish_action_xml
523
+ <<-XML
524
+ <?xml version="1.0" encoding="UTF-8"?>
525
+ <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>
526
+ XML
527
+ end
528
+
529
+ def example_publish_templatized_action_xml
530
+ <<-XML
531
+ <?xml version="1.0" encoding="UTF-8"?>
532
+ <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">
533
+ <feed_publishTemplatizedAction_response_elt>1</feed_publishTemplatizedAction_response_elt>
534
+ </feed_publishTemplatizedAction_response>
535
+ XML
536
+ end
537
+
538
+ def example_deactivate_template_bundle_by_id_xml
539
+ <<-XML
540
+ <?xml version="1.0" encoding="UTF-8"?>
541
+ <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>
542
+ XML
543
+ end
544
+
545
+ def example_user_info_xml
546
+ <<-XML
547
+ <?xml version="1.0" encoding="UTF-8"?>
548
+ <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">
549
+ <user>
550
+ <uid>222333</uid>
551
+ <about_me>This field perpetuates the glorification of the ego. Also, it has a character limit.</about_me>
552
+ <activities>Here: facebook, etc. There: Glee Club, a capella, teaching.</activities>
553
+ <affiliations list="true">
554
+ <affiliation>
555
+ <nid>50453093</nid>
556
+ <name>Facebook Developers</name>
557
+ <type>work</type>
558
+ <status/>
559
+ <year/>
560
+ </affiliation>
561
+ </affiliations>
562
+ <birthday>November 3</birthday>
563
+ <books>The Brothers K, GEB, Ken Wilber, Zen and the Art, Fitzgerald, The Emporer's New Mind, The Wonderful Story of Henry Sugar</books>
564
+ <current_location>
565
+ <city>Palo Alto</city>
566
+ <state>CA</state>
567
+ <country>United States</country>
568
+ <zip>94303</zip>
569
+ </current_location>
570
+ <education_history list="true">
571
+ <education_info>
572
+ <name>Harvard</name>
573
+ <year>2003</year>
574
+ <concentrations list="true">
575
+ <concentration>Applied Mathematics</concentration>
576
+ <concentration>Computer Science</concentration>
577
+ </concentrations>
578
+ <degree>Masters</degree>
579
+ </education_info>
580
+ </education_history>
581
+ <first_name>Dave</first_name>
582
+ <hometown_location>
583
+ <city>York</city>
584
+ <state>PA</state>
585
+ <country>United States</country>
586
+ <zip>0</zip>
587
+ </hometown_location>
588
+ <hs_info>
589
+ <hs1_name>Central York High School</hs1_name>
590
+ <hs2_name/>
591
+ <grad_year>1999</grad_year>
592
+ <hs1_id>21846</hs1_id>
593
+ <hs2_id>0</hs2_id>
594
+ </hs_info>
595
+ <is_app_user>1</is_app_user>
596
+ <has_added_app>1</has_added_app>
597
+ <interests>coffee, computers, the funny, architecture, code breaking,snowboarding, philosophy, soccer, talking to strangers</interests>
598
+ <last_name>Fetterman</last_name>
599
+ <meeting_for list="true">
600
+ <seeking>Friendship</seeking>
601
+ </meeting_for>
602
+ <meeting_sex list="true">
603
+ <sex>female</sex>
604
+ </meeting_sex>
605
+ <movies>Tommy Boy, Billy Madison, Fight Club, Dirty Work, Meet the Parents, My Blue Heaven, Office Space </movies>
606
+ <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>
607
+ <name>Dave Fetterman</name>
608
+ <notes_count>0</notes_count>
609
+ <pic>http://photos-055.facebook.com/ip007/profile3/1271/65/s8055_39735.jpg</pic>
610
+ <pic_big>http://photos-055.facebook.com/ip007/profile3/1271/65/n8055_39735.jpg</pic_big>
611
+ <pic_small>http://photos-055.facebook.com/ip007/profile3/1271/65/t8055_39735.jpg</pic_small>
612
+ <pic_square>http://photos-055.facebook.com/ip007/profile3/1271/65/q8055_39735.jpg</pic_square>
613
+ <political>Moderate</political>
614
+ <profile_update_time>1170414620</profile_update_time>
615
+ <quotes/>
616
+ <relationship_status>In a Relationship</relationship_status>
617
+ <religion/>
618
+ <sex>male</sex>
619
+ <significant_other_id xsi:nil="true"/>
620
+ <status>
621
+ <message>I rule</message>
622
+ <time>0</time>
623
+ </status>
624
+ <timezone>-8</timezone>
625
+ <tv>cf. Bob Trahan</tv>
626
+ <wall_count>121</wall_count>
627
+ <work_history list="true">
628
+ <work_info>
629
+ <location>
630
+ <city>Palo Alto</city>
631
+ <state>CA</state>
632
+ <country>United States</country>
633
+ </location>
634
+ <company_name>Facebook</company_name>
635
+ <position>Software Engineer</position>
636
+ <description>Tech Lead, Facebook Platform</description>
637
+ <start_date>2006-01</start_date>
638
+ <end_date/>
639
+ </work_info>
640
+ </work_history>
641
+ </user>
642
+ <user>
643
+ <uid>1240079</uid>
644
+ <about_me>I am here.</about_me>
645
+ <activities>Party.</activities>
646
+ </user>
647
+ </users_getInfo_response>
648
+ XML
649
+ end
650
+
651
+ def example_limited_user_info_xml
652
+ <<-XML
653
+ <?xml version="1.0" encoding="UTF-8"?>
654
+ <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">
655
+ <user>
656
+ <uid>222333</uid>
657
+ <affiliations list="true">
658
+ <affiliation>
659
+ <nid>50453093</nid>
660
+ <name>Facebook Developers</name>
661
+ <type>work</type>
662
+ <status/>
663
+ <year/>
664
+ </affiliation>
665
+ </affiliations>
666
+ <meeting_for list="true">
667
+ <seeking>Friendship</seeking>
668
+ </meeting_for>
669
+ <status>
670
+ <message>I rule</message>
671
+ <time>0</time>
672
+ </status>
673
+ </user>
674
+ <user>
675
+ <uid>1240079</uid>
676
+ <activities>Party.</activities>
677
+ </user>
678
+ </users_getInfo_response>
679
+ XML
680
+ end
681
+
682
+
683
+ def example_nil_user_info_xml
684
+ <<-XML
685
+ <?xml version="1.0" encoding="UTF-8"?>
686
+ <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">
687
+ <user>
688
+ <uid>222333</uid>
689
+ <name>Kevin Lochner</name>
690
+ <current_location xsi:nil="true"/>
691
+ <pic xsi:nil="true"/>
692
+ </user>
693
+ </users_getInfo_response>
694
+ XML
695
+ end
696
+
697
+
698
+ def example_friends_xml
699
+ <<-XML
700
+ <?xml version="1.0" encoding="UTF-8"?>
701
+ <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">
702
+ <uid>222333</uid>
703
+ <uid>1240079</uid>
704
+ </friends_get_response>
705
+ XML
706
+ end
707
+
708
+ def example_friend_lists_xml
709
+ <<-XML
710
+ <?xml version="1.0" encoding="UTF-8"?>
711
+ <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">
712
+ <friendlist>
713
+ <flid>12089150545</flid>
714
+ <name>Family</name>
715
+ </friendlist>
716
+ <friendlist>
717
+ <flid>16361710545</flid>
718
+ <name>Entrepreneuer</name>
719
+ </friendlist>
720
+ </friends_getLists_response>
721
+ XML
722
+ end
723
+
724
+ def example_get_logged_in_user_xml
725
+ <<-XML
726
+ <?xml version="1.0" encoding="UTF-8"?>
727
+ <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>
728
+ XML
729
+ end
730
+
731
+ def example_invalid_api_key_error_response
732
+ <<-XML
733
+ <?xml version="1.0" encoding="UTF-8"?>
734
+ <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">
735
+ <error_code>101</error_code>
736
+ <error_msg>Invalid API key</error_msg>
737
+ <request_args list="true">
738
+ <arg>
739
+ <key>v</key>
740
+ <value>1.0</value>
741
+ </arg>
742
+ <arg>
743
+ <key>method</key>
744
+ <value>facebook.auth.createToken</value>
745
+ </arg>
746
+ <arg>
747
+ <key>sig</key>
748
+ <value>611f5f44e55f3fe17f858a8de84a4b0a</value>
749
+ </arg>
750
+ <arg>
751
+ <key>call_id</key>
752
+ <value>1186088346.82142</value>
753
+ </arg>
754
+ </request_args>
755
+ </error_response>
756
+ XML
757
+ end
758
+
759
+ def example_session_expired_error_response
760
+ <<-XML
761
+ <?xml version="1.0" encoding="UTF-8"?>
762
+ <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">
763
+ <error_code>102</error_code>
764
+ <error_msg>Session Expired</error_msg>
765
+ <request_args list="true">
766
+ <arg>
767
+ <key>v</key>
768
+ <value>1.0</value>
769
+ </arg>
770
+ <arg>
771
+ <key>method</key>
772
+ <value>facebook.auth.createToken</value>
773
+ </arg>
774
+ <arg>
775
+ <key>sig</key>
776
+ <value>611f5f44e55f3fe17f858a8de84a4b0a</value>
777
+ </arg>
778
+ <arg>
779
+ <key>call_id</key>
780
+ <value>1186088346.82142</value>
781
+ </arg>
782
+ </request_args>
783
+ </error_response>
784
+ XML
785
+ end
786
+
787
+ def example_app_users_xml
788
+ <<-XML
789
+ <?xml version="1.0" encoding="UTF-8"?>
790
+ <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">
791
+ <uid>222333</uid>
792
+ <uid>1240079</uid>
793
+ </friends_getAppUsers_response>
794
+ XML
795
+ end
796
+
797
+ def example_user_albums_xml
798
+ <<-XML
799
+ <?xml version="1.0" encoding="UTF-8"?>
800
+ <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">
801
+ <album>
802
+ <aid>97503428432802022</aid>
803
+ <cover_pid>97503428461115574</cover_pid>
804
+ <owner>22701786</owner>
805
+ <name>Summertime is Best</name>
806
+ <created>1184120648</created>
807
+ <modified>1185465771</modified>
808
+ <description>Happenings on or around Summer '07</description>
809
+ <location>Brooklyn, New York</location>
810
+ <link>http://www.facebook.com/album.php?aid=2011366&amp;id=22701786</link>
811
+ <size>49</size>
812
+ </album>
813
+ <album>
814
+ <aid>97503428432797817</aid>
815
+ <cover_pid>97503428460977993</cover_pid>
816
+ <owner>22701786</owner>
817
+ <name>Bonofon's Recital</name>
818
+ <created>1165356279</created>
819
+ <modified>1165382364</modified>
820
+ <description>The whole Ewing fam flies out to flatland to watch the Bonofon's senior recital. That boy sure can tinkle them ivories.</description>
821
+ <location>Grinnell College, Grinnell Iowa</location>
822
+ <link>http://www.facebook.com/album.php?aid=2007161&amp;id=22701786</link>
823
+ <size>14</size>
824
+ </album>
825
+ </photos_getAlbums_response>
826
+ XML
827
+ end
828
+
829
+ def example_upload_photo_xml
830
+ <<-XML
831
+ <?xml version="1.0" encoding="UTF-8"?>
832
+ <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">
833
+ <pid>940915697041656</pid>
834
+ <aid>940915667462717</aid>
835
+ <owner>219074</owner>
836
+ <src>http://ip002.facebook.com/v67/161/72/219074/s219074_31637752_5455.jpg</src>
837
+ <src_big>http://ip002.facebook.com/v67/161/72/219074/n219074_31637752_5455.jpg</src_big>
838
+ <src_small>http://ip002.facebook.com/v67/161/72/219074/t219074_31637752_5455.jpg</src_small>
839
+ <link>http://www.facebook.com/photo.php?pid=31637752&id=219074</link>
840
+ <caption>Under the sunset</caption>
841
+ </photos_upload_response>
842
+ XML
843
+ end
844
+
845
+ def example_new_album_xml
846
+ <<-XML
847
+ <?xml version="1.0" encoding="UTF-8"?>
848
+ <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">
849
+ <aid>34595963571485</aid>
850
+ <cover_pid>0</cover_pid>
851
+ <owner>8055</owner>
852
+ <name>My Empty Album</name>
853
+ <created>1132553109</created>
854
+ <modified>1132553363</modified>
855
+ <description>No I will not make out with you</description>
856
+ <location>York, PA</location>
857
+ <link>http://www.facebook.com/album.php?aid=2002205&id=8055</link>
858
+ <size>0</size>
859
+ </photos_createAlbum_response>
860
+ XML
861
+ end
862
+
863
+ def example_photo_tags_xml
864
+ <<-XML
865
+ <?xml version="1.0" encoding="UTF-8"?>
866
+ <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">
867
+ <photo_tag>
868
+ <pid>97503428461115571</pid>
869
+ <subject>570070524</subject>
870
+ <xcoord>65.4248</xcoord>
871
+ <ycoord>16.8627</ycoord>
872
+ </photo_tag>
873
+ </photos_getTags_response>
874
+ XML
875
+ end
876
+
877
+ def example_add_tag_xml
878
+ <<-XML
879
+ <?xml version="1.0" encoding="UTF-8"?>
880
+ <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>
881
+ XML
882
+ end
883
+
884
+ def example_get_photo_xml
885
+ <<-XML
886
+ <?xml version="1.0" encoding="UTF-8"?>
887
+ <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">
888
+ <photo>
889
+ <pid>97503428461115590</pid>
890
+ <aid>97503428432802022</aid>
891
+ <owner>22701786</owner>
892
+ <src>http://photos-c.ak.facebook.com/photos-ak-sf2p/v77/74/112/22701786/s22701786_30324934_7816.jpg</src>
893
+ <src_big>http://photos-c.ak.facebook.com/photos-ak-sf2p/v77/74/112/22701786/n22701786_30324934_7816.jpg</src_big>
894
+ <src_small>http://photos-c.ak.facebook.com/photos-ak-sf2p/v77/74/112/22701786/t22701786_30324934_7816.jpg</src_small>
895
+ <link>http://www.facebook.com/photo.php?pid=30324934&amp;id=22701786</link>
896
+ <caption>Rooftop barbecues make me act funny</caption>
897
+ <created>1184120987</created>
898
+ </photo>
899
+ <photo>
900
+ <pid>97503428461115573</pid>
901
+ <aid>97503428432802022</aid>
902
+ <owner>22701786</owner>
903
+ <src>http://photos-b.ak.facebook.com/photos-ak-sf2p/v77/74/112/22701786/s22701786_30324917_4555.jpg</src>
904
+ <src_big>http://photos-b.ak.facebook.com/photos-ak-sf2p/v77/74/112/22701786/n22701786_30324917_4555.jpg</src_big>
905
+ <src_small>http://photos-b.ak.facebook.com/photos-ak-sf2p/v77/74/112/22701786/t22701786_30324917_4555.jpg</src_small>
906
+ <link>http://www.facebook.com/photo.php?pid=30324917&amp;id=22701786</link>
907
+ <caption/>
908
+ <created>1184120654</created>
909
+ </photo>
910
+ </photos_get_response>
911
+ XML
912
+ end
913
+
914
+ def example_upload_video_xml
915
+ <<-XML
916
+ <?xml version="1.0" encoding="UTF-8"?>
917
+ <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">
918
+ <vid>15943367753</vid>
919
+ <title>Some Epic</title>
920
+ <description>Check it out</description>
921
+ <link>http://www.facebook.com/video/video.php?v=15943367753</link>
922
+ </video_upload_response>
923
+ XML
924
+ end
925
+ end