facebooker 1.0.13 → 1.0.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/Manifest.txt +29 -16
  2. data/Rakefile +9 -2
  3. data/generators/facebook/templates/public/javascripts/facebooker.js +1 -8
  4. data/init.rb +3 -1
  5. data/lib/facebooker.rb +4 -2
  6. data/lib/facebooker/adapters/facebook_adapter.rb +4 -0
  7. data/lib/facebooker/admin.rb +2 -2
  8. data/lib/facebooker/mobile.rb +20 -0
  9. data/lib/facebooker/mock/service.rb +50 -0
  10. data/lib/facebooker/mock/session.rb +18 -0
  11. data/lib/facebooker/model.rb +3 -3
  12. data/lib/facebooker/models/applicationrestrictions.rb +10 -0
  13. data/lib/facebooker/models/user.rb +35 -3
  14. data/lib/facebooker/models/user.rb.orig +396 -0
  15. data/lib/facebooker/models/user.rb.rej +17 -0
  16. data/lib/facebooker/models/video.rb +9 -0
  17. data/lib/facebooker/parser.rb +22 -1
  18. data/lib/facebooker/rails/controller.rb +34 -12
  19. data/lib/facebooker/rails/cucumber.rb +28 -0
  20. data/lib/facebooker/rails/cucumber/world.rb +46 -0
  21. data/lib/facebooker/rails/facebook_pretty_errors.rb +19 -11
  22. data/lib/facebooker/rails/helpers.rb +203 -122
  23. data/lib/facebooker/rails/helpers/fb_connect.rb +56 -5
  24. data/lib/facebooker/rails/integration_session.rb +38 -0
  25. data/lib/facebooker/rails/publisher.rb +15 -2
  26. data/lib/facebooker/rails/test_helpers.rb +11 -26
  27. data/lib/facebooker/service.rb +6 -3
  28. data/lib/facebooker/session.rb +24 -2
  29. data/lib/facebooker/session.rb.orig +564 -0
  30. data/lib/facebooker/session.rb.rej +29 -0
  31. data/lib/facebooker/version.rb +1 -1
  32. data/lib/tasks/tunnel.rake +2 -2
  33. data/test/{adapters_test.rb → facebooker/adapters_test.rb} +2 -4
  34. data/test/{facebook_admin_test.rb → facebooker/admin_test.rb} +2 -2
  35. data/test/{batch_request_test.rb → facebooker/batch_request_test.rb} +3 -2
  36. data/test/{facebook_data_test.rb → facebooker/data_test.rb} +2 -2
  37. data/test/{logging_test.rb → facebooker/logging_test.rb} +3 -3
  38. data/test/facebooker/mobile_test.rb +45 -0
  39. data/test/{model_test.rb → facebooker/model_test.rb} +36 -4
  40. data/test/{event_test.rb → facebooker/models/event_test.rb} +2 -2
  41. data/test/{user_test.rb → facebooker/models/user_test.rb} +10 -5
  42. data/test/{publisher_test.rb → facebooker/rails/publisher_test.rb} +12 -18
  43. data/test/{rails_integration_test.rb → facebooker/rails_integration_test.rb} +347 -272
  44. data/test/{facebook_cache_test.rb → facebooker/server_cache_test.rb} +1 -1
  45. data/test/{session_test.rb → facebooker/session_test.rb} +3 -2
  46. data/test/facebooker_test.rb +19 -1
  47. data/test/{http_multipart_post_test.rb → net/http_multipart_post_test.rb} +2 -4
  48. data/test/rails_test_helper.rb +11 -0
  49. data/test/test_helper.rb +8 -2
  50. metadata +45 -32
  51. data/lib/facebooker/rails/facebook_asset_path.rb +0 -18
@@ -0,0 +1,29 @@
1
+ ***************
2
+ *** 211,223 ****
3
+ end
4
+
5
+ def users_standard(user_ids, fields=[])
6
+ - post("facebook.users.getStandardInfo",:uids=>user_ids.join(","),:fields=>User.user_fields(fields)) do |users|
7
+ users.map { |u| User.new(u)}
8
+ end
9
+ end
10
+
11
+ def users(user_ids, fields=[])
12
+ - post("facebook.users.getInfo",:uids=>user_ids.join(","),:fields=>User.standard_fields(fields)) do |users|
13
+ users.map { |u| User.new(u)}
14
+ end
15
+ end
16
+ --- 211,223 ----
17
+ end
18
+
19
+ def users_standard(user_ids, fields=[])
20
+ + post("facebook.users.getStandardInfo",:uids=>user_ids.join(","),:fields=>User.standard_fields(fields)) do |users|
21
+ users.map { |u| User.new(u)}
22
+ end
23
+ end
24
+
25
+ def users(user_ids, fields=[])
26
+ + post("facebook.users.getInfo",:uids=>user_ids.join(","),:fields=>User.user_fields(fields)) do |users|
27
+ users.map { |u| User.new(u)}
28
+ end
29
+ end
@@ -2,7 +2,7 @@ module Facebooker #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 1
4
4
  MINOR = 0
5
- TINY = 13
5
+ TINY = 18
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -7,13 +7,13 @@ namespace :facebooker do
7
7
  desc "Create a reverse ssh tunnel from a public server to a private development server."
8
8
  task :start => [ :environment, :config ] do
9
9
  puts @notification
10
- exec @ssh_command
10
+ system @ssh_command
11
11
  end
12
12
 
13
13
  desc "Create a reverse ssh tunnel in the background. Requires ssh keys to be setup."
14
14
  task :background_start => [ :environment, :config ] do
15
15
  puts @notification
16
- exec "#{@ssh_command} > /dev/null 2>&1 &"
16
+ system "#{@ssh_command} > /dev/null 2>&1 &"
17
17
  end
18
18
 
19
19
  # Adapted from Evan Weaver: http://blog.evanweaver.com/articles/2007/07/13/developing-a-facebook-app-locally/
@@ -1,8 +1,6 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
- require 'facebooker'
3
- class SessionTest < Test::Unit::TestCase
4
-
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
5
2
 
3
+ class Facebooker::SessionTest < Test::Unit::TestCase
6
4
  def setup
7
5
  ENV['FACEBOOK_API_KEY'] = '1234567'
8
6
  ENV['FACEBOOK_SECRET_KEY'] = '7654321'
@@ -1,6 +1,6 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
2
 
3
- class FacebookAdminTest < Test::Unit::TestCase
3
+ class Facebooker::AdminTest < Test::Unit::TestCase
4
4
  def setup
5
5
  @session = Facebooker::Session.create('apikey', 'secretkey')
6
6
  Facebooker.use_curl=false
@@ -1,5 +1,6 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
- class BatchRequestTest < Test::Unit::TestCase
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+
3
+ class Facebooker::BatchRequestTest < Test::Unit::TestCase
3
4
 
4
5
  def setup
5
6
  @proc_called=false
@@ -1,6 +1,6 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
2
 
3
- class FacebookDataTest < Test::Unit::TestCase
3
+ class Facebooker::DataTest < Test::Unit::TestCase
4
4
  def setup
5
5
  @session = Facebooker::Session.create('apikey', 'secretkey')
6
6
  #make sure we use net::http since that's what the tests expect
@@ -1,7 +1,7 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+ require 'logger'
2
3
 
3
-
4
- class LoggingTest < Test::Unit::TestCase
4
+ class Facebooker::LoggingTest < Test::Unit::TestCase
5
5
  def setup
6
6
  super
7
7
  Facebooker.logger = Logger.new(STDERR)
