1 # frozen_string_literal: true
5 RSpec
.describe Auth
::SessionsController, type
: :controller do
10 request
.env['devise.mapping'] = Devise
.mappings
[:user]
13 it
'returns http success' do
15 expect(response
).to
have_http_status(:success)
19 describe
'DELETE #destroy' do
20 let(:user) { Fabricate(:user) }
23 request
.env['devise.mapping'] = Devise
.mappings
[:user]
26 context
'with a regular user' do
27 it
'redirects to home after sign out' do
28 sign_in(user
, scope
: :user)
31 expect(response
).to
redirect_to(root_path
)
35 context
'with a suspended user' do
36 it
'redirects to home after sign out' do
37 Fabricate(:account, user
: user
, suspended
: true)
38 sign_in(user
, scope
: :user)
41 expect(response
).to
redirect_to(root_path
)
46 describe
'POST #create' do
48 request
.env['devise.mapping'] = Devise
.mappings
[:user]
51 context
'using password authentication' do
52 let(:user) { Fabricate(:user, email
: 'foo@bar.com', password
: 'abcdefgh') }
54 context
'using a valid password' do
56 post
:create, params
: { user
: { email
: user
.email
, password
: user
.password
} }
59 it
'redirects to home' do
60 expect(response
).to
redirect_to(root_path
)
63 it
'logs the user in' do
64 expect(controller
.current_user
).to eq user
68 context
'using an invalid password' do
70 post
:create, params
: { user
: { email
: user
.email
, password
: 'wrongpw' } }
73 it
'shows a login error' do
74 expect(flash
[:alert]).to match I18n
.t('devise.failure.invalid', authentication_keys
: 'Email')
77 it
"doesn't log the user in" do
78 expect(controller
.current_user
).to be_nil
82 context
'using an unconfirmed password' do
84 request
.headers
['Accept-Language'] = accept_language
85 post
:create, params
: { user
: { email
: unconfirmed_user
.email
, password
: unconfirmed_user
.password
} }
88 let(:unconfirmed_user) { user
.tap
{ |u
| u
.update!
(confirmed_at
: nil) } }
89 let(:accept_language) { 'fr' }
91 it
'shows a translated login error' do
92 expect(flash
[:alert]).to
eq(I18n
.t('devise.failure.unconfirmed', locale
: accept_language
))
96 context
"logging in from the user's page" do
98 allow(controller
).to
receive(:single_user_mode?).and_return(single_user_mode
)
99 allow(controller
).to
receive(:stored_location_for).with(:user).and_return("/@#{user.account.username}")
100 post
:create, params
: { user
: { email
: user
.email
, password
: user
.password
} }
103 context
"in single user mode" do
104 let(:single_user_mode) { true }
106 it
'redirects to home' do
107 expect(response
).to
redirect_to(root_path
)
111 context
"in non-single user mode" do
112 let(:single_user_mode) { false }
114 it
"redirects back to the user's page" do
115 expect(response
).to
redirect_to(short_account_path(username
: user
.account
))
121 context
'using two-factor authentication' do
123 Fabricate(:user, email
: 'x@y.com', password
: 'abcdefgh',
124 otp_required_for_login
: true, otp_secret
: User
.generate_otp_secret(32))
126 let(:recovery_codes) do
127 codes
= user
.generate_otp_backup_codes!
132 context
'using a valid OTP' do
134 post
:create, params
: { user
: { otp_attempt
: user
.current_otp
} }, session
: { otp_user_id
: user
.id
}
137 it
'redirects to home' do
138 expect(response
).to
redirect_to(root_path
)
141 it
'logs the user in' do
142 expect(controller
.current_user
).to eq user
146 context
'when the server has an decryption error' do
148 allow_any_instance_of(User
).to
receive(:validate_and_consume_otp!
).and_raise(OpenSSL
::Cipher::CipherError)
149 post
:create, params
: { user
: { otp_attempt
: user
.current_otp
} }, session
: { otp_user_id
: user
.id
}
152 it
'shows a login error' do
153 expect(flash
[:alert]).to match I18n
.t('users.invalid_otp_token')
156 it
"doesn't log the user in" do
157 expect(controller
.current_user
).to be_nil
161 context
'using a valid recovery code' do
163 post
:create, params
: { user
: { otp_attempt
: recovery_codes
.first
} }, session
: { otp_user_id
: user
.id
}
166 it
'redirects to home' do
167 expect(response
).to
redirect_to(root_path
)
170 it
'logs the user in' do
171 expect(controller
.current_user
).to eq user
175 context
'using an invalid OTP' do
177 post
:create, params
: { user
: { otp_attempt
: 'wrongotp' } }, session
: { otp_user_id
: user
.id
}
180 it
'shows a login error' do
181 expect(flash
[:alert]).to match I18n
.t('users.invalid_otp_token')
184 it
"doesn't log the user in" do
185 expect(controller
.current_user
).to be_nil