cwninja-facebooker 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. data/CHANGELOG.txt +0 -0
  2. data/COPYING +19 -0
  3. data/History.txt +16 -0
  4. data/Manifest.txt +114 -0
  5. data/README +46 -0
  6. data/README.txt +81 -0
  7. data/Rakefile +76 -0
  8. data/TODO.txt +10 -0
  9. data/generators/facebook/facebook_generator.rb +14 -0
  10. data/generators/facebook/templates/config/facebooker.yml +46 -0
  11. data/generators/facebook/templates/public/javascripts/facebooker.js +106 -0
  12. data/generators/facebook_controller/USAGE +33 -0
  13. data/generators/facebook_controller/facebook_controller_generator.rb +40 -0
  14. data/generators/facebook_controller/templates/controller.rb +7 -0
  15. data/generators/facebook_controller/templates/functional_test.rb +11 -0
  16. data/generators/facebook_controller/templates/helper.rb +2 -0
  17. data/generators/facebook_controller/templates/view.fbml.erb +2 -0
  18. data/generators/facebook_controller/templates/view.html.erb +2 -0
  19. data/generators/facebook_publisher/facebook_publisher_generator.rb +14 -0
  20. data/generators/facebook_publisher/templates/create_facebook_templates.rb +15 -0
  21. data/generators/facebook_publisher/templates/publisher.rb +3 -0
  22. data/generators/facebook_scaffold/USAGE +27 -0
  23. data/generators/facebook_scaffold/facebook_scaffold_generator.rb +118 -0
  24. data/generators/facebook_scaffold/templates/controller.rb +93 -0
  25. data/generators/facebook_scaffold/templates/facebook_style.css +2579 -0
  26. data/generators/facebook_scaffold/templates/functional_test.rb +89 -0
  27. data/generators/facebook_scaffold/templates/helper.rb +2 -0
  28. data/generators/facebook_scaffold/templates/layout.fbml.erb +6 -0
  29. data/generators/facebook_scaffold/templates/layout.html.erb +17 -0
  30. data/generators/facebook_scaffold/templates/style.css +74 -0
  31. data/generators/facebook_scaffold/templates/view_edit.fbml.erb +13 -0
  32. data/generators/facebook_scaffold/templates/view_edit.html.erb +18 -0
  33. data/generators/facebook_scaffold/templates/view_index.fbml.erb +24 -0
  34. data/generators/facebook_scaffold/templates/view_index.html.erb +24 -0
  35. data/generators/facebook_scaffold/templates/view_new.fbml.erb +12 -0
  36. data/generators/facebook_scaffold/templates/view_new.html.erb +17 -0
  37. data/generators/facebook_scaffold/templates/view_show.fbml.erb +10 -0
  38. data/generators/facebook_scaffold/templates/view_show.html.erb +10 -0
  39. data/generators/publisher/publisher_generator.rb +14 -0
  40. data/generators/xd_receiver/templates/xd_receiver.html +10 -0
  41. data/generators/xd_receiver/xd_receiver_generator.rb +9 -0
  42. data/init.rb +70 -0
  43. data/install.rb +12 -0
  44. data/lib/facebooker.rb +160 -0
  45. data/lib/facebooker/adapters/adapter_base.rb +87 -0
  46. data/lib/facebooker/adapters/bebo_adapter.rb +75 -0
  47. data/lib/facebooker/adapters/facebook_adapter.rb +48 -0
  48. data/lib/facebooker/admin.rb +28 -0
  49. data/lib/facebooker/batch_request.rb +44 -0
  50. data/lib/facebooker/data.rb +57 -0
  51. data/lib/facebooker/feed.rb +78 -0
  52. data/lib/facebooker/logging.rb +51 -0
  53. data/lib/facebooker/model.rb +123 -0
  54. data/lib/facebooker/models/affiliation.rb +10 -0
  55. data/lib/facebooker/models/album.rb +11 -0
  56. data/lib/facebooker/models/applicationproperties.rb +39 -0
  57. data/lib/facebooker/models/cookie.rb +10 -0
  58. data/lib/facebooker/models/education_info.rb +11 -0
  59. data/lib/facebooker/models/event.rb +26 -0
  60. data/lib/facebooker/models/friend_list.rb +14 -0
  61. data/lib/facebooker/models/group.rb +35 -0
  62. data/lib/facebooker/models/info_item.rb +10 -0
  63. data/lib/facebooker/models/info_section.rb +10 -0
  64. data/lib/facebooker/models/location.rb +8 -0
  65. data/lib/facebooker/models/notifications.rb +17 -0
  66. data/lib/facebooker/models/page.rb +27 -0
  67. data/lib/facebooker/models/photo.rb +10 -0
  68. data/lib/facebooker/models/tag.rb +12 -0
  69. data/lib/facebooker/models/user.rb +369 -0
  70. data/lib/facebooker/models/work_info.rb +9 -0
  71. data/lib/facebooker/parser.rb +547 -0
  72. data/lib/facebooker/rails/controller.rb +280 -0
  73. data/lib/facebooker/rails/facebook_asset_path.rb +18 -0
  74. data/lib/facebooker/rails/facebook_form_builder.rb +112 -0
  75. data/lib/facebooker/rails/facebook_pretty_errors.rb +14 -0
  76. data/lib/facebooker/rails/facebook_request_fix.rb +24 -0
  77. data/lib/facebooker/rails/facebook_session_handling.rb +69 -0
  78. data/lib/facebooker/rails/facebook_url_helper.rb +191 -0
  79. data/lib/facebooker/rails/facebook_url_rewriting.rb +39 -0
  80. data/lib/facebooker/rails/helpers.rb +642 -0
  81. data/lib/facebooker/rails/helpers/fb_connect.rb +34 -0
  82. data/lib/facebooker/rails/profile_publisher_extensions.rb +42 -0
  83. data/lib/facebooker/rails/publisher.rb +511 -0
  84. data/lib/facebooker/rails/routing.rb +49 -0
  85. data/lib/facebooker/rails/test_helpers.rb +88 -0
  86. data/lib/facebooker/rails/utilities.rb +22 -0
  87. data/lib/facebooker/server_cache.rb +24 -0
  88. data/lib/facebooker/service.rb +83 -0
  89. data/lib/facebooker/session.rb +564 -0
  90. data/lib/facebooker/version.rb +9 -0
  91. data/lib/net/http_multipart_post.rb +123 -0
  92. data/lib/tasks/facebooker.rake +18 -0
  93. data/lib/tasks/tunnel.rake +46 -0
  94. data/rails/init.rb +1 -0
  95. data/setup.rb +1585 -0
  96. data/templates/layout.erb +24 -0
  97. data/test/adapters_test.rb +98 -0
  98. data/test/batch_request_test.rb +82 -0
  99. data/test/event_test.rb +15 -0
  100. data/test/facebook_admin_test.rb +76 -0
  101. data/test/facebook_cache_test.rb +44 -0
  102. data/test/facebook_data_test.rb +86 -0
  103. data/test/facebooker_test.rb +855 -0
  104. data/test/fixtures/multipart_post_body_with_only_parameters.txt +33 -0
  105. data/test/fixtures/multipart_post_body_with_single_file.txt +38 -0
  106. data/test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt +38 -0
  107. data/test/http_multipart_post_test.rb +54 -0
  108. data/test/logging_test.rb +43 -0
  109. data/test/model_test.rb +91 -0
  110. data/test/publisher_test.rb +458 -0
  111. data/test/rails_integration_test.rb +1221 -0
  112. data/test/session_test.rb +613 -0
  113. data/test/test_helper.rb +60 -0
  114. data/test/user_test.rb +270 -0
  115. metadata +185 -0