@@ -0,0 +1,45 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+
3
+ class Facebooker::MobileTest < Test::Unit::TestCase
4
+ def setup
5
+ @session = Facebooker::Session.create('apikey', 'secretkey')
6
+ @user = Facebooker::User.new(1234, @session)
7
+ Facebooker.use_curl=false
8
+ end
9
+
10
+ def test_can_send
11
+ expect_http_posts_with_responses(example_can_send_xml)
12
+ assert(@session.mobile.can_send(@user))
13
+ end
14
+
15
+ def test_send
16
+ expect_http_posts_with_responses(example_send_xml)
17
+ assert(@session.mobile.send(@user, "Some sort of message"))
18
+ end
19
+
20
+ private
21
+ def example_can_send_xml
22
+ <<-XML
23
+ <?xml version="1.0" encoding="UTF-8"?>
24
+ <sms_canSend_response
25
+ xmlns="http://api.facebook.com/1.0/"
26
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
27
+ xsi:schemaLocation="http://api.facebook.com/1.0/http://api.facebook.com/1.0/facebook.xsd">
28
+ 0
29
+ </sms_canSend_response>
30
+ XML
31
+ end
32
+
33
+ def example_send_xml
34
+ <<-XML
35
+ <?xml version="1.0" encoding="UTF-8"?>
36
+ <sms_send_response
37
+ xmlns="http://api.facebook.com/1.0/"
38
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
39
+ xsi:schemaLocation="http://api.facebook.com/1.0/http://api.facebook.com/1.0/facebook.xsd">
40
+ 0
41
+ </sms_send_response>
42
+ XML
43
+ end
44
+
45
+ end
@@ -1,8 +1,6 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
- require 'rubygems'
3
- require 'flexmock/test_unit'
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
4
2
 
5
- class TestFacebooker < Test::Unit::TestCase
3
+ class Facebooker::ModelTest < Test::Unit::TestCase
6
4
 
7
5
  class ComplexThing
8
6
  include Facebooker::Model
@@ -87,5 +85,39 @@ class TestFacebooker < Test::Unit::TestCase
87
85
  t.first_name
88
86
  }
89
87
  end
88
+
89
+ def test_populate_from_hash_e_should_call_a_setter_for_a_key
90
+ t = PopulatingThing.new
91
+ flexmock(t).should_receive('mykey=').with('a value')
92
+ t.populate_from_hash!({ :mykey => 'a value' })
93
+ end
94
+
95
+ def test_populate_from_hash_e_should_call_a_setter_for_a_key_if_the_value_is_false
96
+ t = PopulatingThing.new
97
+ flexmock(t).should_receive('mykey=').with(false)
98
+ t.populate_from_hash!({ :mykey => false })
99
+ end
100
+
101
+ def test_populate_from_hash_e_should_call_not_a_setter_for_a_key_if_the_value_is_nil
102
+ t = PopulatingThing.new
103
+ flexmock(t).should_receive('mykey=').never
104
+ t.populate_from_hash!({ :mykey => nil })
105
+ end
106
+
107
+ def test_populate_from_hash_should_check_for_an_empty_hash
108
+ t = PopulatingThing.new
109
+ hash = {}
110
+ flexmock(hash).should_receive('empty?')
111
+ t.populate_from_hash!(hash)
112
+ end
113
+
114
+ def test_populate_from_hash_should_check_for_a_nil_param
115
+ t = PopulatingThing.new
116
+ hash = nil
117
+ assert_nothing_raised do
118
+ t.populate_from_hash!(hash)
119
+ end
120
+ end
121
+
90
122
  end
91
123
 
@@ -1,6 +1,6 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
2
 
3
- class EventTest< Test::Unit::TestCase
3
+ class Facebooker::EventTest < Test::Unit::TestCase
4
4
  def test_attendance_will_query_for_event_when_asked_for_full_event_object
5
5
  session = flexmock("a session object")
6
6
  eid = 123
@@ -1,8 +1,7 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
- require 'rubygems'
3
- require 'flexmock/test_unit'
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
+ require 'active_support'
4
3
 
5
- class UserTest < Test::Unit::TestCase
4
+ class Facebooker::UserTest < Test::Unit::TestCase
6
5
 
7
6
  def setup
8
7
  @session = Facebooker::Session.create('apikey', 'secretkey')
@@ -165,8 +164,13 @@ class UserTest < Test::Unit::TestCase
165
164
  assert_equal("1234",@user.to_s)
166
165
  end
167
166
 
168
- def test_equality
167
+ def test_equality_with_same_id
169
168
  assert_equal @user, @user.dup
169
+ assert_equal @user, Facebooker::User.new(:id => @user.id)
170
+ end
171
+
172
+ def test_not_equal_to_differnt_class
173
+ assert_not_equal @user, flexmock(:id => @user.id)
170
174
  end
171
175
 
172
176
  def test_hash_email
@@ -287,4 +291,5 @@ class UserTest < Test::Unit::TestCase
287
291
  xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd">1</users_hasAppPermission_response>
288
292
  XML
289
293
  end
294
+
290
295
  end
@@ -1,15 +1,4 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
- require 'rubygems'
3
- require 'flexmock/test_unit'
4
- require 'action_controller'
5
- require 'action_controller/test_process'
6
- require 'active_record'
7
- require File.dirname(__FILE__)+'/../init'
8
- require 'facebooker/rails/controller'
9
- require 'facebooker/rails/helpers/fb_connect'
10
- require 'facebooker/rails/helpers'
11
- require 'facebooker/rails/publisher'
12
-
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../rails_test_helper')
13
2
 
14
3
  module SymbolHelper
15
4
  def symbol_helper_loaded
@@ -143,7 +132,7 @@ class TestPublisher < Facebooker::Rails::Publisher
143
132
 
144
133
  end
145
134
 
146
- class FacebookTemplateTest < Test::Unit::TestCase
135
+ class Facebooker::Rails::Publisher::FacebookTemplateTest < Test::Unit::TestCase
147
136
  FacebookTemplate = Facebooker::Rails::Publisher::FacebookTemplate
148
137
 
149
138
  def setup
@@ -207,7 +196,7 @@ class FacebookTemplateTest < Test::Unit::TestCase
207
196
  end
208
197
  end
209
198
 
210
- class PublisherTest < Test::Unit::TestCase
199
+ class Facebooker::Rails::Publisher::PublisherTest < Test::Unit::TestCase
211
200
  FacebookTemplate = Facebooker::Rails::Publisher::FacebookTemplate
212
201
 
213
202
  def setup
@@ -410,12 +399,17 @@ class PublisherTest < Test::Unit::TestCase
410
399
 
411
400
  def test_image_urls
412
401
  Facebooker.expects(:facebook_path_prefix).returns("/mike")
413
- assert_equal({:src => '/images/image.png', :href => 'raw_string' },
414
- TestPublisher.new.image('image.png', 'raw_string'))
415
- assert_equal({:src => '/images/image.png', :href => 'http://apps.facebook.com/mike/pokes/do/1' },
416
- TestPublisher.new.image('image.png', {:controller => :pokes, :action => :do, :id => 1}))
402
+ string_image = TestPublisher.new.image('image.png', 'raw_string')
403
+ assert_equal('/images/image.png',string_image.src)
404
+ assert_equal('raw_string',string_image.href)
405
+ route_image = TestPublisher.new.image('image.png', {:controller => :pokes, :action => :do, :id => 1})
406
+ assert_equal('http://apps.facebook.com/mike/pokes/do/1',route_image.href)
417
407
  end
418
408
 
409
+ def test_image_to_json_puts_src_first
410
+ string_image = TestPublisher.new.image('image.png', 'raw_string')
411
+ assert_equal "{\"src\":\"/images/image.png\", \"href\":\"raw_string\"}",string_image.to_json
412
+ end
419
413
  def test_action_link
420
414
  assert_equal({:text=>"text", :href=>"href"}, TestPublisher.new.action_link("text","href"))
421
415
  end
