PageRenderTime 70ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/plugins/facebooker/test/facebooker/rails_integration_test.rb

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