Testing Authenticatable Module Authentication Methods in Devise
This test suite validates the core authentication functionality in Devise’s Authenticatable module. It focuses on user authentication methods, parameter filtering, and error handling mechanisms essential for secure user management.
Test Coverage Overview
Implementation Analysis
Technical Details
Best Practices Demonstrated
heartcombo/devise
test/models/authenticatable_test.rb
# frozen_string_literal: true
require 'test_helper'
class AuthenticatableTest < ActiveSupport::TestCase
test 'required_fields should be an empty array' do
assert_equal [], Devise::Models::Validatable.required_fields(User)
end
test 'find_first_by_auth_conditions allows custom filtering parameters' do
user = User.create!(email: "[email protected]", password: "1234567")
assert_equal user, User.find_first_by_auth_conditions({ email: "[email protected]" })
assert_nil User.find_first_by_auth_conditions({ email: "[email protected]" }, id: user.id.to_s.next)
end
# assumes default configuration of
# config.case_insensitive_keys = [:email]
# config.strip_whitespace_keys = [:email]
test 'find_or_initialize_with_errors uses parameter filter on find' do
user = User.create!(email: "[email protected]", password: "1234567")
assert_equal user, User.find_or_initialize_with_errors([:email], { email: " [email protected] " })
end
# assumes default configuration of
# config.case_insensitive_keys = [:email]
# config.strip_whitespace_keys = [:email]
test 'find_or_initialize_with_errors uses parameter filter on initialize' do
assert_equal "[email protected]", User.find_or_initialize_with_errors([:email], { email: " [email protected] " }).email
end
test 'find_or_initialize_with_errors adds blank error' do
user_with_error = User.find_or_initialize_with_errors([:email], { email: "" })
assert user_with_error.errors.added?(:email, :blank)
end
test 'find_or_initialize_with_errors adds invalid error' do
user_with_error = User.find_or_initialize_with_errors([:email], { email: "[email protected]" })
assert user_with_error.errors.added?(:email, :invalid)
end
if defined?(ActionController::Parameters)
test 'does not passes an ActionController::Parameters to find_first_by_auth_conditions through find_or_initialize_with_errors' do
user = create_user(email: '[email protected]')
attributes = ActionController::Parameters.new(email: '[email protected]')
User.expects(:find_first_by_auth_conditions).with({ 'email' => '[email protected]' }).returns(user)
User.find_or_initialize_with_errors([:email], attributes)
end
end
end