PageRenderTime 50ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/spec/features/oauth_login_spec.rb

https://gitlab.com/wolfgang42/gitlab-ce
Ruby | 128 lines | 96 code | 31 blank | 1 comment | 2 complexity | 43c5afab4bd089337494cffdddf2fb0b MD5 | raw file
  1. # frozen_string_literal: true
  2. require 'spec_helper'
  3. describe 'OAuth Login', :js, :allow_forgery_protection do
  4. include DeviseHelpers
  5. def enter_code(code)
  6. fill_in 'user_otp_attempt', with: code
  7. click_button 'Verify code'
  8. end
  9. def stub_omniauth_config(provider)
  10. OmniAuth.config.add_mock(provider, OmniAuth::AuthHash.new(provider: provider.to_s, uid: "12345"))
  11. stub_omniauth_provider(provider)
  12. end
  13. providers = [:github, :twitter, :bitbucket, :gitlab, :google_oauth2,
  14. :facebook, :cas3, :auth0, :authentiq, :salesforce]
  15. around(:all) do |example|
  16. with_omniauth_full_host { example.run }
  17. end
  18. def login_with_provider(provider, enter_two_factor: false, additional_info: {})
  19. login_via(provider.to_s, user, uid, remember_me: remember_me, additional_info: additional_info)
  20. enter_code(user.current_otp) if enter_two_factor
  21. end
  22. providers.each do |provider|
  23. context "when the user logs in using the #{provider} provider" do
  24. let(:uid) { 'my-uid' }
  25. let(:remember_me) { false }
  26. let(:user) { create(:omniauth_user, extern_uid: uid, provider: provider.to_s) }
  27. let(:two_factor_user) { create(:omniauth_user, :two_factor, extern_uid: uid, provider: provider.to_s) }
  28. provider == :salesforce ? let(:additional_info) { { extra: { email_verified: true } } } : let(:additional_info) { {} }
  29. before do
  30. stub_omniauth_config(provider)
  31. expect(ActiveSession).to receive(:cleanup).with(user).at_least(:once).and_call_original
  32. end
  33. context 'when two-factor authentication is disabled' do
  34. it 'logs the user in' do
  35. login_with_provider(provider, additional_info: additional_info)
  36. expect(current_path).to eq root_path
  37. end
  38. end
  39. context 'when two-factor authentication is enabled' do
  40. let(:user) { two_factor_user }
  41. it 'logs the user in' do
  42. login_with_provider(provider, additional_info: additional_info, enter_two_factor: true)
  43. expect(current_path).to eq root_path
  44. end
  45. it 'when bypass-two-factor is enabled' do
  46. allow(Gitlab.config.omniauth).to receive_messages(allow_bypass_two_factor: true)
  47. login_via(provider.to_s, user, uid, remember_me: false, additional_info: additional_info)
  48. expect(current_path).to eq root_path
  49. end
  50. it 'when bypass-two-factor is disabled' do
  51. allow(Gitlab.config.omniauth).to receive_messages(allow_bypass_two_factor: false)
  52. login_with_provider(provider, enter_two_factor: true, additional_info: additional_info)
  53. expect(current_path).to eq root_path
  54. end
  55. end
  56. context 'when "remember me" is checked' do
  57. let(:remember_me) { true }
  58. context 'when two-factor authentication is disabled' do
  59. it 'remembers the user after a browser restart' do
  60. login_with_provider(provider, additional_info: additional_info)
  61. clear_browser_session
  62. visit(root_path)
  63. expect(current_path).to eq root_path
  64. end
  65. end
  66. context 'when two-factor authentication is enabled' do
  67. let(:user) { two_factor_user }
  68. it 'remembers the user after a browser restart' do
  69. login_with_provider(provider, enter_two_factor: true, additional_info: additional_info)
  70. clear_browser_session
  71. visit(root_path)
  72. expect(current_path).to eq root_path
  73. end
  74. end
  75. end
  76. context 'when "remember me" is not checked' do
  77. context 'when two-factor authentication is disabled' do
  78. it 'does not remember the user after a browser restart' do
  79. login_with_provider(provider, additional_info: additional_info)
  80. clear_browser_session
  81. visit(root_path)
  82. expect(current_path).to eq new_user_session_path
  83. end
  84. end
  85. context 'when two-factor authentication is enabled' do
  86. let(:user) { two_factor_user }
  87. it 'does not remember the user after a browser restart' do
  88. login_with_provider(provider, enter_two_factor: true, additional_info: additional_info)
  89. clear_browser_session
  90. visit(root_path)
  91. expect(current_path).to eq new_user_session_path
  92. end
  93. end
  94. end
  95. end
  96. end
  97. end