Commit 7f6290f0 authored by Etienne Baqué's avatar Etienne Baqué

Merge branch...

Merge branch '327039-follow-up-experiment-display-known-fields-in-locked-fields-within-trial-sign-up-form' into 'master'

Display known fields as locked fields within trial sign up form

See merge request gitlab-org/gitlab!65493
parents 46f334d1 594fcf27
......@@ -63,8 +63,8 @@ module Registrations
def apply_trial_for_trial_onboarding_flow
if apply_trial
record_experiment_user(:remove_known_trial_form_fields, namespace_id: @group.id)
record_experiment_conversion_event(:remove_known_trial_form_fields)
record_experiment_user(:remove_known_trial_form_fields_welcoming, namespace_id: @group.id)
record_experiment_conversion_event(:remove_known_trial_form_fields_welcoming)
redirect_to new_users_sign_up_project_path(namespace_id: @group.id, trial: helpers.in_trial_during_signup_flow?, trial_onboarding_flow: true)
else
......
......@@ -14,7 +14,7 @@ class TrialsController < ApplicationController
feature_category :purchase
def new
record_experiment_user(:remove_known_trial_form_fields, remove_known_trial_form_fields_context)
record_experiment_user(:remove_known_trial_form_fields_welcoming, remove_known_trial_form_fields_context)
end
def select
......@@ -39,8 +39,8 @@ class TrialsController < ApplicationController
@result = GitlabSubscriptions::ApplyTrialService.new.execute(apply_trial_params)
if @result&.dig(:success)
record_experiment_user(:remove_known_trial_form_fields, namespace_id: @namespace.id)
record_experiment_conversion_event(:remove_known_trial_form_fields)
record_experiment_user(:remove_known_trial_form_fields_welcoming, namespace_id: @namespace.id)
record_experiment_conversion_event(:remove_known_trial_form_fields_welcoming)
experiment(:force_company_trial, user: current_user).track(:create_trial, namespace: @namespace, user: current_user, label: 'trials_controller') if @namespace.created_at > 24.hours.ago
......@@ -177,7 +177,8 @@ class TrialsController < ApplicationController
{
first_name_present: current_user.first_name.present?,
last_name_present: current_user.last_name.present?,
company_name_present: current_user.organization.present?
company_name_present: current_user.organization.present?,
variant: helpers.remove_known_trial_form_fields_variant
}
end
......
......@@ -74,6 +74,16 @@ module EE
}
end
def remove_known_trial_form_fields_variant
if experiment_enabled?(:remove_known_trial_form_fields_welcoming, subject: current_user)
:welcoming
elsif experiment_enabled?(:remove_known_trial_form_fields_noneditable, subject: current_user)
:noneditable
else
:control
end
end
private
def trial_group_namespaces
......
......@@ -7,29 +7,37 @@
= _("Start your Free Ultimate Trial")
%p.gl-text-center
= _('Your GitLab Ultimate trial will last 30 days after which point you can keep your free GitLab account forever. We just need some additional information to activate your trial.')
- if remove_known_trial_form_fields_variant == :welcoming
- salutation = current_user.first_name.present? ? " #{current_user.first_name}" : ''
- company = current_user.organization.present? ? current_user.organization : _('your company')
= _("Hi%{salutation}, your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information about %{company} to activate your trial.") % { salutation: salutation, company: company }
- else
= _('Your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information to activate your trial.')
= render 'errors'
= form_tag create_lead_trials_path(glm_params), method: :post do |f|
- if experiment_enabled?(:remove_known_trial_form_fields) && current_user.first_name.present?
- if remove_known_trial_form_fields_variant == :welcoming && current_user.first_name.present?
= hidden_field_tag :first_name, current_user.first_name
- else
.form-group
= label_tag :first_name, _('First name'), for: :first_name, class: 'col-form-label'
= text_field_tag :first_name, params[:first_name] || current_user.first_name, class: 'form-control gl-form-input', required: true, data: { qa_selector: 'first_name' }
- if experiment_enabled?(:remove_known_trial_form_fields) && current_user.last_name.present?
- readonly = remove_known_trial_form_fields_variant == :noneditable && current_user.first_name.present?
= text_field_tag :first_name, params[:first_name] || current_user.first_name, class: 'form-control gl-form-input', required: true, data: { qa_selector: 'first_name' }, readonly: readonly
- if remove_known_trial_form_fields_variant == :welcoming && current_user.last_name.present?
= hidden_field_tag :last_name, current_user.last_name
- else
.form-group
= label_tag :last_name, _('Last name'), for: :last_name, class: 'col-form-label'
= text_field_tag :last_name, params[:last_name] || current_user.last_name, class: 'form-control gl-form-input', required: true, data: { qa_selector: 'last_name' }
- if experiment_enabled?(:remove_known_trial_form_fields) && current_user.organization.present?
- readonly = remove_known_trial_form_fields_variant == :noneditable && current_user.last_name.present?
= text_field_tag :last_name, params[:last_name] || current_user.last_name, class: 'form-control gl-form-input', required: true, data: { qa_selector: 'last_name' }, readonly: readonly
- if remove_known_trial_form_fields_variant == :welcoming && current_user.organization.present?
= hidden_field_tag :company_name, current_user.organization
- else
.form-group
= label_tag :company_name, _('Company name'), for: :company_name, class: 'col-form-label'
= text_field_tag :company_name, params[:company_name] || current_user.organization, class: 'form-control gl-form-input', required: true, data: { qa_selector: 'company_name' }
- readonly = remove_known_trial_form_fields_variant == :noneditable && current_user.organization.present?
= text_field_tag :company_name, params[:company_name] || current_user.organization, class: 'form-control gl-form-input', required: true, data: { qa_selector: 'company_name' }, readonly: readonly
.form-group.gl-select2-html5-required-fix
= label_tag :company_size, _('Number of employees'), for: :company_size, class: 'col-form-label'
= select_tag :company_size, company_size_options_for_select(params[:company_size]), include_blank: true, class: 'select2', required: true, data: { qa_selector: 'number_of_employees' }
......
---
name: remove_known_trial_form_fields_noneditable_experiment_percentage
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65493
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337439
milestone: '14.2'
type: experiment
group: group::conversion
default_enabled: false
---
name: remove_known_trial_form_fields_experiment_percentage
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45634/
rollout_issue_url: https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/281
milestone: '13.7'
name: remove_known_trial_form_fields_welcoming_experiment_percentage
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65493
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337439
milestone: '14.2'
type: experiment
group: group::conversion
default_enabled: false
......@@ -171,8 +171,8 @@ RSpec.describe Registrations::GroupsController do
expect_next_instance_of(GitlabSubscriptions::ApplyTrialService) do |service|
expect(service).to receive(:execute).with(apply_trial_params).and_return({ success: true })
end
expect(controller).to receive(:record_experiment_user).with(:remove_known_trial_form_fields, namespace_id: group.id)
expect(controller).to receive(:record_experiment_conversion_event).with(:remove_known_trial_form_fields)
expect(controller).to receive(:record_experiment_user).with(:remove_known_trial_form_fields_welcoming, namespace_id: group.id)
expect(controller).to receive(:record_experiment_conversion_event).with(:remove_known_trial_form_fields_welcoming)
end
context 'with redirection to projects page' do
......
......@@ -8,7 +8,8 @@ RSpec.describe TrialsController do
{
first_name_present: user.first_name.present?,
last_name_present: user.last_name.present?,
company_name_present: user.organization.present?
company_name_present: user.organization.present?,
variant: :control
}
end
......@@ -55,7 +56,7 @@ RSpec.describe TrialsController do
end
it 'calls record_experiment_user for the experiments' do
expect(controller).to receive(:record_experiment_user).with(:remove_known_trial_form_fields, remove_known_trial_form_fields_context)
expect(controller).to receive(:record_experiment_user).with(:remove_known_trial_form_fields_welcoming, remove_known_trial_form_fields_context)
subject
end
......@@ -177,8 +178,8 @@ RSpec.describe TrialsController do
it { is_expected.to redirect_to("/#{namespace.path}?trial=true") }
it 'calls the record conversion method for the experiments' do
expect(controller).to receive(:record_experiment_user).with(:remove_known_trial_form_fields, namespace_id: namespace.id)
expect(controller).to receive(:record_experiment_conversion_event).with(:remove_known_trial_form_fields)
expect(controller).to receive(:record_experiment_user).with(:remove_known_trial_form_fields_welcoming, namespace_id: namespace.id)
expect(controller).to receive(:record_experiment_conversion_event).with(:remove_known_trial_form_fields_welcoming)
expect(experiment(:force_company_trial)).to track(:create_trial, namespace: namespace, user: user, label: 'trials_controller').with_context(user: user).on_next_instance
subject
......@@ -238,7 +239,7 @@ RSpec.describe TrialsController do
it { is_expected.to render_template(:select) }
it 'does not call the record conversion method for the experiments' do
expect(controller).not_to receive(:record_experiment_conversion_event).with(:remove_known_trial_form_fields)
expect(controller).not_to receive(:record_experiment_conversion_event).with(:remove_known_trial_form_fields_welcoming)
subject
end
......
......@@ -265,4 +265,27 @@ RSpec.describe EE::TrialHelper do
it { is_expected.to eq({ namespace_id: 1, trial_plan_name: 'Ultimate', action: 'reactivate' }) }
end
end
describe '#remove_known_trial_form_fields_variant' do
let_it_be(:user) { create(:user) }
subject { helper.remove_known_trial_form_fields_variant }
before do
helper.extend(Gitlab::Experimentation::ControllerConcern)
allow(helper).to receive(:current_user).and_return(user)
stub_experiment_for_subject(remove_known_trial_form_fields_welcoming: welcoming, remove_known_trial_form_fields_noneditable: noneditable)
end
where(:welcoming, :noneditable, :result) do
true | true | :welcoming
true | false | :welcoming
false | true | :noneditable
false | false | :control
end
with_them do
it { is_expected.to eq(result) }
end
end
end
......@@ -4,40 +4,67 @@ require 'spec_helper'
RSpec.describe 'trials/new.html.haml' do
include ApplicationHelper
let_it_be(:remove_known_trial_form_fields_enabled) { false }
let_it_be(:variant) { :control }
let_it_be(:user) { build(:user) }
before do
allow(view).to receive(:current_user) { user }
allow(view).to receive(:experiment_enabled?).with(:remove_known_trial_form_fields).and_return(remove_known_trial_form_fields_enabled)
allow(view).to receive(:remove_known_trial_form_fields_variant).and_return(variant)
render
end
subject { rendered }
it 'has fields for first, last and company names' do
it 'has fields for first, last and company names', :aggregate_failures do
is_expected.to have_field('first_name')
is_expected.to have_field('last_name')
is_expected.to have_field('company_name')
end
context 'remove_known_trial_form_fields experiment is enabled' do
let_it_be(:remove_known_trial_form_fields_enabled) { true }
context 'remove_known_trial_form_fields noneditable experiment is enabled' do
let_it_be(:variant) { :noneditable }
it { is_expected.to have_content('Your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information to activate your trial.') }
context 'the user has already values in first, last and company names' do
let_it_be(:user) { build(:user, first_name: 'John', last_name: 'Doe', organization: 'ACME') }
it 'has readonly fields', :aggregate_failures do
is_expected.to have_field('first_name', readonly: true)
is_expected.to have_field('last_name', readonly: true)
is_expected.to have_field('company_name', readonly: true)
end
end
context 'the user empty values for first, last and company names' do
let_it_be(:user) { build(:user, first_name: '', last_name: '', organization: '') }
it 'has fields', :aggregate_failures do
is_expected.to have_field('first_name')
is_expected.to have_field('last_name')
is_expected.to have_field('company_name')
end
end
end
context 'remove_known_trial_form_fields welcoming experiment is enabled' do
let_it_be(:variant) { :welcoming }
context 'the user has already values in first, last and company names' do
let_it_be(:user) { build(:user, first_name: 'John', last_name: 'Doe', organization: 'ACME') }
it { is_expected.to have_content('Hi John, your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information about ACME to activate your trial.') }
it 'has hidden fields' do
is_expected.to have_field('first_name', type: :hidden)
is_expected.to have_field('last_name', type: :hidden)
is_expected.to have_field('company_name', type: :hidden)
end
end
context 'the user empty values for first, last and company names' do
let_it_be(:user) { build(:user, first_name: '', last_name: '', organization: '') }
it { is_expected.to have_content('Hi, your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information about your company to activate your trial.') }
it 'has fields' do
is_expected.to have_field('first_name')
is_expected.to have_field('last_name')
......
......@@ -42,8 +42,13 @@ module Gitlab
tracking_category: 'Growth::Conversion::Experiment::ContactSalesInApp',
use_backwards_compatible_subject_index: true
},
remove_known_trial_form_fields: {
tracking_category: 'Growth::Conversion::Experiment::RemoveKnownTrialFormFields'
remove_known_trial_form_fields_welcoming: {
tracking_category: 'Growth::Conversion::Experiment::RemoveKnownTrialFormFieldsWelcoming',
rollout_strategy: :user
},
remove_known_trial_form_fields_noneditable: {
tracking_category: 'Growth::Conversion::Experiment::RemoveKnownTrialFormFieldsNoneditable',
rollout_strategy: :user
},
invite_members_new_dropdown: {
tracking_category: 'Growth::Expansion::Experiment::InviteMembersNewDropdown'
......
......@@ -16337,6 +16337,9 @@ msgstr ""
msgid "Hi %{username}!"
msgstr ""
msgid "Hi%{salutation}, your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information about %{company} to activate your trial."
msgstr ""
msgid "Hide"
msgstr ""
......@@ -38248,7 +38251,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
msgid "Your GitLab Ultimate trial will last 30 days after which point you can keep your free GitLab account forever. We just need some additional information to activate your trial."
msgid "Your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information to activate your trial."
msgstr ""
msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
......@@ -40195,5 +40198,8 @@ msgstr ""
msgid "yaml invalid"
msgstr ""
msgid "your company"
msgstr ""
msgid "your settings"
msgstr ""
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