rplatform-rails 0.0.2

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.
@@ -0,0 +1,105 @@
1
+ <style type="text/css">
2
+
3
+ .RFacebook .backtrace
4
+ {
5
+ border-collapse: collapse;
6
+ background-color: #3B5998;
7
+ color: white;
8
+ }
9
+
10
+ .RFacebook .backtrace
11
+ {
12
+ padding: 30px;
13
+ background: #3B5998;
14
+ }
15
+
16
+ .RFacebook .backtrace h1
17
+ {
18
+ margin: 0px 0px 5px 0px;
19
+ padding: 0px;
20
+
21
+ color: #6D84B4;
22
+ font-size: 1.6em;
23
+ }
24
+
25
+ /*
26
+ .RFacebook table.backtrace td
27
+ {
28
+ padding: 10px 2px 10px 2px;
29
+ border-width: 1px 0px 1px 0px;
30
+
31
+ border-style: solid;
32
+ border-color: #ccc;
33
+ }
34
+ */
35
+
36
+ .RFacebook .backtrace div.summary
37
+ {
38
+ font-size: 1.2em;
39
+ padding: 2px;
40
+ color: #6D84B4;
41
+ }
42
+
43
+ .RFacebook .backtrace div.summary strong
44
+ {
45
+ color: white;
46
+ }
47
+
48
+
49
+ .RFacebook .backtrace div.summary em
50
+ {
51
+ color: white;
52
+ }
53
+
54
+ .RFacebook .backtrace div.rawsummary
55
+ {
56
+ font-size: 0.7em;
57
+ color: #6D84B4;
58
+ padding-left: 5px;
59
+ }
60
+
61
+ .RFacebook .backtrace div.message
62
+ {
63
+ font-size: 1.6em;
64
+ color: #6D84B4;
65
+ }
66
+
67
+ .RFacebook ul
68
+ {
69
+ margin: 0px;
70
+ padding: 0px;
71
+ list-style-type: none;
72
+ }
73
+
74
+ .RFacebook ul li
75
+ {
76
+ list-style-type: none;
77
+ padding: 5px;
78
+ }
79
+
80
+
81
+
82
+ </style>
83
+
84
+ <div class="RFacebook">
85
+ <div class="backtrace">
86
+
87
+ <div class="message">
88
+ <strong><%= exception.message %></strong>
89
+ </div>
90
+ <ul>
91
+ <% rfacebookBacktraceLines.each do |line| %>
92
+ <li>
93
+ <div class="summary">
94
+ <strong><%= line[:filename] %></strong>:<em><%= line[:line] %></em>
95
+ in <strong><%= line[:method] %></strong>
96
+ </div>
97
+ <div class="rawsummary">
98
+ <%= line[:rawsummary] %>
99
+ </div>
100
+ </li>
101
+ <% end %>
102
+ </ul>
103
+
104
+ </div>
105
+ </div>
data/test/api_test.rb ADDED
@@ -0,0 +1,203 @@
1
+ require File.dirname(__FILE__) + "/test_helper"
2
+ require "test/unit"
3
+ require "rubygems"
4
+ require "mocha"
5
+
6
+ class APITest < Test::Unit::TestCase
7
+
8
+ def test_fbsession_methods_are_present
9
+ assert @controller.fbsession.respond_to?(:session_user_id)
10
+ assert @controller.fbsession.respond_to?(:session_key)
11
+ assert @controller.fbsession.respond_to?(:session_expires)
12
+ assert @controller.fbsession.respond_to?(:last_error_message), "This assertion is OK to fail with RFacebook Gem <= 0.9.1"
13
+ assert @controller.fbsession.respond_to?(:logger)
14
+ assert @controller.fbsession.respond_to?(:logger=)
15
+ assert @controller.fbsession.respond_to?(:ready?), "This assertion is OK to fail with RFacebook Gem <= 0.9.1"
16
+ end
17
+
18
+ def setup
19
+
20
+ # we want to test with the same fbsession that a real controller will get
21
+ @controller = DummyController.new
22
+ @request = ActionController::TestRequest.new
23
+ @response = ActionController::TestResponse.new
24
+
25
+ # simulate fbsession setup inside canvas
26
+ # (most common usage, but it really doesn't matter for this test case anyway)
27
+ @controller.simulate_inside_canvas
28
+ post :index
29
+
30
+ assert @controller.fbparams.size > 0, "API Test should have simulated fbparams properly"
31
+ assert @controller.fbsession.ready?, "API Test should have an fbsession that is ready to go"
32
+
33
+ # set up some dummy responses from the API
34
+ @dummy_error_response = <<-EOF
35
+ <?xml version="1.0" encoding="UTF-8"?>
36
+ <error_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd">
37
+ <error_code>5</error_code>
38
+ <error_msg>Unauthorized source IP address (ip was: 10.1.2.3)</error_msg>
39
+ <request_args list="true">
40
+ <arg>
41
+ <key>method</key>
42
+ <value>facebook.friends.get</value>
43
+ </arg>
44
+ <arg>
45
+ <key>session_key</key>
46
+ <value>373443c857fcda2e410e349c-i7nF4PqX4IW4.</value>
47
+ </arg>
48
+ <arg>
49
+ <key>api_key</key>
50
+ <value>0289b21f46b2ee642d5c42145df5489f</value>
51
+ </arg>
52
+ <arg>
53
+ <key>call_id</key>
54
+ <value>1170813376.3544</value>
55
+ </arg>
56
+ <arg>
57
+ <key>v</key>
58
+ <value>1.0</value>
59
+ </arg>
60
+ <arg>
61
+ <key>sig</key>
62
+ <value>570dcc2b764578af350ea1e1622349a0</value>
63
+ </arg>
64
+ </request_args>
65
+ </error_response>
66
+ EOF
67
+
68
+ @dummy_auth_getSession_response = <<-EOF
69
+ <?xml version="1.0" encoding="UTF-8"?>
70
+ <auth_getSession_response
71
+ xmlns="http://api.facebook.com/1.0/"
72
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
73
+ xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd">
74
+ <session_key>5f34e11bfb97c762e439e6a5-8055</session_key>
75
+ <uid>8055</uid>
76
+ <expires>1173309298</expires>
77
+ </auth_getSession_response>
78
+ EOF
79
+
80
+ @dummy_group_getMembers_response = <<-EOF
81
+ <?xml version="1.0" encoding="UTF-8"?>
82
+ <groups_getMembers_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd">
83
+ <members list="true">
84
+ <uid>4567</uid>
85
+ <uid>5678</uid>
86
+ <uid>6789</uid>
87
+ <uid>7890</uid>
88
+ </members>
89
+ <admins list="true">
90
+ <uid>1234567</uid>
91
+ </admins>
92
+ <officers list="true"/>
93
+ <not_replied list="true"/>
94
+ </groups_getMembers_response>
95
+ EOF
96
+
97
+ @dummy_users_getLoggedInUser_response = <<-EOF
98
+ <?xml version="1.0" encoding="UTF-8"?>
99
+ <users_getLoggedInUser_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd">1234567</users_getLoggedInUser_response>
100
+ EOF
101
+
102
+ @dummy_users_getInfo_response = <<-EOF
103
+ <?xml version="1.0" encoding="UTF-8"?>
104
+ <users_getInfo_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd" list="true">
105
+ <user>
106
+ <uid>8055</uid>
107
+ <about_me>This field perpetuates the glorification of the ego. Also, it has a character limit.</about_me>
108
+ <activities>Here: facebook, etc. There: Glee Club, a capella, teaching.</activities>
109
+ <affiliations list="true">
110
+ <affiliation>
111
+ <nid>50453093</nid>
112
+ <name>Facebook Developers</name>
113
+ <type>work</type>
114
+ <status/>
115
+ <year/>
116
+ </affiliation>
117
+ </affiliations>
118
+ <birthday>November 3</birthday>
119
+ <books>The Brothers K, GEB, Ken Wilber, Zen and the Art, Fitzgerald, The Emporer's New Mind, The Wonderful Story of Henry Sugar</books>
120
+ <current_location>
121
+ <city>Palo Alto</city>
122
+ <state>CA</state>
123
+ <country>United States</country>
124
+ <zip>94303</zip>
125
+ </current_location>
126
+ <education_history list="true">
127
+ <education_info>
128
+ <name>Harvard</name>
129
+ <year>2003</year>
130
+ <concentrations list="true">
131
+ <concentration>Applied Mathematics</concentration>
132
+ <concentration>Computer Science</concentration>
133
+ </concentrations>
134
+ </education_info>
135
+ </education_history>
136
+ <first_name>Dave</first_name>
137
+ <hometown_location>
138
+ <city>York</city>
139
+ <state>PA</state>
140
+ <country>United States</country>
141
+ <zip>0</zip>
142
+ </hometown_location>
143
+ <hs_info>
144
+ <hs1_name>Central York High School</hs1_name>
145
+ <hs2_name/>
146
+ <grad_year>1999</grad_year>
147
+ <hs1_id>21846</hs1_id>
148
+ <hs2_id>0</hs2_id>
149
+ </hs_info>
150
+ <is_app_user>1</is_app_user>
151
+ <has_added_app>1</has_added_app>
152
+ <interests>coffee, computers, the funny, architecture, code breaking,snowboarding, philosophy, soccer, talking to strangers</interests>
153
+ <last_name>Fetterman</last_name>
154
+ <meeting_for list="true">
155
+ <seeking>Friendship</seeking>
156
+ </meeting_for>
157
+ <meeting_sex list="true">
158
+ <sex>female</sex>
159
+ </meeting_sex>
160
+ <movies>Tommy Boy, Billy Madison, Fight Club, Dirty Work, Meet the Parents, My Blue Heaven, Office Space </movies>
161
+ <music>New Found Glory, Daft Punk, Weezer, The Crystal Method, Rage, the KLF, Green Day, Live, Coldplay, Panic at the Disco, Family Force 5</music>
162
+ <name>Dave Fetterman</name>
163
+ <notes_count>0</notes_count>
164
+ <pic>http://photos-055.facebook.com/ip007/profile3/1271/65/s8055_39735.jpg</pic>
165
+ <pic_big>http://photos-055.facebook.com/ip007/profile3/1271/65/n8055_39735.jpg</pic>
166
+ <pic_small>http://photos-055.facebook.com/ip007/profile3/1271/65/t8055_39735.jpg</pic>
167
+ <pic_square>http://photos-055.facebook.com/ip007/profile3/1271/65/q8055_39735.jpg</pic>
168
+ <political>Moderate</political>
169
+ <profile_update_time>1170414620</profile_update_time>
170
+ <quotes/>
171
+ <relationship_status>In a Relationship</relationship_status>
172
+ <religion/>
173
+ <sex>male</sex>
174
+ <significant_other_id xsi:nil="true"/>
175
+ <status>
176
+ <message/>
177
+ <time>0</time>
178
+ </status>
179
+ <timezone>-8</timezone>
180
+ <tv>cf. Bob Trahan</tv>
181
+ <wall_count>121</wall_count>
182
+ <work_history list="true">
183
+ <work_info>
184
+ <location>
185
+ <city>Palo Alto</city>
186
+ <state>CA</state>
187
+ <country>United States</country>
188
+ </location>
189
+ <company_name>Facebook</company_name>
190
+ <position>Software Engineer</position>
191
+ <description>Tech Lead, Facebook Platform</description>
192
+ <start_date>2006-01</start_date>
193
+ <end_date/>
194
+ </work_info>
195
+ </work_history>
196
+ </user>
197
+ </users_getInfo_response>
198
+ EOF
199
+
200
+ end
201
+
202
+
203
+ end
@@ -0,0 +1,257 @@
1
+ require File.dirname(__FILE__) + "/test_helper"
2
+ require "test/unit"
3
+ require "rubygems"
4
+ require "mocha"
5
+
6
+ class ControllerTest < Test::Unit::TestCase
7
+
8
+ def test_before_filters_are_present
9
+ assert(@controller.respond_to?(:require_facebook_login))
10
+ assert(@controller.respond_to?(:require_facebook_install))
11
+ end
12
+
13
+ def test_facebook_helpers_are_present
14
+ assert(@controller.respond_to?(:in_facebook_canvas?))
15
+ assert(@controller.respond_to?(:in_facebook_frame?))
16
+ assert(@controller.respond_to?(:in_mock_ajax?))
17
+ assert(@controller.respond_to?(:in_ajax?))
18
+ assert(@controller.respond_to?(:in_external_app?))
19
+ assert(@controller.respond_to?(:added_facebook_application?))
20
+ end
21
+
22
+ def test_overrides_are_present
23
+ assert_rfacebook_overrides_method(@controller, :url_for)
24
+ assert_rfacebook_overrides_method(@controller, :redirect_to)
25
+ end
26
+
27
+ def test_unactivated_fbsession_raises_errors
28
+ post :index
29
+ assert_raise(RFacebook::FacebookSession::NotActivatedStandardError){@controller.fbsession.friends_get}
30
+ end
31
+
32
+ def test_should_detect_user_has_added_app
33
+
34
+ # test adding app
35
+ post :index, {:fb_sig_added => 1}
36
+ assert(@controller.added_facebook_application?, "Should be installed")
37
+
38
+ # test not adding app
39
+ @controller.stub_fbparams
40
+ post :index
41
+ assert(!@controller.added_facebook_application?, "Should not be installed")
42
+
43
+ end
44
+
45
+ def test_should_detect_user_in_canvas
46
+
47
+ # test adding app
48
+ post :index, {:fb_sig_in_canvas => 1}
49
+ assert(@controller.in_facebook_canvas?, "Should be in canvas")
50
+
51
+ # test not adding app
52
+ post :index
53
+ assert(!@controller.in_facebook_canvas?, "Should not be in canvas")
54
+
55
+ end
56
+
57
+ def test_should_detect_user_in_iframe
58
+
59
+ # test adding app
60
+ post :index, {:fb_sig_in_iframe => 1}
61
+ assert(@controller.in_facebook_frame?, "Should be in iframe")
62
+
63
+ # test not adding app
64
+ post :index
65
+ assert(!@controller.in_facebook_frame?, "Should not be in iframe")
66
+
67
+ end
68
+
69
+ def test_canvas_authentication_succeeds
70
+ @controller.simulate_inside_canvas
71
+ post :index
72
+ assert @controller.fbsession.ready?
73
+ assert_equal("viewing index", @response.body)
74
+ end
75
+
76
+ def test_fbsession_exists_and_is_correct
77
+ @controller.stub_fbparams
78
+ post :index
79
+ assert_kind_of(RFacebook::FacebookWebSession, @controller.fbsession)
80
+ end
81
+
82
+ def test_should_redirect_for_unauthenticated_user_in_external_site
83
+ post :index
84
+ #assert_redirected_to "http://www.facebook.com/login.php?v=1.0&api_key=#{@controller.facebook_api_key}"
85
+ assert_equal("<script type=\"text/javascript\">\ntop.location.href='http://www.facebook.com/login.php?v=1.0&api_key=#{@controller.facebook_api_key}';\n</script>", @response.body)
86
+ end
87
+
88
+ def test_should_redirect_for_unauthenticated_user_in_canvas
89
+ post :index, {:fb_sig_in_canvas => 1}
90
+ assert(!@controller.fbsession.ready?, "Session should be invalid since the user hasn't logged in.")
91
+ assert_equal("<fb:redirect url=\"http://www.facebook.com/login.php?v=1.0&api_key=#{@controller.facebook_api_key}&canvas=true\" />", @response.body)
92
+ end
93
+
94
+ def test_redirect_when_not_in_canvas
95
+ post :doredirect, {:redirect_url => "http://www.dummy.com"}
96
+ assert_redirected_to("http://www.dummy.com")
97
+ end
98
+
99
+ def test_redirect_when_in_canvas
100
+ @controller.simulate_inside_canvas
101
+ assert(@controller.in_facebook_canvas?, "controller should detect that it is in the canvas")
102
+ post :doredirect, {:redirect_url => "http://www.dummy.com"}
103
+ assert_equal("<fb:redirect url=\"http://www.dummy.com\" />", @response.body)
104
+ end
105
+
106
+ def test_should_have_valid_session_when_auth_token_is_set_for_external_app
107
+ RFacebook::FacebookWebSession.any_instance.expects(:post_request).returns @dummy_auth_getSession_response1
108
+ post :index, {"auth_token" => "abc123"}
109
+ assert(@controller.fbsession.ready?, "session should be ready")
110
+ assert_equal("finished facebook login", @response.body)
111
+ end
112
+
113
+ def test_should_grab_new_session_when_different_but_valid_auth_token_is_given_for_external_app
114
+ # first request
115
+ RFacebook::FacebookWebSession.any_instance.expects(:post_request).returns @dummy_auth_getSession_response1
116
+ post :index, {"auth_token" => "abc123"}
117
+ assert(@controller.fbsession.ready?, "session should be ready after first request")
118
+ assert_equal("finished facebook login", @response.body)
119
+
120
+ firstSessionKey = @controller.fbsession.session_key
121
+ assert_equal("5f34e11bfb97c762e439e6a5-8055", firstSessionKey)
122
+
123
+ # second (valid) request, with a new auth token, except that the session is already activated
124
+ RFacebook::FacebookWebSession.any_instance.expects(:post_request).returns @dummy_auth_getSession_response2
125
+ post :index, {:auth_token => "xyz987"}
126
+ assert(@controller.fbsession.ready?, "session should be ready after second test")
127
+ assert_equal("finished facebook login", @response.body)
128
+
129
+ secondSessionKey = @controller.fbsession.session_key
130
+ assert_equal("21498732891470982137", secondSessionKey)
131
+ assert_not_equal(secondSessionKey, firstSessionKey, "Should have a new session key")
132
+
133
+ # third (invalid) request
134
+ RFacebook::FacebookWebSession.any_instance.expects(:remote_call).raises(RFacebook::FacebookSession::RemoteStandardError)
135
+ post :index, {:auth_token => "ijklmnop"}
136
+ assert(@controller.fbsession.ready?, "session should be ready after third test")
137
+ assert_equal("viewing index", @response.body)
138
+
139
+ thirdSessionKey = @controller.fbsession.session_key
140
+ assert_equal(thirdSessionKey, secondSessionKey, "Session key should be unchanged")
141
+
142
+ end
143
+
144
+ def test_should_have_empty_fbparams_when_signature_is_invalid
145
+ post :nofilter, {:fb_sig_session_key => "12345", :fb_sig => "invalidsignature123"}
146
+ assert(@controller.fbparams.size == 0)
147
+ end
148
+
149
+ def test_should_rewrite_urls_when_in_canvas
150
+ @controller.simulate_inside_canvas
151
+ post :render_foobar_action_on_callback
152
+ assert @controller.in_facebook_canvas?, "Should be in canvas for rewriting to happen"
153
+ assert_equal("http://apps.facebook.com#{@controller.facebook_canvas_path}foobar", @response.body)
154
+ end
155
+
156
+ def test_should_not_rewrite_urls_when_outside_canvas
157
+ post :render_foobar_action_on_callback
158
+ assert !@controller.in_facebook_canvas?, "Should not be in canvas"
159
+ assert_equal("#{@controller.facebook_callback_path}foobar", @response.body)
160
+ end
161
+
162
+ def test_should_detect_in_mock_ajax
163
+ @controller.stub_fbparams
164
+ @controller.simulate_inside_canvas({"fb_sig_is_mockajax" => "1"})
165
+ post :index
166
+ assert(@controller.in_mock_ajax?, "should be in mockajax")
167
+ end
168
+
169
+ def test_should_be_able_to_marshal_fbsession
170
+ @controller.stub_fbparams
171
+ @controller.simulate_inside_canvas
172
+ post :index
173
+
174
+ originalSession = @controller.fbsession.dup
175
+
176
+ serializedSession = Marshal.dump(originalSession)
177
+ assert serializedSession
178
+
179
+ deserializedSession = Marshal.load(serializedSession)
180
+ assert deserializedSession
181
+
182
+ assert_equal(originalSession.session_user_id , deserializedSession.session_user_id)
183
+ assert_equal(originalSession.session_key , deserializedSession.session_key)
184
+ assert_equal(originalSession.session_expires , deserializedSession.session_expires)
185
+ assert_equal(originalSession.quiet? , deserializedSession.quiet?)
186
+ assert_equal(originalSession.ready? , deserializedSession.ready?)
187
+ assert_equal(originalSession.expired? , deserializedSession.expired?)
188
+
189
+ assert_equal(originalSession.class, deserializedSession.class)
190
+ end
191
+
192
+ def test_view_should_not_prepend_image_paths_that_are_already_absolute
193
+ # TODO: implement this
194
+ end
195
+
196
+ def test_should_not_change_only_path_when_specified
197
+ # TODO: implement this
198
+ end
199
+
200
+ def test_should_detect_new_user_has_logged_in_when_in_iframe
201
+
202
+ # log in the first user to the iframe
203
+ post :index
204
+ @controller.stub_fbparams("user" => "ABCDEFG", "in_iframe"=>true)
205
+ assert @controller.fbsession.ready?
206
+ assert_equal "ABCDEFG", @controller.fbsession.session_user_id
207
+
208
+ # simulate a new user coming to the iframe (logout/login cycle happened in Facebook)
209
+ post :index
210
+
211
+ # clear out the old login
212
+ @controller.log_out_of_facebook
213
+
214
+ @controller.stub_fbparams("user" => "ZYXWVUT", "in_iframe"=>true)
215
+ assert @controller.fbsession.ready?
216
+ assert_equal "ZYXWVUT", @controller.fbsession.session_user_id
217
+
218
+ # simulate someone coming back to the iframe without POSTed fb_sig params
219
+ # (should use previous session from Rails session)
220
+ post :index
221
+ assert @controller.fbsession.ready?
222
+ assert_equal("ZYXWVUT", @controller.fbsession.session_user_id, "should have grabbed fbsession from Rails session")
223
+ end
224
+
225
+
226
+ def setup
227
+ @controller = DummyController.new
228
+ @request = ActionController::TestRequest.new
229
+ @response = ActionController::TestResponse.new
230
+
231
+ @dummy_auth_getSession_response1 = <<-EOF
232
+ <?xml version="1.0" encoding="UTF-8"?>
233
+ <auth_getSession_response
234
+ xmlns="http://api.facebook.com/1.0/"
235
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
236
+ xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd">
237
+ <session_key>5f34e11bfb97c762e439e6a5-8055</session_key>
238
+ <uid>8055</uid>
239
+ <expires>1173309298</expires>
240
+ </auth_getSession_response>
241
+ EOF
242
+
243
+ @dummy_auth_getSession_response2 = <<-EOF
244
+ <?xml version="1.0" encoding="UTF-8"?>
245
+ <auth_getSession_response
246
+ xmlns="http://api.facebook.com/1.0/"
247
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
248
+ xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd">
249
+ <session_key>21498732891470982137</session_key>
250
+ <uid>8055</uid>
251
+ <expires>1173309298</expires>
252
+ </auth_getSession_response>
253
+ EOF
254
+
255
+ end
256
+
257
+ end