-
-
Save saroar/de78f4d7060103bf2bdf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
FAIL["test_current_user_returns_right_user_when_session_is_nil", SessionsHelperTest, 2015-08-22 04:39:45 +0300] | |
test_current_user_returns_right_user_when_session_is_nil#SessionsHelperTest (1440207585.90s) | |
--- expected | |
+++ actual | |
@@ -1 +1 @@ | |
-#<User id: 357369365, name: "Alina Example", email: "alina@example.com", created_at: "2015-08-23 08:33:16", updated_at: "2015-08-23 08:33:16", password_digest: "$2a$04$jt0JUcrAoqGpxsRH3MtyheXGKYwXP.Tv3EHiXFhq.5v...", remember_digest: nil> | |
+nil | |
test/helpers/sessions_helper_test.rb:11:in `block in <class:SessionsHelperTest>' | |
USER.RB | |
class User < ActiveRecord::Base | |
attr_accessor :remember_token | |
before_save { self.email = email.downcase } | |
validates :name, presence: true, length: { maximum: 50 } | |
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i | |
validates :email, presence: true, length: { maximum: 255 }, | |
format: { with: VALID_EMAIL_REGEX }, | |
uniqueness: { case_sensitive: false } | |
has_secure_password | |
validates :password, presence: true, length: { minimum: 6 } | |
# Returns the hash digest of the given string. | |
def User.digest(string) | |
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : | |
BCrypt::Engine.cost | |
BCrypt::Password.create(string, cost: cost) | |
end | |
# Returns a random token. | |
def User.new_token | |
SecureRandom.urlsafe_base64 | |
end | |
# Remembers a user in the database for use in persistent sessions. | |
def remember | |
self.remember_token = User.new_token | |
update_attribute(:remember_digest, User.digest(remember_token)) | |
end | |
# Returns true if the given token matches the digest. | |
def authenticated?(remember_token) | |
return false if remember_digest.nil? | |
BCrypt::Password.new(remember_digest).is_password?(remember_token) | |
end | |
# Forgets a user. | |
def forget | |
update_attribute(:remember_digest, nil) | |
end | |
end | |
USERS.YML | |
alina: | |
name: Alina Example | |
email: alina@example.com | |
password_digest: <%= User.digest('password') %> | |
TEST_HELPER.RB | |
ENV['RAILS_ENV'] ||= 'test' | |
require File.expand_path('../../config/environment', __FILE__) | |
require 'rails/test_help' | |
require 'minitest/reporters' | |
Minitest::Reporters.use! | |
class ActiveSupport::TestCase | |
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. | |
fixtures :all | |
# Returns true if a test user is logged in. | |
def is_logged_in? | |
!session[:user_id].nil? | |
end | |
# Logs in a test user | |
def log_in_as(user, options={}) | |
password = options[:password] || 'password' | |
remember_me = options[:remember_me] || 1 | |
if integegration_test? | |
post login_path, session: { email: user.email, | |
password: password, | |
remember_me: remember_me | |
} | |
else | |
session[:user_id] = user.id | |
end | |
end | |
# Returns true inside an integration test. | |
def integegration_test? | |
defined?(post_via_redirect) | |
end | |
end | |
SESSIONS_HELPER.rb | |
module SessionsHelper | |
# Logs in the given user. | |
def log_in(user) | |
session[:user_id] = user.id | |
end | |
# Remeber a user in a persistent session. | |
def remember(user) | |
cookies.permanent.signed[:user_id] = user.id | |
cookies.permanent[:remember_token] = user.remember_token | |
end | |
# Returns the user corresponding to the remember token cookie. | |
def current_user | |
if (user_id = session[:user_id]) | |
@current_user ||= User.find_by(id: user_id) | |
elsif (user_id = cookies.signed[:user_id]) | |
user = User.find_by(id: user_id) | |
if user && user.authenticated?(cookies[:remember_token]) | |
log_in user | |
@current_user = user | |
end | |
end | |
end | |
# Logs in the given user | |
def logged_in? | |
!current_user.nil? | |
end | |
#Forgets a persistent session | |
def forget(user) | |
user.forget | |
cookies.delete(:user_id) | |
cookies.delete(:remember_token) | |
end | |
#Logs out the current User | |
def log_out | |
forget(current_user) | |
session.delete(:user_id) | |
@current_user = nil | |
end | |
end | |
SESSIONS_HELPER_TEST.rb | |
require 'test_helper' | |
class SessionsHelperTest < ActionView::TestCase | |
def setup | |
@user = users(:alina) | |
remember(@user) | |
end | |
test "current_user returns right user when session is nil" do | |
assert_equal @user, current_user | |
assert is_logged_in? | |
end | |
test "current_user returns nil when remember digest is wrong" do | |
@user.update_attribute(:remember_digest, User.digest(User.new_token)) | |
assert_nil current_user | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment