diff options
Diffstat (limited to 'spec/controllers/invites_controller_spec.rb')
-rw-r--r-- | spec/controllers/invites_controller_spec.rb | 142 |
1 files changed, 93 insertions, 49 deletions
diff --git a/spec/controllers/invites_controller_spec.rb b/spec/controllers/invites_controller_spec.rb index 5195f482084..6b94d186d5f 100644 --- a/spec/controllers/invites_controller_spec.rb +++ b/spec/controllers/invites_controller_spec.rb @@ -8,16 +8,18 @@ RSpec.describe InvitesController do let(:raw_invite_token) { member.raw_invite_token } let(:project_members) { member.source.users } let(:md5_member_global_id) { Digest::MD5.hexdigest(member.to_global_id.to_s) } - let(:params) { { id: raw_invite_token } } + let(:extra_params) { {} } + let(:params) { { id: raw_invite_token }.merge(extra_params) } shared_examples 'invalid token' do context 'when invite token is not valid' do - let(:params) { { id: '_bogus_token_' } } + let(:raw_invite_token) { '_bogus_token_' } - it 'renders the 404 page' do + it 'redirects to root' do request - expect(response).to have_gitlab_http_status(:not_found) + expect(response).to redirect_to(root_path) + expect(controller).to set_flash[:alert].to('The invitation can not be found with the provided invite token.') end end end @@ -25,6 +27,37 @@ RSpec.describe InvitesController do describe 'GET #show' do subject(:request) { get :show, params: params } + context 'when it is part of our invite email experiment' do + let(:extra_params) { { invite_type: 'initial_email' } } + + it 'tracks the experiment' do + experiment = double(track: true) + allow(controller).to receive(:experiment).with('members/invite_email', actor: member).and_return(experiment) + + request + + expect(experiment).to have_received(:track).with(:join_clicked) + end + + context 'when member does not exist' do + let(:raw_invite_token) { '_bogus_token_' } + + it 'does not track the experiment' do + expect(controller).not_to receive(:experiment).with('members/invite_email', actor: member) + + request + end + end + end + + context 'when it is not part of our invite email experiment' do + it 'does not track via experiment' do + expect(controller).not_to receive(:experiment).with('members/invite_email', actor: member) + + request + end + end + context 'when logged in' do before do sign_in(user) @@ -51,32 +84,10 @@ RSpec.describe InvitesController do end it_behaves_like 'invalid token' - - context 'when invite comes from the initial email invite' do - let(:params) { { id: raw_invite_token, invite_type: Members::InviteEmailExperiment::INVITE_TYPE } } - - it 'tracks via experiment', :aggregate_failures do - experiment = double(track: true) - allow(controller).to receive(:experiment).and_return(experiment) - - request - - expect(experiment).to have_received(:track).with(:opened) - expect(experiment).to have_received(:track).with(:accepted) - end - end - - context 'when invite does not come from initial email invite' do - it 'does not track via experiment' do - expect(controller).not_to receive(:experiment) - - request - end - end end context 'when not logged in' do - context 'when inviter is a member' do + context 'when invite token belongs to a valid member' do context 'when instance allows sign up' do it 'indicates an account can be created in notice' do request @@ -116,10 +127,62 @@ RSpec.describe InvitesController do expect(flash[:notice]).to include('create an account or sign in') end - it 'is redirected to a new registration with invite email param' do + context 'when it is part of our invite email experiment', :experiment, :aggregate_failures do + let(:experience) { :control } + + before do + stub_experiments(invite_signup_page_interaction: experience) + end + + it 'sets originating_member_id session key' do + request + + expect(session[:originating_member_id]).to eq(member.id) + end + + context 'with control experience' do + it 'is redirected to a new registration with invite email param and flash message' do + request + + expect(response).to redirect_to(new_user_registration_path(invite_email: member.invite_email)) + expect(flash[:notice]).to eq 'To accept this invitation, create an account or sign in.' + end + end + + context 'with candidate experience' do + let(:experience) { :candidate } + + it 'is redirected to a new invite registration with invite email param and no flash message' do + request + + expect(response).to redirect_to(new_users_sign_up_invite_path(invite_email: member.invite_email)) + expect(flash[:notice]).to be_nil + end + end + end + + it 'sets session keys for auto email confirmation on sign up' do request - expect(response).to redirect_to(new_user_registration_path(invite_email: member.invite_email)) + expect(session[:invite_email]).to eq(member.invite_email) + end + + context 'when it is part of our invite email experiment' do + let(:extra_params) { { invite_type: 'initial_email' } } + + it 'sets session key for invite acceptance tracking on sign-up' do + request + + expect(session[:originating_member_id]).to eq(member.id) + end + end + + context 'when it is not part of our invite email experiment' do + it 'does not set the session key for invite acceptance tracking on sign-up' do + request + + expect(session[:originating_member_id]).to be_nil + end end end end @@ -157,7 +220,7 @@ RSpec.describe InvitesController do end end - context 'when inviter is not a member' do + context 'when invite token does not belong to a valid member' do let(:params) { { id: '_bogus_token_' } } it 'is redirected to a new session' do @@ -177,25 +240,6 @@ RSpec.describe InvitesController do subject(:request) { post :accept, params: params } it_behaves_like 'invalid token' - - context 'when invite comes from the initial email invite' do - it 'tracks via experiment' do - experiment = double(track: true) - allow(controller).to receive(:experiment).and_return(experiment) - - post :accept, params: params, session: { invite_type: Members::InviteEmailExperiment::INVITE_TYPE } - - expect(experiment).to have_received(:track).with(:accepted) - end - end - - context 'when invite does not come from initial email invite' do - it 'does not track via experiment' do - expect(controller).not_to receive(:experiment) - - request - end - end end describe 'POST #decline for link in UI' do |