@@ -1,187 +1,212 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
- begin
3
- require 'action_controller'
4
- require 'action_controller/test_process'
5
- require 'facebooker/rails/controller'
6
- require 'facebooker/rails/helpers/fb_connect'
7
- require 'facebooker/rails/helpers'
8
- require 'facebooker/rails/facebook_form_builder'
9
- require File.dirname(__FILE__)+'/../init'
10
- require 'mocha'
11
-
12
- ActionController::Routing::Routes.draw do |map|
13
- map.connect '', :controller=>"facebook",:conditions=>{:canvas=>true}
14
- map.connect '', :controller=>"plain_old_rails"
15
- map.resources :comments, :controller=>"plain_old_rails"
16
- map.connect 'require_auth/:action', :controller => "controller_which_requires_facebook_authentication"
17
- map.connect 'require_install/:action', :controller => "controller_which_requires_application_installation"
18
- map.connect ':controller/:action/:id', :controller => "plain_old_rails"
19
- end
1
+ require File.expand_path(File.dirname(__FILE__) + '/../rails_test_helper')
2
+
3
+ ActionController::Routing::Routes.draw do |map|
4
+ map.connect '', :controller=>"facebook",:conditions=>{:canvas=>true}
5
+ map.connect '', :controller=>"plain_old_rails"
6
+ map.resources :comments, :controller=>"plain_old_rails"
7
+ map.connect 'require_auth/:action', :controller => "controller_which_requires_facebook_authentication"
8
+ map.connect 'require_install/:action', :controller => "controller_which_requires_application_installation"
9
+ map.connect ':controller/:action/:id', :controller => "plain_old_rails"
10
+ end
11
+
12
+ module FBConnectTestHelpers
13
+ def setup_fb_connect_cookies(params=cookie_hash_for_auth)
14
+ params.each {|k,v| @request.cookies[ENV['FACEBOOK_API_KEY']+k] = CGI::Cookie.new(ENV['FACEBOOK_API_KEY']+k,v)}
15
+ end
16
+
17
+ def expired_cookie_hash_for_auth
18
+ {"_ss" => "not_used", "_session_key"=> "whatever", "_user"=>"77777", "_expires"=>"#{1.day.ago.to_i}"}
19
+ end
20
+
21
+ def cookie_hash_for_auth
22
+ {"_ss" => "not_used", "_session_key"=> "whatever", "_user"=>"77777", "_expires"=>"#{1.day.from_now.to_i}"}
23
+ end
24
+ end
25
+ class NoisyController < ActionController::Base
26
+ include Facebooker::Rails::Controller
27
+ def rescue_action(e) raise e end
28
+ end
29
+
30
+
31
+ class ControllerWhichRequiresExtendedPermissions< NoisyController
32
+ ensure_authenticated_to_facebook
33
+ before_filter :ensure_has_status_update
34
+ before_filter :ensure_has_photo_upload
35
+ before_filter :ensure_has_video_upload
36
+ before_filter :ensure_has_create_listing
37
+ def index
38
+ render :text => 'score!'
39
+ end
40
+ end
41
+
42
+ class FBConnectController < NoisyController
43
+ before_filter :create_facebook_session
44
+ def index
45
+ render :text => 'score!'
46
+ end
47
+ end
48
+
49
+ class ControllerWhichRequiresFacebookAuthentication < NoisyController
50
+ ensure_authenticated_to_facebook
51
+ def index
52
+ render :text => 'score!'
53
+ end
54
+ def link_test
55
+ options = {}
56
+ options[:canvas] = true if params[:canvas] == true
57
+ options[:canvas] = false if params[:canvas] == false
58
+ render :text=>url_for(options)
59
+ end
20
60
 
21
- class NoisyController < ActionController::Base
22
- include Facebooker::Rails::Controller
23
- def rescue_action(e) raise e end
61
+ def named_route_test
62
+ render :text=>comments_url()
24
63
  end
25
- class ControllerWhichRequiresExtendedPermissions< NoisyController
26
- ensure_authenticated_to_facebook
27
- before_filter :ensure_has_status_update
28
- before_filter :ensure_has_photo_upload
29
- before_filter :ensure_has_create_listing
30
- def index
31
- render :text => 'score!'
32
- end
64
+
65
+ def image_test
66
+ render :inline=>"<%=image_tag 'image.png'%>"
33
67
  end
34
68
 
35
- class ControllerWhichRequiresFacebookAuthentication < NoisyController
36
- ensure_authenticated_to_facebook
37
- def index
38
- render :text => 'score!'
39
- end
40
- def link_test
41
- options = {}
42
- options[:canvas] = true if params[:canvas] == true
43
- options[:canvas] = false if params[:canvas] == false
44
- render :text=>url_for(options)
45
- end
46
-
47
- def named_route_test
48
- render :text=>comments_url()
49
- end
50
-
51
- def image_test
52
- render :inline=>"<%=image_tag 'image.png'%>"
53
- end
54
-
55
- def fb_params_test
56
- render :text=>facebook_params['user']
57
- end
58
-
59
- def publisher_test
60
- if wants_interface?
61
- render :text=>"interface"
62
- else
63
- render :text=>"not interface"
64
- end
65
- end
66
-
67
- def publisher_test_interface
68
- render_publisher_interface("This is a test",false,true)
69
- end
70
-
71
- def publisher_test_response
72
- ua=Facebooker::Rails::Publisher::UserAction.new
73
- ua.data = {:params=>true}
74
- ua.template_name = "template_name"
75
- ua.template_id = 1234
76
- render_publisher_response(ua)
77
- end
78
-
79
- def publisher_test_error
80
- render_publisher_error("Title","Body")
69
+ def fb_params_test
70
+ render :text=>facebook_params['user']
71
+ end
72
+
73
+ def publisher_test
74
+ if wants_interface?
75
+ render :text=>"interface"
76
+ else
77
+ render :text=>"not interface"
81
78
  end
82
-
83
79
  end
84
- class ControllerWhichRequiresApplicationInstallation < NoisyController
85
- ensure_application_is_installed_by_facebook_user
86
- def index
87
- render :text => 'installed!'
88
- end
80
+
81
+ def publisher_test_interface
82
+ render_publisher_interface("This is a test",false,true)
89
83
  end
90
- class FacebookController < ActionController::Base
91
- def index
92
- end
84
+
85
+ def publisher_test_response
86
+ ua=Facebooker::Rails::Publisher::UserAction.new
87
+ ua.data = {:params=>true}
88
+ ua.template_name = "template_name"
89
+ ua.template_id = 1234
90
+ render_publisher_response(ua)
93
91
  end
94
92
 
95
- class PlainOldRailsController < ActionController::Base
96
- def index
97
- end
98
- def link_test
99
- options = {}
100
- options[:canvas] = true if params[:canvas] == true
101
- options[:canvas] = false if params[:canvas] == false
102
- render :text => url_for(options)
103
- end
104
-
105
- def named_route_test
106
- render :text=>comments_url()
107
- end
108
- def canvas_false_test
109
- render :text=>comments_url(:canvas=>false)
110
- end
111
- def canvas_true_test
112
- render :text=>comments_url(:canvas=>true)
113
- end
93
+ def publisher_test_error
94
+ render_publisher_error("Title","Body")
114
95
  end
115
96
 
116
- class ControllerWhichFails < ActionController::Base
117
- def pass
118
- render :text=>''
119
- end
120
- def fail
121
- raise "I'm failing"
122
- end
97
+ end
98
+ class ControllerWhichRequiresApplicationInstallation < NoisyController
99
+ ensure_application_is_installed_by_facebook_user
100
+ def index
101
+ render :text => 'installed!'
102
+ end
103
+ end
104
+ class FacebookController < ActionController::Base
105
+ def index
106
+ end
107
+ end
108
+
109
+ class PlainOldRailsController < ActionController::Base
110
+ def index
111
+ end
112
+ def link_test
113
+ options = {}
114
+ options[:canvas] = true if params[:canvas] == true
115
+ options[:canvas] = false if params[:canvas] == false
116
+ render :text => url_for(options)
123
117
  end
124
118
 
125
- # you can't use asset_recognize, because it can't pass parameters in to the requests
126
- class UrlRecognitionTests < Test::Unit::TestCase
127
- def test_detects_in_canvas
128
- request = ActionController::TestRequest.new({"fb_sig_in_canvas"=>"1"}, {}, nil)
129
- request.path = "/"
130
- ActionController::Routing::Routes.recognize(request)
131
- assert_equal({"controller"=>"facebook","action"=>"index"},request.path_parameters)
132
- end
133
-
134
- def test_routes_when_not_in_canvas
135
- request = ActionController::TestRequest.new({}, {}, nil)
136
- request.path = "/"
137
- ActionController::Routing::Routes.recognize(request)
138
- assert_equal({"controller"=>"plain_old_rails","action"=>"index"},request.path_parameters)
139
- end
119
+ def named_route_test
120
+ render :text=>comments_url()
121
+ end
122
+ def canvas_false_test
123
+ render :text=>comments_url(:canvas=>false)
124
+ end
125
+ def canvas_true_test
126
+ render :text=>comments_url(:canvas=>true)
127
+ end
128
+ end
129
+
130
+ class Test::Unit::TestCase
131
+ include Facebooker::Rails::TestHelpers
132
+ end
133
+
134
+
135
+ # you can't use asset_recognize, because it can't pass parameters in to the requests
136
+ class UrlRecognitionTests < Test::Unit::TestCase
137
+ def test_detects_in_canvas
138
+ request = ActionController::TestRequest.new({"fb_sig_in_canvas"=>"1"}, {}, nil)
139
+ request.path = "/"
140
+ ActionController::Routing::Routes.recognize(request)
141
+ assert_equal({"controller"=>"facebook","action"=>"index"},request.path_parameters)
140
142
  end
