diff options
Diffstat (limited to 'spec/features/users/signup_spec.rb')
-rw-r--r-- | spec/features/users/signup_spec.rb | 465 |
1 files changed, 259 insertions, 206 deletions
diff --git a/spec/features/users/signup_spec.rb b/spec/features/users/signup_spec.rb index 30441dac7b6..f2381e41de8 100644 --- a/spec/features/users/signup_spec.rb +++ b/spec/features/users/signup_spec.rb @@ -3,39 +3,43 @@ require 'spec_helper' RSpec.shared_examples 'Signup name validation' do |field, max_length, label| - before do - visit new_user_registration_path - end + flag_values = [true, false] + flag_values.each do |val| + before do + stub_feature_flags(restyle_login_page: val) + visit new_user_registration_path + end - describe "#{field} validation", :js do - it "does not show an error border if the user's fullname length is not longer than #{max_length} characters" do - fill_in field, with: 'u' * max_length + describe "#{field} validation", :js do + it "does not show an error border if the user's fullname length is not longer than #{max_length} characters" do + fill_in field, with: 'u' * max_length - expect(find('.name')).not_to have_css '.gl-field-error-outline' - end + expect(find('.name')).not_to have_css '.gl-field-error-outline' + end - it 'shows an error border if the user\'s fullname contains an emoji' do - simulate_input("##{field}", 'Ehsan 🦋') + it 'shows an error border if the user\'s fullname contains an emoji' do + simulate_input("##{field}", 'Ehsan 🦋') - expect(find('.name')).to have_css '.gl-field-error-outline' - end + expect(find('.name')).to have_css '.gl-field-error-outline' + end - it "shows an error border if the user\'s fullname is longer than #{max_length} characters" do - fill_in field, with: 'n' * (max_length + 1) + it "shows an error border if the user\'s fullname is longer than #{max_length} characters" do + fill_in field, with: 'n' * (max_length + 1) - expect(find('.name')).to have_css '.gl-field-error-outline' - end + expect(find('.name')).to have_css '.gl-field-error-outline' + end - it "shows an error message if the user\'s #{label} is longer than #{max_length} characters" do - fill_in field, with: 'n' * (max_length + 1) + it "shows an error message if the user\'s #{label} is longer than #{max_length} characters" do + fill_in field, with: 'n' * (max_length + 1) - expect(page).to have_content("#{label} is too long (maximum is #{max_length} characters).") - end + expect(page).to have_content("#{label} is too long (maximum is #{max_length} characters).") + end - it 'shows an error message if the username contains emojis' do - simulate_input("##{field}", 'Ehsan 🦋') + it 'shows an error message if the username contains emojis' do + simulate_input("##{field}", 'Ehsan 🦋') - expect(page).to have_content("Invalid input, please avoid emojis") + expect(page).to have_content("Invalid input, please avoid emojis") + end end end end @@ -43,10 +47,6 @@ end RSpec.describe 'Signup' do include TermsHelper - before do - stub_application_setting(require_admin_approval_after_user_signup: false) - end - let(:new_user) { build_stubbed(:user) } def fill_in_signup_form @@ -63,214 +63,309 @@ RSpec.describe 'Signup' do visit user_confirmation_path(confirmation_token: new_user_token) end - describe 'username validation', :js do + flag_values = [true, false] + flag_values.each do |val| before do - visit new_user_registration_path + stub_feature_flags(restyle_login_page: val) + stub_application_setting(require_admin_approval_after_user_signup: false) end - it 'does not show an error border if the username is available' do - fill_in 'new_user_username', with: 'new-user' - wait_for_requests + describe 'username validation', :js do + before do + visit new_user_registration_path + end - expect(find('.username')).not_to have_css '.gl-field-error-outline' - end + it 'does not show an error border if the username is available' do + fill_in 'new_user_username', with: 'new-user' + wait_for_requests - it 'does not show an error border if the username contains dots (.)' do - simulate_input('#new_user_username', 'new.user.username') - wait_for_requests + expect(find('.username')).not_to have_css '.gl-field-error-outline' + end - expect(find('.username')).not_to have_css '.gl-field-error-outline' - end + it 'does not show an error border if the username contains dots (.)' do + simulate_input('#new_user_username', 'new.user.username') + wait_for_requests - it 'does not show an error border if the username length is not longer than 255 characters' do - fill_in 'new_user_username', with: 'u' * 255 - wait_for_requests + expect(find('.username')).not_to have_css '.gl-field-error-outline' + end - expect(find('.username')).not_to have_css '.gl-field-error-outline' - end + it 'does not show an error border if the username length is not longer than 255 characters' do + fill_in 'new_user_username', with: 'u' * 255 + wait_for_requests - it 'shows an error border if the username already exists' do - existing_user = create(:user) + expect(find('.username')).not_to have_css '.gl-field-error-outline' + end - fill_in 'new_user_username', with: existing_user.username - wait_for_requests + it 'shows an error border if the username already exists' do + existing_user = create(:user) - expect(find('.username')).to have_css '.gl-field-error-outline' - end + fill_in 'new_user_username', with: existing_user.username + wait_for_requests - it 'shows a success border if the username is available' do - fill_in 'new_user_username', with: 'new-user' - wait_for_requests + expect(find('.username')).to have_css '.gl-field-error-outline' + end - expect(find('.username')).to have_css '.gl-field-success-outline' - end + it 'shows a success border if the username is available' do + fill_in 'new_user_username', with: 'new-user' + wait_for_requests - it 'shows an error border if the username contains special characters' do - fill_in 'new_user_username', with: 'new$user!username' - wait_for_requests + expect(find('.username')).to have_css '.gl-field-success-outline' + end - expect(find('.username')).to have_css '.gl-field-error-outline' - end + it 'shows an error border if the username contains special characters' do + fill_in 'new_user_username', with: 'new$user!username' + wait_for_requests - it 'shows an error border if the username is longer than 255 characters' do - fill_in 'new_user_username', with: 'u' * 256 - wait_for_requests + expect(find('.username')).to have_css '.gl-field-error-outline' + end - expect(find('.username')).to have_css '.gl-field-error-outline' - end + it 'shows an error border if the username is longer than 255 characters' do + fill_in 'new_user_username', with: 'u' * 256 + wait_for_requests - it 'shows an error message if the username is longer than 255 characters' do - fill_in 'new_user_username', with: 'u' * 256 - wait_for_requests + expect(find('.username')).to have_css '.gl-field-error-outline' + end - expect(page).to have_content("Username is too long (maximum is 255 characters).") - end + it 'shows an error message if the username is longer than 255 characters' do + fill_in 'new_user_username', with: 'u' * 256 + wait_for_requests - it 'shows an error message if the username is less than 2 characters' do - fill_in 'new_user_username', with: 'u' - wait_for_requests + expect(page).to have_content("Username is too long (maximum is 255 characters).") + end - expect(page).to have_content("Username is too short (minimum is 2 characters).") - end + it 'shows an error message if the username is less than 2 characters' do + fill_in 'new_user_username', with: 'u' + wait_for_requests - it 'shows an error message on submit if the username contains special characters' do - fill_in 'new_user_username', with: 'new$user!username' - wait_for_requests + expect(page).to have_content("Username is too short (minimum is 2 characters).") + end - click_button "Register" + it 'shows an error message on submit if the username contains special characters' do + fill_in 'new_user_username', with: 'new$user!username' + wait_for_requests - expect(page).to have_content("Please create a username with only alphanumeric characters.") - end + click_button "Register" - it 'shows an error border if the username contains emojis' do - simulate_input('#new_user_username', 'ehsan😀') + expect(page).to have_content("Please create a username with only alphanumeric characters.") + end - expect(find('.username')).to have_css '.gl-field-error-outline' - end + it 'shows an error border if the username contains emojis' do + simulate_input('#new_user_username', 'ehsan😀') - it 'shows an error message if the username contains emojis' do - simulate_input('#new_user_username', 'ehsan😀') + expect(find('.username')).to have_css '.gl-field-error-outline' + end - expect(page).to have_content("Invalid input, please avoid emojis") - end + it 'shows an error message if the username contains emojis' do + simulate_input('#new_user_username', 'ehsan😀') - it 'shows a pending message if the username availability is being fetched', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/31484' do - fill_in 'new_user_username', with: 'new-user' + expect(page).to have_content("Invalid input, please avoid emojis") + end - expect(find('.username > .validation-pending')).not_to have_css '.hide' - end + it 'shows a pending message if the username availability is being fetched', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/31484' do + fill_in 'new_user_username', with: 'new-user' - it 'shows a success message if the username is available' do - fill_in 'new_user_username', with: 'new-user' - wait_for_requests + expect(find('.username > .validation-pending')).not_to have_css '.hide' + end - expect(find('.username > .validation-success')).not_to have_css '.hide' - end + it 'shows a success message if the username is available' do + fill_in 'new_user_username', with: 'new-user' + wait_for_requests - it 'shows an error message if the username is unavailable' do - existing_user = create(:user) + expect(find('.username > .validation-success')).not_to have_css '.hide' + end - fill_in 'new_user_username', with: existing_user.username - wait_for_requests + it 'shows an error message if the username is unavailable' do + existing_user = create(:user) - expect(find('.username > .validation-error')).not_to have_css '.hide' - end + fill_in 'new_user_username', with: existing_user.username + wait_for_requests - it 'shows a success message if the username is corrected and then available' do - fill_in 'new_user_username', with: 'new-user$' - wait_for_requests - fill_in 'new_user_username', with: 'new-user' - wait_for_requests + expect(find('.username > .validation-error')).not_to have_css '.hide' + end - expect(page).to have_content("Username is available.") + it 'shows a success message if the username is corrected and then available' do + fill_in 'new_user_username', with: 'new-user$' + wait_for_requests + fill_in 'new_user_username', with: 'new-user' + wait_for_requests + + expect(page).to have_content("Username is available.") + end end - end - context 'with no errors' do - context 'when sending confirmation email' do - before do - stub_application_setting(send_user_confirmation_email: true) + context 'with no errors' do + context 'when sending confirmation email' do + before do + stub_application_setting(send_user_confirmation_email: true) + end + + context 'when soft email confirmation is not enabled' do + before do + stub_feature_flags(soft_email_confirmation: false) + end + + it 'creates the user account and sends a confirmation email, and pre-fills email address after confirming' do + visit new_user_registration_path + + fill_in_signup_form + + expect { click_button 'Register' }.to change { User.count }.by(1) + expect(page).to have_current_path users_almost_there_path, ignore_query: true + expect(page).to have_content("Please check your email (#{new_user.email}) to confirm your account") + + confirm_email + + expect(find_field('Username or email').value).to eq(new_user.email) + end + end + + context 'when soft email confirmation is enabled' do + before do + stub_feature_flags(soft_email_confirmation: true) + end + + it 'creates the user account and sends a confirmation email' do + visit new_user_registration_path + + fill_in_signup_form + + expect { click_button 'Register' }.to change { User.count }.by(1) + expect(page).to have_current_path users_sign_up_welcome_path, ignore_query: true + end + end end - context 'when soft email confirmation is not enabled' do + context "when not sending confirmation email" do before do - stub_feature_flags(soft_email_confirmation: false) + stub_application_setting(send_user_confirmation_email: false) end - it 'creates the user account and sends a confirmation email, and pre-fills email address after confirming' do + it 'creates the user account and goes to dashboard' do visit new_user_registration_path fill_in_signup_form + click_button "Register" - expect { click_button 'Register' }.to change { User.count }.by(1) - expect(page).to have_current_path users_almost_there_path, ignore_query: true - expect(page).to have_content("Please check your email (#{new_user.email}) to confirm your account") - - confirm_email - - expect(find_field('Username or email').value).to eq(new_user.email) + expect(page).to have_current_path users_sign_up_welcome_path, ignore_query: true end end - context 'when soft email confirmation is enabled' do + context 'with required admin approval enabled' do before do - stub_feature_flags(soft_email_confirmation: true) + stub_application_setting(require_admin_approval_after_user_signup: true) end - it 'creates the user account and sends a confirmation email' do + it 'creates the user but does not sign them in' do visit new_user_registration_path fill_in_signup_form expect { click_button 'Register' }.to change { User.count }.by(1) - expect(page).to have_current_path users_sign_up_welcome_path, ignore_query: true + expect(page).to have_current_path new_user_session_path, ignore_query: true + expect(page).to have_content("You have signed up successfully. However, we could not sign you in because your account is awaiting approval from your GitLab administrator") end end end - context "when not sending confirmation email" do - before do - stub_application_setting(send_user_confirmation_email: false) + context 'with errors' do + it "displays the errors" do + create(:user, email: new_user.email) + visit new_user_registration_path + + fill_in_signup_form + click_button "Register" + + expect(page).to have_current_path user_registration_path, ignore_query: true + expect(page).to have_content("error prohibited this user from being saved") + expect(page).to have_content("Email has already been taken") end - it 'creates the user account and goes to dashboard' do + it 'does not redisplay the password' do + create(:user, email: new_user.email) visit new_user_registration_path fill_in_signup_form click_button "Register" - expect(page).to have_current_path users_sign_up_welcome_path, ignore_query: true + expect(page).to have_current_path user_registration_path, ignore_query: true + expect(page.body).not_to match(/#{new_user.password}/) end end - context 'with required admin approval enabled' do + context 'when terms are enforced' do before do - stub_application_setting(require_admin_approval_after_user_signup: true) + enforce_terms end - it 'creates the user but does not sign them in' do + it 'renders text that the user confirms terms by clicking register' do visit new_user_registration_path + expect(page).to have_content(/By clicking Register, I agree that I have read and accepted the Terms of Use and Privacy Policy/) + fill_in_signup_form + click_button 'Register' - expect { click_button 'Register' }.to change { User.count }.by(1) - expect(page).to have_current_path new_user_session_path, ignore_query: true - expect(page).to have_content("You have signed up successfully. However, we could not sign you in because your account is awaiting approval from your GitLab administrator") + expect(page).to have_current_path users_sign_up_welcome_path, ignore_query: true end end - end - context 'with errors' do - it "displays the errors" do - create(:user, email: new_user.email) + context 'when reCAPTCHA and invisible captcha are enabled' do + before do + stub_application_setting(invisible_captcha_enabled: true) + stub_application_setting(recaptcha_enabled: true) + allow_next_instance_of(RegistrationsController) do |instance| + allow(instance).to receive(:verify_recaptcha).and_return(true) + end + end + + context 'when reCAPTCHA detects malicious behaviour' do + before do + allow_next_instance_of(RegistrationsController) do |instance| + allow(instance).to receive(:verify_recaptcha).and_return(false) + end + end + + it 'prevents from signing up' do + visit new_user_registration_path + + fill_in_signup_form + + expect { click_button 'Register' }.not_to change { User.count } + expect(page).to have_content(_('There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.')) + end + end + + context 'when invisible captcha detects malicious behaviour' do + it 'prevents from signing up' do + visit new_user_registration_path + + fill_in_signup_form + + expect { click_button 'Register' }.not_to change { User.count } + expect(page).to have_content('That was a bit too quick! Please resubmit.') + end + end + end + + it 'redirects to step 2 of the signup process, sets the role and redirects back' do + stub_feature_flags(about_your_company_registration_flow: false) visit new_user_registration_path fill_in_signup_form - click_button "Register" + click_button 'Register' - expect(page).to have_current_path user_registration_path, ignore_query: true - expect(page).to have_content("error prohibited this user from being saved") - expect(page).to have_content("Email has already been taken") + visit new_project_path + + expect(page).to have_current_path(users_sign_up_welcome_path) + + select 'Software Developer', from: 'user_role' + click_button 'Get started!' + + created_user = User.find_by_username(new_user.username) + + expect(created_user.software_developer_role?).to be_truthy + expect(created_user.setup_for_company).to be_nil + expect(page).to have_current_path(new_project_path) end it 'does not redisplay the password' do @@ -283,6 +378,12 @@ RSpec.describe 'Signup' do expect(page).to have_current_path user_registration_path, ignore_query: true expect(page.body).not_to match(/#{new_user.password}/) end + + context 'with invalid email', :saas, :js do + it_behaves_like 'user email validation' do + let(:path) { new_user_registration_path } + end + end end context 'when terms are enforced' do @@ -298,69 +399,21 @@ RSpec.describe 'Signup' do fill_in_signup_form click_button 'Register' - expect(page).to have_current_path users_sign_up_welcome_path, ignore_query: true - end - end - - context 'when reCAPTCHA and invisible captcha are enabled' do - before do - stub_application_setting(invisible_captcha_enabled: true) - stub_application_setting(recaptcha_enabled: true) - allow_next_instance_of(RegistrationsController) do |instance| - allow(instance).to receive(:verify_recaptcha).and_return(true) - end - end - - context 'when reCAPTCHA detects malicious behaviour' do - before do - allow_next_instance_of(RegistrationsController) do |instance| - allow(instance).to receive(:verify_recaptcha).and_return(false) - end - end - - it 'prevents from signing up' do - visit new_user_registration_path + visit new_project_path - fill_in_signup_form + expect(page).to have_current_path(users_sign_up_welcome_path) - expect { click_button 'Register' }.not_to change { User.count } - expect(page).to have_content(_('There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.')) - end - end - - context 'when invisible captcha detects malicious behaviour' do - it 'prevents from signing up' do - visit new_user_registration_path + select 'Software Developer', from: 'user_role' + click_button 'Get started!' - fill_in_signup_form + created_user = User.find_by_username(new_user.username) - expect { click_button 'Register' }.not_to change { User.count } - expect(page).to have_content('That was a bit too quick! Please resubmit.') - end + expect(created_user.software_developer_role?).to be_truthy + expect(created_user.setup_for_company).to be_nil + expect(page).to have_current_path(new_project_path) end - end - - it 'redirects to step 2 of the signup process, sets the role and redirects back' do - stub_feature_flags(about_your_company_registration_flow: false) - visit new_user_registration_path - - fill_in_signup_form - click_button 'Register' - - visit new_project_path - expect(page).to have_current_path(users_sign_up_welcome_path) - - select 'Software Developer', from: 'user_role' - click_button 'Get started!' - - created_user = User.find_by_username(new_user.username) - - expect(created_user.software_developer_role?).to be_truthy - expect(created_user.setup_for_company).to be_nil - expect(page).to have_current_path(new_project_path) + it_behaves_like 'Signup name validation', 'new_user_first_name', 127, 'First name' + it_behaves_like 'Signup name validation', 'new_user_last_name', 127, 'Last name' end - - it_behaves_like 'Signup name validation', 'new_user_first_name', 127, 'First name' - it_behaves_like 'Signup name validation', 'new_user_last_name', 127, 'Last name' end |