Skip to content

Commit

Permalink
New improved way of setting the session user id, with fixed tests (th…
Browse files Browse the repository at this point in the history
…at now don't require mocha).
  • Loading branch information
pupeno committed Apr 16, 2011
1 parent e90c977 commit 90dbeac
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 85 deletions.
16 changes: 8 additions & 8 deletions lib/ubiquitous_user/ubiquitous_user.rb
Expand Up @@ -41,15 +41,15 @@ def current_user

# If the object is new, let's get ready to mark the user as logged in when saving.
if @ubiquitous_user.new_record? or @ubiquitous_user.id != session[:user_id]
controller = self
# Read more about this technique on http://stackoverflow.com/questions/2495550/define-a-method-that-is-a-closure-in-ruby
klass = class << @ubiquitous_user;
self;
end
klass.send(:define_method, :after_save) do
super
controller.session[:user_id] = self.id
if !@ubiquitous_user.respond_to? :mark_user_as_logged_in_in_the_session
UbiquitousUser::Config::user_model_class.class_eval do
after_save :mark_user_as_logged_in_in_the_session
def mark_user_as_logged_in_in_the_session
@session_reference_by_ubiquitous_user[:user_id] = id
end
end
end
@ubiquitous_user.instance_variable_set "@session_reference_by_ubiquitous_user", self.session
end

return @ubiquitous_user
Expand Down
42 changes: 40 additions & 2 deletions test/helper.rb
Expand Up @@ -20,12 +20,49 @@ class RedirectBackError < Exception
end
end

class Model
attr_accessor :id
@@after_save_methods = []

def self.after_save(method)
@@after_save_methods << method
end

def self.find_by_id(user_id)
user = User.new
user.id = user_id
return user
end

def save
self.id = object_id if id.nil?
@@after_save_methods.each do |m|
send(m)
end
end

def save!
save
end

def new_record?
id.nil?
end
end

# Default user model.
class User
class User < Model
end

# An alternative user model.
class Person
class Person < Model
class <<self
alias_method :new_person, :new

def new
raise "This method shouldn't ever be called."
end
end
end

require "ubiquitous_user"
Expand All @@ -38,6 +75,7 @@ def initialize
@session = {}
@flash = {}
end

attr_accessor :session
attr_accessor :flash

Expand Down
114 changes: 39 additions & 75 deletions test/test_ubiquitous_user.rb
Expand Up @@ -4,120 +4,84 @@
require "helper"

class TestUbiquitousUser < Test::Unit::TestCase
context "A controller and a mock user" do
context "A controller" do
setup do
@controller = Controller.new
@user = mock("User")

# Just to be sure we are starting from scratch
assert_nil @controller.ubiquitous_user
assert_nil @controller.session[:user_id]
end

should "create a new user object on current_user" do
@user.expects(:new_record?).returns(true)
User.expects(:new).returns(@user)

user = @controller.current_user

assert_equal @user, user
assert_equal @user, @controller.ubiquitous_user
end

should "should return previous user object on current_user" do
@user.expects(:new_record?).returns(true)
@controller.ubiquitous_user = @user

user = @controller.current_user

assert_equal @user, user
assert_equal User, user.class
assert_equal @controller.ubiquitous_user, user
assert user.new_record?
end

should "find a user on current_user if there's a user_id on session" do
user_id = 42
@controller.session[:user_id] = user_id
@user.expects(:new_record?).returns(true)
User.expects(:find_by_id).with(user_id).returns(@user)

@controller.session[:user_id] = 42
user = @controller.current_user

assert_equal @user, user
assert_equal @user, @controller.ubiquitous_user
assert_equal @controller.session[:user_id], user.id
end

should "set the session user_id when saving a user" do
user_id = 43
User.expects(:new).returns(@user)
@user.expects(:new_record?).returns(true)
@user.expects(:save!)
@user.expects(:id).returns(user_id)
@user.expects(:after_save)

user = @controller.current_user
user.save!
# save! should be calling after_save, but it isn't because it's a mock, so
# let's call it manually
user.after_save

assert_equal @user, user
assert_equal @user, @controller.ubiquitous_user
assert_equal user_id, @controller.session[:user_id]
end

should "set user on current_user=" do
user_id = 45
user_name = "Alex"
@user.expects(:id).returns(user_id)
@user.expects(:name).returns(user_name)

@controller.current_user = @user

assert_equal @user, @controller.ubiquitous_user
assert_equal user_id, @controller.session[:user_id]
assert_equal user_name, @controller.session[:user_name]
assert_not_nil user.id
assert_not_nil @controller.session[:user_id]
assert_equal user.id, @controller.session[:user_id]
end

should "unset user on current_user=(nil)" do
@controller.current_user = nil

assert_equal nil, @controller.ubiquitous_user
assert_equal nil, @controller.session[:user_id]
assert_equal nil, @controller.session[:user_name]
end

context "and a user" do
setup do
@user = User.new
assert_nil @user.id
end

should "should return previous user object on current_user" do
@controller.ubiquitous_user = @user
assert_equal @user, @controller.current_user
assert_nil @controller.session[:user_id]
end

context "that is saved" do
setup do
@user.save!
assert_not_nil @user.id
end

should "set user on current_user=" do
@controller.current_user = @user

assert_equal @user, @controller.ubiquitous_user
assert_equal @user.id, @controller.session[:user_id]
end
end
end

context "with custom config" do
setup do
@orig_config = UbiquitousUser::Config.clone
UbiquitousUser::Config.user_model = :Person
UbiquitousUser::Config.user_model_new = :new_person
UbiquitousUser::Config.user_model_save = :save_person!
UbiquitousUser::Config.user_model_name = :full_name
end

teardown do
UbiquitousUser::Config.user_model = @orig_config.user_model
UbiquitousUser::Config.user_model_new = @orig_config.user_model_new
UbiquitousUser::Config.user_model_save = @orig_config.user_model_save
UbiquitousUser::Config.user_model_name = @orig_config.user_model_name
end

should "create a new user object on #current_user" do
@user.expects(:new_record?).returns(true)
Person.expects(:new_person).returns(@user)
assert_equal @user, @controller.current_user
assert_equal @user, @controller.ubiquitous_user
end

should "set user on current_user=" do
user_id = 45
user_name = "Alex"
@user.expects(:id).returns(user_id)
@user.expects(:full_name).returns(user_name)

@controller.current_user = @user

assert_equal @user, @controller.ubiquitous_user
assert_equal user_id, @controller.session[:user_id]
assert_equal user_name, @controller.session[:user_name]
person = @controller.current_user
assert_equal Person, person.class
end
end
end
Expand Down

0 comments on commit 90dbeac

Please sign in to comment.