141
143
 
142
- class RailsIntegrationTestForNonFacebookControllers < Test::Unit::TestCase
143
- def setup
144
- ENV['FACEBOOK_CANVAS_PATH'] ='facebook_app_name'
145
- ENV['FACEBOOK_API_KEY'] = '1234567'
146
- ENV['FACEBOOK_SECRET_KEY'] = '7654321'
147
- @controller = PlainOldRailsController.new
148
- @request = ActionController::TestRequest.new
149
- @response = ActionController::TestResponse.new
150
- end
144
+ def test_routes_when_not_in_canvas
145
+ request = ActionController::TestRequest.new({}, {}, nil)
146
+ request.path = "/"
147
+ ActionController::Routing::Routes.recognize(request)
148
+ assert_equal({"controller"=>"plain_old_rails","action"=>"index"},request.path_parameters)
149
+ end
150
+ end
151
151
 
152
- def test_url_for_links_to_callback_if_canvas_is_false_and_in_canvas
153
- get :link_test, example_rails_params
154
- assert_match /test.host/,@response.body
155
- end
156
-
157
- def test_named_route_doesnt_include_canvas_path_when_not_in_canvas
158
- get :named_route_test, example_rails_params
159
- assert_equal "http://test.host/comments",@response.body
160
- end
161
- def test_named_route_includes_canvas_path_when_in_canvas
162
- get :named_route_test, example_rails_params_including_fb
163
- assert_equal "http://apps.facebook.com/facebook_app_name/comments",@response.body
164
- end
165
-
166
- def test_named_route_doesnt_include_canvas_path_when_in_canvas_with_canvas_equals_false
167
- get :canvas_false_test, example_rails_params_including_fb
168
- assert_equal "http://test.host/comments",@response.body
169
- end
170
- def test_named_route_does_include_canvas_path_when_not_in_canvas_with_canvas_equals_true
171
- get :canvas_true_test, example_rails_params
172
- assert_equal "http://apps.facebook.com/facebook_app_name/comments",@response.body
173
- end
152
+ class RailsIntegrationTestForFBConnect < Test::Unit::TestCase
153
+ include FBConnectTestHelpers
154
+
155
+ def setup
156
+ ENV['FACEBOOK_CANVAS_PATH'] ='facebook_app_name'
157
+ ENV['FACEBOOK_API_KEY'] = '1234567'
158
+ ENV['FACEBOOK_SECRET_KEY'] = '7654321'
159
+ @controller = FBConnectController.new
160
+ @request = ActionController::TestRequest.new
161
+ @response = ActionController::TestResponse.new
162
+ @controller.stubs(:verify_signature).returns(true)
163
+
164
+ end
165
+
166
+ def test_doesnt_set_cookie_but_facebook_session_is_available
167
+ setup_fb_connect_cookies
168
+ get :index
169
+ assert_not_nil @controller.facebook_session
170
+ assert_nil @response.cookies[:facebook_session]
174
171
 
175
- private
176
- def example_rails_params
177
- { "action"=>"index", "controller"=>"plain_old_rails_controller" }
178
- end
179
- def example_rails_params_including_fb(options={})
180
- {"fb_sig_time"=>"1186588275.5988", "fb_sig"=>"8d9e9dd2cb0742a5a2bfe35563134585", "action"=>"index", "fb_sig_in_canvas"=>"1", "fb_sig_session_key"=>"c452b5d5d60cbd0a0da82021-744961110", "controller"=>"controller_which_requires_facebook_authentication", "fb_sig_expires"=>"0", "fb_sig_friends"=>"417358,702720,1001170,1530839,3300204,3501584,6217936,9627766,9700907,22701786,33902768,38914148,67400422,135301144,157200364,500103523,500104930,500870819,502149612,502664898,502694695,502852293,502985816,503254091,504510130,504611551,505421674,509229747,511075237,512548373,512830487,517893818,517961878,518890403,523589362,523826914,525812984,531555098,535310228,539339781,541137089,549405288,552706617,564393355,564481279,567640762,568091401,570201702,571469972,573863097,574415114,575543081,578129427,578520568,582262836,582561201,586550659,591631962,592318318,596269347,596663221,597405464,599764847,602995438,606661367,609761260,610544224,620049417,626087078,628803637,632686250,641422291,646763898,649678032,649925863,653288975,654395451,659079771,661794253,665861872,668960554,672481514,675399151,678427115,685772348,686821151,687686894,688506532,689275123,695551670,710631572,710766439,712406081,715741469,718976395,719246649,722747311,725327717,725683968,725831016,727580320,734151780,734595181,737944528,748881410,752244947,763868412,768578853,776596978,789728437,873695441", "fb_sig_added"=>"0", "fb_sig_api_key"=>"b6c9c857ac543ca806f4d3187cd05e09", "fb_sig_user"=>"744961110", "fb_sig_profile_update_time"=>"1180712453"}.merge(options)
181
- end
172
+ end
173
+ end
174
+
175
+ class RailsIntegrationTestForNonFacebookControllers < Test::Unit::TestCase
176
+ def setup
177
+ ENV['FACEBOOK_CANVAS_PATH'] ='facebook_app_name'
178
+ ENV['FACEBOOK_API_KEY'] = '1234567'
179
+ ENV['FACEBOOK_SECRET_KEY'] = '7654321'
180
+ @controller = PlainOldRailsController.new
181
+ @request = ActionController::TestRequest.new
182
+ @response = ActionController::TestResponse.new
183
+ end
184
+
185
+ def test_url_for_links_to_callback_if_canvas_is_false_and_in_canvas
186
+ get :link_test
187
+ assert_match /test.host/,@response.body
188
+ end
182
189
 
190
+ def test_named_route_doesnt_include_canvas_path_when_not_in_canvas
191
+ get :named_route_test
192
+ assert_equal "http://test.host/comments",@response.body
193
+ end
194
+ def test_named_route_includes_canvas_path_when_in_canvas
195
+ get :named_route_test, facebook_params
196
+ assert_equal "http://apps.facebook.com/facebook_app_name/comments",@response.body
197
+ end
198
+
199
+ def test_named_route_doesnt_include_canvas_path_when_in_canvas_with_canvas_equals_false
200
+ get :canvas_false_test, facebook_params
201
+ assert_equal "http://test.host/comments",@response.body
202
+ end
203
+ def test_named_route_does_include_canvas_path_when_not_in_canvas_with_canvas_equals_true
204
+ get :canvas_true_test
205
+ assert_equal "http://apps.facebook.com/facebook_app_name/comments",@response.body
183
206
  end
184
207
 
208
+ end
209
+
185
210
  class RailsIntegrationTestForExtendedPermissions < Test::Unit::TestCase
186
211
  def setup
187
212
  ENV['FACEBOOK_API_KEY'] = '1234567'
@@ -193,32 +218,32 @@ class RailsIntegrationTestForExtendedPermissions < Test::Unit::TestCase
193
218
  end
194
219
 
195
220
  def test_redirects_without_set_status
196
- post :index,example_rails_params_including_fb
221
+ post :index, facebook_params
197
222
  assert_response :success
198
223
  assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=status_update\" />", @response.body)
199
224
  end
200
225
  def test_redirects_without_photo_upload
201
- post :index,example_rails_params_including_fb.merge(:fb_sig_ext_perms=>"status_update")
226
+ post :index, facebook_params(:fb_sig_ext_perms=>"status_update")
202
227
  assert_response :success
203
228
  assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=photo_upload\" />", @response.body)
204
229
  end
230
+ def test_redirects_without_video_upload
231
+ post :index, facebook_params(:fb_sig_ext_perms=>"status_update,photo_upload")
232
+ assert_response :success
233
+ assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=video_upload\" />", @response.body)
234
+ end
205
235
  def test_redirects_without_create_listing
206
- post :index,example_rails_params_including_fb.merge(:fb_sig_ext_perms=>"status_update,photo_upload")
236
+ post :index, facebook_params(:fb_sig_ext_perms=>"status_update,photo_upload,video_upload")
207
237
  assert_response :success
