simianarmy-facebooker 1.0.40

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