djanowski-facebooker 1.0.1

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