cwninja-facebooker 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. data/CHANGELOG.txt +0 -0
  2. data/COPYING +19 -0
  3. data/History.txt +16 -0
  4. data/Manifest.txt +114 -0
  5. data/README +46 -0
  6. data/README.txt +81 -0
  7. data/Rakefile +76 -0
  8. data/TODO.txt +10 -0
  9. data/generators/facebook/facebook_generator.rb +14 -0
  10. data/generators/facebook/templates/config/facebooker.yml +46 -0
  11. data/generators/facebook/templates/public/javascripts/facebooker.js +106 -0
  12. data/generators/facebook_controller/USAGE +33 -0
  13. data/generators/facebook_controller/facebook_controller_generator.rb +40 -0
  14. data/generators/facebook_controller/templates/controller.rb +7 -0
  15. data/generators/facebook_controller/templates/functional_test.rb +11 -0
  16. data/generators/facebook_controller/templates/helper.rb +2 -0
  17. data/generators/facebook_controller/templates/view.fbml.erb +2 -0
  18. data/generators/facebook_controller/templates/view.html.erb +2 -0
  19. data/generators/facebook_publisher/facebook_publisher_generator.rb +14 -0
  20. data/generators/facebook_publisher/templates/create_facebook_templates.rb +15 -0
  21. data/generators/facebook_publisher/templates/publisher.rb +3 -0
  22. data/generators/facebook_scaffold/USAGE +27 -0
  23. data/generators/facebook_scaffold/facebook_scaffold_generator.rb +118 -0
  24. data/generators/facebook_scaffold/templates/controller.rb +93 -0
  25. data/generators/facebook_scaffold/templates/facebook_style.css +2579 -0
  26. data/generators/facebook_scaffold/templates/functional_test.rb +89 -0
  27. data/generators/facebook_scaffold/templates/helper.rb +2 -0
  28. data/generators/facebook_scaffold/templates/layout.fbml.erb +6 -0
  29. data/generators/facebook_scaffold/templates/layout.html.erb +17 -0
  30. data/generators/facebook_scaffold/templates/style.css +74 -0
  31. data/generators/facebook_scaffold/templates/view_edit.fbml.erb +13 -0
  32. data/generators/facebook_scaffold/templates/view_edit.html.erb +18 -0
  33. data/generators/facebook_scaffold/templates/view_index.fbml.erb +24 -0
  34. data/generators/facebook_scaffold/templates/view_index.html.erb +24 -0
  35. data/generators/facebook_scaffold/templates/view_new.fbml.erb +12 -0
  36. data/generators/facebook_scaffold/templates/view_new.html.erb +17 -0
  37. data/generators/facebook_scaffold/templates/view_show.fbml.erb +10 -0
  38. data/generators/facebook_scaffold/templates/view_show.html.erb +10 -0
  39. data/generators/publisher/publisher_generator.rb +14 -0
  40. data/generators/xd_receiver/templates/xd_receiver.html +10 -0
  41. data/generators/xd_receiver/xd_receiver_generator.rb +9 -0
  42. data/init.rb +70 -0
  43. data/install.rb +12 -0
  44. data/lib/facebooker.rb +160 -0
  45. data/lib/facebooker/adapters/adapter_base.rb +87 -0
  46. data/lib/facebooker/adapters/bebo_adapter.rb +75 -0
  47. data/lib/facebooker/adapters/facebook_adapter.rb +48 -0
  48. data/lib/facebooker/admin.rb +28 -0
  49. data/lib/facebooker/batch_request.rb +44 -0
  50. data/lib/facebooker/data.rb +57 -0
  51. data/lib/facebooker/feed.rb +78 -0
  52. data/lib/facebooker/logging.rb +51 -0
  53. data/lib/facebooker/model.rb +123 -0
  54. data/lib/facebooker/models/affiliation.rb +10 -0
  55. data/lib/facebooker/models/album.rb +11 -0
  56. data/lib/facebooker/models/applicationproperties.rb +39 -0
  57. data/lib/facebooker/models/cookie.rb +10 -0
  58. data/lib/facebooker/models/education_info.rb +11 -0
  59. data/lib/facebooker/models/event.rb +26 -0
  60. data/lib/facebooker/models/friend_list.rb +14 -0
  61. data/lib/facebooker/models/group.rb +35 -0
  62. data/lib/facebooker/models/info_item.rb +10 -0
  63. data/lib/facebooker/models/info_section.rb +10 -0
  64. data/lib/facebooker/models/location.rb +8 -0
  65. data/lib/facebooker/models/notifications.rb +17 -0
  66. data/lib/facebooker/models/page.rb +27 -0
  67. data/lib/facebooker/models/photo.rb +10 -0
  68. data/lib/facebooker/models/tag.rb +12 -0
  69. data/lib/facebooker/models/user.rb +369 -0
  70. data/lib/facebooker/models/work_info.rb +9 -0
  71. data/lib/facebooker/parser.rb +547 -0
  72. data/lib/facebooker/rails/controller.rb +280 -0
  73. data/lib/facebooker/rails/facebook_asset_path.rb +18 -0
  74. data/lib/facebooker/rails/facebook_form_builder.rb +112 -0
  75. data/lib/facebooker/rails/facebook_pretty_errors.rb +14 -0
  76. data/lib/facebooker/rails/facebook_request_fix.rb +24 -0
  77. data/lib/facebooker/rails/facebook_session_handling.rb +69 -0
  78. data/lib/facebooker/rails/facebook_url_helper.rb +191 -0
  79. data/lib/facebooker/rails/facebook_url_rewriting.rb +39 -0
  80. data/lib/facebooker/rails/helpers.rb +642 -0
  81. data/lib/facebooker/rails/helpers/fb_connect.rb +34 -0
  82. data/lib/facebooker/rails/profile_publisher_extensions.rb +42 -0
  83. data/lib/facebooker/rails/publisher.rb +511 -0
  84. data/lib/facebooker/rails/routing.rb +49 -0
  85. data/lib/facebooker/rails/test_helpers.rb +88 -0
  86. data/lib/facebooker/rails/utilities.rb +22 -0
  87. data/lib/facebooker/server_cache.rb +24 -0
  88. data/lib/facebooker/service.rb +83 -0
  89. data/lib/facebooker/session.rb +564 -0
  90. data/lib/facebooker/version.rb +9 -0
  91. data/lib/net/http_multipart_post.rb +123 -0
  92. data/lib/tasks/facebooker.rake +18 -0
  93. data/lib/tasks/tunnel.rake +46 -0
  94. data/rails/init.rb +1 -0
  95. data/setup.rb +1585 -0
  96. data/templates/layout.erb +24 -0
  97. data/test/adapters_test.rb +98 -0
  98. data/test/batch_request_test.rb +82 -0
  99. data/test/event_test.rb +15 -0
  100. data/test/facebook_admin_test.rb +76 -0
  101. data/test/facebook_cache_test.rb +44 -0
  102. data/test/facebook_data_test.rb +86 -0
  103. data/test/facebooker_test.rb +855 -0
  104. data/test/fixtures/multipart_post_body_with_only_parameters.txt +33 -0
  105. data/test/fixtures/multipart_post_body_with_single_file.txt +38 -0
  106. data/test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt +38 -0
  107. data/test/http_multipart_post_test.rb +54 -0
  108. data/test/logging_test.rb +43 -0
  109. data/test/model_test.rb +91 -0
  110. data/test/publisher_test.rb +458 -0
  111. data/test/rails_integration_test.rb +1221 -0
  112. data/test/session_test.rb +613 -0
  113. data/test/test_helper.rb +60 -0
  114. data/test/user_test.rb +270 -0
  115. metadata +185 -0
