Skip to content

Commit 7d4f343

Browse files
test: add unit tests for two-factor model, strategy, and registration
Add model tests for TwoFactorAuthenticatable (enabled/disabled states, multiple methods, unknown method errors, model concern inclusion). Add strategy tests for the base TwoFactor strategy. Add registration tests for register_two_factor_method in devise_test.
1 parent 47c49a1 commit 7d4f343

3 files changed

Lines changed: 89 additions & 0 deletions

File tree

test/devise_test.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,29 @@ class DeviseTest < ActiveSupport::TestCase
8686
Devise::CONTROLLERS.delete(:kivi)
8787
end
8888

89+
test 'register_two_factor_method stores config and populates STRATEGIES' do
90+
Devise.register_two_factor_method(:fake_2fa, model: 'devise/models/fake_2fa', strategy: :fake_2fa_strategy)
91+
assert_equal({ model: 'devise/models/fake_2fa', strategy: :fake_2fa_strategy }, Devise.two_factor_method_configs[:fake_2fa])
92+
assert_equal :fake_2fa_strategy, Devise::STRATEGIES[:fake_2fa]
93+
Devise.two_factor_method_configs.delete(:fake_2fa)
94+
Devise::STRATEGIES.delete(:fake_2fa)
95+
end
96+
97+
test 'register_two_factor_method with route populates ROUTES and URL_HELPERS' do
98+
Devise.register_two_factor_method(:fake_rt, model: 'x', route: { fake_rt: [nil, :new] })
99+
assert_equal :fake_rt, Devise::ROUTES[:fake_rt]
100+
assert_equal [nil, :new], Devise::URL_HELPERS[:fake_rt]
101+
Devise.two_factor_method_configs.delete(:fake_rt)
102+
Devise::ROUTES.delete(:fake_rt)
103+
Devise::URL_HELPERS.delete(:fake_rt)
104+
end
105+
106+
test 'register_two_factor_method rejects unknown options' do
107+
assert_raises(ArgumentError) do
108+
Devise.register_two_factor_method(:bad, model: 'x', unknown: true)
109+
end
110+
end
111+
89112
test 'Devise.secure_compare fails when comparing different strings or nil' do
90113
[nil, ""].each do |empty|
91114
assert_not Devise.secure_compare(empty, "something")
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# frozen_string_literal: true
2+
3+
require 'test_helper'
4+
5+
class TwoFactorAuthenticatableTest < ActiveSupport::TestCase
6+
test '.two_factor_modules returns the configured two_factor_methods' do
7+
assert_equal [:test_otp], UserWithTwoFactor.two_factor_modules
8+
end
9+
10+
test '#two_factor_enabled? returns true when any method reports enabled' do
11+
user = new_user_with_two_factor
12+
user.stubs(:test_otp_two_factor_enabled?).returns(true)
13+
assert user.two_factor_enabled?
14+
assert_equal [:test_otp], user.enabled_two_factors
15+
end
16+
17+
test '#two_factor_enabled? returns false when no method reports enabled' do
18+
user = new_user_with_two_factor
19+
user.stubs(:test_otp_two_factor_enabled?).returns(false)
20+
assert_not user.two_factor_enabled?
21+
assert_empty user.enabled_two_factors
22+
end
23+
24+
test '.two_factor_methods= raises on unknown method' do
25+
klass = Class.new do
26+
extend Devise::Models::TwoFactorAuthenticatable::ClassMethods
27+
end
28+
29+
assert_raises(RuntimeError, /Unknown two-factor method/) do
30+
klass.two_factor_methods = [:nonexistent]
31+
end
32+
end
33+
34+
private
35+
36+
def new_user_with_two_factor(attributes = {})
37+
UserWithTwoFactor.new(valid_attributes(attributes))
38+
end
39+
end

test/strategies/two_factor_test.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# frozen_string_literal: true
2+
3+
require 'test_helper'
4+
5+
class TwoFactorStrategyTest < ActiveSupport::TestCase
6+
test 'TwoFactor strategy can be loaded' do
7+
assert defined?(Devise::Strategies::TwoFactor)
8+
end
9+
10+
test 'TwoFactor base strategy is not valid without a pending session' do
11+
strategy = Devise::Strategies::TwoFactor.new(env_with_session)
12+
assert_not strategy.valid?
13+
end
14+
15+
test 'verify_two_factor! raises NotImplementedError by default' do
16+
strategy = Devise::Strategies::TwoFactor.new(env_with_session)
17+
assert_raises(NotImplementedError) do
18+
strategy.verify_two_factor!(Object.new)
19+
end
20+
end
21+
22+
private
23+
24+
def env_with_session(session = {})
25+
{ 'rack.session' => session }
26+
end
27+
end

0 commit comments

Comments
 (0)