facebooker 1.0.13 → 1.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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