208
238
  assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=create_listing\" />", @response.body)
209
239
  end
210
240
 
211
241
  def test_renders_with_permission
212
- post :index,example_rails_params_including_fb.merge(:fb_sig_ext_perms=>"status_update,photo_upload,create_listing")
242
+ post :index, facebook_params(:fb_sig_ext_perms=>"status_update,photo_upload,create_listing,video_upload")
213
243
  assert_response :success
214
244
  assert_equal("score!", @response.body)
215
245
 
216
246
  end
217
- private
218
- def example_rails_params_including_fb
219
- {"fb_sig_time"=>"1186588275.5988", "fb_sig"=>"7371a6400329b229f800a5ecafe03b0a", "action"=>"index", "fb_sig_in_canvas"=>"1", "fb_sig_session_key"=>"c452b5d5d60cbd0a0da82021-744961110", "controller"=>"controller_which_requires_facebook_authentication", "fb_sig_expires"=>"0", "fb_sig_friends"=>"417358,702720,1001170,1530839,3300204,3501584,6217936,9627766,9700907,22701786,33902768,38914148,67400422,135301144,157200364,500103523,500104930,500870819,502149612,502664898,502694695,502852293,502985816,503254091,504510130,504611551,505421674,509229747,511075237,512548373,512830487,517893818,517961878,518890403,523589362,523826914,525812984,531555098,535310228,539339781,541137089,549405288,552706617,564393355,564481279,567640762,568091401,570201702,571469972,573863097,574415114,575543081,578129427,578520568,582262836,582561201,586550659,591631962,592318318,596269347,596663221,597405464,599764847,602995438,606661367,609761260,610544224,620049417,626087078,628803637,632686250,641422291,646763898,649678032,649925863,653288975,654395451,659079771,661794253,665861872,668960554,672481514,675399151,678427115,685772348,686821151,687686894,688506532,689275123,695551670,710631572,710766439,712406081,715741469,718976395,719246649,722747311,725327717,725683968,725831016,727580320,734151780,734595181,737944528,748881410,752244947,763868412,768578853,776596978,789728437,873695441", "fb_sig_added"=>"0", "fb_sig_api_key"=>"b6c9c857ac543ca806f4d3187cd05e09", "fb_sig_user"=>"744961110", "fb_sig_profile_update_time"=>"1180712453"}
220
- end
221
-
222
247
  end
223
248
 
224
249
  class RailsIntegrationTestForApplicationInstallation < Test::Unit::TestCase
@@ -238,24 +263,20 @@ class RailsIntegrationTestForApplicationInstallation < Test::Unit::TestCase
238
263
  end
239
264
 
240
265
  def test_if_controller_requires_application_installation_authenticated_requests_without_installation_will_redirect_to_install_page
241
- get :index, example_rails_params_including_fb
266
+ get :index, facebook_params(:fb_sig_added => nil)
242
267
  assert_response :success
243
268
  assert_equal("<fb:redirect url=\"http://www.facebook.com/install.php?api_key=1234567&v=1.0\" />", @response.body)
244
269
  end
245
270
 
246
271
  def test_if_controller_requires_application_installation_authenticated_requests_with_installation_will_render
247
- get :index, example_rails_params_including_fb.merge('fb_sig_added' => "1")
272
+ get :index, facebook_params('fb_sig_added' => "1")
248
273
  assert_response :success
249
274
  assert_equal("installed!", @response.body)
250
275
  end
251
-
252
- private
253
- def example_rails_params_including_fb
254
- {"fb_sig_time"=>"1186588275.5988", "fb_sig"=>"7371a6400329b229f800a5ecafe03b0a", "action"=>"index", "fb_sig_in_canvas"=>"1", "fb_sig_session_key"=>"c452b5d5d60cbd0a0da82021-744961110", "controller"=>"controller_which_requires_facebook_authentication", "fb_sig_expires"=>"0", "fb_sig_friends"=>"417358,702720,1001170,1530839,3300204,3501584,6217936,9627766,9700907,22701786,33902768,38914148,67400422,135301144,157200364,500103523,500104930,500870819,502149612,502664898,502694695,502852293,502985816,503254091,504510130,504611551,505421674,509229747,511075237,512548373,512830487,517893818,517961878,518890403,523589362,523826914,525812984,531555098,535310228,539339781,541137089,549405288,552706617,564393355,564481279,567640762,568091401,570201702,571469972,573863097,574415114,575543081,578129427,578520568,582262836,582561201,586550659,591631962,592318318,596269347,596663221,597405464,599764847,602995438,606661367,609761260,610544224,620049417,626087078,628803637,632686250,641422291,646763898,649678032,649925863,653288975,654395451,659079771,661794253,665861872,668960554,672481514,675399151,678427115,685772348,686821151,687686894,688506532,689275123,695551670,710631572,710766439,712406081,715741469,718976395,719246649,722747311,725327717,725683968,725831016,727580320,734151780,734595181,737944528,748881410,752244947,763868412,768578853,776596978,789728437,873695441", "fb_sig_added"=>"0", "fb_sig_api_key"=>"b6c9c857ac543ca806f4d3187cd05e09", "fb_sig_user"=>"744961110", "fb_sig_profile_update_time"=>"1180712453"}
255
- end
256
276
  end
257
277
 
258
278
  class RailsIntegrationTest < Test::Unit::TestCase
279
+ include FBConnectTestHelpers
259
280
  def setup
260
281
  ENV['FACEBOOK_CANVAS_PATH'] ='root'
261
282
  ENV['FACEBOOK_API_KEY'] = '1234567'
@@ -269,7 +290,7 @@ class RailsIntegrationTest < Test::Unit::TestCase
269
290
  end
270
291
 
271
292
  def test_named_route_includes_new_canvas_path_when_in_new_canvas
272
- get :named_route_test, example_rails_params_including_fb.merge("fb_sig_in_new_facebook"=>"1")
293
+ get :named_route_test, facebook_params("fb_sig_in_new_facebook"=>"1")
273
294
  assert_equal "http://apps.facebook.com/root/comments",@response.body
274
295
  end
275
296
 
@@ -280,67 +301,66 @@ class RailsIntegrationTest < Test::Unit::TestCase
280
301
  end
281
302
 
282
303
  def test_facebook_params_are_parsed_into_a_separate_hash
283
- get :index, example_rails_params_including_fb
284
- facebook_params = @controller.facebook_params
285
- assert_equal([8, 8], [facebook_params['time'].day, facebook_params['time'].mon])
304
+ get :index, facebook_params(:fb_sig_user => '9')
305
+ assert_not_nil @controller.facebook_params['time']
286
306
  end
287
307
 
288
308
  def test_facebook_params_convert_in_canvas_to_boolean
289
- get :index, example_rails_params_including_fb
309
+ get :index, facebook_params
290
310
  assert_equal(true, @controller.facebook_params['in_canvas'])
291
311
  end
292
312
 
293
313
  def test_facebook_params_convert_added_to_boolean_false
294
- get :index, example_rails_params_including_fb
314
+ get :index, facebook_params(:fb_sig_added => '0')
295
315
  assert_equal(false, @controller.facebook_params['added'])
296
316
  end
297
317
 
298
318
  def test_facebook_params_convert_added_to_boolean_true
299
- get :index, example_rails_params_including_fb.merge('fb_sig_added' => "1")
319
+ get :index, facebook_params('fb_sig_added' => "1")
300
320
  assert_equal(true, @controller.facebook_params['added'])
301
321
  end
302
322
 
303
- def test_facebook_params_convert_expirey_into_time_or_nil
304
- get :index, example_rails_params_including_fb
323
+ def test_facebook_params_convert_expirey_into_nil
324
+ get :index, facebook_params(:fb_sig_expires => '0')
305
325
  assert_nil(@controller.facebook_params['expires'])
306
- modified_params = example_rails_params_including_fb
307
- modified_params['fb_sig_expires'] = modified_params['fb_sig_time']
308
- setup # reset session and cached params
309
- get :index, modified_params
310
- assert_equal([8, 8], [@controller.facebook_params['time'].day, @controller.facebook_params['time'].mon])
326
+ end
327
+
328
+ def test_facebook_params_convert_expirey_into_time
329
+ get :index, facebook_params(:fb_sig_expires => 5.minutes.from_now.to_f)
330
+ assert_instance_of Time, @controller.facebook_params['expires']
311
331
  end
