summaryrefslogtreecommitdiff
path: root/spec/controllers/invites_controller_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/controllers/invites_controller_spec.rb')
-rw-r--r--spec/controllers/invites_controller_spec.rb140
1 files changed, 123 insertions, 17 deletions
diff --git a/spec/controllers/invites_controller_spec.rb b/spec/controllers/invites_controller_spec.rb
index 2b222331b55..a083cfac981 100644
--- a/spec/controllers/invites_controller_spec.rb
+++ b/spec/controllers/invites_controller_spec.rb
@@ -2,36 +2,142 @@
require 'spec_helper'
-RSpec.describe InvitesController do
- let(:token) { '123456' }
+RSpec.describe InvitesController, :snowplow do
let_it_be(:user) { create(:user) }
- let(:member) { create(:project_member, :invited, invite_token: token, invite_email: user.email) }
+ let(:member) { create(:project_member, :invited, invite_email: user.email) }
+ 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(:snowplow_event) do
+ {
+ category: 'Growth::Acquisition::Experiment::InviteEmail',
+ label: md5_member_global_id,
+ property: group_type
+ }
+ end
before do
controller.instance_variable_set(:@member, member)
- sign_in(user)
end
describe 'GET #show' do
- it 'accepts user if invite email matches signed in user' do
- expect do
- get :show, params: { id: token }
- end.to change { project_members.include?(user) }.from(false).to(true)
+ subject(:request) { get :show, params: params }
+
+ context 'when logged in' do
+ before do
+ sign_in(user)
+ end
+
+ it 'accepts user if invite email matches signed in user' do
+ expect do
+ request
+ end.to change { project_members.include?(user) }.from(false).to(true)
+
+ expect(response).to have_gitlab_http_status(:found)
+ expect(flash[:notice]).to include 'You have been granted'
+ end
+
+ it 'forces re-confirmation if email does not match signed in user' do
+ member.invite_email = 'bogus@email.com'
+
+ expect do
+ request
+ end.not_to change { project_members.include?(user) }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(flash[:notice]).to be_nil
+ end
+
+ context 'when new_user_invite is not set' do
+ it 'does not track the user as experiment group' do
+ request
+
+ expect_no_snowplow_event
+ end
+ end
+
+ context 'when new_user_invite is experiment' do
+ let(:params) { { id: raw_invite_token, new_user_invite: 'experiment' } }
+ let(:group_type) { 'experiment_group' }
+
+ it 'tracks the user as experiment group' do
+ request
+
+ expect_snowplow_event(snowplow_event.merge(action: 'opened'))
+ expect_snowplow_event(snowplow_event.merge(action: 'accepted'))
+ end
+ end
+
+ context 'when new_user_invite is control' do
+ let(:params) { { id: raw_invite_token, new_user_invite: 'control' } }
+ let(:group_type) { 'control_group' }
+
+ it 'tracks the user as control group' do
+ request
+
+ expect_snowplow_event(snowplow_event.merge(action: 'opened'))
+ expect_snowplow_event(snowplow_event.merge(action: 'accepted'))
+ end
+ end
+ end
+
+ context 'when not logged in' do
+ context 'when inviter is a member' do
+ it 'is redirected to a new session with invite email param' do
+ request
+
+ expect(response).to redirect_to(new_user_session_path(invite_email: member.invite_email))
+ end
+ end
+
+ context 'when inviter is not a member' do
+ let(:params) { { id: '_bogus_token_' } }
+
+ it 'is redirected to a new session' do
+ request
+
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+ end
+ end
+
+ describe 'POST #accept' do
+ before do
+ sign_in(user)
+ end
+
+ subject(:request) { post :accept, params: params }
+
+ context 'when new_user_invite is not set' do
+ it 'does not track an event' do
+ request
+
+ expect_no_snowplow_event
+ end
+ end
+
+ context 'when new_user_invite is experiment' do
+ let(:params) { { id: raw_invite_token, new_user_invite: 'experiment' } }
+ let(:group_type) { 'experiment_group' }
+
+ it 'tracks the user as experiment group' do
+ request
- expect(response).to have_gitlab_http_status(:found)
- expect(flash[:notice]).to include 'You have been granted'
+ expect_snowplow_event(snowplow_event.merge(action: 'accepted'))
+ end
end
- it 'forces re-confirmation if email does not match signed in user' do
- member.invite_email = 'bogus@email.com'
+ context 'when new_user_invite is control' do
+ let(:params) { { id: raw_invite_token, new_user_invite: 'control' } }
+ let(:group_type) { 'control_group' }
- expect do
- get :show, params: { id: token }
- end.not_to change { project_members.include?(user) }
+ it 'tracks the user as control group' do
+ request
- expect(response).to have_gitlab_http_status(:ok)
- expect(flash[:notice]).to be_nil
+ expect_snowplow_event(snowplow_event.merge(action: 'accepted'))
+ end
end
end
end