@@ -0,0 +1,33 @@
1
+ --MichaelNiessnerIsSuperDuperAwesome
2
+ Content-Disposition: form-data; name="aid"
3
+
4
+ 940915667462717
5
+ --MichaelNiessnerIsSuperDuperAwesome
6
+ Content-Disposition: form-data; name="api_key"
7
+
8
+ 77a52842357422fadd912a2600e6e53c
9
+ --MichaelNiessnerIsSuperDuperAwesome
10
+ Content-Disposition: form-data; name="call_id"
11
+
12
+ 1172623588.023010
13
+ --MichaelNiessnerIsSuperDuperAwesome
14
+ Content-Disposition: form-data; name="caption"
15
+
16
+ Under the sunset
17
+ --MichaelNiessnerIsSuperDuperAwesome
18
+ Content-Disposition: form-data; name="method"
19
+
20
+ facebook.photos.upload
21
+ --MichaelNiessnerIsSuperDuperAwesome
22
+ Content-Disposition: form-data; name="session_key"
23
+
24
+ 489727d0ab2efc6e8003018c-i2LLkn8BDb2s.
25
+ --MichaelNiessnerIsSuperDuperAwesome
26
+ Content-Disposition: form-data; name="sig"
27
+
28
+ dfa724b8a5cd97d9df4baf2b60d3484c
29
+ --MichaelNiessnerIsSuperDuperAwesome
30
+ Content-Disposition: form-data; name="v"
31
+
32
+ 1.0
33
+ --MichaelNiessnerIsSuperDuperAwesome--
@@ -0,0 +1,38 @@
1
+ --MichaelNiessnerIsSuperDuperAwesome
2
+ Content-Disposition: form-data; name="aid"
3
+
4
+ 940915667462717
5
+ --MichaelNiessnerIsSuperDuperAwesome
6
+ Content-Disposition: form-data; name="api_key"
7
+
8
+ 77a52842357422fadd912a2600e6e53c
9
+ --MichaelNiessnerIsSuperDuperAwesome
10
+ Content-Disposition: form-data; name="call_id"
11
+
12
+ 1172623588.023010
13
+ --MichaelNiessnerIsSuperDuperAwesome
14
+ Content-Disposition: form-data; name="caption"
15
+
16
+ Under the sunset
17
+ --MichaelNiessnerIsSuperDuperAwesome
18
+ Content-Disposition: form-data; name="method"
19
+
20
+ facebook.photos.upload
21
+ --MichaelNiessnerIsSuperDuperAwesome
22
+ Content-Disposition: form-data; name="session_key"
23
+
24
+ 489727d0ab2efc6e8003018c-i2LLkn8BDb2s.
25
+ --MichaelNiessnerIsSuperDuperAwesome
26
+ Content-Disposition: form-data; name="sig"
27
+
28
+ dfa724b8a5cd97d9df4baf2b60d3484c
29
+ --MichaelNiessnerIsSuperDuperAwesome
30
+ Content-Disposition: form-data; name="v"
31
+
32
+ 1.0
33
+ --MichaelNiessnerIsSuperDuperAwesome
34
+ Content-Disposition: form-data; name="file"; filename="somefilename.jpg"
35
+ Content-Type: image/jpg
36
+
37
+ [Raw file data here]
38
+ --MichaelNiessnerIsSuperDuperAwesome--
@@ -0,0 +1,38 @@
1
+ --MichaelNiessnerIsSuperDuperAwesome
2
+ Content-Disposition: form-data; name="aid"
3
+
4
+ 940915667462717
5
+ --MichaelNiessnerIsSuperDuperAwesome
6
+ Content-Disposition: form-data; name="api_key"
7
+
8
+ 77a52842357422fadd912a2600e6e53c
9
+ --MichaelNiessnerIsSuperDuperAwesome
10
+ Content-Disposition: form-data; name="call_id"
11
+
12
+ 1172623588.023010
13
+ --MichaelNiessnerIsSuperDuperAwesome
14
+ Content-Disposition: form-data; name="caption"
15
+
16
+ Under the sunset
17
+ --MichaelNiessnerIsSuperDuperAwesome
18
+ Content-Disposition: form-data; name="method"
19
+
20
+ facebook.photos.upload
21
+ --MichaelNiessnerIsSuperDuperAwesome
22
+ Content-Disposition: form-data; name="session_key"
23
+
24
+ 489727d0ab2efc6e8003018c-i2LLkn8BDb2s.
25
+ --MichaelNiessnerIsSuperDuperAwesome
26
+ Content-Disposition: form-data; name="sig"
27
+
28
+ dfa724b8a5cd97d9df4baf2b60d3484c
29
+ --MichaelNiessnerIsSuperDuperAwesome
30
+ Content-Disposition: form-data; name="v"
31
+
32
+ 1.0
33
+ --MichaelNiessnerIsSuperDuperAwesome
34
+ Content-Disposition: form-data; filename="somefilename.jpg"
35
+ Content-Type: image/jpg
36
+
37
+ [Raw file data here]
38
+ --MichaelNiessnerIsSuperDuperAwesome--
@@ -0,0 +1,54 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+ require 'rubygems'
3
+ require 'flexmock/test_unit'
4
+ require 'net/http_multipart_post'
5
+
6
+ class HttpMulitpartPostTest < Test::Unit::TestCase
7
+ def setup
8
+ super
9
+ end
10
+
11
+ def fixture(string)
12
+ File.open(File.dirname(__FILE__) + "/fixtures/#{string}.txt").read
13
+ end
14
+
15
+ def test_multipart_post_with_only_parameters
16
+ params = add_sample_facebook_params({})
17
+ post = Net::HTTP::MultipartPost.new("uri", params)
18
+ assert_equal fixture("multipart_post_body_with_only_parameters"), post.send(:body)
19
+ end
20
+
21
+ def test_multipart_post_with_a_single_file
22
+ params = add_sample_facebook_params({})
23
+ params[:file] = Net::HTTP::MultipartPostFile.new
24
+ params[:file].filename = "somefilename.jpg"
25
+ params[:file].content_type = "image/jpg"
26
+ params[:file].data = "[Raw file data here]"
27
+ post = Net::HTTP::MultipartPost.new("uri", params)
28
+ assert_equal fixture("multipart_post_body_with_single_file"), post.send(:body)
29
+ end
30
+
31
+ def test_multipart_post_with_a_single_file_parameter_that_has_nil_key
32
+ params = add_sample_facebook_params({})
33
+ params[nil] = Net::HTTP::MultipartPostFile.new("somefilename.jpg", "image/jpg", "[Raw file data here]")
34
+ post = Net::HTTP::MultipartPost.new("uri", params)
35
+ assert_equal fixture("multipart_post_body_with_single_file_that_has_nil_key"), post.send(:body)
36
+ end
37
+
38
+ def test_multipart_post_should_have_correct_content_type
39
+ post = Net::HTTP::MultipartPost.new("uri", {})
40
+ assert post.send(:content_type) =~ /multipart\/form-data; boundary=/
41
+ end
42
+
43
+ def add_sample_facebook_params(hash)
44
+ hash[:method] = "facebook.photos.upload"
45
+ hash[:v] = "1.0"
46
+ hash[:api_key] = "77a52842357422fadd912a2600e6e53c"
47
+ hash[:session_key] = "489727d0ab2efc6e8003018c-i2LLkn8BDb2s."
48
+ hash[:call_id] = "1172623588.023010"
49
+ hash[:caption] = "Under the sunset"
50
+ hash[:aid] = "940915667462717"
51
+ hash[:sig] = "dfa724b8a5cd97d9df4baf2b60d3484c"
52
+ hash
53
+ end
54
+ end
@@ -0,0 +1,43 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+
4
+ class LoggingTest < Test::Unit::TestCase
5
+ def setup
6
+ super
7
+ Facebooker.logger = Logger.new(STDERR)
8
+ Facebooker::Logging.skip_api_logging=false
9
+ end
10
+ def teardown
11
+ Facebooker.logger = nil
12
+ super
13
+ end
14
+
15
+ def test_does_not_crash_with_nil_logger
16
+ Facebooker.logger = nil
17
+ Facebooker::Logging.log_fb_api('sample.api.call',
18
+ {'param1' => true, 'param2' => 'value2'})
19
+ end
20
+
21
+ def test_does_not_crash_outside_rails
22
+ flexmock(Facebooker.logger, :logger).should_receive(:debug).once.with(String)
23
+ Facebooker::Logging.log_fb_api('sample.api.call',
24
+ {'param1' => true, 'param2' => 'value2'})
25
+ end
26
+
27
+ def test_can_disable_logging
28
+ Facebooker::Logging.skip_api_logging = true
29
+ flexmock(Facebooker::Logging).should_receive(:log_info).never
30
+ Facebooker::Logging.log_fb_api('sample.api.call',
31
+ {'param1' => true, 'param2' => 'value2'})
32
+ end
33
+
34
+ def test_plain_format
35
+ flexmock(Facebooker.logger, :logger).should_receive(:debug).once.with(
36
+ 'sample.api.call (0) param1 = true')
37
+ Facebooker::Logging.log_fb_api('sample.api.call',
38
+ {'param1' => true})
39
+ ensure
40
+ Facebooker.logger = nil
41
+ end
42
+
43
+ end
@@ -0,0 +1,91 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+ require 'rubygems'
3
+ require 'flexmock/test_unit'
4
+
5
+ class TestFacebooker < Test::Unit::TestCase
6
+
7
+ class ComplexThing
8
+ include Facebooker::Model
9
+ attr_accessor :weight, :height
10
+ end
11
+
12
+ class Thing
13
+ include Facebooker::Model
14
+ attr_accessor :name, :job
15
+ hash_settable_accessor :complex_thing, ComplexThing
16
+ hash_settable_list_accessor :list_of_complex_things, ComplexThing
17
+ end
18
+
19
+ class PopulatingThing
20
+ include Facebooker::Model
21
+ populating_attr_accessor :first_name
22
+ end
23
+
24
+ def test_can_instantiate_an_object_with_a_hash
25
+ h = {:name => "Blob", :job => "Monster"}
26
+ assert_equal("Blob", Thing.from_hash(h).name)
27
+ end
28
+
29
+ def test_ignores_non_model_keys
30
+ h = {:name => "Blob", :job => "Monster", :not_there=>true}
31
+ assert_equal("Blob", Thing.from_hash(h).name)
32
+ end
33
+
34
+ def test_logs_non_model_keys
35
+ flexmock(Facebooker::Logging).should_receive(:log_info)
36
+ h = {:name => "Blob", :job => "Monster", :not_there=>true}
37
+ Thing.from_hash(h)
38
+ end
39
+
40
+
41
+ def test_if_no_hash_is_given_to_model_constructor_no_attributes_are_set
42
+ assert_nothing_raised {
43
+ t = Thing.new
44
+ assert_nil(t.name)
45
+ }
46
+ end
47
+
48
+ def test_can_declare_hash_settable_attributes
49
+ t = Thing.new({})
50
+ t.complex_thing = {:weight => 123, :height => 5.4}
51
+ assert_equal(123, t.complex_thing.weight)
52
+ t.complex_thing = ComplexThing.new(:weight => 321)
53
+ assert_equal(321, t.complex_thing.weight)
54
+ end
55
+
56
+ def test_can_declare_attributes_which_are_settable_via_a_list_of_hashes
57
+ t = Thing.new
58
+ t.list_of_complex_things = [{:weight => 444, :height => 123.0}, {:weight => 222, :height => 321.1}]
59
+ assert_equal("123.0, 321.1", t.list_of_complex_things.map{|ct| ct.height.to_s}.sort.join(', '))
60
+ t.list_of_complex_things = [ComplexThing.new(:weight => 555), ComplexThing.new(:weight => 111)]
61
+ assert_equal("111, 555", t.list_of_complex_things.map{|ct| ct.weight.to_s}.sort.join(', '))
62
+ end
63
+
64
+ def test_if_you_try_to_use_a_models_session_without_initializing_it_first_you_get_a_descriptive_error
65
+ t = Thing.new
66
+ assert_raises(Facebooker::Model::UnboundSessionException) {
67
+ t.session
68
+ }
69
+ end
70
+
71
+ def test_populating_reader_will_call_populate_if_model_was_not_previously_populated
72
+ t = PopulatingThing.new
73
+ flexmock(t).should_receive(:populate).once
74
+ t.first_name
75
+ end
76
+
77
+ def test_populating_reader_will_not_call_populate_if_model_was_previously_populated
78
+ t = PopulatingThing.new
79
+ flexmock(t).should_receive(:populated?).and_return(true)
80
+ flexmock(t).should_receive(:populate).never
81
+ t.first_name
82
+ end
83
+
84
+ def test_attempting_to_access_a_populating_reader_will_raise_an_exception_if_populate_was_not_defined
85
+ t = PopulatingThing.new
86
+ assert_raises(NotImplementedError) {
87
+ t.first_name
88
+ }
89
+ end
90
+ end
91
+
@@ -0,0 +1,458 @@
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
+
13
+
14
+ module SymbolHelper
15
+ def symbol_helper_loaded
16
+ true
17
+ end
18
+ end
19
+
20
+ module ModuleHelper
21
+ def module_helper_loaded
22
+ true
23
+ end
24
+ end
25
+
26
+ ::RAILS_DEFAULT_LOGGER = Logger.new(STDOUT)
27
+
28
+ class TestPublisher < Facebooker::Rails::Publisher
29
+
30
+ helper :symbol
31
+ helper ModuleHelper
32
+
33
+ def action(f)
34
+ send_as :action
35
+ from f
36
+ title "Action Title"
37
+ end
38
+
39
+ def templatized_action(f)
40
+ send_as :templatized_action
41
+ from f
42
+ title_template "Templatized Action Title"
43
+ end
44
+
45
+ def story(to)
46
+ send_as :story
47
+ recipients to
48
+ title 'Story Title'
49
+ end
50
+
51
+ def notification(to,f)
52
+ send_as :notification
53
+ recipients to
54
+ from f
55
+ fbml "Not"
56
+ end
57
+
58
+ def email(to,f)
59
+ send_as :email
60
+ recipients to
61
+ from f
62
+ title "Email"
63
+ fbml 'text'
64
+ text fbml
65
+ end
66
+
67
+ def render_notification(to,f)
68
+ send_as :notification
69
+ recipients to
70
+ from f
71
+ fbml render(:inline=>"<%=module_helper_loaded%>")
72
+ end
73
+
74
+
75
+ def profile_update(to,f)
76
+ send_as :profile
77
+ recipients to
78
+ profile "profile"
79
+ profile_action "profile_action"
80
+ mobile_profile "mobile_profile"
81
+
82
+ end
83
+
84
+ def profile_update_with_profile_main(to,f)
85
+ send_as :profile
86
+ recipients to
87
+ from f
88
+ profile "profile"
89
+ profile_action "profile_action"
90
+ mobile_profile "mobile_profile"
91
+ profile_main "profile_main"
92
+ end
93
+
94
+ def ref_update(user)
95
+ send_as :ref
96
+ fbml "fbml"
97
+ handle "handle"
98
+ end
99
+
100
+ def user_action_template
101
+ one_line_story_template "{*actor*} did stuff with {*friend*}"
102
+ short_story_template "{*actor*} has a title {*friend*}", render(:inline=>"This is a test render")
103
+ full_story_template "{*actor*} did a lot","This is the full body",:img=>{:some_params=>true}
104
+ end
105
+
106
+ def simple_user_action_template
107
+ one_line_story_template "{*actor*} did stuff with {*friend*}"
108
+ end
109
+
110
+ def user_action_with_action_links_template
111
+ one_line_story_template "{*actor*} did stuff with {*friend*}"
112
+ short_story_template "{*actor*} has a title {*friend*}", render(:inline=>"This is a test render")
113
+ full_story_template "{*actor*} did a lot","This is the full body",:img=>{:some_params=>true}
114
+ action_links action_link("Source","HREF")
115
+ end
116
+
117
+ def user_action(user)
118
+ send_as :user_action
119
+ from user
120
+ data :friend=>"Mike"
121
+ end
122
+ def user_action_with_story_size(user)
123
+ send_as :user_action
124
+ from user
125
+ story_size ONE_LINE
126
+ story_size FULL
127
+ story_size SHORT
128
+ data :friend=>"Mike"
129
+ end
130
+ def user_action_no_data(user)
131
+ send_as :user_action
132
+ from user
133
+ end
134
+
135
+ def no_send_as(to)
136
+ recipients to
137
+ end
138
+
139
+ def invalid_send_as(to)
140
+ send_as :fake
141
+ recipients to
142
+ end
143
+
144
+ end
145
+
146
+ class FacebookTemplateTest < Test::Unit::TestCase
147
+ FacebookTemplate = Facebooker::Rails::Publisher::FacebookTemplate
148
+
149
+ def setup
150
+ super
151
+ @template = mock("facebook template")
152
+ FacebookTemplate.stubs(:register).returns(@template)
153
+ FacebookTemplate.clear_cache!
154
+ end
155
+
156
+ def test_find_or_register_calls_find_cached
157
+ FacebookTemplate.expects(:find_cached).with(TestPublisher,"simple_user_action").returns(@template)
158
+ assert_equal FacebookTemplate.for_class_and_method(TestPublisher,"simple_user_action"),@template
159
+ end
160
+
161
+ def test_find_cached_should_use_cached_if_it_exists
162
+ FacebookTemplate.cache(TestPublisher,"simple_user_action",@template)
163
+ assert_equal FacebookTemplate.find_cached(TestPublisher,"simple_user_action"), @template
164
+
165
+ end
166
+
167
+ def test_find_cached_should_call_find_in_db_if_not_in_cache
168
+ FacebookTemplate.expects(:find_in_db).with(TestPublisher,"simple_user_action").returns(@template)
169
+ assert_equal FacebookTemplate.find_cached(TestPublisher,"simple_user_action"), @template
170
+ end
171
+
172
+ def test_find_in_db_should_run_find
173
+ FacebookTemplate.expects(:find_by_template_name).with("TestPublisher::simple_user_action").returns(@template)
174
+ @template.stubs(:template_changed?).returns(false)
175
+ assert_equal FacebookTemplate.find_in_db(TestPublisher,"simple_user_action"), @template
176
+ end
177
+
178
+ def test_find_in_db_should_register_if_not_found
179
+ FacebookTemplate.expects(:find_by_template_name).with("TestPublisher::simple_user_action").returns(nil)
180
+ FacebookTemplate.expects(:register).with(TestPublisher,"simple_user_action").returns(@template)
181
+ FacebookTemplate.find_cached(TestPublisher,"simple_user_action")
182
+
183
+ end
184
+
185
+ def test_find_in_db_should_check_for_change_if_found
186
+ FacebookTemplate.stubs(:find_by_template_name).returns(@template)
187
+ FacebookTemplate.stubs(:hashed_content).returns("MY CONTENT")
188
+ @template.expects(:template_changed?).with("MY CONTENT").returns(false)
189
+ FacebookTemplate.find_in_db(TestPublisher,"simple_user_action")
190
+ end
191
+
192
+ def test_find_in_db_should_destroy_old_record_if_changed
193
+ FacebookTemplate.stubs(:find_by_template_name).returns(@template)
194
+ FacebookTemplate.stubs(:hashed_content).returns("MY CONTENT")
195
+ @template.stubs(:template_changed?).returns(true)
196
+ @template.expects(:destroy)
197
+ FacebookTemplate.find_in_db(TestPublisher,"simple_user_action")
198
+ end
199
+
200
+ def test_find_in_db_should_re_register_if_changed
201
+ FacebookTemplate.stubs(:find_by_template_name).with("TestPublisher::simple_user_action").returns(@template)
202
+ FacebookTemplate.stubs(:hashed_content).returns("MY CONTENT")
203
+ @template.stubs(:template_changed?).returns(true)
204
+ @template.stubs(:destroy)
205
+ FacebookTemplate.expects(:register).with(TestPublisher,"simple_user_action").returns(@template)
206
+ FacebookTemplate.find_in_db(TestPublisher,"simple_user_action")
207
+ end
208
+ end
209
+
210
+ class PublisherTest < Test::Unit::TestCase
211
+ FacebookTemplate = Facebooker::Rails::Publisher::FacebookTemplate
212
+
213
+ def setup
214
+ super
215
+ @user = Facebooker::User.new
216
+ @user.id=4
217
+ @session = "session"
218
+ @user.stubs(:session).returns(@session)
219
+ end
220
+
221
+ def teardown
222
+ super
223
+ end
224
+
225
+ def test_create_action
226
+ action=TestPublisher.create_action(@user)
227
+ assert_equal Facebooker::Feed::Action,action.class
228
+ assert_equal "Action Title",action.title
229
+ end
230
+
231
+ def test_deliver_action
232
+ @user.expects(:publish_action)
233
+ TestPublisher.deliver_action(@user)
234
+ end
235
+
236
+ def test_create_story
237
+ action=TestPublisher.create_story(@user)
238
+ assert_equal Facebooker::Feed::Story,action.class
239
+ assert_equal "Story Title",action.title
240
+ end
241
+
242
+ def test_deliver_story
243
+ @user.expects(:publish_story)
244
+ TestPublisher.deliver_story(@user)
245
+ end
246
+
247
+ def test_create_notification
248
+ notification=TestPublisher.create_notification(12451752,@user)
249
+ assert_equal Facebooker::Rails::Publisher::Notification,notification.class
250
+ assert_equal "Not",notification.fbml
251
+ end
252
+
253
+ def test_deliver_notification
254
+ @session.expects(:send_notification)
255
+ TestPublisher.deliver_notification("12451752",@user)
256
+ end
257
+
258
+ def test_create_email
259
+ email=TestPublisher.create_email("12451752",@user)
260
+ assert_equal Facebooker::Rails::Publisher::Email,email.class
261
+ assert_equal "Email",email.title
262
+ assert_equal "text",email.text
263
+ assert_equal "text",email.fbml
264
+ end
265
+
266
+ def test_deliver_email
267
+ @session.expects(:send_email)
268
+ TestPublisher.deliver_email("12451752",@user)
269
+ end
270
+
271
+ def test_create_templatized_action
272
+ ta=TestPublisher.create_templatized_action(@user)
273
+ assert_equal Facebooker::Feed::TemplatizedAction,ta.class
274
+ assert_equal "Templatized Action Title",ta.title_template
275
+
276
+ end
277
+
278
+
279
+
280
+ def test_deliver_templatized_action
281
+ @user.expects(:publish_action)
282
+ TestPublisher.deliver_templatized_action(@user)
283
+ end
284
+ def test_create_profile_update
285
+ p=TestPublisher.create_profile_update(@user,@user)
286
+ assert_equal Facebooker::Rails::Publisher::Profile,p.class
287
+ assert_equal "profile",p.profile
288
+ assert_equal "profile_action",p.profile_action
289
+ assert_equal "mobile_profile",p.mobile_profile
290
+ end
291
+ def test_create_profile_update_with_profile_main
292
+ p=TestPublisher.create_profile_update_with_profile_main(@user,@user)
293
+ assert_equal Facebooker::Rails::Publisher::Profile,p.class
294
+ assert_equal "profile",p.profile
295
+ assert_equal "profile_action",p.profile_action
296
+ assert_equal "mobile_profile",p.mobile_profile
297
+ assert_equal "profile_main",p.profile_main
298
+ end
299
+
300
+
301
+ def test_deliver_profile
302
+ Facebooker::User.stubs(:new).returns(@user)
303
+ @user.expects(:set_profile_fbml).with('profile', 'mobile_profile', 'profile_action',nil)
304
+ TestPublisher.deliver_profile_update(@user,@user)
305
+ end
306
+
307
+ def test_deliver_profile_with_main
308
+ Facebooker::User.stubs(:new).returns(@user)
309
+ @user.expects(:set_profile_fbml).with('profile', 'mobile_profile', 'profile_action','profile_main')
310
+ TestPublisher.deliver_profile_update_with_profile_main(@user,@user)
311
+ end
312
+
313
+
314
+ def test_create_ref_update
315
+ p=TestPublisher.create_ref_update(@user)
316
+ assert_equal Facebooker::Rails::Publisher::Ref,p.class
317
+ assert_equal "fbml",p.fbml
318
+ assert_equal "handle",p.handle
319
+ end
320
+
321
+ def test_deliver_ref_update
322
+ Facebooker::Session.stubs(:create).returns(@session)
323
+ @server_cache="server_cache"
324
+ @session.expects(:server_cache).returns(@server_cache)
325
+ @server_cache.expects(:set_ref_handle).with("handle","fbml")
326
+ TestPublisher.deliver_ref_update(@user)
327
+ end
328
+
329
+ def test_register_user_action
330
+ Facebooker::Rails::Publisher::FacebookTemplate.expects(:register)
331
+ TestPublisher.register_user_action
332
+ end
333
+ def test_register_user_action_with_action_links
334
+ ActionController::Base.append_view_path("./test/../../app/views")
335
+ Facebooker::Rails::Publisher::FacebookTemplate.expects(:register)
336
+ TestPublisher.register_user_action_with_action_links
337
+ end
338
+
339
+ def test_create_user_action
340
+ @from_user = Facebooker::User.new
341
+ @session = Facebooker::Session.new("","")
342
+ @from_user.stubs(:session).returns(@session)
343
+ Facebooker::Rails::Publisher::FacebookTemplate.expects(:bundle_id_for_class_and_method).
344
+ with(TestPublisher,'user_action').
345
+ returns(20309041537)
346
+ ua = TestPublisher.create_user_action(@from_user)
347
+ assert_equal "user_action", ua.template_name
348
+ end
349
+
350
+ def test_publisher_user_action
351
+ @from_user = Facebooker::User.new
352
+ @session = Facebooker::Session.new("","")
353
+ @from_user.stubs(:session).returns(@session)
354
+ @session.expects(:publish_user_action).with(20309041537,{:friend=>"Mike"},nil,nil)
355
+
356
+ Facebooker::Rails::Publisher::FacebookTemplate.expects(:bundle_id_for_class_and_method).
357
+ with(TestPublisher, 'user_action').
358
+ returns(20309041537)
359
+ # pseudo_template = Struct.new(:bundle_id, :content_hash).new(20309041537, '')
360
+ # pseudo_template.expects(:matches_content?).returns(true)
361
+ # Facebooker::Rails::Publisher::FacebookTemplate.expects(:for).returns(pseudo_template)
362
+ TestPublisher.deliver_user_action(@from_user)
363
+ end
364
+
365
+ def test_publish_user_action_with_story_size
366
+ @from_user = Facebooker::User.new
367
+ @session = Facebooker::Session.new("","")
368
+ @from_user.stubs(:session).returns(@session)
369
+ @session.expects(:publish_user_action).with(20309041537,{:friend=>"Mike", :story_size=>2},nil,nil)
370
+
371
+ Facebooker::Rails::Publisher::FacebookTemplate.expects(:bundle_id_for_class_and_method).
372
+ with(TestPublisher, 'user_action_with_story_size').
373
+ returns(20309041537)
374
+ TestPublisher.deliver_user_action_with_story_size(@from_user)
375
+
376
+ end
377
+
378
+ def test_publishing_user_data_no_action_gives_nil_hash
379
+ @from_user = Facebooker::User.new
380
+ @session = Facebooker::Session.new("","")
381
+ @from_user.stubs(:session).returns(@session)
382
+ @session.expects(:publish_user_action).with(20309041537,{},nil,nil)
383
+
384
+ Facebooker::Rails::Publisher::FacebookTemplate.stubs(:bundle_id_for_class_and_method).returns(20309041537)
385
+ TestPublisher.deliver_user_action_no_data(@from_user)
386
+ end
387
+ def test_no_sends_as_raises
388
+ assert_raises(Facebooker::Rails::Publisher::UnspecifiedBodyType) {
389
+ TestPublisher.deliver_no_send_as(@user)
390
+ }
391
+ end
392
+
393
+ def test_invalid_send_as_raises
394
+ assert_raises(Facebooker::Rails::Publisher::UnknownBodyType) {
395
+ TestPublisher.deliver_invalid_send_as(@user)
396
+ }
397
+ end
398
+
399
+
400
+ def test_keeps_class_method_missing
401
+ assert_raises(NoMethodError) {
402
+ TestPublisher.fake
403
+ }
404
+ end
405
+ def test_keeps_instance_method_missing
406
+ assert_raises(NoMethodError) {
407
+ TestPublisher.new.fake
408
+ }
409
+ end
410
+
411
+ def test_image_urls
412
+ 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}))
417
+ end
418
+
419
+ def test_action_link
420
+ assert_equal({:text=>"text", :href=>"href"}, TestPublisher.new.action_link("text","href"))
421
+ end
422
+
423
+ def test_default_url_options
424
+ Facebooker.expects(:facebook_path_prefix).returns("/mike")
425
+ assert_equal({:host=>"apps.facebook.com/mike"},TestPublisher.default_url_options)
426
+ end
427
+
428
+ def test_recipients
429
+ tp=TestPublisher.new
430
+ tp.recipients "a"
431
+ assert_equal("a",tp.recipients)
432
+ end
433
+
434
+ def test_symbol_helper
435
+ assert TestPublisher.new.symbol_helper_loaded
436
+ end
437
+ def test_module_helper
438
+ assert TestPublisher.new.module_helper_loaded
439
+ end
440
+
441
+ def test_with_render
442
+ #normally Rails would do this for us
443
+ if ActionController::Base.respond_to?(:append_view_path)
444
+ ActionController::Base.append_view_path("./test/../../app/views")
445
+ end
446
+ notification=TestPublisher.create_render_notification(12451752,@user)
447
+ assert_equal "true",notification.fbml
448
+ end
449
+
450
+ def test_notification_as_announcement
451
+ #normally Rails would do this for us
452
+ if ActionController::Base.respond_to?(:append_view_path)
453
+ ActionController::Base.append_view_path("./test/../../app/views")
454
+ end
455
+ notification=TestPublisher.create_render_notification(12451752,nil)
456
+ assert_equal "true",notification.fbml
457
+ end
458
+ end