312
332
 
313
333
  def test_facebook_params_convert_friend_list_to_parsed_array_of_friend_ids
314
- get :index, example_rails_params_including_fb
334
+ get :index, facebook_params(:fb_sig_friends => '1,2,3,4,5')
315
335
  assert_kind_of(Array, @controller.facebook_params['friends'])
316
- assert_equal(111, @controller.facebook_params['friends'].size)
336
+ assert_equal(5, @controller.facebook_params['friends'].size)
317
337
  end
318
338
 
319
339
  def test_session_can_be_resecured_from_facebook_params
320
- get :index, example_rails_params_including_fb
321
- assert_equal(744961110, @controller.facebook_session.user.id)
340
+ get :index, facebook_params(:fb_sig_user => 10)
341
+ assert_equal(10, @controller.facebook_session.user.id)
322
342
  end
323
343
 
324
344
  def test_existing_secured_session_is_used_if_available
325
- session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY'])
326
- session.secure_with!("c452b5d5d60cbd0a0da82021-744961110", "1111111", Time.now.to_i + 60)
327
- get :index, example_rails_params_including_fb, {:facebook_session => session}
328
- assert_equal(1111111, @controller.facebook_session.user.id)
345
+ session = Facebooker::Session.create(Facebooker::Session.api_key, Facebooker::Session.secret_key)
346
+ session.secure_with!("session_key", "111", Time.now.to_i + 60)
347
+ get :index, facebook_params(:fb_sig_session_key => 'session_key', :fb_sig_user => '987'), {:facebook_session => session}
348
+ assert_equal(111, @controller.facebook_session.user.id)
329
349
  end
330
350
 
331
351
  def test_facebook_params_used_if_existing_secured_session_key_does_not_match
332
- session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY'])
333
- session.secure_with!("a session key", "1111111", Time.now.to_i + 60)
334
- get :index, example_rails_params_including_fb, {:facebook_session => session}
335
- assert_equal(744961110, @controller.facebook_session.user.id)
352
+ session = Facebooker::Session.create(Facebooker::Session.api_key, Facebooker::Session.secret_key)
353
+ session.secure_with!("different session key", "111", Time.now.to_i + 60)
354
+ get :index, facebook_params(:fb_sig_session_key => '', :fb_sig_user => '123'), {:facebook_session => session}
355
+ assert_equal(123, @controller.facebook_session.user.id)
336
356
  end
337
357
 
338
358
  def test_existing_secured_session_is_NOT_used_if_available_and_facebook_params_session_key_is_nil_and_in_canvas
339
- session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY'])
359
+ session = Facebooker::Session.create(Facebooker::Session.api_key, Facebooker::Session.secret_key)
360
+ session.secure_with!("session_key", "111", Time.now.to_i + 60)
340
361
  session.secure_with!("a session key", "1111111", Time.now.to_i + 60)
341
- get :index, example_rails_params_including_fb.merge("fb_sig_session_key" => ''), {:facebook_session => session}
342
-
343
- assert_equal(744961110, @controller.facebook_session.user.id)
362
+ get :index, facebook_params(:fb_sig_session_key => '', :fb_sig_user => '987'), {:facebook_session => session}
363
+ assert_equal(987, @controller.facebook_session.user.id)
344
364
  end
345
365
 
346
366
  def test_existing_secured_session_IS_used_if_available_and_facebook_params_session_key_is_nil_and_NOT_in_canvas
@@ -354,7 +374,7 @@ class RailsIntegrationTest < Test::Unit::TestCase
354
374
 
355
375
  def test_session_can_be_secured_with_auth_token
356
376
  auth_token = 'ohaiauthtokenhere111'
357
- modified_params = example_rails_params_including_fb
377
+ modified_params = facebook_params
358
378
  modified_params.delete('fb_sig_session_key')
359
379
  modified_params['auth_token'] = auth_token
