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(new_user_session_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(new_user_session_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 email with uppercase letters' do
70 post
:create, params
: { user
: { email
: user
.email
.upcase
, password
: user
.password
} }
73 it
'redirects to home' do
74 expect(response
).to
redirect_to(root_path
)
77 it
'logs the user in' do
78 expect(controller
.current_user
).to eq user
82 context
'using an invalid password' do
84 post
:create, params
: { user
: { email
: user
.email
, password
: 'wrongpw' } }
87 it
'shows a login error' do
88 expect(flash
[:alert]).to match I18n
.t('devise.failure.invalid', authentication_keys
: 'Email')
91 it
"doesn't log the user in" do
92 expect(controller
.current_user
).to be_nil
96 context
'using an unconfirmed password' do
98 request
.headers
['Accept-Language'] = accept_language
99 post
:create, params
: { user
: { email
: unconfirmed_user
.email
, password
: unconfirmed_user
.password
} }
102 let(:unconfirmed_user) { user
.tap
{ |u
| u
.update!
(confirmed_at
: nil) } }
103 let(:accept_language) { 'fr' }
105 it
'shows a translated login error' do
106 expect(flash
[:alert]).to
eq(I18n
.t('devise.failure.unconfirmed', locale
: accept_language
))
110 context
"logging in from the user's page" do
112 allow(controller
).to
receive(:single_user_mode?).and_return(single_user_mode
)
113 allow(controller
).to
receive(:stored_location_for).with(:user).and_return("/@#{user.account.username}")
114 post
:create, params
: { user
: { email
: user
.email
, password
: user
.password
} }
117 context
"in single user mode" do
118 let(:single_user_mode) { true }
120 it
'redirects to home' do
121 expect(response
).to
redirect_to(root_path
)
125 context
"in non-single user mode" do
126 let(:single_user_mode) { false }
128 it
"redirects back to the user's page" do
129 expect(response
).to
redirect_to(short_account_path(username
: user
.account
))
135 context
'using two-factor authentication' do
137 Fabricate(:user, email
: 'x@y.com', password
: 'abcdefgh',
138 otp_required_for_login
: true, otp_secret
: User
.generate_otp_secret(32))
140 let(:recovery_codes) do
141 codes
= user
.generate_otp_backup_codes!
146 context
'using email and password' do
148 post
:create, params
: { user
: { email
: user
.email
, password
: user
.password
} }
151 it
'renders two factor authentication page' do
152 expect(controller
).to
render_template("two_factor")
156 context
'using upcase email and password' do
158 post
:create, params
: { user
: { email
: user
.email
.upcase
, password
: user
.password
} }
161 it
'renders two factor authentication page' do
162 expect(controller
).to
render_template("two_factor")
166 context
'using a valid OTP' do
168 post
:create, params
: { user
: { otp_attempt
: user
.current_otp
} }, session
: { otp_user_id
: user
.id
}
171 it
'redirects to home' do
172 expect(response
).to
redirect_to(root_path
)
175 it
'logs the user in' do
176 expect(controller
.current_user
).to eq user
180 context
'when the server has an decryption error' do
182 allow_any_instance_of(User
).to
receive(:validate_and_consume_otp!
).and_raise(OpenSSL
::Cipher::CipherError)
183 post
:create, params
: { user
: { otp_attempt
: user
.current_otp
} }, session
: { otp_user_id
: user
.id
}
186 it
'shows a login error' do
187 expect(flash
[:alert]).to match I18n
.t('users.invalid_otp_token')
190 it
"doesn't log the user in" do
191 expect(controller
.current_user
).to be_nil
195 context
'using a valid recovery code' do
197 post
:create, params
: { user
: { otp_attempt
: recovery_codes
.first
} }, session
: { otp_user_id
: user
.id
}
200 it
'redirects to home' do
201 expect(response
).to
redirect_to(root_path
)
204 it
'logs the user in' do
205 expect(controller
.current_user
).to eq user
209 context
'using an invalid OTP' do
211 post
:create, params
: { user
: { otp_attempt
: 'wrongotp' } }, session
: { otp_user_id
: user
.id
}
214 it
'shows a login error' do
215 expect(flash
[:alert]).to match I18n
.t('users.invalid_otp_token')
218 it
"doesn't log the user in" do
219 expect(controller
.current_user
).to be_nil