summaryrefslogtreecommitdiff
path: root/spec/features
diff options
context:
space:
mode:
authorRobert Speicher <rspeicher@gmail.com>2015-05-05 22:16:45 -0400
committerRobert Speicher <rspeicher@gmail.com>2015-05-09 17:32:08 -0400
commit5520397f048243ad7fd8a39faf9d9f7b5a97c5bc (patch)
treecfe27297df119b88d5736e047697bbe27d54ac12 /spec/features
parent66bc758e2b9ba736035d036b25b17bdbb83c39b3 (diff)
downloadgitlab-ce-5520397f048243ad7fd8a39faf9d9f7b5a97c5bc.tar.gz
Make two-factor login work and add a feature spec
Diffstat (limited to 'spec/features')
-rw-r--r--spec/features/login_spec.rb82
1 files changed, 82 insertions, 0 deletions
diff --git a/spec/features/login_spec.rb b/spec/features/login_spec.rb
new file mode 100644
index 00000000000..5ffaae54766
--- /dev/null
+++ b/spec/features/login_spec.rb
@@ -0,0 +1,82 @@
+require 'spec_helper'
+
+feature 'Login' do
+ let(:user) { create(:user) }
+
+ context 'with two-factor authentication' do
+ before do
+ user.otp_required_for_login = true
+ user.otp_secret = User.generate_otp_secret
+ user.save!
+ end
+
+ context 'with valid username/password' do
+ before do
+ login_with(user)
+ expect(page).to have_content('Two-factor Authentication')
+ end
+
+ def enter_code(code)
+ fill_in 'Two-factor authentication code', with: code
+ click_button 'Verify code'
+ end
+
+ context 'using one-time code' do
+ it 'allows login with valid code' do
+ enter_code(user.current_otp)
+ expect(current_path).to eq root_path
+ end
+
+ it 'blocks login with invalid code' do
+ enter_code('foo')
+ expect(page).to have_content('Invalid two-factor code')
+ end
+ end
+
+ context 'using backup code' do
+ let(:codes) { user.generate_otp_backup_codes! }
+
+ before do
+ expect(codes.size).to eq 5
+
+ # Because `generate_otp_backup_codes!` doesn't actually do this...
+ user.save
+ end
+
+ context 'with valid code' do
+ it 'allows login' do
+ enter_code(codes.sample)
+ expect(current_path).to eq root_path
+ end
+
+ it 'invalidates the used code' do
+ # FIXME (rspeicher): Broken library is broken
+ expect { enter_code(codes.sample) }.to change { user.otp_backup_codes.size }.by(-1)
+ end
+ end
+
+ context 'with invalid code' do
+ it 'blocks login' do
+ # FIXME (rspeicher): Broken library is broken
+ code = codes.sample
+ expect(user.invalidate_otp_backup_code!(code)).to eq true
+ expect(user.otp_backup_codes.size).to eq 4 # Passes
+ user.save!
+ user.reload
+ expect(user.otp_backup_codes.size).to eq 4 # Fails... WAT?!
+
+ enter_code(code)
+ expect(page).to have_content('Invalid two-factor code')
+ end
+ end
+ end
+ end
+ end
+
+ context 'without two-factor authentication' do
+ it 'allows basic login' do
+ login_with(user)
+ expect(current_path).to eq root_path
+ end
+ end
+end