360
380
  session_mock = flexmock(session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY']))
@@ -366,106 +386,104 @@ class RailsIntegrationTest < Test::Unit::TestCase
366
386
 
367
387
  def test_session_secured_with_auth_token_if_cookies_expired
368
388
  auth_token = 'ohaiauthtokenhere111'
369
- modified_params = example_rails_params_including_fb
389
+ modified_params = facebook_params
370
390
  modified_params.delete('fb_sig_session_key')
371
391
  modified_params['auth_token'] = auth_token
372
392
  session_mock = flexmock(session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY']))
373
393
  session_params = { 'session_key' => '123', 'uid' => '321' }
374
394
  session_mock.should_receive(:post).with('facebook.auth.getSession', :auth_token => auth_token).once.and_return(session_params).ordered
375
395
  flexmock(@controller).should_receive(:new_facebook_session).once.and_return(session).ordered
376
- expired_cookie_hash_for_auth.each {|k,v| @request.cookies[ENV['FACEBOOK_API_KEY']+k] = CGI::Cookie.new(ENV['FACEBOOK_API_KEY']+k,v)}
396
+ setup_fb_connect_cookies(expired_cookie_hash_for_auth)
377
397
  get :index, modified_params
378
398
  assert_equal(321, @controller.facebook_session.user.id)
379
399
  end
380
400
 
381
401
  def test_session_can_be_secured_with_cookies
382
- cookie_hash_for_auth.each {|k,v| @request.cookies[ENV['FACEBOOK_API_KEY']+k] = CGI::Cookie.new(ENV['FACEBOOK_API_KEY']+k,v)}
383
- get :index, example_rails_params_for_fb_connect
402
+ setup_fb_connect_cookies
403
+ get :index
384
404
  assert_equal(77777, @controller.facebook_session.user.id)
385
405
  end
386
406
 
387
407
  def test_session_does_NOT_secure_with_expired_cookies
388
- expired_cookie_hash_for_auth.each {|k,v| @request.cookies[ENV['FACEBOOK_API_KEY']+k] = CGI::Cookie.new(ENV['FACEBOOK_API_KEY']+k,v)}
389
- get :index, example_rails_params_for_fb_connect
408
+ setup_fb_connect_cookies(expired_cookie_hash_for_auth)
409
+ get :index
390
410
  assert_nil(@controller.facebook_session)
391
411
  end
392
412
 
393
413
  def test_user_friends_can_be_populated_from_facebook_params_if_available
394
- get :index, example_rails_params_including_fb
395
- assert_not_nil(friends = @controller.facebook_session.user.friends)
396
- assert_equal(111, friends.size)
414
+ get :index, facebook_params(:fb_sig_friends => '1,2,3,4')
415
+ friends = @controller.facebook_session.user.friends
416
+ assert_not_nil(friends)
417
+ assert_equal(4, friends.size)
397
418
  end
398
419
 
399
420
  def test_fbml_redirect_tag_handles_hash_parameters_correctly
400
- get :index, example_rails_params_including_fb
421
+ get :index, facebook_params
401
422
  assert_equal "<fb:redirect url=\"http://apps.facebook.com/root/require_auth\" />", @controller.send(:fbml_redirect_tag, :action => :index,:canvas=>true)
402
423
  end
403
424
 
404
425
  def test_redirect_to_renders_fbml_redirect_tag_if_request_is_for_a_facebook_canvas
405
- get :index, example_rails_params_including_fb_for_user_not_logged_into_application
426
+ get :index, facebook_params(:fb_sig_user => nil)
406
427
  assert_response :success
407
428
  assert_equal("<fb:redirect url=\"http://www.facebook.com/login.php?api_key=1234567&v=1.0\" />", @response.body)
408
429
  end
409
430
 
410
431
  def test_url_for_links_to_canvas_if_canvas_is_true_and_not_in_canvas
411
- get :link_test,example_rails_params_including_fb.merge(:fb_sig_in_canvas=>0,:canvas=>true)
432
+ get :link_test, facebook_params(:fb_sig_in_canvas=>0,:canvas=>true)
412
433
  assert_match /apps.facebook.com/,@response.body
413
434
  end
414
435
 
415
436
  def test_includes_relative_url_root_when_linked_to_canvas
416
- get :link_test,example_rails_params_including_fb.merge(:fb_sig_in_canvas=>0,:canvas=>true)
437
+ get :link_test,facebook_params(:fb_sig_in_canvas=>0,:canvas=>true)
417
438
  assert_match /root/,@response.body
418
439
  end
419
440
 
420
441
  def test_url_for_links_to_callback_if_canvas_is_false_and_in_canvas
421
- get :link_test,example_rails_params_including_fb.merge(:fb_sig_in_canvas=>0,:canvas=>false)
442
+ get :link_test,facebook_params(:fb_sig_in_canvas=>0,:canvas=>false)
422
443
  assert_match /test.host/,@response.body
423
444
  end
424
445
 
425
446
  def test_url_for_doesnt_include_url_root_when_not_linked_to_canvas
426
- get :link_test,example_rails_params_including_fb.merge(:fb_sig_in_canvas=>0,:canvas=>false)
447
+ get :link_test,facebook_params(:fb_sig_in_canvas=>0,:canvas=>false)
427
448
  assert !@response.body.match(/root/)
428
449
  end
429
450
 
430
451
  def test_url_for_links_to_canvas_if_canvas_is_not_set
431
- get :link_test,example_rails_params_including_fb
452
+ get :link_test,facebook_params
432
453
  assert_match /apps.facebook.com/,@response.body
433
454
  end
434
455
 
435
456
  def test_image_tag
436
- get :image_test, example_rails_params_including_fb
457
+ get :image_test, facebook_params
437
458
  assert_equal "<img alt=\"Image\" src=\"http://root.example.com/images/image.png\" />",@response.body
438
459
  end
439
460
 
440
461
  def test_wants_interface_is_available_and_detects_method
441
- get :publisher_test, example_rails_params_including_fb.merge(:method=>"publisher_getInterface")
462
+ get :publisher_test, facebook_params(:method=>"publisher_getInterface")
442
463
  assert_equal "interface",@response.body
443
464
  end
444
465
  def test_wants_interface_is_available_and_detects_not_interface
445
- get :publisher_test, example_rails_params_including_fb.merge(:method=>"publisher_getFeedStory")
466
+ get :publisher_test, facebook_params(:method=>"publisher_getFeedStory")
446
467
  assert_equal "not interface",@response.body
447
468
  end
448
469
 
449
470
  def test_publisher_test_error
450
- get :publisher_test_error, example_rails_params_including_fb
451
- assert_equal JSON.parse("{\"errorCode\": 1, \"errorTitle\": \"Title\", \"errorMessage\": \"Body\"}"), JSON.parse(@response.body)
471
+ get :publisher_test_error, facebook_params
472
+ assert_equal Facebooker.json_decode("{\"errorCode\": 1, \"errorTitle\": \"Title\", \"errorMessage\": \"Body\"}"), Facebooker.json_decode(@response.body)
452
473
  end
453
474
 
454
475
  def test_publisher_test_interface
455
- get :publisher_test_interface, example_rails_params_including_fb
456
- assert_equal JSON.parse("{\"method\": \"publisher_getInterface\", \"content\": {\"fbml\": \"This is a test\", \"publishEnabled\": false, \"commentEnabled\": true}}"), JSON.parse(@response.body)
476
+ get :publisher_test_interface, facebook_params
477
+ assert_equal Facebooker.json_decode("{\"method\": \"publisher_getInterface\", \"content\": {\"fbml\": \"This is a test\", \"publishEnabled\": false, \"commentEnabled\": true}}"), Facebooker.json_decode(@response.body)
457
478
  end
458
479
 
459
480
  def test_publisher_test_reponse
460
- get :publisher_test_response, example_rails_params_including_fb
461
- assert_equal JSON.parse("{\"method\": \"publisher_getFeedStory\", \"content\": {\"feed\": {\"template_data\": {\"params\": true}, \"template_id\": 1234}}}"), JSON.parse(@response.body)
481
+ get :publisher_test_response, facebook_params
482
+ assert_equal Facebooker.json_decode("{\"method\": \"publisher_getFeedStory\", \"content\": {\"feed\": {\"template_data\": {\"params\": true}, \"template_id\": 1234}}}"), Facebooker.json_decode(@response.body)
462
483
 
463
484
  end
464
485
 
465
486
  private
466
- def example_rails_params_for_fb_connect
467
- {"action"=>"index", "controller"=>"controller_which_requires_facebook_authentication"}
468
- end
469
487
 
470
488
  def expired_cookie_hash_for_auth
471
489
  {"_ss" => "not_used", "_session_key"=> "whatever", "_user"=>"77777", "_expires"=>"#{1.day.ago.to_i}"}
@@ -475,13 +493,6 @@ class RailsIntegrationTest < Test::Unit::TestCase
475
493
  {"_ss" => "not_used", "_session_key"=> "whatever", "_user"=>"77777", "_expires"=>"#{1.day.from_now.to_i}"}
476
494
  end
477
495
 
478
- def example_rails_params_including_fb_for_user_not_logged_into_application
479
- {"fb_sig_time"=>"1186588275.5988", "fb_sig"=>"7371a6400329b229f800a5ecafe03b0a", "action"=>"index", "fb_sig_in_canvas"=>"1", "controller"=>"controller_which_requires_facebook_authentication", "fb_sig_added"=>"0", "fb_sig_api_key"=>"b6c9c857ac543ca806f4d3187cd05e09"}
480
- end
481
-
482
- def example_rails_params_including_fb
483
- {"fb_sig_time"=>"1186588275.5988", "fb_sig"=>"7371a6400329b229f800a5ecafe03b0a", "action"=>"index", "fb_sig_in_canvas"=>"1", "fb_sig_session_key"=>"c452b5d5d60cbd0a0da82021-744961110", "controller"=>"controller_which_requires_facebook_authentication", "fb_sig_expires"=>"0", "fb_sig_friends"=>"417358,702720,1001170,1530839,3300204,3501584,6217936,9627766,9700907,22701786,33902768,38914148,67400422,135301144,157200364,500103523,500104930,500870819,502149612,502664898,502694695,502852293,502985816,503254091,504510130,504611551,505421674,509229747,511075237,512548373,512830487,517893818,517961878,518890403,523589362,523826914,525812984,531555098,535310228,539339781,541137089,549405288,552706617,564393355,564481279,567640762,568091401,570201702,571469972,573863097,574415114,575543081,578129427,578520568,582262836,582561201,586550659,591631962,592318318,596269347,596663221,597405464,599764847,602995438,606661367,609761260,610544224,620049417,626087078,628803637,632686250,641422291,646763898,649678032,649925863,653288975,654395451,659079771,661794253,665861872,668960554,672481514,675399151,678427115,685772348,686821151,687686894,688506532,689275123,695551670,710631572,710766439,712406081,715741469,718976395,719246649,722747311,725327717,725683968,725831016,727580320,734151780,734595181,737944528,748881410,752244947,763868412,768578853,776596978,789728437,873695441", "fb_sig_added"=>"0", "fb_sig_api_key"=>"b6c9c857ac543ca806f4d3187cd05e09", "fb_sig_user"=>"744961110", "fb_sig_profile_update_time"=>"1180712453"}
484
- end
485
496
  end
486
497
 
487
498
 
@@ -498,7 +509,7 @@ class RailsSignatureTest < Test::Unit::TestCase
498
509
 
499
510
  def test_should_raise_too_old_for_replayed_session
500
511
  begin
501
- get :fb_params_test,example_rails_params_including_fb
512
+ get :fb_params_test, facebook_params('fb_sig_time' => Time.now.to_i - 49.hours)
502
513
  fail "No SignatureTooOld raised"
503
514
  rescue Facebooker::Session::SignatureTooOld=>e
504
515
  end
@@ -506,7 +517,7 @@ class RailsSignatureTest < Test::Unit::TestCase
506
517
 
507
518
  def test_should_raise_on_bad_sig
508
519
  begin
509
- get :fb_params_test,example_rails_params_including_fb("fb_sig"=>'incorrect')
520
+ get :fb_params_test, facebook_params.merge('fb_sig' => 'incorrect')
510
521
  fail "No IncorrectSignature raised"
511
522
  rescue Facebooker::Session::IncorrectSignature=>e
512
523
  end
@@ -514,14 +525,10 @@ class RailsSignatureTest < Test::Unit::TestCase
514
525
 
515
526
  def test_valid_signature
516
527
  @controller.expects(:earliest_valid_session).returns(Time.at(1186588275.5988)-1)
517
- get :fb_params_test,example_rails_params_including_fb
528
+ get :fb_params_test, facebook_params
518
529
 
519
530
  end
520
531
 
521
- def example_rails_params_including_fb(options={})
522
- {"fb_sig_time"=>"1186588275.5988", "fb_sig"=>"8d9e9dd2cb0742a5a2bfe35563134585", "action"=>"index", "fb_sig_in_canvas"=>"1", "fb_sig_session_key"=>"c452b5d5d60cbd0a0da82021-744961110", "controller"=>"controller_which_requires_facebook_authentication", "fb_sig_expires"=>"0", "fb_sig_friends"=>"417358,702720,1001170,1530839,3300204,3501584,6217936,9627766,9700907,22701786,33902768,38914148,67400422,135301144,157200364,500103523,500104930,500870819,502149612,502664898,502694695,502852293,502985816,503254091,504510130,504611551,505421674,509229747,511075237,512548373,512830487,517893818,517961878,518890403,523589362,523826914,525812984,531555098,535310228,539339781,541137089,549405288,552706617,564393355,564481279,567640762,568091401,570201702,571469972,573863097,574415114,575543081,578129427,578520568,582262836,582561201,586550659,591631962,592318318,596269347,596663221,597405464,599764847,602995438,606661367,609761260,610544224,620049417,626087078,628803637,632686250,641422291,646763898,649678032,649925863,653288975,654395451,659079771,661794253,665861872,668960554,672481514,675399151,678427115,685772348,686821151,687686894,688506532,689275123,695551670,710631572,710766439,712406081,715741469,718976395,719246649,722747311,725327717,725683968,725831016,727580320,734151780,734595181,737944528,748881410,752244947,763868412,768578853,776596978,789728437,873695441", "fb_sig_added"=>"0", "fb_sig_api_key"=>"b6c9c857ac543ca806f4d3187cd05e09", "fb_sig_user"=>"744961110", "fb_sig_profile_update_time"=>"1180712453"}.merge(options)
523
- end
524
-
525
532
  end
526
533
  class RailsHelperTest < Test::Unit::TestCase
527
534
  class HelperClass
@@ -939,6 +946,23 @@ class RailsHelperTest < Test::Unit::TestCase
939
946
  assert @h.init_fb_connect("XFBML").match(/XFBML/)
940
947
  end
941
948
 
949
+ def test_init_fb_connect_with_features_and_body
950
+ @h.expects(:capture).returns("Body Content")
951
+
952
+ @h.init_fb_connect("XFBML") do
953
+ end
954
+ assert @h.output_buffer =~ /Body Content/
955
+ end
956
+
957
+ def test_fb_login_and_redirect
958
+ assert_equal @h.fb_login_and_redirect("/path"),"<fb:login-button onlogin=\"window.location.href = &quot;/path&quot;;\"></fb:login-button>"
959
+ end
960
+
961
+ def test_fb_logout_link
962
+ assert_equal @h.fb_logout_link("Logout","My URL"),"<a href=\"#\" onclick=\"FB.Connect.logoutAndRedirect(&quot;My URL&quot;);; return false;\">Logout</a>"
963
+ end
964
+
965
+
942
966
  def test_fb_connect_javascript_tag
943
967
  assert_equal "<script src=\"http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php\" type=\"text/javascript\"></script>",
944
968
  @h.fb_connect_javascript_tag
@@ -978,6 +1002,16 @@ class RailsHelperTest < Test::Unit::TestCase
978
1002
  user=flexmock("user", :facebook_id => "5678")
979
1003
  assert_equal '<fb:user-status linked="false" uid="5678"></fb:user-status>',@h.fb_user_status(user,false)
980
1004
  end
1005
+
1006
+ def test_fb_time
1007
+ time = Time.now
1008
+ 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)
1009
+ end
1010
+
1011
+ def test_fb_time_defaults
1012
+ time = Time.now
1013
+ assert_equal %Q{<fb:time t="#{time.to_i}" />}, @h.fb_time(time)
1014
+ end
981
1015
  end
982
1016
  class TestModel
983
1017
  attr_accessor :name,:facebook_id
@@ -1061,32 +1095,43 @@ class RailsFacebookFormbuilderTest < Test::Unit::TestCase
1061
1095
  end
1062
1096
 
1063
1097
  class RailsPrettyErrorsTest < Test::Unit::TestCase
1098
+ class ControllerWhichFails < ActionController::Base
1099
+ def pass
1100
+ render :text=>''
1101
+ end
1102
+ def fail
1103
+ raise "I'm failing"
1104
+ end
1105
+ end
1106
+
1064
1107
  def setup
1065
- ENV['FACEBOOK_API_KEY'] = '1234567'
1066
- ENV['FACEBOOK_SECRET_KEY'] = '7654321'
1067
1108
  @controller = ControllerWhichFails.new
1068
1109
  @request = ActionController::TestRequest.new
1069
1110
  @response = ActionController::TestResponse.new
1070
- @controller.stubs(:verify_signature).returns(true)
1071
1111
  end
1072
1112
 
1073
- def test_pretty_errors
1074
- Facebooker.facebooker_config.stubs(:pretty_errors).returns(false)
1075
- post :pass, example_rails_params_including_fb
1076
- assert_response :success
1077
- post :fail, example_rails_params_including_fb
1078
- assert_response :error
1079
- Facebooker.facebooker_config.stubs(:pretty_errors).returns(true)
1080
- post :pass, example_rails_params_including_fb
1081
- assert_response :success
1082
- post :fail, example_rails_params_including_fb
1113
+ def test_pretty_errors_disabled_success
1114
+ Facebooker.facebooker_config.stubs(:[]).with('pretty_errors').returns(false)
1115
+ post :pass, facebook_params
1116
+ assert_response 200
1117
+ end
1118
+
1119
+ def test_pretty_errors_disabled_error
1120
+ Facebooker.facebooker_config.stubs(:[]).with('pretty_errors').returns(false)
1121
+ post :fail, facebook_params
1083
1122
  assert_response :error
1084
1123
  end
1085
- private
1086
- def example_rails_params_including_fb
1087
- {"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"}
1088
- end
1089
1124
 
1125
+ def test_pretty_errors_enabled_success
1126
+ Facebooker.facebooker_config.stubs(:[]).with('pretty_errors').returns(true)
1127
+ post :pass, facebook_params
1128
+ assert_response 200
1129
+ end
1130
+ def test_pretty_errors_enabled_error
1131
+ Facebooker.facebooker_config.stubs(:[]).with('pretty_errors').returns(true)
1132
+ post :fail, facebook_params
1133
+ assert_response 200
1134
+ end
1090
1135
  end
1091
1136
 
1092
1137
  class RailsUrlHelperExtensionsTest < Test::Unit::TestCase
@@ -1231,7 +1276,37 @@ class RailsUrlHelperExtensionsTest < Test::Unit::TestCase
1231
1276
 
1232
1277
  end
1233
1278
 
1279
+ class RailsRequestFormatTest < Test::Unit::TestCase
1280
+ class FacebookController < NoisyController
1281
+ def index
1282
+ respond_to do |format|
1283
+ format.html { render :text => 'html' }
1284
+ format.fbml { render :text => 'fbml' }
1285
+ format.fbjs { render :text => 'fbjs' }
1286
+ end
1287
+ end
1288
+ end
1289
+
1290
+ def setup
1291
+ @controller = FacebookController.new
1292
+ @request = ActionController::TestRequest.new
1293
+ @response = ActionController::TestResponse.new
1294
+ @controller.stubs(:verify_signature).returns(true)
1295
+ end
1296
+
1297
+ def test_responds_to_html_without_canvas
1298
+ get :index
1299
+ assert_equal 'html', @response.body
1300
+ end
1301
+
1302
+ def test_responds_to_fbml_in_canvas
1303
+ get :index, facebook_params(:fb_sig_in_canvas => '1')
1304
+ assert_equal 'fbml', @response.body
1305
+ end
1234
1306
 
1235
- # rescue LoadError
1236
- # $stderr.puts "Couldn't find action controller. That's OK. We'll skip it."
1307
+ def test_responds_to_fbjs_when_is_ajax
1308
+ get :index, facebook_params(:fb_sig_is_ajax => '1')
1309
+ assert_equal 'fbjs', @response.body
1310
+ end
1311
+
1237
1312
  end