faceb 0.1.0
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.
- 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
|