Commit 9fef92d3 authored by Doug Stull's avatar Doug Stull

Commit registration invite page to product

- for .com only - experiment passed.

Changelog: added
parent fa597211
......@@ -4,6 +4,7 @@ module Registrations
class GroupInvitesController < Groups::ApplicationController
layout 'checkout'
before_action :check_if_gl_com_or_dev
before_action :authorize_invite_to_group!
feature_category :navigation
......@@ -12,12 +13,7 @@ module Registrations
end
def create
result = Members::CreateService.new(current_user, invite_params).execute
if result[:status] == :success
experiment(:registrations_group_invite, actor: current_user)
.track(:invites_sent, property: group.id.to_s, value: group.members.invite.size)
end
Members::CreateService.new(current_user, invite_params).execute
redirect_to new_users_sign_up_project_path(namespace_id: group.id,
trial: helpers.in_trial_during_signup_flow?,
......
......@@ -6,7 +6,7 @@ module Registrations
layout 'checkout'
before_action :check_signup_onboarding_enabled
before_action :check_if_gl_com_or_dev
before_action :authorize_create_group!, only: :new
feature_category :onboarding
......@@ -37,10 +37,6 @@ module Registrations
private
def check_signup_onboarding_enabled
access_denied! unless helpers.signup_onboarding_enabled?
end
def create_successful_flow
if helpers.in_trial_onboarding_flow?
apply_trial_for_trial_onboarding_flow
......@@ -64,7 +60,7 @@ module Registrations
record_experiment_conversion_event(:remove_known_trial_form_fields)
record_experiment_conversion_event(:trial_onboarding_issues)
registrations_group_invite_flow(trial_onboarding_flow: true)
redirect_to new_users_sign_up_group_invite_path(group_id: @group.id, trial: helpers.in_trial_during_signup_flow?, trial_onboarding_flow: true)
else
render action: :new
end
......@@ -74,27 +70,19 @@ module Registrations
record_experiment_conversion_event(:learn_gitlab_a, namespace_id: @group.id)
record_experiment_conversion_event(:learn_gitlab_b, namespace_id: @group.id)
if helpers.in_trial_during_signup_flow?
create_lead_and_apply_trial_flow
else
redirect_to new_users_sign_up_group_invite_path(group_id: @group.id, trial: false)
end
end
def create_lead_and_apply_trial_flow
if helpers.in_trial_during_signup_flow?
if create_lead && apply_trial
registrations_group_invite_flow
redirect_to new_users_sign_up_group_invite_path(group_id: @group.id, trial: true)
else
render action: :new
end
else
registrations_group_invite_flow
end
end
def registrations_group_invite_flow(options = {})
experiment(:registrations_group_invite, actor: current_user) do |experiment_instance|
experiment_instance.use { redirect_to new_users_sign_up_project_path({ namespace_id: @group.id, trial: helpers.in_trial_during_signup_flow? }.merge(options) ) } # control
experiment_instance.try(:invite_page) { redirect_to new_users_sign_up_group_invite_path({ group_id: @group.id, trial: helpers.in_trial_during_signup_flow? }.merge(options)) } # with separate page
experiment_instance.track(:created, property: @group.id.to_s)
end
end
def create_lead
......
......@@ -8,7 +8,7 @@ module Registrations
LEARN_GITLAB_TEMPLATE = 'learn_gitlab.tar.gz'
LEARN_GITLAB_ULTIMATE_TEMPLATE = 'learn_gitlab_ultimate_trial.tar.gz'
before_action :check_signup_onboarding_enabled
before_action :check_if_gl_com_or_dev
before_action only: [:new] do
set_namespace
authorize_create_project!
......@@ -31,8 +31,6 @@ module Registrations
learn_gitlab_project_id: learn_gitlab_project.id
}
experiment(:registrations_group_invite, actor: current_user)
.track(:signup_successful, property: @project.namespace_id.to_s)
experiment(:jobs_to_be_done, user: current_user)
.track(:create_project, project: @project)
......@@ -58,10 +56,6 @@ module Registrations
private
def check_signup_onboarding_enabled
access_denied! unless helpers.signup_onboarding_enabled?
end
def create_learn_gitlab_project
File.open(learn_gitlab_template_path) do |archive|
::Projects::GitlabProjectsImportService.new(
......
......@@ -43,11 +43,7 @@
= render partial: 'shared/groups/visibility_level', locals: { f: f }
- if !in_trial_onboarding_flow? && show_trial_during_signup?
= render partial: 'shared/groups/trial_form'
- else
- experiment(:registrations_group_invite, actor: current_user) do |experiment_instance|
- experiment_instance.use do
= render partial: 'shared/groups/invite_members'
- experiment_instance.try(:invite_page) {}
.row
.form-group.col-sm-12.gl-mb-0
= button_tag class: %w[btn gl-button btn-success gl-w-full!] do
......
---
name: registrations_group_invite
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52371
rollout_issue_url: https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/351
milestone: '13.10'
type: experiment
group: group::expansion
default_enabled: false
......@@ -28,7 +28,7 @@ RSpec.describe Registrations::GroupsController do
end
describe 'GET #new', :aggregate_failures do
let(:signup_onboarding_enabled) { true }
let(:dev_env_or_com) { true }
let(:learn_gitlab_context) do
{
in_experiment_group_a: false,
......@@ -46,9 +46,10 @@ RSpec.describe Registrations::GroupsController do
context 'with an authenticated user' do
before do
sign_in(user)
allow(controller.helpers).to receive(:signup_onboarding_enabled?).and_return(signup_onboarding_enabled)
allow(::Gitlab).to receive(:dev_env_or_com?).and_return(dev_env_or_com)
end
context 'when on .com' do
it { is_expected.to have_gitlab_http_status(:ok) }
it { is_expected.to render_template(:new) }
......@@ -86,9 +87,10 @@ RSpec.describe Registrations::GroupsController do
it { is_expected.to have_gitlab_http_status(:not_found) }
end
end
context 'signup onboarding not enabled' do
let(:signup_onboarding_enabled) { false }
context 'when not on .com' do
let(:dev_env_or_com) { false }
it { is_expected.to have_gitlab_http_status(:not_found) }
end
......@@ -103,7 +105,7 @@ RSpec.describe Registrations::GroupsController do
let_it_be(:trial_onboarding_issues_enabled) { false }
let_it_be(:trial_onboarding_flow_params) { {} }
let(:signup_onboarding_enabled) { true }
let(:dev_env_or_com) { true }
let(:group_params) { { name: 'Group name', path: 'group-path', visibility_level: Gitlab::VisibilityLevel::PRIVATE, emails: ['', ''] } }
let(:params) do
{ group: group_params }.merge(glm_params).merge(trial_form_params).merge(trial_onboarding_flow_params)
......@@ -120,17 +122,12 @@ RSpec.describe Registrations::GroupsController do
before do
sign_in(user)
stub_experiment_for_subject(trial_onboarding_issues: trial_onboarding_issues_enabled)
allow(controller.helpers).to receive(:signup_onboarding_enabled?).and_return(signup_onboarding_enabled)
allow(::Gitlab).to receive(:dev_env_or_com?).and_return(dev_env_or_com)
end
context 'when on .com' do
it_behaves_like 'hides email confirmation warning'
context 'when signup onboarding is not enabled' do
let(:signup_onboarding_enabled) { false }
it { is_expected.to have_gitlab_http_status(:not_found) }
end
context 'when group can be created' do
it 'creates a group' do
expect { subject }.to change { Group.count }.by(1)
......@@ -183,21 +180,9 @@ RSpec.describe Registrations::GroupsController do
expect(controller).to receive(:record_experiment_conversion_event).with(:trial_onboarding_issues)
end
context 'when registration_group_invite experiment is enabled' do
before do
stub_experiments(registrations_group_invite: :invite_page)
end
context 'with separate invite page' do
it { is_expected.to redirect_to(new_users_sign_up_group_invite_path(group_id: group.id, trial: false, trial_onboarding_flow: true)) }
end
context 'when registration_group_invite experiment is disabled' do
before do
stub_experiments(registrations_group_invite: :control)
end
it { is_expected.to redirect_to(new_users_sign_up_project_path(namespace_id: group.id, trial: false, trial_onboarding_flow: true)) }
end
end
context 'when failing to apply trial' do
......@@ -285,32 +270,9 @@ RSpec.describe Registrations::GroupsController do
end
end
context 'with registrations_group_invite experiment' do
it 'tracks experiment as expected', :experiment do
expect(experiment(:registrations_group_invite))
.to track(:created, { property: group.id.to_s })
.on_next_instance
.with_context(actor: user)
subject
end
context 'when registrations_group_invite invite_page path is taken' do
before do
stub_experiments(registrations_group_invite: :invite_page)
end
context 'with separate invite page' do
it { is_expected.to redirect_to(new_users_sign_up_group_invite_path(group_id: group.id, trial: true)) }
end
context 'when registrations_group_invite experiment control path is taken' do
before do
stub_experiments(registrations_group_invite: :control)
end
it { is_expected.to redirect_to(new_users_sign_up_project_path(namespace_id: group.id, trial: true)) }
end
end
end
context 'when failing to create a lead and apply trial' do
......@@ -330,12 +292,12 @@ RSpec.describe Registrations::GroupsController do
context 'when user chooses no trial' do
let_it_be(:trial_form_params) { { trial: 'false' } }
it 'redirects user to the new user signup page' do
it 'redirects user to a separate invite page' do
expect_next_instance_of(Groups::CreateService) do |service|
expect(service).to receive(:execute).and_return(group)
end
expect(subject).to redirect_to(new_users_sign_up_project_path(namespace_id: group.id, trial: false))
expect(subject).to redirect_to(new_users_sign_up_group_invite_path(group_id: group.id, trial: false))
end
it 'does not call trial creation methods' do
......@@ -344,37 +306,6 @@ RSpec.describe Registrations::GroupsController do
subject
end
context 'with registrations_group_invite experiment' do
it 'tracks experiment as expected', :experiment do
expect_next_instance_of(Groups::CreateService) do |service|
expect(service).to receive(:execute).and_return(group)
end
expect(experiment(:registrations_group_invite))
.to track(:created, { property: group.id.to_s })
.on_next_instance
.with_context(actor: user)
subject
end
context 'when registrations_group_invite invite_page path is taken' do
before do
stub_experiments(registrations_group_invite: :invite_page)
end
it { is_expected.to redirect_to(new_users_sign_up_group_invite_path(group_id: user.groups.last.id, trial: false)) }
end
context 'when registrations_group_invite experiment control path is taken' do
before do
stub_experiments(registrations_group_invite: :control)
end
it { is_expected.to redirect_to(new_users_sign_up_project_path(namespace_id: user.groups.last.id, trial: false)) }
end
end
end
end
end
......@@ -398,5 +329,12 @@ RSpec.describe Registrations::GroupsController do
it { is_expected.to render_template(:new) }
end
end
context 'when not on .com' do
let(:dev_env_or_com) { false }
it { is_expected.to have_gitlab_http_status(:not_found) }
end
end
end
end
......@@ -18,13 +18,14 @@ RSpec.describe Registrations::ProjectsController do
end
context 'with an authenticated user' do
let(:signup_onboarding_enabled) { true }
let(:dev_env_or_com) { true }
before do
sign_in(user)
allow(controller.helpers).to receive(:signup_onboarding_enabled?).and_return(signup_onboarding_enabled)
allow(::Gitlab).to receive(:dev_env_or_com?).and_return(dev_env_or_com)
end
context 'when on .com' do
it { is_expected.to have_gitlab_http_status(:not_found) }
context 'with a namespace in the URL' do
......@@ -41,9 +42,10 @@ RSpec.describe Registrations::ProjectsController do
it { is_expected.to render_template(:new) }
end
end
end
context 'with signup onboarding not enabled' do
let(:signup_onboarding_enabled) { false }
context 'when not on .com' do
let(:dev_env_or_com) { false }
it { is_expected.to have_gitlab_http_status(:not_found) }
end
......@@ -56,7 +58,7 @@ RSpec.describe Registrations::ProjectsController do
let_it_be(:trial_onboarding_flow_params) { {} }
let(:params) { { namespace_id: namespace.id, name: 'New project', path: 'project-path', visibility_level: Gitlab::VisibilityLevel::PRIVATE } }
let(:signup_onboarding_enabled) { true }
let(:dev_env_or_com) { true }
context 'with an unauthenticated user' do
it { is_expected.to have_gitlab_http_status(:redirect) }
......@@ -74,7 +76,7 @@ RSpec.describe Registrations::ProjectsController do
namespace.add_owner(user)
sign_in(user)
stub_experiment_for_subject(trial_onboarding_issues: trial_onboarding_issues_enabled)
allow(controller.helpers).to receive(:signup_onboarding_enabled?).and_return(signup_onboarding_enabled)
allow(::Gitlab).to receive(:dev_env_or_com?).and_return(dev_env_or_com)
end
it 'creates a new project, a "Learn GitLab" project, sets a cookie and redirects to the experience level page' do
......@@ -108,15 +110,6 @@ RSpec.describe Registrations::ProjectsController do
subject
end
it 'tracks the registrations_group_invite experiment as expected', :experiment do
expect(experiment(:registrations_group_invite))
.to track(:signup_successful, { property: namespace.id.to_s })
.on_next_instance
.with_context(actor: user)
subject
end
context 'learn gitlab project' do
using RSpec::Parameterized::TableSyntax
......@@ -183,7 +176,7 @@ RSpec.describe Registrations::ProjectsController do
end
context 'with signup onboarding not enabled' do
let(:signup_onboarding_enabled) { false }
let(:dev_env_or_com) { false }
it { is_expected.to have_gitlab_http_status(:not_found) }
end
......
......@@ -10,7 +10,6 @@ RSpec.describe 'User is able to invite members to group during signup', :js, :ex
before do
allow(Gitlab).to receive(:dev_env_or_com?).and_return(true)
stub_experiments(registrations_group_invite: :invite_page)
sign_in(user)
end
......
......@@ -8,7 +8,6 @@ RSpec.describe 'User sees new onboarding flow', :js do
before do
allow(Gitlab).to receive(:com?).and_return(true)
stub_feature_flags(registrations_group_invite: false)
sign_in(user)
visit users_sign_up_welcome_path
......@@ -20,13 +19,13 @@ RSpec.describe 'User sees new onboarding flow', :js do
expect(page).to have_content('GitLab Ultimate trial (optional)')
end
it 'shows the expected behavior with no trial chosen' do
it 'shows the expected behavior with no trial chosen', :aggregate_failures do
fill_in 'group_name', with: 'test'
click_on 'Create group'
expect(page).not_to have_content('Congratulations, your free trial is activated.')
expect(page).to have_content('Create/import your first project')
expect(page).to have_content('Invite your teammates')
end
it 'shows the expected behavior with trial chosen' do
......@@ -73,6 +72,6 @@ RSpec.describe 'User sees new onboarding flow', :js do
click_on 'Create group'
expect(page).to have_content('Congratulations, your free trial is activated.')
expect(page).to have_content('Create/import your first project')
expect(page).to have_content('Invite your teammates')
end
end
......@@ -5,7 +5,6 @@ require 'spec_helper'
RSpec.describe 'User sees new onboarding flow', :js do
before do
stub_const('Gitlab::QueryLimiting::Transaction::THRESHOLD', 200)
stub_feature_flags(registration_group_invite: false)
allow(Gitlab).to receive(:com?).and_return(true)
gitlab_sign_in(:user)
visit users_sign_up_welcome_path
......@@ -29,6 +28,10 @@ RSpec.describe 'User sees new onboarding flow', :js do
click_on 'Create group'
expect(page).to have_content('Invite your teammates')
click_on 'Skip this for now'
expect(page).to have_content('Create/import your first project')
expect(page).to have_content('Your profile Your GitLab group Your first project')
expect(page).to have_css('li.current', text: 'Your first project')
......
......@@ -7,12 +7,15 @@ RSpec.describe 'view group invites' do
let_it_be(:user) { create(:user) }
let_it_be(:not_authorized_group) { create(:group) }
let(:dev_env_or_com) { true }
before_all do
group.add_owner(user)
end
before do
login_as(user)
allow(::Gitlab).to receive(:dev_env_or_com?).and_return(dev_env_or_com)
end
describe 'GET /users/sign_up/group_invites/new' do
......@@ -28,6 +31,16 @@ RSpec.describe 'view group invites' do
end
end
context 'when not on .com' do
let(:dev_env_or_com) { false }
it 'returns not_found' do
get_request
expect(response).to have_gitlab_http_status(:not_found)
end
end
context 'when user is not authorized to invite for the group' do
let(:group_params) { { group_id: not_authorized_group.id } }
......@@ -59,12 +72,6 @@ RSpec.describe 'view group invites' do
expect(group.members.invite).to be_empty
end
it 'does not track experiment', :experiment do
expect(experiment(:registrations_group_invite)).not_to track(:invites_sent)
post_request
end
end
context 'with valid emails in the params' do
......@@ -85,15 +92,6 @@ RSpec.describe 'view group invites' do
user: user
)
end
it 'tracks experiment as expected', :experiment do
expect(experiment(:registrations_group_invite))
.to track(:invites_sent, { property: group.id.to_s, value: valid_emails.size })
.on_next_instance
.with_context(actor: user)
post_request
end
end
end
......@@ -109,6 +107,16 @@ RSpec.describe 'view group invites' do
end
end
context 'when not on .com' do
let(:dev_env_or_com) { false }
it 'returns not_found' do
post_request
expect(response).to have_gitlab_http_status(:not_found)
end
end
context 'when user is not authorized to invite for the group' do
let(:group_params) { { group_id: not_authorized_group.id } }
......
......@@ -35,9 +35,8 @@ RSpec.describe 'registrations/groups/new' do
context 'in trial onboarding' do
let_it_be(:trial_onboarding_flow) { true }
it 'hides trial form and shows invite members' do
it 'hides trial form' do
is_expected.not_to have_content('Company name')
is_expected.to have_selector('.js-invite-members')
end
it 'hides the progress bar' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment