diff options
Diffstat (limited to 'spec/controllers/registrations_controller_spec.rb')
-rw-r--r-- | spec/controllers/registrations_controller_spec.rb | 113 |
1 files changed, 110 insertions, 3 deletions
diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb index aac7c10d878..ff73c0aafe8 100644 --- a/spec/controllers/registrations_controller_spec.rb +++ b/spec/controllers/registrations_controller_spec.rb @@ -20,10 +20,15 @@ RSpec.describe RegistrationsController do end describe '#create' do - let(:base_user_params) { { first_name: 'first', last_name: 'last', username: 'new_username', email: 'new@user.com', password: 'Any_password' } } - let(:user_params) { { user: base_user_params } } + let_it_be(:base_user_params) do + { first_name: 'first', last_name: 'last', username: 'new_username', email: 'new@user.com', password: 'Any_password' } + end + + let_it_be(:user_params) { { user: base_user_params } } - subject { post(:create, params: user_params) } + let(:session_params) { {} } + + subject { post(:create, params: user_params, session: session_params) } context '`blocked_pending_approval` state' do context 'when the `require_admin_approval_after_user_signup` setting is turned on' do @@ -148,6 +153,90 @@ RSpec.describe RegistrationsController do expect { subject }.to have_enqueued_mail(DeviseMailer, :confirmation_instructions) expect(controller.current_user).to be_nil end + + context 'when registration is triggered from an accepted invite' do + context 'when it is part of our invite email experiment', :experiment do + let_it_be(:member) { create(:project_member, :invited, invite_email: user_params.dig(:user, :email)) } + + let(:originating_member_id) { member.id } + let(:session_params) do + { + invite_email: user_params.dig(:user, :email), + originating_member_id: originating_member_id + } + end + + context 'when member exists from the session key value' do + it 'tracks the experiment' do + expect(experiment('members/invite_email')).to track(:accepted) + .with_context(actor: member) + .on_next_instance + + subject + end + end + + context 'when member does not exist from the session key value' do + let(:originating_member_id) { -1 } + + it 'tracks the experiment' do + expect(experiment('members/invite_email')).not_to track(:accepted) + + subject + end + end + end + + context 'when it is part of our invite_signup_page_interaction experiment', :experiment do + let_it_be(:member) { create(:project_member, :invited, invite_email: user_params.dig(:user, :email)) } + + let(:originating_member_id) { member.id } + let(:session_params) do + { + invite_email: user_params.dig(:user, :email), + originating_member_id: originating_member_id + } + end + + context 'when member exists from the session key value' do + it 'tracks the experiment' do + expect(experiment(:invite_signup_page_interaction)).to track(:form_submission) + .with_context(actor: member) + .on_next_instance + + subject + end + end + + context 'when member does not exist from the session key value' do + let(:originating_member_id) { -1 } + + it 'tracks the experiment' do + expect(experiment(:invite_signup_page_interaction)).not_to track(:form_submission) + + subject + end + end + end + + context 'when invite email matches email used on registration' do + let(:session_params) { { invite_email: user_params.dig(:user, :email) } } + + it 'signs the user in without sending a confirmation email', :aggregate_failures do + expect { subject }.not_to have_enqueued_mail(DeviseMailer, :confirmation_instructions) + expect(controller.current_user).to be_confirmed + end + end + + context 'when invite email does not match the email used on registration' do + let(:session_params) { { invite_email: 'bogus@email.com' } } + + it 'does not authenticate the user and sends a confirmation email', :aggregate_failures do + expect { subject }.to have_enqueued_mail(DeviseMailer, :confirmation_instructions) + expect(controller.current_user).to be_nil + end + end + end end context 'when soft email confirmation is enabled' do @@ -161,6 +250,24 @@ RSpec.describe RegistrationsController do expect(controller.current_user).to be_present expect(response).to redirect_to(users_sign_up_welcome_path) end + + context 'when invite email matches email used on registration' do + let(:session_params) { { invite_email: user_params.dig(:user, :email) } } + + it 'signs the user in without sending a confirmation email', :aggregate_failures do + expect { subject }.not_to have_enqueued_mail(DeviseMailer, :confirmation_instructions) + expect(controller.current_user).to be_confirmed + end + end + + context 'when invite email does not match the email used on registration' do + let(:session_params) { { invite_email: 'bogus@email.com' } } + + it 'authenticates the user and sends a confirmation email without confirming', :aggregate_failures do + expect { subject }.to have_enqueued_mail(DeviseMailer, :confirmation_instructions) + expect(controller.current_user).not_to be_confirmed + end + end end end |