Add helper to load config

This commit is contained in:
Mike Mangino 2010-05-05 16:28:18 -04:00
parent 6a47e3c67a
commit 6f52778c38
6 changed files with 98 additions and 14 deletions

View File

@ -2,10 +2,34 @@
require "mogli"
module Facebooker2
class NotConfigured < Exception; end
class << self
attr_accessor :api_key, :secret, :app_id
end
def self.secret
@secret || raise_unconfigured_exception
end
def self.app_id
@app_id || raise_unconfigured_exception
end
def self.raise_unconfigured_exception
raise NotConfigured.new("No configuration provided for Facebooker2. Either set the app_id and secret or call Facebooker2.load_facebooker_yaml in an initializer")
end
def self.configuration=(hash)
self.api_key = hash[:api_key]
self.secret = hash[:secret]
self.app_id = hash[:app_id]
end
def self.load_facebooker_yaml
config = YAML.load(File.read(File.join(::Rails.root,"config","facebooker.yml")))[::Rails.env]
raise NotConfigured.new("Unable to load configuration for #{::Rails.env} from facebooker.yml. Is it set up?") if config.nil?
self.configuration = config.with_indifferent_access
end
def self.cast_to_facebook_id(object)
if object.kind_of?(Mogli::Profile)

View File

@ -4,6 +4,12 @@ module Facebooker2
module Rails
module Controller
def self.included(controller)
controller.helper Facebooker2::Rails::Helpers
controller.helper_method :current_facebook_user
controller.helper_method :current_facebook_client
end
def current_facebook_user
fetch_client_and_user_from_cookie
@_current_facebook_user
@ -19,17 +25,24 @@ module Facebooker2
app_id = Facebooker2.app_id
if (hash_data = fb_cookie_hash_for_app_id(app_id)) and
fb_cookie_signature_correct?(fb_cookie_hash_for_app_id(app_id),Facebooker2.secret)
@_current_facebook_client = Mogli::Client.new(hash_data["access_token"],hash_data["expires"].to_i)
@_current_facebook_user = Mogli::User.new(:id=>hash_data["uid"])
@_current_facebook_user.client = @_current_facebook_client
client = Mogli::Client.new(hash_data["access_token"],hash_data["expires"].to_i)
user = Mogli::User.new(:id=>hash_data["uid"])
user.client = @_current_facebook_client
fb_sign_in_user_and_client(user,client)
end
@_fb_user_fetched = true
end
def fb_sign_in_user_and_client(user,client)
@_current_facebook_user = user
@_current_facebook_client = client
@_fb_user_fetched = true
end
def fb_cookie_hash_for_app_id(app_id)
return nil unless fb_cookie_for_app_id?(app_id)
hash={}
data = fb_cookie_for_app_id(app_id)
data = fb_cookie_for_app_id(app_id).gsub(/"/,"")
data.split("&").each do |str|
parts = str.split("=")
hash[parts.first] = parts.last

View File

@ -6,7 +6,7 @@ module Facebooker2
opts = Hash.new(true).merge!(options)
cookie = opts[:cookie]
status = opts[:status]
status = opts[:xfbml]
xfbml = opts[:xfbml]
js = <<-JAVASCRIPT
<div id="fb-root"></div>
<script>

View File

@ -0,0 +1,3 @@
spec:
app_id: 1234fromyaml
secret: fromyaml

View File

@ -16,6 +16,35 @@ describe Facebooker2 do
Facebooker2.app_id = "12345"
Facebooker2.app_id.should == "12345"
end
it "should allow setting the configuration in bulk" do
Facebooker2.configuration = {:app_id=>1234,:secret=>"secret"}
Facebooker2.app_id.should == 1234
Facebooker2.secret.should == "secret"
end
it "raises an exception if you access a nil app_id" do
Facebooker2.app_id = nil
lambda do
Facebooker2.app_id
end.should raise_error(Facebooker2::NotConfigured)
end
it "can load the configuration via facebooker.yml" do
::Rails=mock("rails",:env=>"spec",:root=>File.dirname(__FILE__))
Facebooker2.load_facebooker_yaml
Facebooker2.app_id.should == "1234fromyaml"
Facebooker2.secret.should == "fromyaml"
end
it "raises an error if there is no configuration for the env" do
::Rails=mock("rails",:env=>"invalid",:root=>File.dirname(__FILE__))
lambda do
Facebooker2.load_facebooker_yaml
end.should raise_error(Facebooker2::NotConfigured)
end
end
describe "Casting to facebook_id" do

View File

@ -1,6 +1,6 @@
require "spec_helper"
class FakeController
class FakeController < ActionController::Base
include Facebooker2::Rails::Controller
end
@ -9,12 +9,19 @@ describe Facebooker2::Rails::Controller do
Facebooker2.app_id = "12345"
Facebooker2.secret = "42ca6de519d53f6e0420247a4d108d90"
end
let :controller do
controller = FakeController.new
controller.stub!(:cookies).and_return("fbs_12345"=>"\"access_token=114355055262088|57f0206b01ad48bf84ac86f1-12451752|63WyZjRQbzowpN8ibdIfrsg80OA.&expires=0&secret=1e3375dcc4527e7ead0f82c095421690&session_key=57f0206b01ad48bf84ac86f1-12451752&sig=4337fcdee4cc68bb70ec495c0eebf89c&uid=12451752\"")
controller
end
it "should include helpers" do
controller.master_helper_module.ancestors.should include(Facebooker2::Rails::Helpers)
end
describe "Cookie handling" do
let :controller do
controller = FakeController.new
controller.stub!(:cookies).and_return("fbs_12345"=>"access_token=114355055262088|57f0206b01ad48bf84ac86f1-12451752|63WyZjRQbzowpN8ibdIfrsg80OA.&expires=0&secret=1e3375dcc4527e7ead0f82c095421690&session_key=57f0206b01ad48bf84ac86f1-12451752&sig=4337fcdee4cc68bb70ec495c0eebf89c&uid=12451752")
controller
end
it "knows if a cookie exists for this app" do
controller.fb_cookie_for_app_id?(12345).should be_true
@ -75,12 +82,20 @@ describe Facebooker2::Rails::Controller do
end
describe "Methods" do
it "allows you to sign in a user" do
controller.fb_sign_in_user_and_client(Mogli::User.new,Mogli::Client.new)
end
it "has a current_facebook_user" do
user = mock("user")
controller.fb_sign_in_user_and_client(user,Mogli::Client.new)
controller.current_facebook_user.should == user
end
it "has a current_facebook_client" do
client = mock("client")
controller.fb_sign_in_user_and_client(Mogli::User.new,client)
controller.current_facebook_client.should == client
end
end