faceb 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +24 -0
- data/Gemfile +13 -0
- data/LICENSE +20 -0
- data/README.md +70 -0
- data/Rakefile +76 -0
- data/VERSION +1 -0
- data/bin/console +3 -0
- data/faceb.gemspec +164 -0
- data/features/faceb-session.feature +7 -0
- data/features/step_definitions/facebook-session_steps.rb +14 -0
- data/features/support/env.rb +4 -0
- data/lib/faceb.rb +7 -0
- data/lib/faceb/api.rb +69 -0
- data/lib/faceb/base.rb +51 -0
- data/lib/faceb/rails.rb +12 -0
- data/lib/faceb/rails/api.rb +21 -0
- data/lib/faceb/rails/base.rb +30 -0
- data/lib/faceb/rails/configuration.rb +31 -0
- data/lib/faceb/rails/controller.rb +49 -0
- data/lib/faceb/rails/generators.rb +3 -0
- data/lib/faceb/rails/generators/config/USAGE +8 -0
- data/lib/faceb/rails/generators/config/config_generator.rb +16 -0
- data/lib/faceb/rails/generators/config/templates/faceb.yml +6 -0
- data/lib/faceb/rails/generators/fb_connect/USAGE +7 -0
- data/lib/faceb/rails/generators/fb_connect/fb_connect_generator.rb +16 -0
- data/lib/faceb/rails/generators/fb_connect/templates/xd_receiver.html +10 -0
- data/lib/faceb/rails/generators/fb_connect/templates/xd_receiver_ssl.html +10 -0
- data/lib/faceb/rails/rails_23_init.rb +21 -0
- data/lib/faceb/rails/railtie.rb +39 -0
- data/lib/faceb/rails/tasks.rb +2 -0
- data/lib/faceb/rails/tasks/faceb.tasks +6 -0
- data/lib/faceb/rails/tasks/tunnel.tasks +46 -0
- data/lib/faceb/session.rb +38 -0
- data/spec/faceb_api_spec.rb +107 -0
- data/spec/faceb_base_spec.rb +48 -0
- data/spec/faceb_session_spec.rb +64 -0
- data/spec/rails/config_generator_spec.rb +39 -0
- data/spec/rails/configuration_sepc.rb +11 -0
- data/spec/rails/controller_spec.rb +39 -0
- data/spec/rails/fb_connect_generator_spec.rb +28 -0
- data/spec/rails/railtie_spec.rb +23 -0
- data/spec/rails_app/app/controllers/application_controller.rb +3 -0
- data/spec/rails_app/app/controllers/posts_controller.rb +7 -0
- data/spec/rails_app/app/helpers/application_helper.rb +2 -0
- data/spec/rails_app/config.ru +4 -0
- data/spec/rails_app/config/application.rb +46 -0
- data/spec/rails_app/config/boot.rb +9 -0
- data/spec/rails_app/config/database.yml +22 -0
- data/spec/rails_app/config/environment.rb +5 -0
- data/spec/rails_app/config/environments/development.rb +19 -0
- data/spec/rails_app/config/environments/production.rb +33 -0
- data/spec/rails_app/config/environments/test.rb +32 -0
- data/spec/rails_app/config/faceb.yml +3 -0
- data/spec/rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/rails_app/config/initializers/cookie_verification_secret.rb +7 -0
- data/spec/rails_app/config/initializers/inflections.rb +10 -0
- data/spec/rails_app/config/initializers/mime_types.rb +5 -0
- data/spec/rails_app/config/initializers/session_store.rb +10 -0
- data/spec/rails_app/config/locales/en.yml +5 -0
- data/spec/rails_app/config/routes.rb +58 -0
- data/spec/rails_app/log/development.log +0 -0
- data/spec/rails_app/log/production.log +0 -0
- data/spec/rails_app/log/server.log +0 -0
- data/spec/rails_app/log/test.log +0 -0
- data/spec/rails_app/public/404.html +26 -0
- data/spec/rails_app/public/422.html +26 -0
- data/spec/rails_app/public/500.html +26 -0
- data/spec/rails_app/public/favicon.ico +0 -0
- data/spec/rails_app/public/javascripts/application.js +2 -0
- data/spec/rails_app/public/javascripts/controls.js +965 -0
- data/spec/rails_app/public/javascripts/dragdrop.js +974 -0
- data/spec/rails_app/public/javascripts/effects.js +1123 -0
- data/spec/rails_app/public/javascripts/prototype.js +4874 -0
- data/spec/rails_app/public/javascripts/rails.js +110 -0
- data/spec/rails_app/public/stylesheets/.gitkeep +0 -0
- data/spec/rails_app/script/rails +9 -0
- data/spec/rails_spec_helper.rb +6 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +27 -0
- metadata +247 -0
@@ -0,0 +1,107 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
module FaceB
|
4
|
+
describe Api do
|
5
|
+
describe "Default params" do
|
6
|
+
subject { FaceB::Api.default_params }
|
7
|
+
|
8
|
+
it { subject[:format].should == 'JSON' }
|
9
|
+
it { subject[:v].should == '1.0' }
|
10
|
+
end
|
11
|
+
|
12
|
+
# Call
|
13
|
+
describe "#call" do
|
14
|
+
before(:each) do
|
15
|
+
@session = FaceB.new('api-key', 'secret-key')
|
16
|
+
end
|
17
|
+
|
18
|
+
# Error Response
|
19
|
+
context "When error" do
|
20
|
+
before(:each) do
|
21
|
+
mock(FaceB::Api).post(FaceB::Api::API_SERVER_URL, is_a(Hash)) {
|
22
|
+
{"error_msg" => "error message", "error_code" => 100}
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should get error nicely" do
|
27
|
+
lambda {
|
28
|
+
@session.call("facebook.method")
|
29
|
+
}.should raise_error(FaceB::Api::Error, "Facebook error 100 : 'error message'")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Success Response with String
|
34
|
+
context "When success with string response" do
|
35
|
+
before(:each) do
|
36
|
+
mock(FaceB::Api).post(FaceB::Api::API_SERVER_URL, is_a(Hash)) { "data" }
|
37
|
+
@response = @session.call("facebook.method")
|
38
|
+
end
|
39
|
+
|
40
|
+
subject { @response }
|
41
|
+
|
42
|
+
it { should be_an_instance_of(FaceB::Api::Response) }
|
43
|
+
its(:data) { should == 'data'}
|
44
|
+
end
|
45
|
+
|
46
|
+
# Success Response with Array with one Hash element
|
47
|
+
context "When success with one Array response with one Hash element" do
|
48
|
+
before(:each) do
|
49
|
+
mock(FaceB::Api).post(FaceB::Api::API_SERVER_URL, is_a(Hash)) {
|
50
|
+
[{'key1' => 'value1', 'key2' => 'value2'}]
|
51
|
+
}
|
52
|
+
@response = @session.call("facebook.method")
|
53
|
+
end
|
54
|
+
|
55
|
+
subject { @response }
|
56
|
+
|
57
|
+
it { should be_an_instance_of(FaceB::Api::Response) }
|
58
|
+
its(:data) { should == [{"key1"=>"value1", "key2"=>"value2"}] }
|
59
|
+
its(:key1) { should == "value1" }
|
60
|
+
its(:key2) { should == "value2" }
|
61
|
+
end
|
62
|
+
|
63
|
+
# Success Response one Hash element
|
64
|
+
context "When success with one Hash response" do
|
65
|
+
before(:each) do
|
66
|
+
mock(FaceB::Api).post(FaceB::Api::API_SERVER_URL, is_a(Hash)) {
|
67
|
+
{'key1' => 'value1', 'key2' => 'value2'}
|
68
|
+
}
|
69
|
+
@response = @session.call("facebook.method")
|
70
|
+
end
|
71
|
+
|
72
|
+
subject { @response }
|
73
|
+
|
74
|
+
it { should be_an_instance_of(FaceB::Api::Response) }
|
75
|
+
its(:data) { should == {"key1"=>"value1", "key2"=>"value2"} }
|
76
|
+
its(:key1) { should == "value1" }
|
77
|
+
its(:key2) { should == "value2" }
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
# Session Key
|
82
|
+
context "With Session key" do
|
83
|
+
before(:each) do
|
84
|
+
mock.instance_of(FaceB::Session).secure_with_session_key!('session-key').once { 12345 }
|
85
|
+
mock(@session).call('users.getLoggedInUser', :session_key => 'session-key') { FaceB::Api::Response.new(12345) }
|
86
|
+
@session.secure_with_session_key!('session-key')
|
87
|
+
@api = FaceB::Api.new(@session)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should pass the current session_key if param is true" do
|
91
|
+
mock(FaceB::Api).post(FaceB::Api::API_SERVER_URL, satisfy {|arg| arg[:body][:session_key] == "session-key"} ) {
|
92
|
+
{"ok" => "ok"}
|
93
|
+
}
|
94
|
+
@api.call('method', :session_key => true)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should be able to averride the current session_key" do
|
98
|
+
mock(FaceB::Api).post(FaceB::Api::API_SERVER_URL, satisfy {|arg| arg[:body][:session_key] == "my-new-session-key"} ) {
|
99
|
+
{"ok" => "ok"}
|
100
|
+
}
|
101
|
+
@api.call('method', :session_key => 'my-new-session-key')
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe FaceB do
|
4
|
+
|
5
|
+
describe "#current_session" do
|
6
|
+
before(:each) do
|
7
|
+
@session = FaceB.new('api-key', 'secret-key')
|
8
|
+
end
|
9
|
+
|
10
|
+
subject { FaceB.current_session }
|
11
|
+
|
12
|
+
it { should be_an_instance_of(FaceB::Session) }
|
13
|
+
it { should == @session }
|
14
|
+
|
15
|
+
its(:api_key) { should == 'api-key' }
|
16
|
+
its(:secret_key) { should == 'secret-key' }
|
17
|
+
end
|
18
|
+
|
19
|
+
# New
|
20
|
+
describe "#new" do
|
21
|
+
before(:each) do
|
22
|
+
@session = FaceB.new('api-key', 'secret-key')
|
23
|
+
end
|
24
|
+
|
25
|
+
subject { @session }
|
26
|
+
|
27
|
+
its(:api_key) { should == 'api-key' }
|
28
|
+
its(:secret_key) { should == 'secret-key' }
|
29
|
+
|
30
|
+
it "should be able to reset the current session" do
|
31
|
+
FaceB::Session.reset!
|
32
|
+
FaceB.current_session.should be_nil
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Call
|
37
|
+
describe "#call" do
|
38
|
+
it "should be able to call the api without create a session before" do
|
39
|
+
mock.instance_of(FaceB::Session).call('method', :params => 1) { "response" }
|
40
|
+
FaceB.call('api-key', 'secret-key', 'method', :params => 1).should == "response"
|
41
|
+
FaceB.current_session.should be_nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should not be included in Facebook" do
|
46
|
+
FaceB.should_not respond_to(:config)
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
module FaceB
|
4
|
+
describe Session do
|
5
|
+
|
6
|
+
# Create session
|
7
|
+
context "When create session" do
|
8
|
+
before(:each) do
|
9
|
+
@session = FaceB::Session.create('api-key', 'secret-key')
|
10
|
+
end
|
11
|
+
|
12
|
+
subject { @session }
|
13
|
+
|
14
|
+
its(:api_key) { should == 'api-key' }
|
15
|
+
its(:secret_key) { should == 'secret-key' }
|
16
|
+
|
17
|
+
it { should be_an_instance_of(FaceB::Session) }
|
18
|
+
|
19
|
+
it "should set session as the current session" do
|
20
|
+
FaceB::Session.current.should == @session
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should be able to reset the current session" do
|
24
|
+
FaceB::Session.reset!
|
25
|
+
FaceB::Session.current.should be_nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# New session
|
30
|
+
context "When instanciate new session" do
|
31
|
+
before(:each) do
|
32
|
+
@session = FaceB::Session.new('api-key', 'secret-key')
|
33
|
+
end
|
34
|
+
|
35
|
+
subject { @session }
|
36
|
+
|
37
|
+
its(:api_key) { should == 'api-key' }
|
38
|
+
its(:secret_key) { should == 'secret-key' }
|
39
|
+
|
40
|
+
it { should be_an_instance_of(FaceB::Session) }
|
41
|
+
|
42
|
+
it "should not have persistent session" do
|
43
|
+
FaceB::Session.current.should be_nil
|
44
|
+
end
|
45
|
+
|
46
|
+
# Session key
|
47
|
+
context "With session key" do
|
48
|
+
before(:each) do
|
49
|
+
mock.instance_of(FaceB::Session).call('users.getLoggedInUser', :session_key => 'session-key') { FaceB::Api::Response.new(12345) }
|
50
|
+
@session = FaceB::Session.new('api-key', 'secret-key', 'session-key')
|
51
|
+
end
|
52
|
+
|
53
|
+
subject { @session }
|
54
|
+
|
55
|
+
its(:api_key) { should == 'api-key' }
|
56
|
+
its(:secret_key) { should == 'secret-key' }
|
57
|
+
its(:session_key) { should == 'session-key' }
|
58
|
+
its(:user_facebook_uid) { should == 12345 }
|
59
|
+
|
60
|
+
it { should be_an_instance_of(FaceB::Session) }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
module FaceB
|
4
|
+
describe ConfigGenerator do
|
5
|
+
before do
|
6
|
+
@destination = TMP_DIR
|
7
|
+
@config_file = File.join(@destination, 'config', 'faceb.yml')
|
8
|
+
@source = ConfigGenerator.source_root
|
9
|
+
end
|
10
|
+
|
11
|
+
after do
|
12
|
+
FileUtils.rm_rf(@destination)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should copy Faceb config file" do
|
16
|
+
ConfigGenerator.start([], :destination_root => @destination)
|
17
|
+
File.exists?(@config_file).should be_true
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should accept options" do
|
21
|
+
ConfigGenerator.start(['--api-key=my-api-key', '--secret-key=my-secret-key'], :destination_root => @destination)
|
22
|
+
|
23
|
+
File.exists?(@config_file).should be_true
|
24
|
+
file_content = IO.read(@config_file)
|
25
|
+
file_content.should =~ /api_key: my-api-key/
|
26
|
+
file_content.should =~ /secret_key: my-secret-key/
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
it "should accept aliases" do
|
31
|
+
ConfigGenerator.start(['-a=my-api-key', '-s=my-secret-key'], :destination_root => @destination)
|
32
|
+
|
33
|
+
File.exists?(@config_file).should be_true
|
34
|
+
file_content = IO.read(@config_file)
|
35
|
+
file_content.should =~ /api_key: my-api-key/
|
36
|
+
file_content.should =~ /secret_key: my-secret-key/
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
# Dummy Controller
|
4
|
+
Dummy::Application.initialize!
|
5
|
+
class MockController < ApplicationController
|
6
|
+
include FaceB::Rails::Controller
|
7
|
+
|
8
|
+
ensure_authenticated_to_facebook :only => :action1
|
9
|
+
|
10
|
+
def self.before_filters
|
11
|
+
_process_action_callbacks.select { |c| c.kind == :before }
|
12
|
+
end
|
13
|
+
|
14
|
+
def action1;end
|
15
|
+
def action2;end
|
16
|
+
end
|
17
|
+
|
18
|
+
# MockController
|
19
|
+
describe MockController do
|
20
|
+
describe "ClassMethods" do
|
21
|
+
it "should include before_filter 'set_facebook_request_format'" do
|
22
|
+
filters = MockController.before_filters.map! { |c| c.raw_filter }
|
23
|
+
filters.should include(:set_facebook_request_format)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should include ensure_authenticated_to_facebook filter only for action1" do
|
27
|
+
filter = MockController.before_filters.find {|f| f.raw_filter == :ensure_authenticated_to_facebook}
|
28
|
+
filter.options[:only].should == :action1
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
#describe "#facebook_session" do
|
34
|
+
# before(:each) { @controller.get :action1 }
|
35
|
+
# subject { @controller.facebook_session }
|
36
|
+
#
|
37
|
+
# it { should be_an_instance_of(FaceB::Session) }
|
38
|
+
#end
|
39
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
module FaceB
|
4
|
+
describe FbConnectGenerator do
|
5
|
+
before do
|
6
|
+
@destination = TMP_DIR
|
7
|
+
@source = FbConnectGenerator.source_root
|
8
|
+
end
|
9
|
+
|
10
|
+
after do
|
11
|
+
FileUtils.rm_rf(@destination)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should create xd_receiver file" do
|
15
|
+
FbConnectGenerator.start([], :destination_root => @destination)
|
16
|
+
file = File.join(TMP_DIR, 'public', 'xd_receiver.html')
|
17
|
+
File.exists?(file).should be_true
|
18
|
+
IO.read(file).should =~ %r{http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.js}
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should create xd_receiver file with SSL support" do
|
22
|
+
FbConnectGenerator.start(['--ssl'], :destination_root => @destination)
|
23
|
+
file = File.join(TMP_DIR, 'public', 'xd_receiver_ssl.html')
|
24
|
+
File.exists?(file).should be_true
|
25
|
+
IO.read(file).should =~ %r{https://ssl.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.js}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "Rails app initialization" do
|
4
|
+
before(:each) do
|
5
|
+
Dummy::Application.initialize!
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should load facebook config file" do
|
9
|
+
FaceB.config.should_not be_nil
|
10
|
+
FaceB.config.api_key.should == 'rails-api-key'
|
11
|
+
FaceB.config.secret_key.should == 'rails-secret-key'
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should add Rack-Facebook as a middleware" do
|
15
|
+
Dummy::Application.config.middleware.should include(Rack::Facebook)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should add FBML request type" do
|
19
|
+
mime_type = Mime::Type.lookup(:fbml)
|
20
|
+
mime_type.should_not be_nil
|
21
|
+
mime_type.should be_an_instance_of(Mime::Type)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.expand_path('../boot', __FILE__)
|
2
|
+
|
3
|
+
require "active_model/railtie"
|
4
|
+
require "active_record/railtie"
|
5
|
+
require "action_controller/railtie"
|
6
|
+
require "action_view/railtie"
|
7
|
+
require "action_mailer/railtie"
|
8
|
+
|
9
|
+
Bundler.require
|
10
|
+
require "faceb/rails"
|
11
|
+
|
12
|
+
module Dummy
|
13
|
+
class Application < Rails::Application
|
14
|
+
# Settings in config/environments/* take precedence over those specified here.
|
15
|
+
# Application configuration should go into files in config/initializers
|
16
|
+
# -- all .rb files in that directory are automatically loaded.
|
17
|
+
|
18
|
+
# Add additional load paths for your own custom dirs
|
19
|
+
# config.load_paths += %W( #{config.root}/extras )
|
20
|
+
|
21
|
+
# Only load the plugins named here, in the order given (default is alphabetical).
|
22
|
+
# :all can be used as a placeholder for all plugins not explicitly named
|
23
|
+
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
|
24
|
+
|
25
|
+
# Activate observers that should always be running
|
26
|
+
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
|
27
|
+
|
28
|
+
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
29
|
+
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
30
|
+
# config.time_zone = 'Central Time (US & Canada)'
|
31
|
+
|
32
|
+
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
33
|
+
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
34
|
+
# config.i18n.default_locale = :de
|
35
|
+
|
36
|
+
# Configure generators values. Many other options are available, be sure to check the documentation.
|
37
|
+
# config.generators do |g|
|
38
|
+
# g.orm :active_record
|
39
|
+
# g.template_engine :erb
|
40
|
+
# g.test_framework :test_unit, :fixture => true
|
41
|
+
# end
|
42
|
+
|
43
|
+
# Configure sensitive parameters which will be filtered from the log file.
|
44
|
+
config.filter_parameters << :password
|
45
|
+
end
|
46
|
+
end
|