fbooker 1.0.53

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 (142) hide show
  1. data/.autotest +15 -0
  2. data/CHANGELOG.rdoc +24 -0
  3. data/COPYING.rdoc +19 -0
  4. data/Manifest.txt +144 -0
  5. data/README.rdoc +113 -0
  6. data/Rakefile +94 -0
  7. data/TODO.rdoc +4 -0
  8. data/examples/desktop_login.rb +14 -0
  9. data/facebooker.gemspec +42 -0
  10. data/generators/facebook/facebook_generator.rb +14 -0
  11. data/generators/facebook/templates/config/facebooker.yml +49 -0
  12. data/generators/facebook/templates/public/javascripts/facebooker.js +332 -0
  13. data/generators/facebook_controller/USAGE +33 -0
  14. data/generators/facebook_controller/facebook_controller_generator.rb +40 -0
  15. data/generators/facebook_controller/templates/controller.rb +7 -0
  16. data/generators/facebook_controller/templates/functional_test.rb +11 -0
  17. data/generators/facebook_controller/templates/helper.rb +2 -0
  18. data/generators/facebook_controller/templates/view.fbml.erb +2 -0
  19. data/generators/facebook_controller/templates/view.html.erb +2 -0
  20. data/generators/facebook_publisher/facebook_publisher_generator.rb +14 -0
  21. data/generators/facebook_publisher/templates/create_facebook_templates.rb +15 -0
  22. data/generators/facebook_publisher/templates/publisher.rb +3 -0
  23. data/generators/facebook_scaffold/USAGE +27 -0
  24. data/generators/facebook_scaffold/facebook_scaffold_generator.rb +118 -0
  25. data/generators/facebook_scaffold/templates/controller.rb +93 -0
  26. data/generators/facebook_scaffold/templates/facebook_style.css +2579 -0
  27. data/generators/facebook_scaffold/templates/functional_test.rb +89 -0
  28. data/generators/facebook_scaffold/templates/helper.rb +2 -0
  29. data/generators/facebook_scaffold/templates/layout.fbml.erb +6 -0
  30. data/generators/facebook_scaffold/templates/layout.html.erb +17 -0
  31. data/generators/facebook_scaffold/templates/style.css +74 -0
  32. data/generators/facebook_scaffold/templates/view_edit.fbml.erb +13 -0
  33. data/generators/facebook_scaffold/templates/view_edit.html.erb +18 -0
  34. data/generators/facebook_scaffold/templates/view_index.fbml.erb +24 -0
  35. data/generators/facebook_scaffold/templates/view_index.html.erb +24 -0
  36. data/generators/facebook_scaffold/templates/view_new.fbml.erb +12 -0
  37. data/generators/facebook_scaffold/templates/view_new.html.erb +17 -0
  38. data/generators/facebook_scaffold/templates/view_show.fbml.erb +10 -0
  39. data/generators/facebook_scaffold/templates/view_show.html.erb +10 -0
  40. data/generators/publisher/publisher_generator.rb +14 -0
  41. data/generators/xd_receiver/templates/xd_receiver.html +10 -0
  42. data/generators/xd_receiver/templates/xd_receiver_ssl.html +10 -0
  43. data/generators/xd_receiver/xd_receiver_generator.rb +10 -0
  44. data/init.rb +26 -0
  45. data/install.rb +12 -0
  46. data/lib/facebooker.rb +252 -0
  47. data/lib/facebooker/adapters/adapter_base.rb +91 -0
  48. data/lib/facebooker/adapters/bebo_adapter.rb +77 -0
  49. data/lib/facebooker/adapters/facebook_adapter.rb +60 -0
  50. data/lib/facebooker/admin.rb +42 -0
  51. data/lib/facebooker/application.rb +13 -0
  52. data/lib/facebooker/batch_request.rb +45 -0
  53. data/lib/facebooker/data.rb +57 -0
  54. data/lib/facebooker/feed.rb +78 -0
  55. data/lib/facebooker/logging.rb +44 -0
  56. data/lib/facebooker/mobile.rb +20 -0
  57. data/lib/facebooker/mock/service.rb +50 -0
  58. data/lib/facebooker/mock/session.rb +18 -0
  59. data/lib/facebooker/model.rb +139 -0
  60. data/lib/facebooker/models/affiliation.rb +10 -0
  61. data/lib/facebooker/models/album.rb +11 -0
  62. data/lib/facebooker/models/applicationproperties.rb +39 -0
  63. data/lib/facebooker/models/applicationrestrictions.rb +10 -0
  64. data/lib/facebooker/models/cookie.rb +10 -0
  65. data/lib/facebooker/models/education_info.rb +11 -0
  66. data/lib/facebooker/models/event.rb +28 -0
  67. data/lib/facebooker/models/family_relative_info.rb +7 -0
  68. data/lib/facebooker/models/friend_list.rb +16 -0
  69. data/lib/facebooker/models/group.rb +36 -0
  70. data/lib/facebooker/models/info_item.rb +10 -0
  71. data/lib/facebooker/models/info_section.rb +10 -0
  72. data/lib/facebooker/models/location.rb +8 -0
  73. data/lib/facebooker/models/notifications.rb +17 -0
  74. data/lib/facebooker/models/page.rb +44 -0
  75. data/lib/facebooker/models/photo.rb +19 -0
  76. data/lib/facebooker/models/tag.rb +12 -0
  77. data/lib/facebooker/models/user.rb +552 -0
  78. data/lib/facebooker/models/video.rb +9 -0
  79. data/lib/facebooker/models/work_info.rb +10 -0
  80. data/lib/facebooker/parser.rb +717 -0
  81. data/lib/facebooker/rails/backwards_compatible_param_checks.rb +31 -0
  82. data/lib/facebooker/rails/controller.rb +353 -0
  83. data/lib/facebooker/rails/cucumber.rb +28 -0
  84. data/lib/facebooker/rails/cucumber/world.rb +40 -0
  85. data/lib/facebooker/rails/extensions/action_controller.rb +48 -0
  86. data/lib/facebooker/rails/extensions/rack_setup.rb +6 -0
  87. data/lib/facebooker/rails/extensions/routing.rb +15 -0
  88. data/lib/facebooker/rails/facebook_form_builder.rb +112 -0
  89. data/lib/facebooker/rails/facebook_pretty_errors.rb +22 -0
  90. data/lib/facebooker/rails/facebook_request_fix.rb +28 -0
  91. data/lib/facebooker/rails/facebook_request_fix_2-3.rb +31 -0
  92. data/lib/facebooker/rails/facebook_session_handling.rb +68 -0
  93. data/lib/facebooker/rails/facebook_url_helper.rb +192 -0
  94. data/lib/facebooker/rails/facebook_url_rewriting.rb +60 -0
  95. data/lib/facebooker/rails/helpers.rb +870 -0
  96. data/lib/facebooker/rails/helpers/fb_connect.rb +122 -0
  97. data/lib/facebooker/rails/integration_session.rb +38 -0
  98. data/lib/facebooker/rails/profile_publisher_extensions.rb +42 -0
  99. data/lib/facebooker/rails/publisher.rb +595 -0
  100. data/lib/facebooker/rails/routing.rb +49 -0
  101. data/lib/facebooker/rails/test_helpers.rb +68 -0
  102. data/lib/facebooker/rails/utilities.rb +22 -0
  103. data/lib/facebooker/server_cache.rb +24 -0
  104. data/lib/facebooker/service.rb +102 -0
  105. data/lib/facebooker/service/base_service.rb +19 -0
  106. data/lib/facebooker/service/curl_service.rb +44 -0
  107. data/lib/facebooker/service/net_http_service.rb +12 -0
  108. data/lib/facebooker/service/typhoeus_multi_service.rb +27 -0
  109. data/lib/facebooker/service/typhoeus_service.rb +17 -0
  110. data/lib/facebooker/session.rb +726 -0
  111. data/lib/facebooker/version.rb +9 -0
  112. data/lib/net/http_multipart_post.rb +123 -0
  113. data/lib/rack/facebook.rb +89 -0
  114. data/lib/tasks/facebooker.rake +18 -0
  115. data/lib/tasks/tunnel.rake +46 -0
  116. data/rails/init.rb +1 -0
  117. data/setup.rb +1585 -0
  118. data/templates/layout.erb +24 -0
  119. data/test/facebooker/adapters_test.rb +191 -0
  120. data/test/facebooker/admin_test.rb +102 -0
  121. data/test/facebooker/application_test.rb +41 -0
  122. data/test/facebooker/batch_request_test.rb +83 -0
  123. data/test/facebooker/data_test.rb +86 -0
  124. data/test/facebooker/logging_test.rb +43 -0
  125. data/test/facebooker/mobile_test.rb +45 -0
  126. data/test/facebooker/model_test.rb +133 -0
  127. data/test/facebooker/models/event_test.rb +15 -0
  128. data/test/facebooker/models/page_test.rb +46 -0
  129. data/test/facebooker/models/photo_test.rb +16 -0
  130. data/test/facebooker/models/user_test.rb +397 -0
  131. data/test/facebooker/rails/facebook_request_fix_2-3_test.rb +25 -0
  132. data/test/facebooker/rails/facebook_url_rewriting_test.rb +76 -0
  133. data/test/facebooker/rails/integration_session_test.rb +13 -0
  134. data/test/facebooker/rails/publisher_test.rb +519 -0
  135. data/test/facebooker/rails_integration_test.rb +1511 -0
  136. data/test/facebooker/server_cache_test.rb +44 -0
  137. data/test/facebooker/service_test.rb +58 -0
  138. data/test/facebooker/session_test.rb +883 -0
  139. data/test/facebooker_test.rb +951 -0
  140. data/test/net/http_multipart_post_test.rb +52 -0
  141. data/test/rack/facebook_test.rb +73 -0
  142. metadata +235 -0