@@ -0,0 +1,1221 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+ begin
3
+ require 'action_controller'
4
+ require 'action_controller/test_process'
5
+ require 'facebooker/rails/controller'
6
+ require 'facebooker/rails/helpers/fb_connect'
7
+ require 'facebooker/rails/helpers'
8
+ require 'facebooker/rails/facebook_form_builder'
9
+ require File.dirname(__FILE__)+'/../init'
10
+ require 'mocha'
11
+
12
+ ActionController::Routing::Routes.draw do |map|
13
+ map.connect '', :controller=>"facebook",:conditions=>{:canvas=>true}
14
+ map.connect '', :controller=>"plain_old_rails"
15
+ map.resources :comments, :controller=>"plain_old_rails"
16
+ map.connect 'require_auth/:action', :controller => "controller_which_requires_facebook_authentication"
17
+ map.connect 'require_install/:action', :controller => "controller_which_requires_application_installation"
18
+ map.connect ':controller/:action/:id', :controller => "plain_old_rails"
19
+ end
20
+
21
+ class NoisyController < ActionController::Base
22
+ include Facebooker::Rails::Controller
23
+ def rescue_action(e) raise e end
24
+ end
25
+ class ControllerWhichRequiresExtendedPermissions< NoisyController
26
+ ensure_authenticated_to_facebook
27
+ before_filter :ensure_has_status_update
28
+ before_filter :ensure_has_photo_upload
29
+ before_filter :ensure_has_create_listing
30
+ def index
31
+ render :text => 'score!'
32
+ end
33
+ end
34
+
35
+ class ControllerWhichRequiresFacebookAuthentication < NoisyController
36
+ ensure_authenticated_to_facebook
37
+ def index
38
+ render :text => 'score!'
39
+ end
40
+ def link_test
41
+ options = {}
42
+ options[:canvas] = true if params[:canvas] == true
43
+ options[:canvas] = false if params[:canvas] == false
44
+ render :text=>url_for(options)
45
+ end
46
+
47
+ def named_route_test
48
+ render :text=>comments_url()
49
+ end
50
+
51
+ def image_test
52
+ render :inline=>"<%=image_tag 'image.png'%>"
53
+ end
54
+
55
+ def fb_params_test
56
+ render :text=>facebook_params['user']
57
+ end
58
+
59
+ def publisher_test
60
+ if wants_interface?
61
+ render :text=>"interface"
62
+ else
63
+ render :text=>"not interface"
64
+ end
65
+ end
66
+
67
+ def publisher_test_interface
68
+ render_publisher_interface("This is a test",false,true)
69
+ end
70
+
71
+ def publisher_test_response
72
+ ua=Facebooker::Rails::Publisher::UserAction.new
73
+ ua.data = {:params=>true}
74
+ ua.template_name = "template_name"
75
+ ua.template_id = 1234
76
+ render_publisher_response(ua)
77
+ end
78
+
79
+ def publisher_test_error
80
+ render_publisher_error("Title","Body")
81
+ end
82
+
83
+ end
84
+ class ControllerWhichRequiresApplicationInstallation < NoisyController
85
+ ensure_application_is_installed_by_facebook_user
86
+ def index
87
+ render :text => 'installed!'
88
+ end
89
+ end
90
+ class FacebookController < ActionController::Base
91
+ def index
92
+ end
93
+ end
94
+
95
+ class PlainOldRailsController < ActionController::Base
96
+ def index
97
+ end
98
+ def link_test
99
+ options = {}
100
+ options[:canvas] = true if params[:canvas] == true
101
+ options[:canvas] = false if params[:canvas] == false
102
+ render :text => url_for(options)
103
+ end
104
+
105
+ def named_route_test
106
+ render :text=>comments_url()
107
+ end
108
+ def canvas_false_test
109
+ render :text=>comments_url(:canvas=>false)
110
+ end
111
+ def canvas_true_test
112
+ render :text=>comments_url(:canvas=>true)
113
+ end
114
+ end
115
+
116
+ class ControllerWhichFails < ActionController::Base
117
+ def pass
118
+ render :text=>''
119
+ end
120
+ def fail
121
+ raise "I'm failing"
122
+ end
123
+ end
124
+
125
+ # you can't use asset_recognize, because it can't pass parameters in to the requests
126
+ class UrlRecognitionTests < Test::Unit::TestCase
127
+ def test_detects_in_canvas
128
+ request = ActionController::TestRequest.new({"fb_sig_in_canvas"=>"1"}, {}, nil)
129
+ request.path = "/"
130
+ ActionController::Routing::Routes.recognize(request)
131
+ assert_equal({"controller"=>"facebook","action"=>"index"},request.path_parameters)
132
+ end
133
+
134
+ def test_routes_when_not_in_canvas
135
+ request = ActionController::TestRequest.new({}, {}, nil)
136
+ request.path = "/"
137
+ ActionController::Routing::Routes.recognize(request)
138
+ assert_equal({"controller"=>"plain_old_rails","action"=>"index"},request.path_parameters)
139
+ end
140
+ end
141
+
142
+ class RailsIntegrationTestForNonFacebookControllers < Test::Unit::TestCase
143
+ def setup
144
+ ENV['FACEBOOK_CANVAS_PATH'] ='facebook_app_name'
145
+ ENV['FACEBOOK_API_KEY'] = '1234567'
146
+ ENV['FACEBOOK_SECRET_KEY'] = '7654321'
147
+ @controller = PlainOldRailsController.new
148
+ @request = ActionController::TestRequest.new
149
+ @response = ActionController::TestResponse.new
150
+ end
151
+
152
+ def test_url_for_links_to_callback_if_canvas_is_false_and_in_canvas
153
+ get :link_test, example_rails_params
154
+ assert_match /test.host/,@response.body
155
+ end
156
+
157
+ def test_named_route_doesnt_include_canvas_path_when_not_in_canvas
158
+ get :named_route_test, example_rails_params
159
+ assert_equal "http://test.host/comments",@response.body
160
+ end
161
+ def test_named_route_includes_canvas_path_when_in_canvas
162
+ get :named_route_test, example_rails_params_including_fb
163
+ assert_equal "http://apps.facebook.com/facebook_app_name/comments",@response.body
164
+ end
165
+
166
+ def test_named_route_doesnt_include_canvas_path_when_in_canvas_with_canvas_equals_false
167
+ get :canvas_false_test, example_rails_params_including_fb
168
+ assert_equal "http://test.host/comments",@response.body
169
+ end
170
+ def test_named_route_does_include_canvas_path_when_not_in_canvas_with_canvas_equals_true
171
+ get :canvas_true_test, example_rails_params
172
+ assert_equal "http://apps.facebook.com/facebook_app_name/comments",@response.body
173
+ end
174
+
175
+ private
176
+ def example_rails_params
177
+ { "action"=>"index", "controller"=>"plain_old_rails_controller" }
178
+ end
179
+ def example_rails_params_including_fb(options={})
180
+ {"fb_sig_time"=>"1186588275.5988", "fb_sig"=>"8d9e9dd2cb0742a5a2bfe35563134585", "action"=>"index", "fb_sig_in_canvas"=>"1", "fb_sig_session_key"=>"c452b5d5d60cbd0a0da82021-744961110", "controller"=>"controller_which_requires_facebook_authentication", "fb_sig_expires"=>"0", "fb_sig_friends"=>"417358,702720,1001170,1530839,3300204,3501584,6217936,9627766,9700907,22701786,33902768,38914148,67400422,135301144,157200364,500103523,500104930,500870819,502149612,502664898,502694695,502852293,502985816,503254091,504510130,504611551,505421674,509229747,511075237,512548373,512830487,517893818,517961878,518890403,523589362,523826914,525812984,531555098,535310228,539339781,541137089,549405288,552706617,564393355,564481279,567640762,568091401,570201702,571469972,573863097,574415114,575543081,578129427,578520568,582262836,582561201,586550659,591631962,592318318,596269347,596663221,597405464,599764847,602995438,606661367,609761260,610544224,620049417,626087078,628803637,632686250,641422291,646763898,649678032,649925863,653288975,654395451,659079771,661794253,665861872,668960554,672481514,675399151,678427115,685772348,686821151,687686894,688506532,689275123,695551670,710631572,710766439,712406081,715741469,718976395,719246649,722747311,725327717,725683968,725831016,727580320,734151780,734595181,737944528,748881410,752244947,763868412,768578853,776596978,789728437,873695441", "fb_sig_added"=>"0", "fb_sig_api_key"=>"b6c9c857ac543ca806f4d3187cd05e09", "fb_sig_user"=>"744961110", "fb_sig_profile_update_time"=>"1180712453"}.merge(options)
181
+ end
182
+
183
+ end
184
+
185
+ class RailsIntegrationTestForExtendedPermissions < Test::Unit::TestCase
186
+ def setup
187
+ ENV['FACEBOOK_API_KEY'] = '1234567'
188
+ ENV['FACEBOOK_SECRET_KEY'] = '7654321'
189
+ @controller = ControllerWhichRequiresExtendedPermissions.new
190
+ @request = ActionController::TestRequest.new
191
+ @response = ActionController::TestResponse.new
192
+ @controller.stubs(:verify_signature).returns(true)
193
+ end
194
+
195
+ def test_redirects_without_set_status
196
+ post :index,example_rails_params_including_fb
197
+ assert_response :success
198
+ assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=status_update\" />", @response.body)
199
+ end
200
+ def test_redirects_without_photo_upload
201
+ post :index,example_rails_params_including_fb.merge(:fb_sig_ext_perms=>"status_update")
202
+ assert_response :success
203
+ assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=photo_upload\" />", @response.body)
204
+ end
205
+ def test_redirects_without_create_listing
206
+ post :index,example_rails_params_including_fb.merge(:fb_sig_ext_perms=>"status_update,photo_upload")
207
+ assert_response :success
208
+ assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=create_listing\" />", @response.body)
209
+ end
210
+
211
+ def test_renders_with_permission
212
+ post :index,example_rails_params_including_fb.merge(:fb_sig_ext_perms=>"status_update,photo_upload,create_listing")
213
+ assert_response :success
214
+ assert_equal("score!", @response.body)
215
+
216
+ end
217
+ private
218
+ def example_rails_params_including_fb
219
+ {"fb_sig_time"=>"1186588275.5988", "fb_sig"=>"7371a6400329b229f800a5ecafe03b0a", "action"=>"index", "fb_sig_in_canvas"=>"1", "fb_sig_session_key"=>"c452b5d5d60cbd0a0da82021-744961110", "controller"=>"controller_which_requires_facebook_authentication", "fb_sig_expires"=>"0", "fb_sig_friends"=>"417358,702720,1001170,1530839,3300204,3501584,6217936,9627766,9700907,22701786,33902768,38914148,67400422,135301144,157200364,500103523,500104930,500870819,502149612,502664898,502694695,502852293,502985816,503254091,504510130,504611551,505421674,509229747,511075237,512548373,512830487,517893818,517961878,518890403,523589362,523826914,525812984,531555098,535310228,539339781,541137089,549405288,552706617,564393355,564481279,567640762,568091401,570201702,571469972,573863097,574415114,575543081,578129427,578520568,582262836,582561201,586550659,591631962,592318318,596269347,596663221,597405464,599764847,602995438,606661367,609761260,610544224,620049417,626087078,628803637,632686250,641422291,646763898,649678032,649925863,653288975,654395451,659079771,661794253,665861872,668960554,672481514,675399151,678427115,685772348,686821151,687686894,688506532,689275123,695551670,710631572,710766439,712406081,715741469,718976395,719246649,722747311,725327717,725683968,725831016,727580320,734151780,734595181,737944528,748881410,752244947,763868412,768578853,776596978,789728437,873695441", "fb_sig_added"=>"0", "fb_sig_api_key"=>"b6c9c857ac543ca806f4d3187cd05e09", "fb_sig_user"=>"744961110", "fb_sig_profile_update_time"=>"1180712453"}
220
+ end
221
+
222
+ end
223
+
224
+ class RailsIntegrationTestForApplicationInstallation < Test::Unit::TestCase
225
+ def setup
226
+ ENV['FACEBOOK_API_KEY'] = '1234567'
227
+ ENV['FACEBOOK_SECRET_KEY'] = '7654321'
228
+ @controller = ControllerWhichRequiresApplicationInstallation.new
229
+ @request = ActionController::TestRequest.new
230
+ @response = ActionController::TestResponse.new
231
+ @controller.stubs(:verify_signature).returns(true)
232
+ end
233
+
234
+ def test_if_controller_requires_application_installation_unauthenticated_requests_will_redirect_to_install_page
235
+ get :index
236
+ assert_response :redirect
237
+ assert_equal("http://www.facebook.com/install.php?api_key=1234567&v=1.0", @response.headers['Location'])
238
+ end
239
+
240
+ def test_if_controller_requires_application_installation_authenticated_requests_without_installation_will_redirect_to_install_page
241
+ get :index, example_rails_params_including_fb
242
+ assert_response :success
243
+ assert_equal("<fb:redirect url=\"http://www.facebook.com/install.php?api_key=1234567&v=1.0\" />", @response.body)
244
+ end
245
+
246
+ def test_if_controller_requires_application_installation_authenticated_requests_with_installation_will_render
247
+ get :index, example_rails_params_including_fb.merge('fb_sig_added' => "1")
248
+ assert_response :success
249
+ assert_equal("installed!", @response.body)
250
+ end
251
+
252
+ private
253
+ def example_rails_params_including_fb
254
+ {"fb_sig_time"=>"1186588275.5988", "fb_sig"=>"7371a6400329b229f800a5ecafe03b0a", "action"=>"index", "fb_sig_in_canvas"=>"1", "fb_sig_session_key"=>"c452b5d5d60cbd0a0da82021-744961110", "controller"=>"controller_which_requires_facebook_authentication", "fb_sig_expires"=>"0", "fb_sig_friends"=>"417358,702720,1001170,1530839,3300204,3501584,6217936,9627766,9700907,22701786,33902768,38914148,67400422,135301144,157200364,500103523,500104930,500870819,502149612,502664898,502694695,502852293,502985816,503254091,504510130,504611551,505421674,509229747,511075237,512548373,512830487,517893818,517961878,518890403,523589362,523826914,525812984,531555098,535310228,539339781,541137089,549405288,552706617,564393355,564481279,567640762,568091401,570201702,571469972,573863097,574415114,575543081,578129427,578520568,582262836,582561201,586550659,591631962,592318318,596269347,596663221,597405464,599764847,602995438,606661367,609761260,610544224,620049417,626087078,628803637,632686250,641422291,646763898,649678032,649925863,653288975,654395451,659079771,661794253,665861872,668960554,672481514,675399151,678427115,685772348,686821151,687686894,688506532,689275123,695551670,710631572,710766439,712406081,715741469,718976395,719246649,722747311,725327717,725683968,725831016,727580320,734151780,734595181,737944528,748881410,752244947,763868412,768578853,776596978,789728437,873695441", "fb_sig_added"=>"0", "fb_sig_api_key"=>"b6c9c857ac543ca806f4d3187cd05e09", "fb_sig_user"=>"744961110", "fb_sig_profile_update_time"=>"1180712453"}
255
+ end
256
+ end
257
+
258
+ class RailsIntegrationTest < Test::Unit::TestCase
259
+ def setup
260
+ ENV['FACEBOOK_CANVAS_PATH'] ='root'
261
+ ENV['FACEBOOK_API_KEY'] = '1234567'
262
+ ENV['FACEBOOK_SECRET_KEY'] = '7654321'
263
+ ActionController::Base.asset_host="http://root.example.com"
264
+ @controller = ControllerWhichRequiresFacebookAuthentication.new
265
+ @request = ActionController::TestRequest.new
266
+ @response = ActionController::TestResponse.new
267
+ @controller.stubs(:verify_signature).returns(true)
268
+
269
+ end
270
+
271
+ def test_named_route_includes_new_canvas_path_when_in_new_canvas
272
+ get :named_route_test, example_rails_params_including_fb.merge("fb_sig_in_new_facebook"=>"1")
273
+ assert_equal "http://apps.facebook.com/root/comments",@response.body
274
+ end
275
+
276
+ def test_if_controller_requires_facebook_authentication_unauthenticated_requests_will_redirect
277
+ get :index
278
+ assert_response :redirect
279
+ assert_equal("http://www.facebook.com/login.php?api_key=1234567&v=1.0", @response.headers['Location'])
280
+ end
281
+
282
+ def test_facebook_params_are_parsed_into_a_separate_hash
283
+ get :index, example_rails_params_including_fb
284
+ facebook_params = @controller.facebook_params
285
+ assert_equal([8, 8], [facebook_params['time'].day, facebook_params['time'].mon])
286
+ end
287
+
288
+ def test_facebook_params_convert_in_canvas_to_boolean
289
+ get :index, example_rails_params_including_fb
290
+ assert_equal(true, @controller.facebook_params['in_canvas'])
291
+ end
292
+
293
+ def test_facebook_params_convert_added_to_boolean_false
294
+ get :index, example_rails_params_including_fb
295
+ assert_equal(false, @controller.facebook_params['added'])
296
+ end
297
+
298
+ def test_facebook_params_convert_added_to_boolean_true
299
+ get :index, example_rails_params_including_fb.merge('fb_sig_added' => "1")
300
+ assert_equal(true, @controller.facebook_params['added'])
301
+ end
302
+
303
+ def test_facebook_params_convert_expirey_into_time_or_nil
304
+ get :index, example_rails_params_including_fb
305
+ assert_nil(@controller.facebook_params['expires'])
306
+ modified_params = example_rails_params_including_fb
307
+ modified_params['fb_sig_expires'] = modified_params['fb_sig_time']
308
+ setup # reset session and cached params
309
+ get :index, modified_params
310
+ assert_equal([8, 8], [@controller.facebook_params['time'].day, @controller.facebook_params['time'].mon])
311
+ end
312
+
313
+ def test_facebook_params_convert_friend_list_to_parsed_array_of_friend_ids
314
+ get :index, example_rails_params_including_fb
315
+ assert_kind_of(Array, @controller.facebook_params['friends'])
316
+ assert_equal(111, @controller.facebook_params['friends'].size)
317
+ end
318
+
319
+ def test_session_can_be_resecured_from_facebook_params
320
+ get :index, example_rails_params_including_fb
321
+ assert_equal(744961110, @controller.facebook_session.user.id)
322
+ end
323
+
324
+ def test_existing_secured_session_is_used_if_available
325
+ session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY'])
326
+ session.secure_with!("c452b5d5d60cbd0a0da82021-744961110", "1111111", Time.now.to_i + 60)
327
+ get :index, example_rails_params_including_fb, {:facebook_session => session}
328
+ assert_equal(1111111, @controller.facebook_session.user.id)
329
+ end
330
+
331
+ def test_facebook_params_used_if_existing_secured_session_key_does_not_match
332
+ session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY'])
333
+ session.secure_with!("a session key", "1111111", Time.now.to_i + 60)
334
+ get :index, example_rails_params_including_fb, {:facebook_session => session}
335
+ assert_equal(744961110, @controller.facebook_session.user.id)
336
+ end
337
+
338
+ def test_existing_secured_session_is_NOT_used_if_available_and_facebook_params_session_key_is_nil_and_in_canvas
339
+ session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY'])
340
+ session.secure_with!("a session key", "1111111", Time.now.to_i + 60)
341
+ get :index, example_rails_params_including_fb.merge("fb_sig_session_key" => ''), {:facebook_session => session}
342
+
343
+ assert_equal(744961110, @controller.facebook_session.user.id)
344
+ end
345
+
346
+ def test_existing_secured_session_IS_used_if_available_and_facebook_params_session_key_is_nil_and_NOT_in_canvas
347
+ @contoller = PlainOldRailsController.new
348
+ session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY'])
349
+ session.secure_with!("a session key", "1111111", Time.now.to_i + 60)
350
+ get :index,{}, {:facebook_session => session}
351
+
352
+ assert_equal(1111111, @controller.facebook_session.user.id)
353
+ end
354
+
355
+ def test_session_can_be_secured_with_auth_token
356
+ auth_token = 'ohaiauthtokenhere111'
357
+ modified_params = example_rails_params_including_fb
358
+ modified_params.delete('fb_sig_session_key')
359
+ modified_params['auth_token'] = auth_token
360
+ session_mock = flexmock(session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY']))
361
+ session_params = { 'session_key' => '123', 'uid' => '321' }
362
+ session_mock.should_receive(:post).with('facebook.auth.getSession', :auth_token => auth_token).once.and_return(session_params).ordered
363
+ flexmock(@controller).should_receive(:new_facebook_session).once.and_return(session).ordered
364
+ get :index, modified_params
365
+ end
366
+
367
+ def test_session_secured_with_auth_token_if_cookies_expired
368
+ auth_token = 'ohaiauthtokenhere111'
369
+ modified_params = example_rails_params_including_fb
370
+ modified_params.delete('fb_sig_session_key')
371
+ modified_params['auth_token'] = auth_token
372
+ session_mock = flexmock(session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY']))
373
+ session_params = { 'session_key' => '123', 'uid' => '321' }
374
+ session_mock.should_receive(:post).with('facebook.auth.getSession', :auth_token => auth_token).once.and_return(session_params).ordered
375
+ flexmock(@controller).should_receive(:new_facebook_session).once.and_return(session).ordered
376
+ expired_cookie_hash_for_auth.each {|k,v| @request.cookies[ENV['FACEBOOK_API_KEY']+k] = CGI::Cookie.new(ENV['FACEBOOK_API_KEY']+k,v)}
377
+ get :index, modified_params
378
+ assert_equal(321, @controller.facebook_session.user.id)
379
+ end
380
+
381
+ def test_session_can_be_secured_with_cookies
382
+ cookie_hash_for_auth.each {|k,v| @request.cookies[ENV['FACEBOOK_API_KEY']+k] = CGI::Cookie.new(ENV['FACEBOOK_API_KEY']+k,v)}
383
+ get :index, example_rails_params_for_fb_connect
384
+ assert_equal(77777, @controller.facebook_session.user.id)
385
+ end
386
+
387
+ def test_session_does_NOT_secure_with_expired_cookies
388
+ expired_cookie_hash_for_auth.each {|k,v| @request.cookies[ENV['FACEBOOK_API_KEY']+k] = CGI::Cookie.new(ENV['FACEBOOK_API_KEY']+k,v)}
389
+ get :index, example_rails_params_for_fb_connect
390
+ assert_nil(@controller.facebook_session)
391
+ end
392
+
393
+ def test_user_friends_can_be_populated_from_facebook_params_if_available
394
+ get :index, example_rails_params_including_fb
395
+ assert_not_nil(friends = @controller.facebook_session.user.friends)
396
+ assert_equal(111, friends.size)
397
+ end
398
+
399
+ def test_fbml_redirect_tag_handles_hash_parameters_correctly
400
+ get :index, example_rails_params_including_fb
401
+ assert_equal "<fb:redirect url=\"http://apps.facebook.com/root/require_auth\" />", @controller.send(:fbml_redirect_tag, :action => :index,:canvas=>true)
402
+ end
403
+
404
+ def test_redirect_to_renders_fbml_redirect_tag_if_request_is_for_a_facebook_canvas
405
+ get :index, example_rails_params_including_fb_for_user_not_logged_into_application
406
+ assert_response :success
407
+ assert_equal("<fb:redirect url=\"http://www.facebook.com/login.php?api_key=1234567&v=1.0\" />", @response.body)
408
+ end
409
+
410
+ def test_url_for_links_to_canvas_if_canvas_is_true_and_not_in_canvas
411
+ get :link_test,example_rails_params_including_fb.merge(:fb_sig_in_canvas=>0,:canvas=>true)
412
+ assert_match /apps.facebook.com/,@response.body
413
+ end
414
+
415
+ def test_includes_relative_url_root_when_linked_to_canvas
416
+ get :link_test,example_rails_params_including_fb.merge(:fb_sig_in_canvas=>0,:canvas=>true)
417
+ assert_match /root/,@response.body
418
+ end
419
+
420
+ def test_url_for_links_to_callback_if_canvas_is_false_and_in_canvas
421
+ get :link_test,example_rails_params_including_fb.merge(:fb_sig_in_canvas=>0,:canvas=>false)
422
+ assert_match /test.host/,@response.body
423
+ end
424
+
425
+ def test_url_for_doesnt_include_url_root_when_not_linked_to_canvas
426
+ get :link_test,example_rails_params_including_fb.merge(:fb_sig_in_canvas=>0,:canvas=>false)
427
+ assert !@response.body.match(/root/)
428
+ end
429
+
430
+ def test_url_for_links_to_canvas_if_canvas_is_not_set
431
+ get :link_test,example_rails_params_including_fb
432
+ assert_match /apps.facebook.com/,@response.body
433
+ end
434
+
435
+ def test_image_tag
436
+ get :image_test, example_rails_params_including_fb
437
+ assert_equal "<img alt=\"Image\" src=\"http://root.example.com/images/image.png\" />",@response.body
438
+ end
439
+
440
+ def test_wants_interface_is_available_and_detects_method
441
+ get :publisher_test, example_rails_params_including_fb.merge(:method=>"publisher_getInterface")
442
+ assert_equal "interface",@response.body
443
+ end
444
+ def test_wants_interface_is_available_and_detects_not_interface
445
+ get :publisher_test, example_rails_params_including_fb.merge(:method=>"publisher_getFeedStory")
446
+ assert_equal "not interface",@response.body
447
+ end
448
+
449
+ def test_publisher_test_error
450
+ get :publisher_test_error, example_rails_params_including_fb
451
+ assert_equal JSON.parse("{\"errorCode\": 1, \"errorTitle\": \"Title\", \"errorMessage\": \"Body\"}"), JSON.parse(@response.body)
452
+ end
453
+
454
+ def test_publisher_test_interface
455
+ get :publisher_test_interface, example_rails_params_including_fb
456
+ assert_equal JSON.parse("{\"method\": \"publisher_getInterface\", \"content\": {\"fbml\": \"This is a test\", \"publishEnabled\": false, \"commentEnabled\": true}}"), JSON.parse(@response.body)
457
+ end
458
+
459
+ def test_publisher_test_reponse
460
+ get :publisher_test_response, example_rails_params_including_fb
461
+ assert_equal JSON.parse("{\"method\": \"publisher_getFeedStory\", \"content\": {\"feed\": {\"template_data\": {\"params\": true}, \"template_id\": 1234}}}"), JSON.parse(@response.body)
462
+
463
+ end
464
+
465
+ private
466
+ def example_rails_params_for_fb_connect
467
+ {"action"=>"index", "controller"=>"controller_which_requires_facebook_authentication"}
468
+ end
469
+
470
+ def expired_cookie_hash_for_auth
471
+ {"_ss" => "not_used", "_session_key"=> "whatever", "_user"=>"77777", "_expires"=>"#{1.day.ago.to_i}"}
472
+ end
473
+
474
+ def cookie_hash_for_auth
475
+ {"_ss" => "not_used", "_session_key"=> "whatever", "_user"=>"77777", "_expires"=>"#{1.day.from_now.to_i}"}
476
+ end
477
+
478
+ def example_rails_params_including_fb_for_user_not_logged_into_application
479
+ {"fb_sig_time"=>"1186588275.5988", "fb_sig"=>"7371a6400329b229f800a5ecafe03b0a", "action"=>"index", "fb_sig_in_canvas"=>"1", "controller"=>"controller_which_requires_facebook_authentication", "fb_sig_added"=>"0", "fb_sig_api_key"=>"b6c9c857ac543ca806f4d3187cd05e09"}
480
+ end
481
+
482
+ def example_rails_params_including_fb
483
+ {"fb_sig_time"=>"1186588275.5988", "fb_sig"=>"7371a6400329b229f800a5ecafe03b0a", "action"=>"index", "fb_sig_in_canvas"=>"1", "fb_sig_session_key"=>"c452b5d5d60cbd0a0da82021-744961110", "controller"=>"controller_which_requires_facebook_authentication", "fb_sig_expires"=>"0", "fb_sig_friends"=>"417358,702720,1001170,1530839,3300204,3501584,6217936,9627766,9700907,22701786,33902768,38914148,67400422,135301144,157200364,500103523,500104930,500870819,502149612,502664898,502694695,502852293,502985816,503254091,504510130,504611551,505421674,509229747,511075237,512548373,512830487,517893818,517961878,518890403,523589362,523826914,525812984,531555098,535310228,539339781,541137089,549405288,552706617,564393355,564481279,567640762,568091401,570201702,571469972,573863097,574415114,575543081,578129427,578520568,582262836,582561201,586550659,591631962,592318318,596269347,596663221,597405464,599764847,602995438,606661367,609761260,610544224,620049417,626087078,628803637,632686250,641422291,646763898,649678032,649925863,653288975,654395451,659079771,661794253,665861872,668960554,672481514,675399151,678427115,685772348,686821151,687686894,688506532,689275123,695551670,710631572,710766439,712406081,715741469,718976395,719246649,722747311,725327717,725683968,725831016,727580320,734151780,734595181,737944528,748881410,752244947,763868412,768578853,776596978,789728437,873695441", "fb_sig_added"=>"0", "fb_sig_api_key"=>"b6c9c857ac543ca806f4d3187cd05e09", "fb_sig_user"=>"744961110", "fb_sig_profile_update_time"=>"1180712453"}
484
+ end
485
+ end
486
+
487
+
488
+ class RailsSignatureTest < Test::Unit::TestCase
489
+ def setup
490
+ ENV['FACEBOOKER_RELATIVE_URL_ROOT'] ='root'
491
+ ENV['FACEBOOK_API_KEY'] = '1234567'
492
+ ENV['FACEBOOK_SECRET_KEY'] = '7654321'
493
+ @controller = ControllerWhichRequiresFacebookAuthentication.new
494
+ @request = ActionController::TestRequest.new
495
+ @response = ActionController::TestResponse.new
496
+
497
+ end
498
+
499
+ def test_should_raise_too_old_for_replayed_session
500
+ begin
501
+ get :fb_params_test,example_rails_params_including_fb
502
+ fail "No SignatureTooOld raised"
503
+ rescue Facebooker::Session::SignatureTooOld=>e
504
+ end
505
+ end
506
+
507
+ def test_should_raise_on_bad_sig
508
+ begin
509
+ get :fb_params_test,example_rails_params_including_fb("fb_sig"=>'incorrect')
510
+ fail "No IncorrectSignature raised"
511
+ rescue Facebooker::Session::IncorrectSignature=>e
512
+ end
513
+ end
514
+
515
+ def test_valid_signature
516
+ @controller.expects(:earliest_valid_session).returns(Time.at(1186588275.5988)-1)
517
+ get :fb_params_test,example_rails_params_including_fb
518
+
519
+ end
520
+
521
+ def example_rails_params_including_fb(options={})
522
+ {"fb_sig_time"=>"1186588275.5988", "fb_sig"=>"8d9e9dd2cb0742a5a2bfe35563134585", "action"=>"index", "fb_sig_in_canvas"=>"1", "fb_sig_session_key"=>"c452b5d5d60cbd0a0da82021-744961110", "controller"=>"controller_which_requires_facebook_authentication", "fb_sig_expires"=>"0", "fb_sig_friends"=>"417358,702720,1001170,1530839,3300204,3501584,6217936,9627766,9700907,22701786,33902768,38914148,67400422,135301144,157200364,500103523,500104930,500870819,502149612,502664898,502694695,502852293,502985816,503254091,504510130,504611551,505421674,509229747,511075237,512548373,512830487,517893818,517961878,518890403,523589362,523826914,525812984,531555098,535310228,539339781,541137089,549405288,552706617,564393355,564481279,567640762,568091401,570201702,571469972,573863097,574415114,575543081,578129427,578520568,582262836,582561201,586550659,591631962,592318318,596269347,596663221,597405464,599764847,602995438,606661367,609761260,610544224,620049417,626087078,628803637,632686250,641422291,646763898,649678032,649925863,653288975,654395451,659079771,661794253,665861872,668960554,672481514,675399151,678427115,685772348,686821151,687686894,688506532,689275123,695551670,710631572,710766439,712406081,715741469,718976395,719246649,722747311,725327717,725683968,725831016,727580320,734151780,734595181,737944528,748881410,752244947,763868412,768578853,776596978,789728437,873695441", "fb_sig_added"=>"0", "fb_sig_api_key"=>"b6c9c857ac543ca806f4d3187cd05e09", "fb_sig_user"=>"744961110", "fb_sig_profile_update_time"=>"1180712453"}.merge(options)
523
+ end
524
+
525
+ end
526
+ class RailsHelperTest < Test::Unit::TestCase
527
+ class HelperClass
528
+ include ActionView::Helpers::TextHelper
529
+ include ActionView::Helpers::CaptureHelper
530
+ include ActionView::Helpers::TagHelper
531
+ include ActionView::Helpers::AssetTagHelper
532
+ include ActionView::Helpers::JavaScriptHelper
533
+ include Facebooker::Rails::Helpers
534
+ attr_accessor :flash, :output_buffer
535
+ def initialize
536
+ @flash={}
537
+ @template = self
538
+ @content_for_test_param="Test Param"
539
+ @output_buffer = ""
540
+ end
541
+ #used for stubbing out the form builder
542
+ def url_for(arg)
543
+ arg
544
+ end
545
+ def fields_for(*args)
546
+ ""
547
+ end
548
+
549
+ end
550
+
551
+ # used for capturing the contents of some of the helper tests
552
+ # this duplicates the rails template system
553
+ attr_accessor :_erbout
554
+
555
+ def setup
556
+ ENV['FACEBOOK_CANVAS_PATH'] ='facebook'
557
+ ENV['FACEBOOK_API_KEY'] = '1234567'
558
+ ENV['FACEBOOK_SECRET_KEY'] = '7654321'
559
+
560
+ @_erbout = ""
561
+ @h = HelperClass.new
562
+ #use an asset path where the canvas path equals the hostname to make sure we handle that case right
563
+ ActionController::Base.asset_host='http://facebook.host.com'
564
+ end
565
+
566
+ def test_fb_profile_pic
567
+ assert_equal "<fb:profile-pic uid=\"1234\"></fb:profile-pic>", @h.fb_profile_pic("1234")
568
+ end
569
+
570
+ def test_fb_profile_pic_with_valid_size
571
+ assert_equal "<fb:profile-pic size=\"small\" uid=\"1234\"></fb:profile-pic>", @h.fb_profile_pic("1234", :size => :small)
572
+ end
573
+
574
+ def test_fb_profile_pic_with_invalid_size
575
+ assert_raises(ArgumentError) {@h.fb_profile_pic("1234", :size => :mediumm)}
576
+ end
577
+
578
+ def test_fb_photo
579
+ assert_equal "<fb:photo pid=\"1234\"></fb:photo>",@h.fb_photo("1234")
580
+ end
581
+
582
+ def test_fb_photo_with_object_responding_to_photo_id
583
+ photo = flexmock("photo", :photo_id => "5678")
584
+ assert_equal "<fb:photo pid=\"5678\"></fb:photo>", @h.fb_photo(photo)
585
+ end
586
+
587
+ def test_fb_photo_with_invalid_size
588
+ assert_raises(ArgumentError) {@h.fb_photo("1234", :size => :medium)}
589
+ end
590
+
591
+ def test_fb_photo_with_invalid_size_value
592
+ assert_raises(ArgumentError) {@h.fb_photo("1234", :size => :mediumm)}
593
+ end
594
+
595
+ def test_fb_photo_with_invalid_align_value
596
+ assert_raises(ArgumentError) {@h.fb_photo("1234", :align => :rightt)}
597
+ end
598
+
599
+ def test_fb_photo_with_valid_align_value
600
+ assert_equal "<fb:photo align=\"right\" pid=\"1234\"></fb:photo>",@h.fb_photo("1234", :align => :right)
601
+ end
602
+
603
+ def test_fb_photo_with_class
604
+ assert_equal "<fb:photo class=\"picky\" pid=\"1234\"></fb:photo>",@h.fb_photo("1234", :class => :picky)
605
+ end
606
+ def test_fb_photo_with_style
607
+ assert_equal "<fb:photo pid=\"1234\" style=\"some=css;put=here;\"></fb:photo>",@h.fb_photo("1234", :style => "some=css;put=here;")
608
+ end
609
+
610
+ def test_fb_prompt_permission_valid_no_callback
611
+ assert_equal "<fb:prompt-permission perms=\"email\">Can I email you?</fb:prompt-permission>",@h.fb_prompt_permission("email","Can I email you?")
612
+ end
613
+
614
+ def test_fb_prompt_permission_valid_with_callback
615
+ 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()")
616
+ end
617
+
618
+ def test_fb_prompt_permission_invalid_option
619
+ assert_raises(ArgumentError) {@h.fb_prompt_permission("invliad", "a message")}
620
+
621
+ end
622
+
623
+ def test_fb_add_profile_section
624
+ assert_equal "<fb:add-section-button section=\"profile\" />",@h.fb_add_profile_section
625
+ end
626
+
627
+ def test_fb_add_info_section
628
+ assert_equal "<fb:add-section-button section=\"info\" />",@h.fb_add_info_section
629
+ end
630
+
631
+ def test_fb_name_with_invalid_key
632
+ assert_raises(ArgumentError) {@h.fb_name(1234, :sizee => false)}
633
+ end
634
+
635
+ def test_fb_name
636
+ assert_equal "<fb:name uid=\"1234\"></fb:name>",@h.fb_name("1234")
637
+ end
638
+
639
+ def test_fb_name_with_transformed_key
640
+ assert_equal "<fb:name uid=\"1234\" useyou=\"true\"></fb:name>", @h.fb_name(1234, :use_you => true)
641
+ end
642
+
643
+ def test_fb_name_with_user_responding_to_facebook_id
644
+ user = flexmock("user", :facebook_id => "5678")
645
+ assert_equal "<fb:name uid=\"5678\"></fb:name>", @h.fb_name(user)
646
+ end
647
+
648
+ def test_fb_name_with_invalid_key
649
+ assert_raises(ArgumentError) {@h.fb_name(1234, :linkd => false)}
650
+ end
651
+
652
+ def test_fb_tabs
653
+ assert_equal "<fb:tabs></fb:tabs>", @h.fb_tabs{}
654
+ end
655
+
656
+ def test_fb_tab_item
657
+ assert_equal "<fb:tab-item href=\"http://www.google.com\" title=\"Google\" />", @h.fb_tab_item("Google", "http://www.google.com")
658
+ end
659
+
660
+ def test_fb_tab_item_raises_exception_for_invalid_option
661
+ assert_raises(ArgumentError) {@h.fb_tab_item("Google", "http://www.google.com", :alignn => :right)}
662
+ end
663
+
664
+ def test_fb_tab_item_raises_exception_for_invalid_align_value
665
+ assert_raises(ArgumentError) {@h.fb_tab_item("Google", "http://www.google.com", :align => :rightt)}
666
+ end
667
+
668
+ def test_fb_req_choice
669
+ assert_equal "<fb:req-choice label=\"label\" url=\"url\" />", @h.fb_req_choice("label","url")
670
+ end
671
+
672
+ def test_fb_multi_friend_selector
673
+ assert_equal "<fb:multi-friend-selector actiontext=\"This is a message\" max=\"20\" showborder=\"false\" />", @h.fb_multi_friend_selector("This is a message")
674
+ end
675
+ def test_fb_multi_friend_selector_with_options
676
+ 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")
677
+ end
678
+
679
+ def test_fb_comments
680
+ assert_equal "<fb:comments candelete=\"false\" canpost=\"true\" numposts=\"7\" showform=\"true\" xid=\"a:1\" />", @h.fb_comments("a:1",true,false,7,:showform=>true)
681
+ end
682
+
683
+ def test_fb_title
684
+ assert_equal "<fb:title>This is the canvas page window title</fb:title>", @h.fb_title("This is the canvas page window title")
685
+ end
686
+
687
+ def test_fb_google_analytics
688
+ assert_equal "<fb:google-analytics uacct=\"UA-9999999-99\" />", @h.fb_google_analytics("UA-9999999-99")
689
+ end
690
+
691
+ def test_fb_if_is_user_with_single_object
692
+ user = flexmock("user", :facebook_id => "5678")
693
+ assert_equal "<fb:if-is-user uid=\"5678\"></fb:if-is-user>", @h.fb_if_is_user(user){}
694
+ end
695
+
696
+ def test_fb_if_is_user_with_array
697
+ user1 = flexmock("user", :facebook_id => "5678")
698
+ user2 = flexmock("user", :facebook_id => "1234")
699
+ assert_equal "<fb:if-is-user uid=\"5678,1234\"></fb:if-is-user>", @h.fb_if_is_user([user1,user2]){}
700
+ end
701
+
702
+ def test_fb_else
703
+ assert_equal "<fb:else></fb:else>", @h.fb_else{}
704
+ end
705
+
706
+ def test_fb_about_url
707
+ ENV["FACEBOOK_API_KEY"]="1234"
708
+ assert_equal "http://www.facebook.com/apps/application.php?api_key=1234", @h.fb_about_url
709
+ end
710
+
711
+ def test_fb_ref_with_url
712
+ assert_equal "<fb:ref url=\"A URL\" />", @h.fb_ref(:url => "A URL")
713
+ end
714
+
715
+ def test_fb_ref_with_handle
716
+ assert_equal "<fb:ref handle=\"A Handle\" />", @h.fb_ref(:handle => "A Handle")
717
+ end
718
+
719
+ def test_fb_ref_with_invalid_attribute
720
+ assert_raises(ArgumentError) {@h.fb_ref(:handlee => "A HANLDE")}
721
+ end
722
+
723
+ def test_fb_ref_with_handle_and_url
724
+ assert_raises(ArgumentError) {@h.fb_ref(:url => "URL", :handle => "HANDLE")}
725
+ end
726
+
727
+ def test_facebook_messages_notice
728
+ @h.flash[:notice]="A message"
729
+ assert_equal "<fb:success message=\"A message\" />",@h.facebook_messages
730
+ end
731
+
732
+ def test_facebook_messages_error
733
+ @h.flash[:error]="An error"
734
+ assert_equal "<fb:error message=\"An error\" />",@h.facebook_messages
735
+ end
736
+ def test_fb_wall_post
737
+ assert_equal "<fb:wallpost uid=\"1234\">A wall post</fb:wallpost>",@h.fb_wall_post("1234","A wall post")
738
+ end
739
+
740
+ def test_fb_pronoun
741
+ assert_equal "<fb:pronoun uid=\"1234\"></fb:pronoun>", @h.fb_pronoun(1234)
742
+ end
743
+
744
+ def test_fb_pronoun_with_transformed_key
745
+ assert_equal "<fb:pronoun uid=\"1234\" usethey=\"true\"></fb:pronoun>", @h.fb_pronoun(1234, :use_they => true)
746
+ end
747
+
748
+ def test_fb_pronoun_with_user_responding_to_facebook_id
749
+ user = flexmock("user", :facebook_id => "5678")
750
+ assert_equal "<fb:pronoun uid=\"5678\"></fb:pronoun>", @h.fb_pronoun(user)
751
+ end
752
+
753
+ def test_fb_pronoun_with_invalid_key
754
+ assert_raises(ArgumentError) {@h.fb_pronoun(1234, :posessive => true)}
755
+ end
756
+
757
+ def test_fb_wall
758
+ @h.expects(:capture).returns("wall content")
759
+ @h.fb_wall do
760
+ end
761
+ assert_equal "<fb:wall>wall content</fb:wall>",@h.output_buffer
762
+ end
763
+
764
+ def test_fb_multi_friend_request
765
+ @h.expects(:capture).returns("body")
766
+ @h.expects(:protect_against_forgery?).returns(false)
767
+ @h.expects(:fb_multi_friend_selector).returns("friend selector")
768
+ assert_equal "<fb:request-form action=\"action\" content=\"body\" invite=\"true\" method=\"post\" type=\"invite\">friend selector</fb:request-form>",
769
+ (@h.fb_multi_friend_request("invite","ignored","action") {})
770
+ end
771
+
772
+ def test_fb_multi_friend_request_with_protection_against_forgery
773
+ @h.expects(:capture).returns("body")
774
+ @h.expects(:protect_against_forgery?).returns(true)
775
+ @h.expects(:request_forgery_protection_token).returns('forgery_token')
776
+ @h.expects(:form_authenticity_token).returns('form_token')
777
+
778
+ @h.expects(:fb_multi_friend_selector).returns("friend selector")
779
+ 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>",
780
+ (@h.fb_multi_friend_request("invite","ignored","action") {})
781
+ end
782
+
783
+ def test_fb_dialog
784
+ @h.expects(:capture).returns("dialog content")
785
+ @h.fb_dialog( "my_dialog", "1" ) do
786
+ end
787
+ assert_equal '<fb:dialog cancel_button="1" id="my_dialog">dialog content</fb:dialog>', @h.output_buffer
788
+ end
789
+ def test_fb_dialog_title
790
+ assert_equal '<fb:dialog-title>My Little Dialog</fb:dialog-title>', @h.fb_dialog_title("My Little Dialog")
791
+ end
792
+ def test_fb_dialog_content
793
+ @h.expects(:capture).returns("dialog content content")
794
+ @h.fb_dialog_content do
795
+ end
796
+ assert_equal '<fb:dialog-content>dialog content content</fb:dialog-content>', @h.output_buffer
797
+ end
798
+ def test_fb_dialog_button
799
+ 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" />',
800
+ @h.fb_dialog_button("submit", "Yes", {:clickrewriteurl => "http://www.some_url_here.com/dialog_return.php",
801
+ :clickrewriteid => "my_dialog", :clickrewriteform => "my_form" } )
802
+ end
803
+
804
+ def test_fb_request_form
805
+ @h.expects(:capture).returns("body")
806
+ @h.expects(:protect_against_forgery?).returns(false)
807
+ assert_equal "<fb:request-form action=\"action\" content=\"Test Param\" invite=\"true\" method=\"post\" type=\"invite\">body</fb:request-form>",
808
+ (@h.fb_request_form("invite","test_param","action") {})
809
+ end
810
+
811
+ def test_fb_request_form_with_protect_against_forgery
812
+ @h.expects(:capture).returns("body")
813
+ @h.expects(:protect_against_forgery?).returns(true)
814
+ @h.expects(:request_forgery_protection_token).returns('forgery_token')
815
+ @h.expects(:form_authenticity_token).returns('form_token')
816
+ 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>",
817
+ (@h.fb_request_form("invite","test_param","action") {})
818
+ end
819
+
820
+ def test_fb_error_with_only_message
821
+ assert_equal "<fb:error message=\"Errors have occurred!!\" />", @h.fb_error("Errors have occurred!!")
822
+ end
823
+
824
+ def test_fb_error_with_message_and_text
825
+ 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!!")
826
+ end
827
+
828
+ def test_fb_explanation_with_only_message
829
+ assert_equal "<fb:explanation message=\"This is an explanation\" />", @h.fb_explanation("This is an explanation")
830
+ end
831
+
832
+ def test_fb_explanation_with_message_and_text
833
+ 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")
834
+ end
835
+
836
+ def test_fb_success_with_only_message
837
+ assert_equal "<fb:success message=\"Woot!!\" />", @h.fb_success("Woot!!")
838
+ end
839
+
840
+ def test_fb_success_with_message_and_text
841
+ assert_equal "<fb:success><fb:message>Woot!!</fb:message>You Rock!!</fb:success>", @h.fb_success("Woot!!", "You Rock!!")
842
+ end
843
+
844
+ def test_facebook_form_for
845
+ @h.expects(:protect_against_forgery?).returns(false)
846
+ form_body=@h.facebook_form_for(:model,:url=>"action") do
847
+ end
848
+ assert_equal "<fb:editor action=\"action\"></fb:editor>",form_body
849
+ end
850
+
851
+ def test_facebook_form_for_with_authenticity_token
852
+ @h.expects(:protect_against_forgery?).returns(true)
853
+ @h.expects(:request_forgery_protection_token).returns('forgery_token')
854
+ @h.expects(:form_authenticity_token).returns('form_token')
855
+ assert_equal "<fb:editor action=\"action\"><input name=\"forgery_token\" type=\"hidden\" value=\"form_token\" /></fb:editor>",
856
+ (@h.facebook_form_for(:model, :url => "action") {})
857
+ end
858
+
859
+ def test_fb_friend_selector
860
+ assert_equal("<fb:friend-selector />",@h.fb_friend_selector)
861
+ end
862
+
863
+ def test_fb_request_form_submit
864
+ assert_equal("<fb:request-form-submit />",@h.fb_request_form_submit)
865
+ end
866
+
867
+ def test_fb_request_form_submit_with_uid
868
+ assert_equal("<fb:request-form-submit uid=\"123456789\" />",@h.fb_request_form_submit({:uid => "123456789"}))
869
+ end
870
+
871
+ def test_fb_request_form_submit_with_label
872
+ assert_equal("<fb:request-form-submit label=\"Send Invite to Joel\" />",@h.fb_request_form_submit({:label => "Send Invite to Joel"}))
873
+ end
874
+
875
+ def test_fb_request_form_submit_with_uid_and_label
876
+ 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"}))
877
+ end
878
+
879
+ def test_fb_action
880
+ assert_equal "<fb:action href=\"/growingpets/rub\">Rub my pet</fb:action>", @h.fb_action("Rub my pet", "/growingpets/rub")
881
+ end
882
+
883
+ def test_fb_help
884
+ 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")
885
+ end
886
+
887
+ def test_fb_create_button
888
+ assert_equal "<fb:create-button href=\"/growingpets/invite\">Invite Friends</fb:create-button>", @h.fb_create_button('Invite Friends', '/growingpets/invite')
889
+ end
890
+ def test_fb_comments
891
+ 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)
892
+ end
893
+ def test_fb_comments_with_title
894
+ 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")
895
+ end
896
+ def test_fb_board
897
+ assert_equal "<fb:board optional=\"false\" xid=\"xxx\" />", @h.fb_board("xxx",:optional => false)
898
+ end
899
+
900
+ def test_fb_dashboard
901
+ @h.expects(:capture).returns("dashboard content")
902
+ @h.fb_dashboard do
903
+ end
904
+ assert_equal "<fb:dashboard>dashboard content</fb:dashboard>", @h.output_buffer
905
+ end
906
+ def test_fb_dashboard_non_block
907
+ assert_equal "<fb:dashboard></fb:dashboard>", @h.fb_dashboard
908
+ end
909
+
910
+ def test_fb_wide
911
+ @h.expects(:capture).returns("wide profile content")
912
+ @h.fb_wide do
913
+ end
914
+ assert_equal "<fb:wide>wide profile content</fb:wide>", @h.output_buffer
915
+ end
916
+
917
+ def test_fb_narrow
918
+ @h.expects(:capture).returns("narrow profile content")
919
+ @h.fb_narrow do
920
+ end
921
+ assert_equal "<fb:narrow>narrow profile content</fb:narrow>", @h.output_buffer
922
+ end
923
+
924
+ def test_fb_login_button
925
+ assert_equal "<fb:login-button onlogin=\"somejs\"></fb:login-button>",@h.fb_login_button("somejs")
926
+ end
927
+
928
+ def test_init_fb_connect_no_features
929
+ assert ! @h.init_fb_connect.match(/XFBML/)
930
+ end
931
+
932
+ def test_init_fb_connect_with_features
933
+ assert @h.init_fb_connect("XFBML").match(/XFBML/)
934
+ end
935
+
936
+ def test_fb_connect_javascript_tag
937
+ assert_equal "<script src=\"http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php\" type=\"text/javascript\"></script>",
938
+ @h.fb_connect_javascript_tag
939
+ end
940
+
941
+ def test_fb_container
942
+ @h.expects(:capture).returns("Inner Stuff")
943
+ @h.fb_container(:condition=>"somejs") do
944
+ end
945
+ assert_equal "<fb:container condition=\"somejs\">Inner Stuff</fb:container>",@h.output_buffer
946
+ end
947
+
948
+ def test_fb_eventlink
949
+ assert_equal '<fb:eventlink eid="21150032416"></fb:eventlink>',@h.fb_eventlink("21150032416")
950
+ end
951
+
952
+ def test_fb_grouplink
953
+ assert_equal '<fb:grouplink gid="2541896821"></fb:grouplink>',@h.fb_grouplink("2541896821")
954
+ end
955
+
956
+ def test_fb_serverfbml
957
+ @h.expects(:capture).returns("Inner Stuff")
958
+ @h.fb_serverfbml(:condition=>"somejs") do
959
+ end
960
+ assert_equal "<fb:serverfbml condition=\"somejs\">Inner Stuff</fb:serverfbml>",@h.output_buffer
961
+ end
962
+
963
+ def test_fb_share_button
964
+ assert_equal "<fb:share-button class=\"url\" href=\"http://www.elevatedrails.com\"></fb:share-button>",@h.fb_share_button("http://www.elevatedrails.com")
965
+ end
966
+
967
+ def test_fb_unconnected_friends_count_without_condition
968
+ assert_equal "<fb:unconnected-friends-count></fb:unconnected-friends-count>",@h.fb_unconnected_friends_count
969
+ end
970
+
971
+ def test_fb_user_status
972
+ user=flexmock("user", :facebook_id => "5678")
973
+ assert_equal '<fb:user-status linked="false" uid="5678"></fb:user-status>',@h.fb_user_status(user,false)
974
+ end
975
+ end
976
+ class TestModel
977
+ attr_accessor :name,:facebook_id
978
+ end
979
+
980
+ class RailsFacebookFormbuilderTest < Test::Unit::TestCase
981
+ class TestTemplate
982
+ include ActionView::Helpers::TextHelper
983
+ include ActionView::Helpers::CaptureHelper
984
+ include ActionView::Helpers::TagHelper
985
+ include Facebooker::Rails::Helpers
986
+ attr_accessor :output_buffer
987
+ def initialize
988
+ @output_buffer=""
989
+ end
990
+ end
991
+ def setup
992
+ @_erbout = ""
993
+ @test_model = TestModel.new
994
+ @test_model.name="Mike"
995
+ @template = TestTemplate.new
996
+ @proc = Proc.new {}
997
+ @form_builder = Facebooker::Rails::FacebookFormBuilder.new(:test_model,@test_model,@template,{},@proc)
998
+ def @form_builder._erbout
999
+ ""
1000
+ end
1001
+
1002
+ end
1003
+
1004
+ def test_text_field
1005
+ assert_equal "<fb:editor-text id=\"test_model_name\" label=\"Name\" name=\"test_model[name]\" value=\"Mike\"></fb:editor-text>",
1006
+ @form_builder.text_field(:name)
1007
+ end
1008
+ def test_text_area
1009
+ assert_equal "<fb:editor-textarea id=\"test_model_name\" label=\"Name\" name=\"test_model[name]\">Mike</fb:editor-textarea>",
1010
+ @form_builder.text_area(:name)
1011
+ end
1012
+
1013
+ def test_default_name_and_id
1014
+ assert_equal "<fb:editor-text id=\"different_id\" label=\"Name\" name=\"different_name\" value=\"Mike\"></fb:editor-text>",
1015
+ @form_builder.text_field(:name, {:name => 'different_name', :id => 'different_id'})
1016
+ end
1017
+
1018
+ def test_collection_typeahead
1019
+ flexmock(@form_builder) do |fb|
1020
+ fb.should_receive(:collection_typeahead_internal).with(:name,["ABC"],:size,:to_s,{})
1021
+ end
1022
+ @form_builder.collection_typeahead(:name,["ABC"],:size,:to_s)
1023
+ end
1024
+
1025
+ def test_collection_typeahead_internal
1026
+ 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>",
1027
+ @form_builder.collection_typeahead_internal(:name,["ABC"],:size,:to_s)
1028
+ end
1029
+
1030
+ def test_buttons
1031
+ @form_builder.expects(:create_button).with(:first).returns("first")
1032
+ @form_builder.expects(:create_button).with(:second).returns("second")
1033
+ @template.expects(:content_tag).with("fb:editor-buttonset","firstsecond")
1034
+ @form_builder.buttons(:first,:second)
1035
+ end
1036
+
1037
+ def test_create_button
1038
+ assert_equal "<fb:editor-button name=\"commit\" value=\"first\"></fb:editor-button>",@form_builder.create_button(:first)
1039
+ end
1040
+
1041
+ def test_custom
1042
+ @template.expects(:password_field).returns("password_field")
1043
+ assert_equal "<fb:editor-custom label=\"Name\">password_field</fb:editor-custom>",@form_builder.password_field(:name)
1044
+ end
1045
+
1046
+ def test_text
1047
+ assert_equal "<fb:editor-custom label=\"custom\">Mike</fb:editor-custom>",@form_builder.text("Mike",:label=>"custom")
1048
+ end
1049
+
1050
+ def test_multi_friend_input
1051
+ assert_equal "<fb:editor-custom label=\"Friends\"><fb:multi-friend-input></fb:multi-friend-input></fb:editor-custom>",@form_builder.multi_friend_input
1052
+ end
1053
+
1054
+
1055
+ end
1056
+
1057
+ class RailsPrettyErrorsTest < Test::Unit::TestCase
1058
+ def setup
1059
+ ENV['FACEBOOK_API_KEY'] = '1234567'
1060
+ ENV['FACEBOOK_SECRET_KEY'] = '7654321'
1061
+ @controller = ControllerWhichFails.new
1062
+ @request = ActionController::TestRequest.new
1063
+ @response = ActionController::TestResponse.new
1064
+ @controller.stubs(:verify_signature).returns(true)
1065
+ end
1066
+
1067
+ def test_pretty_errors
1068
+ Facebooker.facebooker_config.stubs(:pretty_errors).returns(false)
1069
+ post :pass, example_rails_params_including_fb
1070
+ assert_response :success
1071
+ post :fail, example_rails_params_including_fb
1072
+ assert_response :error
1073
+ Facebooker.facebooker_config.stubs(:pretty_errors).returns(true)
1074
+ post :pass, example_rails_params_including_fb
1075
+ assert_response :success
1076
+ post :fail, example_rails_params_including_fb
1077
+ assert_response :error
1078
+ end
1079
+ private
1080
+ def example_rails_params_including_fb
1081
+ {"fb_sig_time"=>"1186588275.5988", "fb_sig"=>"7371a6400329b229f800a5ecafe03b0a", "action"=>"index", "fb_sig_in_canvas"=>"1", "fb_sig_session_key"=>"c452b5d5d60cbd0a0da82021-744961110", "controller"=>"controller_which_requires_facebook_authentication", "fb_sig_expires"=>"0", "fb_sig_friends"=>"417358,702720,1001170,1530839,3300204,3501584,6217936,9627766,9700907,22701786,33902768,38914148,67400422,135301144,157200364,500103523,500104930,500870819,502149612,502664898,502694695,502852293,502985816,503254091,504510130,504611551,505421674,509229747,511075237,512548373,512830487,517893818,517961878,518890403,523589362,523826914,525812984,531555098,535310228,539339781,541137089,549405288,552706617,564393355,564481279,567640762,568091401,570201702,571469972,573863097,574415114,575543081,578129427,578520568,582262836,582561201,586550659,591631962,592318318,596269347,596663221,597405464,599764847,602995438,606661367,609761260,610544224,620049417,626087078,628803637,632686250,641422291,646763898,649678032,649925863,653288975,654395451,659079771,661794253,665861872,668960554,672481514,675399151,678427115,685772348,686821151,687686894,688506532,689275123,695551670,710631572,710766439,712406081,715741469,718976395,719246649,722747311,725327717,725683968,725831016,727580320,734151780,734595181,737944528,748881410,752244947,763868412,768578853,776596978,789728437,873695441", "fb_sig_added"=>"0", "fb_sig_api_key"=>"b6c9c857ac543ca806f4d3187cd05e09", "fb_sig_user"=>"744961110", "fb_sig_profile_update_time"=>"1180712453"}
1082
+ end
1083
+
1084
+ end
1085
+
1086
+ class RailsUrlHelperExtensionsTest < Test::Unit::TestCase
1087
+ class UrlHelperExtensionsClass
1088
+ include ActionView::Helpers::UrlHelper
1089
+ include ActionView::Helpers::TagHelper
1090
+ def initialize(controller)
1091
+ @controller = controller
1092
+ end
1093
+
1094
+ def protect_against_forgery?
1095
+ false
1096
+ end
1097
+
1098
+ end
1099
+ class UrlHelperExtensionsController < NoisyController
1100
+ def index
1101
+ render :nothing => true
1102
+ end
1103
+ def do_it
1104
+ render :nothing => true
1105
+ end
1106
+ end
1107
+
1108
+ class FacebookRequest < ActionController::TestRequest
1109
+ end
1110
+
1111
+ def setup
1112
+ @controller = UrlHelperExtensionsController.new
1113
+ @request = FacebookRequest.new
1114
+ @response = ActionController::TestResponse.new
1115
+
1116
+ @u = UrlHelperExtensionsClass.new(@controller)
1117
+ @u.stubs(:request_comes_from_facebook?).returns(true)
1118
+
1119
+ @non_canvas_u = UrlHelperExtensionsClass.new(@controller)
1120
+ @non_canvas_u.stubs(:request_comes_from_facebook?).returns(false)
1121
+
1122
+ @label = "Testing"
1123
+ @url = "test.host"
1124
+ @prompt = "Are you sure?"
1125
+ @default_title = "Please Confirm"
1126
+ @title = "Confirm Request"
1127
+ @style = {:color => 'black', :background => 'white'}
1128
+ @verbose_style = "{background: 'white', color: 'black'}"
1129
+ @default_style = "" #"'width','200px'"
1130
+ end
1131
+
1132
+ def test_link_to
1133
+ assert_equal "<a href=\"#{@url}\">Testing</a>", @u.link_to(@label, @url)
1134
+ end
1135
+
1136
+ def test_link_to_with_popup
1137
+ assert_raises(ActionView::ActionViewError) {@u.link_to(@label,@url, :popup=>true)}
1138
+ end
1139
+
1140
+ def test_link_to_with_confirm
1141
+ assert_dom_equal( "<a href=\"#{@url}\" onclick=\"var dlg = new Dialog().showChoice(\'#{@default_title}\',\'#{@prompt}\').setStyle(#{@default_style});"+
1142
+ "var a=this;dlg.onconfirm = function() { " +
1143
+ "document.setLocation(a.getHref()); };return false;\">#{@label}</a>",
1144
+ @u.link_to(@label, @url, :confirm => @prompt) )
1145
+ end
1146
+ def test_link_to_with_confirm_with_title
1147
+ assert_dom_equal( "<a href=\"#{@url}\" onclick=\"var dlg = new Dialog().showChoice(\'#{@title}\',\'#{@prompt}\').setStyle(#{@default_style});"+
1148
+ "var a=this;dlg.onconfirm = function() { " +
1149
+ "document.setLocation(a.getHref()); };return false;\">#{@label}</a>",
1150
+ @u.link_to(@label, @url, :confirm => {:title=>@title,:content=>@prompt}) )
1151
+ end
1152
+ def test_link_to_with_confirm_with_title_and_style
1153
+ assert_dom_equal( "<a href=\"#{@url}\" onclick=\"var dlg = new Dialog().showChoice(\'#{@title}\',\'#{@prompt}\').setStyle(#{@verbose_style});"+
1154
+ "var a=this;dlg.onconfirm = function() { " +
1155
+ "document.setLocation(a.getHref()); };return false;\">#{@label}</a>",
1156
+ @u.link_to(@label, @url, :confirm => {:title=>@title,:content=>@prompt}.merge!(@style)) )
1157
+ end
1158
+
1159
+ def test_link_to_with_method
1160
+ assert_dom_equal( "<a href=\"#{@url}\" onclick=\"var a=this;var f = document.createElement('form'); f.setStyle('display','none'); "+
1161
+ "a.getParentNode().appendChild(f); f.setMethod('POST'); f.setAction(a.getHref());" +
1162
+ "var m = document.createElement('input'); m.setType('hidden'); "+
1163
+ "m.setName('_method'); m.setValue('delete'); f.appendChild(m);"+
1164
+ "f.submit();return false;\">#{@label}</a>", @u.link_to(@label,@url, :method=>:delete))
1165
+ end
1166
+
1167
+ def test_link_to_with_confirm_and_method
1168
+ assert_dom_equal( "<a href=\"#{@url}\" onclick=\"var dlg = new Dialog().showChoice(\'#{@default_title}\',\'#{@prompt}\').setStyle(#{@default_style});"+
1169
+ "var a=this;dlg.onconfirm = function() { " +
1170
+ "var f = document.createElement('form'); f.setStyle('display','none'); "+
1171
+ "a.getParentNode().appendChild(f); f.setMethod('POST'); f.setAction(a.getHref());" +
1172
+ "var m = document.createElement('input'); m.setType('hidden'); "+
1173
+ "m.setName('_method'); m.setValue('delete'); f.appendChild(m);"+
1174
+ "f.submit(); };return false;\">#{@label}</a>", @u.link_to(@label,@url, :confirm=>@prompt, :method=>:delete) )
1175
+ end
1176
+ def test_link_to_with_confirm_and_method_for_non_canvas_page
1177
+ assert_dom_equal( "<a href=\"#{@url}\" onclick=\"if (confirm(\'#{@prompt}\')) { var f = document.createElement('form'); f.style.display = 'none'; "+
1178
+ "this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var m = document.createElement('input'); "+
1179
+ "m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'delete'); "+
1180
+ "f.appendChild(m);f.submit(); };return false;\">#{@label}</a>",
1181
+ @non_canvas_u.link_to(@label,@url, :confirm=>@prompt, :method=>:delete) )
1182
+ end
1183
+
1184
+ def test_button_to
1185
+ assert_equal "<form method=\"post\" action=\"#{@url}\" class=\"button-to\"><div>" +
1186
+ "<input type=\"submit\" value=\"#{@label}\" /></div></form>", @u.button_to(@label,@url)
1187
+ end
1188
+
1189
+ def test_button_to_with_confirm
1190
+ assert_equal "<form method=\"post\" action=\"#{@url}\" class=\"button-to\"><div>" +
1191
+ "<input onclick=\"var dlg = new Dialog().showChoice(\'#{@default_title}\',\'#{@prompt}\').setStyle(#{@default_style});"+
1192
+ "var a=this;dlg.onconfirm = function() { "+
1193
+ "a.getForm().submit(); };return false;\" type=\"submit\" value=\"#{@label}\" /></div></form>",
1194
+ @u.button_to(@label,@url, :confirm=>@prompt)
1195
+ end
1196
+ def test_button_to_with_confirm_for_non_canvas_page
1197
+ assert_equal "<form method=\"post\" action=\"#{@url}\" class=\"button-to\"><div>"+
1198
+ "<input onclick=\"return confirm(\'#{@prompt}\');\" type=\"submit\" value=\"#{@label}\" /></div></form>",
1199
+ @non_canvas_u.button_to(@label,@url, :confirm=>@prompt)
1200
+ end
1201
+
1202
+ def test_link_to_unless_with_true
1203
+ assert_equal @label, @u.link_to_unless(true,@label,@url)
1204
+ end
1205
+ def test_link_to_unless_with_false
1206
+ assert_equal @u.link_to(@label,@url), @u.link_to_unless(false,@label,@url)
1207
+ end
1208
+
1209
+ def test_link_to_if_with_true
1210
+ assert_equal @u.link_to(@label,@url), @u.link_to_if(true,@label,@url)
1211
+ end
1212
+ def test_link_to_if_with_false
1213
+ assert_equal @label, @u.link_to_if(false,@label,@url)
1214
+ end
1215
+
1216
+ end
1217
+
1218
+
1219
+ # rescue LoadError
1220
+ # $stderr.puts "Couldn't find action controller. That's OK. We'll skip it."
1221
+ end