@@ -0,0 +1,1511 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../rails_test_helper')
2
+
3
+ module FBConnectTestHelpers
4
+ def setup_fb_connect_cookies(params=cookie_hash_for_auth)
5
+ params.each {|k,v| @request.cookies[ENV['FACEBOOK_API_KEY']+k] = CGI::Cookie.new(ENV['FACEBOOK_API_KEY']+k,v)}
6
+ end
7
+
8
+ def expired_cookie_hash_for_auth
9
+ {"_ss" => "not_used", "_session_key"=> "whatever", "_user"=>"77777", "_expires"=>"#{1.day.ago.to_i}"}
10
+ end
11
+
12
+ def cookie_hash_for_auth
13
+ {"_ss" => "not_used", "_session_key"=> "whatever", "_user"=>"77777", "_expires"=>"#{1.day.from_now.to_i}"}
14
+ end
15
+ end
16
+ class NoisyController < ActionController::Base
17
+ include Facebooker::Rails::Controller
18
+ def rescue_action(e) raise e end
19
+ end
20
+
21
+
22
+ class ControllerWhichRequiresExtendedPermissions< NoisyController
23
+ ensure_authenticated_to_facebook
24
+ before_filter :ensure_has_status_update
25
+ before_filter :ensure_has_photo_upload
26
+ before_filter :ensure_has_video_upload
27
+ before_filter :ensure_has_create_listing
28
+ before_filter :ensure_has_create_event
29
+ def index
30
+ render :text => 'score!'
31
+ end
32
+ end
33
+
34
+ class FBConnectController < NoisyController
35
+ before_filter :create_facebook_session
36
+ def index
37
+ render :text => 'score!'
38
+ end
39
+ end
40
+
41
+ class FBConnectControllerProxy < NoisyController
42
+ before_filter :create_facebook_session_with_secret
43
+ def index
44
+ render :text => 'score!'
45
+ end
46
+ end
47
+
48
+ class ControllerWhichRequiresFacebookAuthentication < NoisyController
49
+ ensure_authenticated_to_facebook
50
+ def index
51
+ render :text => 'score!'
52
+ end
53
+ def link_test
54
+ options = {}
55
+ options[:canvas] = true if params[:canvas] == true
56
+ options[:canvas] = false if params[:canvas] == false
57
+ render :text=>url_for(options)
58
+ end
59
+
60
+ def named_route_test
61
+ render :text=>comments_url()
62
+ end
63
+
64
+ def image_test
65
+ render :inline=>"<%=image_tag 'image.png'%>"
66
+ end
67
+
68
+ def fb_params_test
69
+ render :text=>facebook_params['user']
70
+ end
71
+
72
+ def publisher_test
73
+ if wants_interface?
74
+ render :text=>"interface"
75
+ else
76
+ render :text=>"not interface"
77
+ end
78
+ end
79
+
80
+ def publisher_test_interface
81
+ render_publisher_interface("This is a test",false,true)
82
+ end
83
+
84
+ def publisher_test_response
85
+ ua=Facebooker::Rails::Publisher::UserAction.new
86
+ ua.data = {:params=>true}
87
+ ua.template_name = "template_name"
88
+ ua.template_id = 1234
89
+ render_publisher_response(ua)
90
+ end
91
+
92
+ def publisher_test_error
93
+ render_publisher_error("Title","Body")
94
+ end
95
+
96
+ end
97
+ class ControllerWhichRequiresApplicationInstallation < NoisyController
98
+ ensure_application_is_installed_by_facebook_user
99
+ def index
100
+ render :text => 'installed!'
101
+ end
102
+ end
103
+ class FacebookController < ActionController::Base
104
+ def index
105
+ end
106
+ end
107
+
108
+ class PlainOldRailsController < ActionController::Base
109
+ def index
110
+ end
111
+ def link_test
112
+ options = {}
113
+ options[:canvas] = true if params[:canvas] == true
114
+ options[:canvas] = false if params[:canvas] == false
115
+ render :text => url_for(options)
116
+ end
117
+
118
+ def named_route_test
119
+ render :text=>comments_url()
120
+ end
121
+ def canvas_false_test
122
+ render :text=>comments_url(:canvas=>false)
123
+ end
124
+ def canvas_true_test
125
+ render :text=>comments_url(:canvas=>true)
126
+ end
127
+ end
128
+
129
+
130
+ # you can't use asset_recognize, because it can't pass parameters in to the requests
131
+ class UrlRecognitionTests < Test::Unit::TestCase
132
+ def test_detects_in_canvas
133
+ if Rails.version < '2.3'
134
+ request = ActionController::TestRequest.new({"fb_sig_in_canvas"=>"1"}, {}, nil)
135
+ else
136
+ request = ActionController::TestRequest.new
137
+ request.query_parameters[:fb_sig_in_canvas] = "1"
138
+ end
139
+ request.path = "/"
140
+ ActionController::Routing::Routes.recognize(request)
141
+ assert_equal({"controller"=>"facebook","action"=>"index"},request.path_parameters)
142
+ end
143
+
144
+ def test_routes_when_not_in_canvas
145
+ if Rails.version < '2.3'
146
+ request = ActionController::TestRequest.new({}, {}, nil)
147
+ else
148
+ request = ActionController::TestRequest.new
149
+ end
150
+ request.path = "/"
151
+ ActionController::Routing::Routes.recognize(request)
152
+ assert_equal({"controller"=>"plain_old_rails","action"=>"index"},request.path_parameters)
153
+ end
154
+ end
155
+
156
+ class RailsIntegrationTestForFBConnect < Test::Unit::TestCase
157
+ include FBConnectTestHelpers
158
+
159
+ def setup
160
+ Facebooker.apply_configuration({
161
+ 'api_key' => '1234567',
162
+ 'canvas_page_name' => 'facebook_app_name',
163
+ 'secret_key' => '7654321' })
164
+ @controller = FBConnectController.new
165
+ @request = ActionController::TestRequest.new
166
+ @response = ActionController::TestResponse.new
167
+ @controller.stubs(:verify_signature).returns(true)
168
+
169
+ end
170
+
171
+ def test_doesnt_set_cookie_but_facebook_session_is_available
172
+ setup_fb_connect_cookies
173
+ get :index
174
+ assert_not_nil @controller.facebook_session
175
+ assert_nil @response.cookies[:facebook_session]
176
+
177
+ end
178
+ end
179
+
180
+ class RailsIntegrationTestForNonFacebookControllers < Test::Unit::TestCase
181
+ def setup
182
+ Facebooker.apply_configuration({
183
+ 'api_key' => '1234567',
184
+ 'canvas_page_name' => 'facebook_app_name',
185
+ 'secret_key' => '7654321' })
186
+ @controller = PlainOldRailsController.new
187
+ @request = ActionController::TestRequest.new
188
+ @response = ActionController::TestResponse.new
189
+ end
190
+
191
+ def test_url_for_links_to_callback_if_canvas_is_false_and_in_canvas
192
+ get :link_test
193
+ assert_match(/test.host/, @response.body)
194
+ end
195
+
196
+ def test_named_route_doesnt_include_canvas_path_when_not_in_canvas
197
+ get :named_route_test
198
+ assert_equal "http://test.host/comments",@response.body
199
+ end
200
+ def test_named_route_includes_canvas_path_when_in_canvas
201
+ get :named_route_test, facebook_params
202
+ assert_equal "http://apps.facebook.com/facebook_app_name/comments",@response.body
203
+ end
204
+
205
+ def test_named_route_doesnt_include_canvas_path_when_in_canvas_with_canvas_equals_false
206
+ get :canvas_false_test, facebook_params
207
+ assert_equal "http://test.host/comments",@response.body
208
+ end
209
+ def test_named_route_does_include_canvas_path_when_not_in_canvas_with_canvas_equals_true
210
+ get :canvas_true_test
211
+ assert_equal "http://apps.facebook.com/facebook_app_name/comments",@response.body
212
+ end
213
+
214
+ end
215
+
216
+ class RailsIntegrationTestForExtendedPermissions < Test::Unit::TestCase
217
+ def setup
218
+ Facebooker.apply_configuration({
219
+ 'api_key' => '1234567',
220
+ 'secret_key' => '7654321' })
221
+ @controller = ControllerWhichRequiresExtendedPermissions.new
222
+ @request = ActionController::TestRequest.new
223
+ @response = ActionController::TestResponse.new
224
+ @controller.stubs(:verify_signature).returns(true)
225
+ end
226
+
227
+ def test_redirects_without_set_status
228
+ post :index, facebook_params
229
+ assert_response :success
230
+ assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=status_update\" />", @response.body)
231
+ end
232
+ def test_redirects_without_photo_upload
233
+ post :index, facebook_params(:fb_sig_ext_perms=>"status_update,create_event")
234
+ assert_response :success
235
+ assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=photo_upload\" />", @response.body)
236
+ end
237
+ def test_redirects_without_video_upload
238
+ post :index, facebook_params(:fb_sig_ext_perms=>"status_update,photo_upload,create_event")
239
+ assert_response :success
240
+ assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=video_upload\" />", @response.body)
241
+ end
242
+ def test_redirects_without_create_listing
243
+ post :index, facebook_params(:fb_sig_ext_perms=>"status_update,photo_upload,video_upload,create_event")
244
+ assert_response :success
245
+ assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=create_listing\" />", @response.body)
246
+ end
247
+ def test_redirects_without_create_event
248
+ post :index, facebook_params(:fb_sig_ext_perms=>"status_update,photo_upload,create_listing,video_upload")
249
+ assert_response :success
250
+ assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=create_event\" />", @response.body)
251
+ end
252
+
253
+ def test_renders_with_permission
254
+ post :index, facebook_params(:fb_sig_ext_perms=>"status_update,photo_upload,create_listing,video_upload,create_event")
255
+ assert_response :success
256
+ assert_equal("score!", @response.body)
257
+
258
+ end
259
+ end
260
+
261
+ class RailsIntegrationTestForApplicationInstallation < Test::Unit::TestCase
262
+ def setup
263
+ Facebooker.apply_configuration({
264
+ 'api_key' => '1234567',
265
+ 'secret_key' => '7654321' })
266
+ @controller = ControllerWhichRequiresApplicationInstallation.new
267
+ @request = ActionController::TestRequest.new
268
+ @response = ActionController::TestResponse.new
269
+ @controller.stubs(:verify_signature).returns(true)
270
+ end
271
+
272
+ def test_if_controller_requires_application_installation_unauthenticated_requests_will_redirect_to_install_page
273
+ get :index
274
+ assert_response :redirect
275
+ assert_equal("http://www.facebook.com/install.php?api_key=1234567&v=1.0&next=http%3A%2F%2Ftest.host%2Frequire_install", @response.headers['Location'])
276
+ end
277
+
278
+ def test_if_controller_requires_application_installation_authenticated_requests_without_installation_will_redirect_to_install_page
279
+ get :index, facebook_params(:fb_sig_added => nil)
280
+ assert_response :success
281
+ assert(@response.body =~ /fb:redirect/)
282
+ end
283
+
284
+ def test_if_controller_requires_application_installation_authenticated_requests_with_installation_will_render
285
+ get :index, facebook_params('fb_sig_added' => "1")
286
+ assert_response :success
287
+ assert_equal("installed!", @response.body)
288
+ end
289
+ end
290
+
291
+ class RailsIntegrationTest < Test::Unit::TestCase
292
+ include FBConnectTestHelpers
293
+ def setup
294
+ Facebooker.apply_configuration({
295
+ 'api_key' => '1234567',
296
+ 'canvas_page_name' => 'root',
297
+ 'secret_key' => '7654321',
298
+ 'set_asset_host_to_callback_url' => true,
299
+ 'callback_url' => "http://root.example.com" })
300
+ @controller = ControllerWhichRequiresFacebookAuthentication.new
301
+ @request = ActionController::TestRequest.new
302
+ @response = ActionController::TestResponse.new
303
+ @controller.stubs(:verify_signature).returns(true)
304
+
305
+ end
306
+
307
+ def test_named_route_includes_new_canvas_path_when_in_new_canvas
308
+ get :named_route_test, facebook_params("fb_sig_in_new_facebook"=>"1")
309
+ assert_equal "http://apps.facebook.com/root/comments",@response.body
310
+ end
311
+
312
+ def test_if_controller_requires_facebook_authentication_unauthenticated_requests_will_redirect
313
+ get :index
314
+ assert_response :redirect
315
+ assert_equal("http://www.facebook.com/login.php?api_key=1234567&v=1.0&next=http%3A%2F%2Ftest.host%2Frequire_auth", @response.headers['Location'])
316
+ end
317
+
318
+ def test_facebook_params_are_parsed_into_a_separate_hash
319
+ get :index, facebook_params(:fb_sig_user => '9')
320
+ assert_not_nil @controller.facebook_params['time']
321
+ end
322
+
323
+ def test_facebook_params_convert_in_canvas_to_boolean
324
+ get :index, facebook_params
325
+ assert_equal(true, @controller.facebook_params['in_canvas'])
326
+ end
327
+
328
+ def test_facebook_params_convert_added_to_boolean_false
329
+ get :index, facebook_params(:fb_sig_added => '0')
330
+ assert_equal(false, @controller.facebook_params['added'])
331
+ end
332
+
333
+ def test_facebook_params_convert_added_to_boolean_true
334
+ get :index, facebook_params('fb_sig_added' => "1")
335
+ assert_equal(true, @controller.facebook_params['added'])
336
+ end
337
+
338
+ def test_facebook_params_convert_added_to_boolean_false_when_already_false
339
+ get :index, facebook_params('fb_sig_added' => false)
340
+ assert_equal(false, @controller.facebook_params['added'])
341
+ end
342
+
343
+ def test_facebook_params_convert_added_to_boolean_true_when_already_true
344
+ get :index, facebook_params('fb_sig_added' => true)
345
+ assert_equal(true, @controller.facebook_params['added'])
346
+ end
347
+
348
+ def test_facebook_params_convert_expirey_into_nil
349
+ get :index, facebook_params(:fb_sig_expires => '0')
350
+ assert_nil(@controller.facebook_params['expires'])
351
+ end
352
+
353
+ def test_facebook_params_convert_expirey_into_time
354
+ get :index, facebook_params(:fb_sig_expires => 5.minutes.from_now.to_f)
355
+ assert_instance_of Time, @controller.facebook_params['expires']
356
+ end
357
+
358
+ def test_facebook_params_convert_friend_list_to_parsed_array_of_friend_ids
359
+ get :index, facebook_params(:fb_sig_friends => '1,2,3,4,5')
360
+ assert_kind_of(Array, @controller.facebook_params['friends'])
361
+ assert_equal(5, @controller.facebook_params['friends'].size)
362
+ end
363
+
364
+ def test_session_can_be_resecured_from_facebook_params
365
+ get :index, facebook_params(:fb_sig_user => 10)
366
+ assert_equal(10, @controller.facebook_session.user.id)
367
+ end
368
+
369
+ def test_existing_secured_session_is_used_if_available
370
+ session = Facebooker::Session.create(Facebooker::Session.api_key, Facebooker::Session.secret_key)
371
+ session.secure_with!("session_key", "111", Time.now.to_i + 60)
372
+ get :index, facebook_params(:fb_sig_session_key => 'session_key', :fb_sig_user => '987'), {:facebook_session => session}
373
+ assert_equal(111, @controller.facebook_session.user.id)
374
+ end
375
+
376
+ def test_facebook_params_used_if_existing_secured_session_key_does_not_match
377
+ session = Facebooker::Session.create(Facebooker::Session.api_key, Facebooker::Session.secret_key)
378
+ session.secure_with!("different session key", "111", Time.now.to_i + 60)
379
+ get :index, facebook_params(:fb_sig_session_key => '', :fb_sig_user => '123'), {:facebook_session => session}
380
+ assert_equal(123, @controller.facebook_session.user.id)
381
+ end
382
+
383
+ def test_existing_secured_session_is_NOT_used_if_available_and_facebook_params_session_key_is_nil_and_in_canvas
384
+ session = Facebooker::Session.create(Facebooker::Session.api_key, Facebooker::Session.secret_key)
385
+ session.secure_with!("session_key", "111", Time.now.to_i + 60)
386
+ session.secure_with!("a session key", "1111111", Time.now.to_i + 60)
387
+ get :index, facebook_params(:fb_sig_session_key => '', :fb_sig_user => '987'), {:facebook_session => session}
388
+ assert_equal(987, @controller.facebook_session.user.id)
389
+ end
390
+
391
+ def test_existing_secured_session_IS_used_if_available_and_facebook_params_session_key_is_nil_and_NOT_in_canvas
392
+ @contoller = PlainOldRailsController.new
393
+ session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY'])
394
+ session.secure_with!("a session key", "1111111", Time.now.to_i + 60)
395
+ get :index,{}, {:facebook_session => session}
396
+
397
+ assert_equal(1111111, @controller.facebook_session.user.id)
398
+ end
399
+
400
+ def test_session_can_be_secured_with_secret
401
+ @controller = FBConnectControllerProxy.new
402
+ auth_token = 'ohaiauthtokenhere111'
403
+ modified_params = facebook_params
404
+ modified_params.delete('fb_sig_session_key')
405
+ modified_params['auth_token'] = auth_token
406
+ modified_params['generate_session_secret'] = true
407
+ session_mock = flexmock(session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY']))
408
+ session_params = { 'session_key' => '123', 'uid' => '321' }
409
+ session_mock.should_receive(:post).with('facebook.auth.getSession', :auth_token => auth_token, :generate_session_secret => "1").once.and_return(session_params).ordered
410
+ flexmock(@controller).should_receive(:new_facebook_session).once.and_return(session).ordered
411
+ get :index, modified_params
412
+ end
413
+
414
+ def test_session_can_be_secured_with_auth_token
415
+ auth_token = 'ohaiauthtokenhere111'
416
+ modified_params = facebook_params
417
+ modified_params.delete('fb_sig_session_key')
418
+ modified_params['auth_token'] = auth_token
419
+ session_mock = flexmock(session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY']))
420
+ session_params = { 'session_key' => '123', 'uid' => '321' }
421
+ session_mock.should_receive(:post).with('facebook.auth.getSession', :auth_token => auth_token, :generate_session_secret => "0").once.and_return(session_params).ordered
422
+ flexmock(@controller).should_receive(:new_facebook_session).once.and_return(session).ordered
423
+ get :index, modified_params
424
+ end
425
+
426
+ def test_session_secured_with_auth_token_if_cookies_expired
427
+ auth_token = 'ohaiauthtokenhere111'
428
+ modified_params = facebook_params
429
+ modified_params.delete('fb_sig_session_key')
430
+ modified_params['auth_token'] = auth_token
431
+ session_mock = flexmock(session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY']))
432
+ session_params = { 'session_key' => '123', 'uid' => '321' }
433
+ session_mock.should_receive(:post).with('facebook.auth.getSession', :auth_token => auth_token, :generate_session_secret => "0").once.and_return(session_params).ordered
434
+ flexmock(@controller).should_receive(:new_facebook_session).once.and_return(session).ordered
435
+ setup_fb_connect_cookies(expired_cookie_hash_for_auth)
436
+ get :index, modified_params
437
+ assert_equal(321, @controller.facebook_session.user.id)
438
+ end
439
+
440
+ def test_session_can_be_secured_with_cookies
441
+ setup_fb_connect_cookies
442
+ get :index
443
+ assert_equal(77777, @controller.facebook_session.user.id)
444
+ end
445
+
446
+ def test_session_does_NOT_secure_with_expired_cookies
447
+ setup_fb_connect_cookies(expired_cookie_hash_for_auth)
448
+ get :index
449
+ assert_nil(@controller.facebook_session)
450
+ end
451
+
452
+ def test_user_friends_can_be_populated_from_facebook_params_if_available
453
+ get :index, facebook_params(:fb_sig_friends => '1,2,3,4')
454
+ friends = @controller.facebook_session.user.friends
455
+ assert_not_nil(friends)
456
+ assert_equal(4, friends.size)
457
+ end
458
+
459
+ def test_fbml_redirect_tag_handles_hash_parameters_correctly
460
+ get :index, facebook_params
461
+ assert_equal "<fb:redirect url=\"http://apps.facebook.com/root/require_auth\" />", @controller.send(:fbml_redirect_tag, :action => :index,:canvas=>true)
462
+ end
463
+
464
+ def test_redirect_to_renders_fbml_redirect_tag_if_request_is_for_a_facebook_canvas
465
+ get :index, facebook_params(:fb_sig_user => nil)
466
+ assert_response :success
467
+ assert @response.body =~ /fb:redirect/
468
+ end
469
+
470
+ def test_redirect_to_renders_javascript_redirect_if_request_is_for_a_facebook_iframe
471
+ get :index, facebook_params(:fb_sig_user => nil, :fb_sig_in_iframe => 1)
472
+ assert_response :success
473
+ assert_match "javascript", @response.body
474
+ assert_match "http-equiv", @response.body
475
+ assert_match "http://www.facebook.com/login.php?api_key=1234567&amp;v=1.0", @response.body
476
+ end
477
+
478
+ def test_url_for_links_to_canvas_if_canvas_is_true_and_not_in_canvas
479
+ get :link_test, facebook_params(:fb_sig_in_canvas=>0,:canvas=>true)
480
+ assert_match(/apps.facebook.com/, @response.body)
481
+ end
482
+
483
+ def test_includes_relative_url_root_when_linked_to_canvas
484
+ get :link_test,facebook_params(:fb_sig_in_canvas=>0,:canvas=>true)
485
+ assert_match(/root/,@response.body)
486
+ end
487
+
488
+ def test_url_for_links_to_callback_if_canvas_is_false_and_in_canvas
489
+ get :link_test,facebook_params(:fb_sig_in_canvas=>0,:canvas=>false)
490
+ assert_match(/test.host/,@response.body)
491
+ end
492
+
493
+ def test_url_for_doesnt_include_url_root_when_not_linked_to_canvas
494
+ get :link_test,facebook_params(:fb_sig_in_canvas=>0,:canvas=>false)
495
+ assert !@response.body.match(/root/)
496
+ end
497
+
498
+ def test_url_for_links_to_canvas_if_fb_sig_is_ajax_is_true_and_fb_sig_in_canvas_is_not_true
499
+ # Normal fb ajax calls have no fb_sig_canvas_param but we must explicitly set it to 0 because it is set to 1 in default_facebook_parameters in test helpers
500
+ get :link_test, facebook_params(:fb_sig_is_ajax=>1, :fb_sig_in_canvas=>0)
501
+ assert_match(/apps.facebook.com/, @response.body)
502
+ end
503
+
504
+ def test_default_url_omits_fb_params
505
+ get :index,facebook_params(:fb_sig_friends=>"overwriteme",:get_param=>"yes")
506
+ assert_equal "http://apps.facebook.com/root/require_auth?get_param=yes", @controller.send(:default_after_facebook_login_url)
507
+ end
508
+
509
+ def test_url_for_links_to_canvas_if_canvas_is_not_set
510
+ get :link_test,facebook_params
511
+ assert_match(/apps.facebook.com/,@response.body)
512
+ end
513
+
514
+ def test_image_tag
515
+ get :image_test, facebook_params
516
+ assert_equal "<img alt=\"Image\" src=\"http://root.example.com/images/image.png\" />",@response.body
517
+ end
518
+
519
+ def test_wants_interface_is_available_and_detects_method
520
+ get :publisher_test, facebook_params(:method=>"publisher_getInterface")
521
+ assert_equal "interface",@response.body
522
+ end
523
+ def test_wants_interface_is_available_and_detects_not_interface
524
+ get :publisher_test, facebook_params(:method=>"publisher_getFeedStory")
525
+ assert_equal "not interface",@response.body
526
+ end
527
+
528
+ def test_publisher_test_error
529
+ get :publisher_test_error, facebook_params
530
+ assert_equal Facebooker.json_decode("{\"errorCode\": 1, \"errorTitle\": \"Title\", \"errorMessage\": \"Body\"}"), Facebooker.json_decode(@response.body)
531
+ end
532
+
533
+ def test_publisher_test_interface
534
+ get :publisher_test_interface, facebook_params
535
+ assert_equal Facebooker.json_decode("{\"method\": \"publisher_getInterface\", \"content\": {\"fbml\": \"This is a test\", \"publishEnabled\": false, \"commentEnabled\": true}}"), Facebooker.json_decode(@response.body)
536
+ end
537
+
538
+ def test_publisher_test_reponse
539
+ get :publisher_test_response, facebook_params
540
+ assert_equal Facebooker.json_decode("{\"method\": \"publisher_getFeedStory\", \"content\": {\"feed\": {\"template_data\": {\"params\": true}, \"template_id\": 1234}}}"), Facebooker.json_decode(@response.body)
541
+
542
+ end
543
+
544
+ private
545
+
546
+ def expired_cookie_hash_for_auth
547
+ {"_ss" => "not_used", "_session_key"=> "whatever", "_user"=>"77777", "_expires"=>"#{1.day.ago.to_i}"}
548
+ end
549
+
550
+ def cookie_hash_for_auth
551
+ {"_ss" => "not_used", "_session_key"=> "whatever", "_user"=>"77777", "_expires"=>"#{1.day.from_now.to_i}"}
552
+ end
553
+
554
+ end
555
+
556
+
557
+ class RailsSignatureTest < Test::Unit::TestCase
558
+ def setup
559
+ Facebooker.apply_configuration({
560
+ 'api_key' => '1234567',
561
+ 'canvas_page_name' => 'root',
562
+ 'secret_key' => '7654321' })
563
+ @controller = ControllerWhichRequiresFacebookAuthentication.new
564
+ @request = ActionController::TestRequest.new
565
+ @response = ActionController::TestResponse.new
566
+
567
+ end
568
+
569
+ if Rails.version < '2.3'
570
+
571
+ def test_should_raise_on_bad_sig
572
+ begin
573
+ get :fb_params_test, facebook_params.merge('fb_sig' => 'incorrect')
574
+ fail "No IncorrectSignature raised"
575
+ rescue Facebooker::Session::IncorrectSignature=>e
576
+ end
577
+ end
578
+
579
+ def test_valid_signature
580
+ @controller.expects(:earliest_valid_session).returns(Time.at(1186588275.5988)-1)
581
+ get :fb_params_test, facebook_params
582
+ end
583
+
584
+ end
585
+
586
+ def test_should_raise_too_old_for_replayed_session
587
+ begin
588
+ get :fb_params_test, facebook_params('fb_sig_time' => Time.now.to_i - 49.hours)
589
+ fail "No SignatureTooOld raised"
590
+ rescue Facebooker::Session::SignatureTooOld=>e
591
+ end
592
+ end
593
+
594
+ end
595
+ class RailsHelperTest < Test::Unit::TestCase
596
+ class HelperClass
597
+ include ActionView::Helpers::TextHelper
598
+ include ActionView::Helpers::CaptureHelper
599
+ include ActionView::Helpers::TagHelper
600
+ include ActionView::Helpers::AssetTagHelper
601
+ include ActionView::Helpers::JavaScriptHelper
602
+ include Facebooker::Rails::Helpers
603
+ attr_accessor :flash, :output_buffer
604
+ def initialize
605
+ @flash={}
606
+ @template = self
607
+ @content_for_test_param="Test Param"
608
+ @output_buffer = ""
609
+ end
610
+ #used for stubbing out the form builder
611
+ def url_for(arg)
612
+ arg
613
+ end
614
+ def request
615
+ ActionController::TestRequest.new
616
+ end
617
+ def fields_for(*args)
618
+ ""
619
+ end
620
+
621
+ end
622
+
623
+ # used for capturing the contents of some of the helper tests
624
+ # this duplicates the rails template system
625
+ attr_accessor :_erbout
626
+
627
+ def setup
628
+ Facebooker.apply_configuration({
629
+ 'api_key' => '1234567',
630
+ 'canvas_page_name' => 'facebook',
631
+ 'secret_key' => '7654321' })
632
+ @_erbout = ""
633
+ @h = HelperClass.new
634
+ #use an asset path where the canvas path equals the hostname to make sure we handle that case right
635
+ ActionController::Base.asset_host='http://facebook.host.com'
636
+ end
637
+
638
+ def test_fb_profile_pic
639
+ assert_equal "<fb:profile-pic uid=\"1234\"></fb:profile-pic>", @h.fb_profile_pic("1234")
640
+ end
641
+
642
+ def test_fb_profile_pic_with_valid_size
643
+ assert_equal "<fb:profile-pic size=\"small\" uid=\"1234\"></fb:profile-pic>", @h.fb_profile_pic("1234", :size => :small)
644
+ end
645
+
646
+ def test_fb_profile_pic_with_width_and_height
647
+ assert_equal "<fb:profile-pic height=\"200\" uid=\"1234\" width=\"100\"></fb:profile-pic>", @h.fb_profile_pic("1234", :width => 100, :height => 200)
648
+ end
649
+
650
+ def test_fb_profile_pic_with_invalid_size
651
+ assert_raises(ArgumentError) {@h.fb_profile_pic("1234", :size => :mediumm)}
652
+ end
653
+
654
+ def test_fb_photo
655
+ assert_equal "<fb:photo pid=\"1234\"></fb:photo>",@h.fb_photo("1234")
656
+ end
657
+
658
+ def test_fb_photo_with_object_responding_to_photo_id
659
+ photo = flexmock("photo", :photo_id => "5678")
660
+ assert_equal "<fb:photo pid=\"5678\"></fb:photo>", @h.fb_photo(photo)
661
+ end
662
+
663
+ def test_fb_photo_with_invalid_size
664
+ assert_raises(ArgumentError) {@h.fb_photo("1234", :size => :medium)}
665
+ end
666
+
667
+ def test_fb_photo_with_invalid_size_value
668
+ assert_raises(ArgumentError) {@h.fb_photo("1234", :size => :mediumm)}
669
+ end
670
+
671
+ def test_fb_photo_with_invalid_align_value
672
+ assert_raises(ArgumentError) {@h.fb_photo("1234", :align => :rightt)}
673
+ end
674
+
675
+ def test_fb_photo_with_valid_align_value
676
+ assert_equal "<fb:photo align=\"right\" pid=\"1234\"></fb:photo>",@h.fb_photo("1234", :align => :right)
677
+ end
678
+
679
+ def test_fb_photo_with_class
680
+ assert_equal "<fb:photo class=\"picky\" pid=\"1234\"></fb:photo>",@h.fb_photo("1234", :class => :picky)
681
+ end
682
+ def test_fb_photo_with_style
683
+ assert_equal "<fb:photo pid=\"1234\" style=\"some=css;put=here;\"></fb:photo>",@h.fb_photo("1234", :style => "some=css;put=here;")
684
+ end
685
+
686
+ def test_fb_prompt_permission_valid_no_callback
687
+ assert_equal "<fb:prompt-permission perms=\"email\">Can I email you?</fb:prompt-permission>",@h.fb_prompt_permission("email","Can I email you?")
688
+ end
689
+
690
+ def test_fb_prompt_permission_valid_with_callback
691
+ assert_equal "<fb:prompt-permission next_fbjs=\"do_stuff()\" perms=\"email\">a message</fb:prompt-permission>",@h.fb_prompt_permission("email","a message","do_stuff()")
692
+ end
693
+
694
+ def test_fb_prompt_permission_invalid_option
695
+ assert_raises(ArgumentError) {@h.fb_prompt_permission("invliad", "a message")}
696
+
697
+ end
698
+
699
+ def test_fb_prompt_permissions_valid_no_callback
700
+ assert_equal "<fb:prompt-permission perms=\"publish_stream,read_stream\">Can I read and write your streams?</fb:prompt-permission>",
701
+ @h.fb_prompt_permissions(['publish_stream', 'read_stream'],"Can I read and write your streams?")
702
+ end
703
+
704
+ def test_fb_prompt_permissions_valid_with_callback
705
+ assert_equal "<fb:prompt-permission next_fbjs=\"do_stuff()\" perms=\"publish_stream,read_stream\">Can I read and write your streams?</fb:prompt-permission>",
706
+ @h.fb_prompt_permissions(['publish_stream', 'read_stream'],"Can I read and write your streams?", "do_stuff()")
707
+ end
708
+
709
+ def test_fb_prompt_permissions_invalid_option
710
+ assert_raises(ArgumentError) {@h.fb_prompt_permissions(["invliad", "read_stream"], "a message")}
711
+
712
+ end
713
+
714
+
715
+ def test_fb_add_profile_section
716
+ assert_equal "<fb:add-section-button section=\"profile\" />",@h.fb_add_profile_section
717
+ end
718
+
719
+ def test_fb_add_info_section
720
+ assert_equal "<fb:add-section-button section=\"info\" />",@h.fb_add_info_section
721
+ end
722
+
723
+ def test_fb_application_name
724
+ assert_equal "<fb:application-name />", @h.fb_application_name
725
+ end
726
+
727
+ def test_fb_application_name_with_linked_false
728
+ assert_equal '<fb:application-name linked="false" />', @h.fb_application_name( :linked => false )
729
+ end
730
+
731
+ def test_fb_name_with_invalid_key_size
732
+ assert_raises(ArgumentError) {@h.fb_name(1234, :sizee => false)}
733
+ end
734
+
735
+ def test_fb_name
736
+ assert_equal "<fb:name uid=\"1234\"></fb:name>",@h.fb_name("1234")
737
+ end
738
+
739
+ def test_fb_name_with_transformed_key
740
+ assert_equal "<fb:name uid=\"1234\" useyou=\"true\"></fb:name>", @h.fb_name(1234, :use_you => true)
741
+ end
742
+
743
+ def test_fb_name_with_user_responding_to_facebook_id
744
+ user = flexmock("user", :facebook_id => "5678")
745
+ assert_equal "<fb:name uid=\"5678\"></fb:name>", @h.fb_name(user)
746
+ end
747
+
748
+ def test_fb_name_with_invalid_key_linkd
749
+ assert_raises(ArgumentError) {@h.fb_name(1234, :linkd => false)}
750
+ end
751
+
752
+ def test_fb_tabs
753
+ assert_equal "<fb:tabs></fb:tabs>", @h.fb_tabs{}
754
+ end
755
+
756
+ def test_fb_tab_item
757
+ assert_equal "<fb:tab-item href=\"http://www.google.com\" title=\"Google\" />", @h.fb_tab_item("Google", "http://www.google.com")
758
+ end
759
+
760
+ def test_fb_tab_item_raises_exception_for_invalid_option
761
+ assert_raises(ArgumentError) {@h.fb_tab_item("Google", "http://www.google.com", :alignn => :right)}
762
+ end
763
+
764
+ def test_fb_tab_item_raises_exception_for_invalid_align_value
765
+ assert_raises(ArgumentError) {@h.fb_tab_item("Google", "http://www.google.com", :align => :rightt)}
766
+ end
767
+
768
+ def test_fb_req_choice
769
+ assert_equal "<fb:req-choice label=\"label\" url=\"url\" />", @h.fb_req_choice("label","url")
770
+ end
771
+
772
+ def test_fb_multi_friend_selector
773
+ assert_equal "<fb:multi-friend-selector actiontext=\"This is a message\" max=\"20\" showborder=\"false\" />", @h.fb_multi_friend_selector("This is a message")
774
+ end
775
+ def test_fb_multi_friend_selector_with_options
776
+ assert_equal "<fb:multi-friend-selector actiontext=\"This is a message\" exclude_ids=\"1,2\" max=\"20\" showborder=\"false\" />", @h.fb_multi_friend_selector("This is a message",:exclude_ids=>"1,2")
777
+ end
778
+
779
+ def test_fb_title
780
+ assert_equal "<fb:title>This is the canvas page window title</fb:title>", @h.fb_title("This is the canvas page window title")
781
+ end
782
+
783
+ def test_fb_google_analytics
784
+ assert_equal "<fb:google-analytics uacct=\"UA-9999999-99\" />", @h.fb_google_analytics("UA-9999999-99")
785
+ end
786
+
787
+ def test_fb_if_is_user_with_single_object
788
+ user = flexmock("user", :facebook_id => "5678")
789
+ assert_equal "<fb:if-is-user uid=\"5678\"></fb:if-is-user>", @h.fb_if_is_user(user){}
790
+ end
791
+
792
+ def test_fb_if_is_user_with_array
793
+ user1 = flexmock("user", :facebook_id => "5678")
794
+ user2 = flexmock("user", :facebook_id => "1234")
795
+ assert_equal "<fb:if-is-user uid=\"5678,1234\"></fb:if-is-user>", @h.fb_if_is_user([user1,user2]){}
796
+ end
797
+
798
+ def test_fb_else
799
+ assert_equal "<fb:else></fb:else>", @h.fb_else{}
800
+ end
801
+
802
+ def test_fb_about_url
803
+ ENV["FACEBOOK_API_KEY"]="1234"
804
+ assert_equal "http://www.facebook.com/apps/application.php?api_key=1234", @h.fb_about_url
805
+ end
806
+
807
+ def test_fb_ref_with_url
808
+ assert_equal "<fb:ref url=\"A URL\" />", @h.fb_ref(:url => "A URL")
809
+ end
810
+
811
+ def test_fb_ref_with_handle
812
+ assert_equal "<fb:ref handle=\"A Handle\" />", @h.fb_ref(:handle => "A Handle")
813
+ end
814
+
815
+ def test_fb_ref_with_invalid_attribute
816
+ assert_raises(ArgumentError) {@h.fb_ref(:handlee => "A HANLDE")}
817
+ end
818
+
819
+ def test_fb_ref_with_handle_and_url
820
+ assert_raises(ArgumentError) {@h.fb_ref(:url => "URL", :handle => "HANDLE")}
821
+ end
822
+
823
+ def test_facebook_messages_notice
824
+ @h.flash[:notice]="A message"
825
+ assert_equal "<fb:success message=\"A message\" />",@h.facebook_messages
826
+ end
827
+
828
+ def test_facebook_messages_error
829
+ @h.flash[:error]="An error"
830
+ assert_equal "<fb:error message=\"An error\" />",@h.facebook_messages
831
+ end
832
+ def test_fb_wall_post
833
+ assert_equal "<fb:wallpost uid=\"1234\">A wall post</fb:wallpost>",@h.fb_wall_post("1234","A wall post")
834
+ end
835
+
836
+ def test_fb_pronoun
837
+ assert_equal "<fb:pronoun uid=\"1234\"></fb:pronoun>", @h.fb_pronoun(1234)
838
+ end
839
+
840
+ def test_fb_pronoun_with_transformed_key
841
+ assert_equal "<fb:pronoun uid=\"1234\" usethey=\"true\"></fb:pronoun>", @h.fb_pronoun(1234, :use_they => true)
842
+ end
843
+
844
+ def test_fb_pronoun_with_user_responding_to_facebook_id
845
+ user = flexmock("user", :facebook_id => "5678")
846
+ assert_equal "<fb:pronoun uid=\"5678\"></fb:pronoun>", @h.fb_pronoun(user)
847
+ end
848
+
849
+ def test_fb_pronoun_with_invalid_key
850
+ assert_raises(ArgumentError) {@h.fb_pronoun(1234, :posessive => true)}
851
+ end
852
+
853
+ def test_fb_wall
854
+ @h.expects(:capture).returns("wall content")
855
+ @h.fb_wall do
856
+ end
857
+ assert_equal "<fb:wall>wall content</fb:wall>",@h.output_buffer
858
+ end
859
+
860
+ def test_fb_multi_friend_request
861
+ @h.expects(:capture).returns("body")
862
+ @h.expects(:protect_against_forgery?).returns(false)
863
+ @h.expects(:fb_multi_friend_selector).returns("friend selector")
864
+ assert_equal "<fb:request-form action=\"action\" content=\"body\" invite=\"true\" method=\"post\" type=\"invite\">friend selector</fb:request-form>",
865
+ (@h.fb_multi_friend_request("invite","ignored","action") {})
866
+ end
867
+
868
+ def test_fb_multi_friend_request_with_protection_against_forgery
869
+ @h.expects(:capture).returns("body")
870
+ @h.expects(:protect_against_forgery?).returns(true)
871
+ @h.expects(:request_forgery_protection_token).returns('forgery_token')
872
+ @h.expects(:form_authenticity_token).returns('form_token')
873
+
874
+ @h.expects(:fb_multi_friend_selector).returns("friend selector")
875
+ assert_equal "<fb:request-form action=\"action\" content=\"body\" invite=\"true\" method=\"post\" type=\"invite\">friend selector<input name=\"forgery_token\" type=\"hidden\" value=\"form_token\" /></fb:request-form>",
876
+ (@h.fb_multi_friend_request("invite","ignored","action") {})
877
+ end
878
+
879
+ def test_fbjs_library
880
+ @h.expects(:form_authenticity_token).returns('form_token')
881
+ assert_equal "<script>var _token = 'form_token';var _hostname = 'http://facebook.host.com'</script><script src=\"http://facebook.host.com/javascripts/facebooker.js\" type=\"text/javascript\"></script>", @h.fbjs_library
882
+ end
883
+
884
+ def test_fb_dialog
885
+ @h.expects(:capture).returns("dialog content")
886
+ @h.fb_dialog( "my_dialog", "1" ) do
887
+ end
888
+ assert_equal '<fb:dialog cancel_button="1" id="my_dialog">dialog content</fb:dialog>', @h.output_buffer
889
+ end
890
+ def test_fb_dialog_title
891
+ assert_equal '<fb:dialog-title>My Little Dialog</fb:dialog-title>', @h.fb_dialog_title("My Little Dialog")
892
+ end
893
+ def test_fb_dialog_content
894
+ @h.expects(:capture).returns("dialog content content")
895
+ @h.fb_dialog_content do
896
+ end
897
+ assert_equal '<fb:dialog-content>dialog content content</fb:dialog-content>', @h.output_buffer
898
+ end
899
+ def test_fb_dialog_button
900
+ assert_equal '<fb:dialog-button clickrewriteform="my_form" clickrewriteid="my_dialog" clickrewriteurl="http://www.some_url_here.com/dialog_return.php" type="submit" value="Yes" />',
901
+ @h.fb_dialog_button("submit", "Yes", {:clickrewriteurl => "http://www.some_url_here.com/dialog_return.php",
902
+ :clickrewriteid => "my_dialog", :clickrewriteform => "my_form" } )
903
+ end
904
+
905
+ def test_fb_request_form
906
+ @h.expects(:capture).returns("body")
907
+ @h.expects(:protect_against_forgery?).returns(false)
908
+ assert_equal "<fb:request-form action=\"action\" content=\"Test Param\" invite=\"true\" method=\"post\" type=\"invite\">body</fb:request-form>",
909
+ (@h.fb_request_form("invite","test_param","action") {})
910
+ end
911
+
912
+ def test_fb_request_form_with_protect_against_forgery
913
+ @h.expects(:capture).returns("body")
914
+ @h.expects(:protect_against_forgery?).returns(true)
915
+ @h.expects(:request_forgery_protection_token).returns('forgery_token')
916
+ @h.expects(:form_authenticity_token).returns('form_token')
917
+ assert_equal "<fb:request-form action=\"action\" content=\"Test Param\" invite=\"true\" method=\"post\" type=\"invite\">body<input name=\"forgery_token\" type=\"hidden\" value=\"form_token\" /></fb:request-form>",
918
+ (@h.fb_request_form("invite","test_param","action") {})
919
+ end
920
+
921
+ def test_fb_error_with_only_message
922
+ assert_equal "<fb:error message=\"Errors have occurred!!\" />", @h.fb_error("Errors have occurred!!")
923
+ end
924
+
925
+ def test_fb_error_with_message_and_text
926
+ assert_equal "<fb:error><fb:message>Errors have occurred!!</fb:message>Label can't be blank!!</fb:error>", @h.fb_error("Errors have occurred!!", "Label can't be blank!!")
927
+ end
928
+
929
+ def test_fb_explanation_with_only_message
930
+ assert_equal "<fb:explanation message=\"This is an explanation\" />", @h.fb_explanation("This is an explanation")
931
+ end
932
+
933
+ def test_fb_explanation_with_message_and_text
934
+ assert_equal "<fb:explanation><fb:message>This is an explanation</fb:message>You have a match</fb:explanation>", @h.fb_explanation("This is an explanation", "You have a match")
935
+ end
936
+
937
+ def test_fb_success_with_only_message
938
+ assert_equal "<fb:success message=\"Woot!!\" />", @h.fb_success("Woot!!")
939
+ end
940
+
941
+ def test_fb_success_with_message_and_text
942
+ assert_equal "<fb:success><fb:message>Woot!!</fb:message>You Rock!!</fb:success>", @h.fb_success("Woot!!", "You Rock!!")
943
+ end
944
+
945
+ def test_facebook_form_for
946
+ @h.expects(:protect_against_forgery?).returns(false)
947
+ form_body=@h.facebook_form_for(:model,:url=>"action") do
948
+ end
949
+ assert_equal "<fb:editor action=\"action\"></fb:editor>",form_body
950
+ end
951
+
952
+ def test_facebook_form_for_with_authenticity_token
953
+ @h.expects(:protect_against_forgery?).returns(true)
954
+ @h.expects(:request_forgery_protection_token).returns('forgery_token')
955
+ @h.expects(:form_authenticity_token).returns('form_token')
956
+ assert_equal "<fb:editor action=\"action\"><input name=\"forgery_token\" type=\"hidden\" value=\"form_token\" /></fb:editor>",
957
+ (@h.facebook_form_for(:model, :url => "action") {})
958
+ end
959
+
960
+ def test_fb_friend_selector
961
+ assert_equal("<fb:friend-selector />",@h.fb_friend_selector)
962
+ end
963
+
964
+ def test_fb_request_form_submit
965
+ assert_equal("<fb:request-form-submit />",@h.fb_request_form_submit)
966
+ end
967
+
968
+ def test_fb_request_form_submit_with_uid
969
+ assert_equal("<fb:request-form-submit uid=\"123456789\" />",@h.fb_request_form_submit({:uid => "123456789"}))
970
+ end
971
+
972
+ def test_fb_request_form_submit_with_label
973
+ assert_equal("<fb:request-form-submit label=\"Send Invite to Joel\" />",@h.fb_request_form_submit({:label => "Send Invite to Joel"}))
974
+ end
975
+
976
+ def test_fb_request_form_submit_with_uid_and_label
977
+ assert_equal("<fb:request-form-submit label=\"Send Invite to Joel\" uid=\"123456789\" />",@h.fb_request_form_submit({:uid =>"123456789", :label => "Send Invite to Joel"}))
978
+ end
979
+
980
+ def test_fb_action
981
+ assert_equal "<fb:action href=\"/growingpets/rub\">Rub my pet</fb:action>", @h.fb_action("Rub my pet", "/growingpets/rub")
982
+ end
983
+
984
+ def test_fb_help
985
+ assert_equal "<fb:help href=\"http://www.facebook.com/apps/application.php?id=6236036681\">Help</fb:help>", @h.fb_help("Help", "http://www.facebook.com/apps/application.php?id=6236036681")
986
+ end
987
+
988
+ def test_fb_create_button
989
+ assert_equal "<fb:create-button href=\"/growingpets/invite\">Invite Friends</fb:create-button>", @h.fb_create_button('Invite Friends', '/growingpets/invite')
990
+ end
991
+
992
+ def test_fb_comments_a_1
993
+ assert_equal "<fb:comments candelete=\"false\" canpost=\"true\" numposts=\"7\" showform=\"true\" xid=\"a:1\"></fb:comments>", @h.fb_comments("a:1",true,false,7,:showform=>true)
994
+ end
995
+
996
+ def test_fb_comments_xxx
997
+ assert_equal "<fb:comments candelete=\"false\" canpost=\"true\" numposts=\"4\" optional=\"false\" xid=\"xxx\"></fb:comments>", @h.fb_comments("xxx",true,false,4,:optional=>false)
998
+ end
999
+
1000
+ def test_fb_comments_with_title
1001
+ assert_equal "<fb:comments candelete=\"false\" canpost=\"true\" numposts=\"4\" optional=\"false\" xid=\"xxx\"><fb:title>TITLE</fb:title></fb:comments>", @h.fb_comments("xxx",true,false,4,:optional=>false, :title => "TITLE")
1002
+ end
1003
+ def test_fb_board
1004
+ assert_equal "<fb:board optional=\"false\" xid=\"xxx\"></fb:board>", @h.fb_board("xxx",:optional => false)
1005
+ end
1006
+ def test_fb_board_with_title
1007
+ assert_equal "<fb:board optional=\"false\" xid=\"xxx\"><fb:title>TITLE</fb:title></fb:board>", @h.fb_board("xxx",:optional=>false, :title => "TITLE")
1008
+ end
1009
+
1010
+ def test_fb_dashboard
1011
+ @h.expects(:capture).returns("dashboard content")
1012
+ @h.fb_dashboard do
1013
+ end
1014
+ assert_equal "<fb:dashboard>dashboard content</fb:dashboard>", @h.output_buffer
1015
+ end
1016
+ def test_fb_dashboard_non_block
1017
+ assert_equal "<fb:dashboard></fb:dashboard>", @h.fb_dashboard
1018
+ end
1019
+
1020
+ def test_fb_wide
1021
+ @h.expects(:capture).returns("wide profile content")
1022
+ @h.fb_wide do
1023
+ end
1024
+ assert_equal "<fb:wide>wide profile content</fb:wide>", @h.output_buffer
1025
+ end
1026
+
1027
+ def test_fb_narrow
1028
+ @h.expects(:capture).returns("narrow profile content")
1029
+ @h.fb_narrow do
1030
+ end
1031
+ assert_equal "<fb:narrow>narrow profile content</fb:narrow>", @h.output_buffer
1032
+ end
1033
+
1034
+ def test_fb_login_button
1035
+ assert_equal "<fb:login-button onlogin=\"somejs\"></fb:login-button>",@h.fb_login_button("somejs")
1036
+ end
1037
+
1038
+ def test_init_fb_connect_no_features
1039
+ assert ! @h.init_fb_connect.match(/XFBML/)
1040
+ end
1041
+
1042
+ def test_init_fb_connect_with_features
1043
+ assert @h.init_fb_connect("XFBML").match(/XFBML/)
1044
+ end
1045
+
1046
+ def test_init_fb_connect_receiver_path
1047
+ assert @h.init_fb_connect.match(/xd_receiver.html/)
1048
+ end
1049
+
1050
+ def test_init_fb_connect_receiver_path_ssl
1051
+ @h.instance_eval do
1052
+ def request
1053
+ ssl_request = ActionController::TestRequest.new
1054
+ ssl_request.stubs(:ssl?).returns(true)
1055
+ ssl_request
1056
+ end
1057
+ end
1058
+
1059
+ assert @h.init_fb_connect.match(/xd_receiver_ssl.html/)
1060
+ end
1061
+
1062
+ def test_init_fb_connect_with_features_and_body
1063
+ @h.expects(:capture).returns("Body Content")
1064
+
1065
+ __in_erb_template = true
1066
+
1067
+ @h.init_fb_connect("XFBML") do
1068
+ end
1069
+ assert @h.output_buffer =~ /Body Content/
1070
+ end
1071
+
1072
+ def test_init_fb_connect_no_options
1073
+ assert ! @h.init_fb_connect.match(/Element.observe\(window,'load',/)
1074
+ end
1075
+
1076
+ def test_init_fb_connect_with_options_js_jquery
1077
+ assert ! @h.init_fb_connect(:js => :jquery).match(/\$\(document\).ready\(/)
1078
+ end
1079
+
1080
+ def test_init_fb_connect_with_features_and_options_js_jquery
1081
+ assert @h.init_fb_connect("XFBML", :js => :jquery).match(/XFBML.*/)
1082
+ assert @h.init_fb_connect("XFBML", :js => :jquery).match(/\$\(document\).ready\(/)
1083
+ end
1084
+
1085
+ def test_init_fb_connect_without_options_app_settings
1086
+ assert @h.init_fb_connect().match(/, \{\}\)/)
1087
+ end
1088
+
1089
+ def test_init_fb_connect_with_options_app_settings
1090
+ assert @h.init_fb_connect(:app_settings => "{foo: bar}").match(/, \{foo: bar\}\)/)
1091
+ end
1092
+
1093
+
1094
+ def test_fb_login_and_redirect
1095
+ assert_equal @h.fb_login_and_redirect("/path"),"<fb:login-button onlogin=\"window.location.href = &quot;/path&quot;;\"></fb:login-button>"
1096
+ end
1097
+
1098
+ def test_fb_logout_link
1099
+ assert_equal @h.fb_logout_link("Logout","My URL"),"<a href=\"#\" onclick=\"FB.Connect.logoutAndRedirect(&quot;My URL&quot;);; return false;\">Logout</a>"
1100
+ end
1101
+
1102
+ def test_fb_user_action_with_literal_callback
1103
+ action = Facebooker::Rails::Publisher::UserAction.new
1104
+ assert_equal "FB.Connect.showFeedDialog(null, null, null, null, null, FB.RequireConnect.promptConnect, function() {alert('hi')}, \"prompt\", #{{"value" => "message"}.to_json});",
1105
+ @h.fb_user_action(action,"message","prompt","function() {alert('hi')}")
1106
+ end
1107
+
1108
+ def test_fb_user_action_with_nil_callback
1109
+ action = Facebooker::Rails::Publisher::UserAction.new
1110
+ assert_equal "FB.Connect.showFeedDialog(null, null, null, null, null, FB.RequireConnect.promptConnect, null, \"prompt\", #{{"value" => "message"}.to_json});",
1111
+ @h.fb_user_action(action,"message","prompt")
1112
+ end
1113
+
1114
+
1115
+ def test_fb_connect_javascript_tag
1116
+ silence_warnings do
1117
+ assert_equal "<script src=\"http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php\" type=\"text/javascript\"></script>",
1118
+ @h.fb_connect_javascript_tag
1119
+ end
1120
+ end
1121
+
1122
+ def test_fb_connect_javascript_tag_with_language_option
1123
+ silence_warnings do
1124
+ assert_equal "<script src=\"http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US\" type=\"text/javascript\"></script>",
1125
+ @h.fb_connect_javascript_tag(:lang => "en_US")
1126
+ end
1127
+ end
1128
+
1129
+ def test_fb_connect_javascript_tag_ssl
1130
+ @h.instance_eval do
1131
+ def request
1132
+ ssl_request = ActionController::TestRequest.new
1133
+ ssl_request.stubs(:ssl?).returns(true)
1134
+ ssl_request
1135
+ end
1136
+ end
1137
+
1138
+ silence_warnings do
1139
+ assert_equal "<script src=\"https://www.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php\" type=\"text/javascript\"></script>",
1140
+ @h.fb_connect_javascript_tag
1141
+ end
1142
+ end
1143
+
1144
+ def test_fb_connect_javascript_tag_ssl_with_language_option
1145
+ @h.instance_eval do
1146
+ def request
1147
+ ssl_request = ActionController::TestRequest.new
1148
+ ssl_request.stubs(:ssl?).returns(true)
1149
+ ssl_request
1150
+ end
1151
+ end
1152
+
1153
+ silence_warnings do
1154
+ assert_equal "<script src=\"https://www.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US\" type=\"text/javascript\"></script>",
1155
+ @h.fb_connect_javascript_tag(:lang => "en_US")
1156
+ end
1157
+ end
1158
+
1159
+ def test_fb_container
1160
+ @h.expects(:capture).returns("Inner Stuff")
1161
+ @h.fb_container(:condition=>"somejs") do
1162
+ end
1163
+ assert_equal "<fb:container condition=\"somejs\">Inner Stuff</fb:container>",@h.output_buffer
1164
+ end
1165
+
1166
+ def test_fb_eventlink
1167
+ assert_equal '<fb:eventlink eid="21150032416"></fb:eventlink>',@h.fb_eventlink("21150032416")
1168
+ end
1169
+
1170
+ def test_fb_grouplink
1171
+ assert_equal '<fb:grouplink gid="2541896821"></fb:grouplink>',@h.fb_grouplink("2541896821")
1172
+ end
1173
+
1174
+ def test_fb_serverfbml
1175
+ @h.expects(:capture).returns("Inner Stuff")
1176
+ @h.fb_serverfbml(:condition=>"somejs") do
1177
+ end
1178
+ assert_equal "<fb:serverfbml condition=\"somejs\">Inner Stuff</fb:serverfbml>",@h.output_buffer
1179
+ end
1180
+
1181
+ def test_fb_share_button
1182
+ assert_equal "<fb:share-button class=\"url\" href=\"http://www.elevatedrails.com\"></fb:share-button>",@h.fb_share_button("http://www.elevatedrails.com")
1183
+ end
1184
+
1185
+ def test_fb_unconnected_friends_count_without_condition
1186
+ assert_equal "<fb:unconnected-friends-count></fb:unconnected-friends-count>",@h.fb_unconnected_friends_count
1187
+ end
1188
+
1189
+ def test_fb_user_status
1190
+ user=flexmock("user", :facebook_id => "5678")
1191
+ assert_equal '<fb:user-status linked="false" uid="5678"></fb:user-status>',@h.fb_user_status(user,false)
1192
+ end
1193
+
1194
+ def test_fb_time
1195
+ time = Time.now
1196
+ assert_equal %Q{<fb:time preposition="true" t="#{time.to_i}" tz="America/New York" />}, @h.fb_time(time, :tz => 'America/New York', :preposition => true)
1197
+ end
1198
+
1199
+ def test_fb_time_defaults
1200
+ time = Time.now
1201
+ assert_equal %Q{<fb:time t="#{time.to_i}" />}, @h.fb_time(time)
1202
+ end
1203
+ end
1204
+ class TestModel
1205
+ attr_accessor :name,:facebook_id
1206
+ end
1207
+
1208
+ class RailsFacebookFormbuilderTest < Test::Unit::TestCase
1209
+ class TestTemplate
1210
+ include ActionView::Helpers::TextHelper
1211
+ include ActionView::Helpers::CaptureHelper
1212
+ include ActionView::Helpers::TagHelper
1213
+ include Facebooker::Rails::Helpers
1214
+ attr_accessor :output_buffer
1215
+ def initialize
1216
+ @output_buffer=""
1217
+ end
1218
+ end
1219
+ def setup
1220
+ @_erbout = ""
1221
+ @test_model = TestModel.new
1222
+ @test_model.name="Mike"
1223
+ @template = TestTemplate.new
1224
+ @proc = Proc.new {}
1225
+ @form_builder = Facebooker::Rails::FacebookFormBuilder.new(:test_model,@test_model,@template,{},@proc)
1226
+ def @form_builder._erbout
1227
+ ""
1228
+ end
1229
+
1230
+ end
1231
+
1232
+ def test_text_field
1233
+ assert_equal "<fb:editor-text id=\"test_model_name\" label=\"Name\" name=\"test_model[name]\" value=\"Mike\"></fb:editor-text>",
1234
+ @form_builder.text_field(:name)
1235
+ end
1236
+ def test_text_area
1237
+ assert_equal "<fb:editor-textarea id=\"test_model_name\" label=\"Name\" name=\"test_model[name]\">Mike</fb:editor-textarea>",
1238
+ @form_builder.text_area(:name)
1239
+ end
1240
+
1241
+ def test_default_name_and_id
1242
+ assert_equal "<fb:editor-text id=\"different_id\" label=\"Name\" name=\"different_name\" value=\"Mike\"></fb:editor-text>",
1243
+ @form_builder.text_field(:name, {:name => 'different_name', :id => 'different_id'})
1244
+ end
1245
+
1246
+ def test_collection_typeahead
1247
+ flexmock(@form_builder) do |fb|
1248
+ fb.should_receive(:collection_typeahead_internal).with(:name,["ABC"],:size,:to_s,{})
1249
+ end
1250
+ @form_builder.collection_typeahead(:name,["ABC"],:size,:to_s)
1251
+ end
1252
+
1253
+ def test_collection_typeahead_internal
1254
+ assert_equal "<fb:typeahead-input id=\"test_model_name\" name=\"test_model[name]\" value=\"Mike\"><fb:typeahead-option value=\"3\">ABC</fb:typeahead-option></fb:typeahead-input>",
1255
+ @form_builder.collection_typeahead_internal(:name,["ABC"],:size,:to_s)
1256
+ end
1257
+
1258
+ def test_buttons
1259
+ @form_builder.expects(:create_button).with(:first).returns("first")
1260
+ @form_builder.expects(:create_button).with(:second).returns("second")
1261
+ @template.expects(:content_tag).with("fb:editor-buttonset","firstsecond")
1262
+ @form_builder.buttons(:first,:second)
1263
+ end
1264
+
1265
+ def test_create_button
1266
+ assert_equal "<fb:editor-button name=\"commit\" value=\"first\"></fb:editor-button>",@form_builder.create_button(:first)
1267
+ end
1268
+
1269
+ def test_custom
1270
+ @template.expects(:password_field).returns("password_field")
1271
+ assert_equal "<fb:editor-custom label=\"Name\">password_field</fb:editor-custom>",@form_builder.password_field(:name)
1272
+ end
1273
+
1274
+ def test_text
1275
+ assert_equal "<fb:editor-custom label=\"custom\">Mike</fb:editor-custom>",@form_builder.text("Mike",:label=>"custom")
1276
+ end
1277
+
1278
+ def test_multi_friend_input
1279
+ assert_equal "<fb:editor-custom label=\"Friends\"><fb:multi-friend-input></fb:multi-friend-input></fb:editor-custom>",@form_builder.multi_friend_input
1280
+ end
1281
+
1282
+
1283
+ end
1284
+
1285
+ class RailsPrettyErrorsTest < Test::Unit::TestCase
1286
+ class ControllerWhichFails < ActionController::Base
1287
+ def pass
1288
+ render :text=>''
1289
+ end
1290
+ def fail
1291
+ raise "I'm failing"
1292
+ end
1293
+ end
1294
+
1295
+ def setup
1296
+ Facebooker.apply_configuration('api_key'=>"1234", 'secret_key'=>"34278",'canvas_page_name'=>'mike','pretty_errors'=>true)
1297
+ @controller = ControllerWhichFails.new
1298
+ @request = ActionController::TestRequest.new
1299
+ @response = ActionController::TestResponse.new
1300
+ end
1301
+
1302
+ def test_pretty_errors_disabled_success
1303
+ post :pass, facebook_params
1304
+ assert_response 200
1305
+ end
1306
+
1307
+ def test_pretty_errors_disabled_error
1308
+ Facebooker.apply_configuration('api_key'=>"1234", 'secret_key'=>"34278",'canvas_page_name'=>'mike','pretty_errors'=>false)
1309
+ silence_warnings do
1310
+ post :fail, facebook_params
1311
+ end
1312
+ assert_response :error
1313
+ end
1314
+
1315
+ def test_pretty_errors_enabled_success
1316
+ post :pass, facebook_params
1317
+ assert_response 200
1318
+ end
1319
+ def test_pretty_errors_enabled_error
1320
+ silence_warnings do
1321
+ post :fail, facebook_params
1322
+ end
1323
+ assert_response 200
1324
+ end
1325
+ end
1326
+
1327
+ class RailsUrlHelperExtensionsTest < Test::Unit::TestCase
1328
+ class UrlHelperExtensionsClass
1329
+ include ActionView::Helpers::UrlHelper
1330
+ include ActionView::Helpers::TagHelper
1331
+ def initialize(controller)
1332
+ @controller = controller
1333
+ end
1334
+
1335
+ def protect_against_forgery?
1336
+ false
1337
+ end
1338
+
1339
+ def request_comes_from_facebook?
1340
+ @request_comes_from_facebook
1341
+ end
1342
+
1343
+ def request_comes_from_facebook=(val)
1344
+ @request_comes_from_facebook = val
1345
+ end
1346
+
1347
+ end
1348
+ class UrlHelperExtensionsController < NoisyController
1349
+ def index
1350
+ render :nothing => true
1351
+ end
1352
+ def do_it
1353
+ render :nothing => true
1354
+ end
1355
+ end
1356
+
1357
+ class FacebookRequest < ActionController::TestRequest
1358
+ end
1359
+
1360
+ def setup
1361
+ @controller = UrlHelperExtensionsController.new
1362
+ @request = FacebookRequest.new
1363
+ @response = ActionController::TestResponse.new
1364
+
1365
+ @u = UrlHelperExtensionsClass.new(@controller)
1366
+ @u.request_comes_from_facebook = true
1367
+
1368
+ @non_canvas_u = UrlHelperExtensionsClass.new(@controller)
1369
+ @non_canvas_u.request_comes_from_facebook = false
1370
+
1371
+ @label = "Testing"
1372
+ @url = "test.host"
1373
+ @prompt = "Are you sure?"
1374
+ @default_title = "Please Confirm"
1375
+ @title = "Confirm Request"
1376
+ @style = {:color => 'black', :background => 'white'}
1377
+ @verbose_style = "{background: 'white', color: 'black'}"
1378
+ @default_okay = "Okay"
1379
+ @default_cancel = "Cancel"
1380
+ @default_style = "" #"'width','200px'"
1381
+ end
1382
+
1383
+ def test_link_to
1384
+ assert_equal "<a href=\"#{@url}\">Testing</a>", @u.link_to(@label, @url)
1385
+ end
1386
+
1387
+ def test_link_to_with_popup
1388
+ assert_raises(ActionView::ActionViewError) {@u.link_to(@label,@url, :popup=>true)}
1389
+ end
1390
+
1391
+ def test_link_to_with_confirm
1392
+ assert_dom_equal( "<a href=\"#{@url}\" onclick=\"var dlg = new Dialog().showChoice(\'#{@default_title}\',\'#{@prompt}\',\'#{@default_okay}\',\'#{@default_cancel}\').setStyle(#{@default_style});"+
1393
+ "var a=this;dlg.onconfirm = function() { " +
1394
+ "document.setLocation(a.getHref()); };return false;\">#{@label}</a>",
1395
+ @u.link_to(@label, @url, :confirm => @prompt) )
1396
+ end
1397
+ def test_link_to_with_confirm_with_title
1398
+ assert_dom_equal( "<a href=\"#{@url}\" onclick=\"var dlg = new Dialog().showChoice(\'#{@title}\',\'#{@prompt}\',\'#{@default_okay}\',\'#{@default_cancel}\').setStyle(#{@default_style});"+
1399
+ "var a=this;dlg.onconfirm = function() { " +
1400
+ "document.setLocation(a.getHref()); };return false;\">#{@label}</a>",
1401
+ @u.link_to(@label, @url, :confirm => {:title=>@title,:content=>@prompt}) )
1402
+ end
1403
+ def test_link_to_with_confirm_with_title_and_style
1404
+ assert_dom_equal( "<a href=\"#{@url}\" onclick=\"var dlg = new Dialog().showChoice(\'#{@title}\',\'#{@prompt}\',\'#{@default_okay}\',\'#{@default_cancel}\').setStyle(#{@verbose_style});"+
1405
+ "var a=this;dlg.onconfirm = function() { " +
1406
+ "document.setLocation(a.getHref()); };return false;\">#{@label}</a>",
1407
+ @u.link_to(@label, @url, :confirm => {:title=>@title,:content=>@prompt}.merge!(@style)) )
1408
+ end
1409
+
1410
+ def test_link_to_with_method
1411
+ assert_dom_equal( "<a href=\"#{@url}\" onclick=\"var a=this;var f = document.createElement('form'); f.setStyle('display','none'); "+
1412
+ "a.getParentNode().appendChild(f); f.setMethod('POST'); f.setAction(a.getHref());" +
1413
+ "var m = document.createElement('input'); m.setType('hidden'); "+
1414
+ "m.setName('_method'); m.setValue('delete'); f.appendChild(m);"+
1415
+ "f.submit();return false;\">#{@label}</a>", @u.link_to(@label,@url, :method=>:delete))
1416
+ end
1417
+
1418
+ def test_link_to_with_confirm_and_method
1419
+ assert_dom_equal( "<a href=\"#{@url}\" onclick=\"var dlg = new Dialog().showChoice(\'#{@default_title}\',\'#{@prompt}\',\'#{@default_okay}\',\'#{@default_cancel}\').setStyle(#{@default_style});"+
1420
+ "var a=this;dlg.onconfirm = function() { " +
1421
+ "var f = document.createElement('form'); f.setStyle('display','none'); "+
1422
+ "a.getParentNode().appendChild(f); f.setMethod('POST'); f.setAction(a.getHref());" +
1423
+ "var m = document.createElement('input'); m.setType('hidden'); "+
1424
+ "m.setName('_method'); m.setValue('delete'); f.appendChild(m);"+
1425
+ "f.submit(); };return false;\">#{@label}</a>", @u.link_to(@label,@url, :confirm=>@prompt, :method=>:delete) )
1426
+ end
1427
+ def test_link_to_with_confirm_and_method_for_non_canvas_page
1428
+ assert_dom_equal( "<a href=\"#{@url}\" onclick=\"if (confirm(\'#{@prompt}\')) { var f = document.createElement('form'); f.style.display = 'none'; "+
1429
+ "this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var m = document.createElement('input'); "+
1430
+ "m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'delete'); "+
1431
+ "f.appendChild(m);f.submit(); };return false;\">#{@label}</a>",
1432
+ @non_canvas_u.link_to(@label,@url, :confirm=>@prompt, :method=>:delete) )
1433
+ end
1434
+
1435
+ def test_button_to
1436
+ assert_equal "<form method=\"post\" action=\"#{@url}\" class=\"button-to\"><div>" +
1437
+ "<input type=\"submit\" value=\"#{@label}\" /></div></form>", @u.button_to(@label,@url)
1438
+ end
1439
+
1440
+ def test_button_to_with_confirm
1441
+ assert_equal "<form method=\"post\" action=\"#{@url}\" class=\"button-to\"><div>" +
1442
+ "<input onclick=\"var dlg = new Dialog().showChoice(\'#{@default_title}\',\'#{@prompt}\',\'#{@default_okay}\',\'#{@default_cancel}\').setStyle(#{@default_style});"+
1443
+ "var a=this;dlg.onconfirm = function() { "+
1444
+ "a.getForm().submit(); };return false;\" type=\"submit\" value=\"#{@label}\" /></div></form>",
1445
+ @u.button_to(@label,@url, :confirm=>@prompt)
1446
+ end
1447
+ def test_button_to_with_confirm_for_non_canvas_page
1448
+ assert_equal "<form method=\"post\" action=\"#{@url}\" class=\"button-to\"><div>"+
1449
+ "<input onclick=\"return confirm(\'#{@prompt}\');\" type=\"submit\" value=\"#{@label}\" /></div></form>",
1450
+ @non_canvas_u.button_to(@label,@url, :confirm=>@prompt)
1451
+ end
1452
+
1453
+ def test_link_to_unless_with_true
1454
+ assert_equal @label, @u.link_to_unless(true,@label,@url)
1455
+ end
1456
+ def test_link_to_unless_with_false
1457
+ assert_equal @u.link_to(@label,@url), @u.link_to_unless(false,@label,@url)
1458
+ end
1459
+
1460
+ def test_link_to_if_with_true
1461
+ assert_equal @u.link_to(@label,@url), @u.link_to_if(true,@label,@url)
1462
+ end
1463
+ def test_link_to_if_with_false
1464
+ assert_equal @label, @u.link_to_if(false,@label,@url)
1465
+ end
1466
+
1467
+ end
1468
+
1469
+ class RailsRequestFormatTest < Test::Unit::TestCase
1470
+ class FacebookController < NoisyController
1471
+ def index
1472
+ respond_to do |format|
1473
+ format.html { render :text => 'html' }
1474
+ format.fbml { render :text => 'fbml' }
1475
+ format.fbjs { render :text => 'fbjs' }
1476
+ end
1477
+ end
1478
+ end
1479
+
1480
+ def setup
1481
+ Facebooker.apply_configuration({
1482
+ 'api_key' => '1234567',
1483
+ 'canvas_page_name' => 'facebook_app_name',
1484
+ 'secret_key' => '7654321' })
1485
+ @controller = FacebookController.new
1486
+ @request = ActionController::TestRequest.new
1487
+ @response = ActionController::TestResponse.new
1488
+ @controller.stubs(:verify_signature).returns(true)
1489
+ end
1490
+
1491
+ def test_responds_to_html_without_canvas
1492
+ get :index
1493
+ assert_equal 'html', @response.body
1494
+ end
1495
+
1496
+ def test_responds_to_fbml_in_canvas
1497
+ get :index, facebook_params(:fb_sig_in_canvas => '1')
1498
+ assert_equal 'fbml', @response.body
1499
+ end
1500
+
1501
+ def test_responds_to_fbjs_when_is_ajax
1502
+ get :index, facebook_params(:fb_sig_is_ajax => '1')
1503
+ assert_equal 'fbjs', @response.body
1504
+ end
1505
+
1506
+ def test_responds_to_html_when_iframe
1507
+ get :index, facebook_params(:fb_sig_in_iframe => '1')
1508
+ assert_equal 'html', @response.body
1509
+ end
1510
+
1511
+ end