From e72419870257df9bb464190f8478d261c2b28ad3 Mon Sep 17 00:00:00 2001
From: Nicolas Dular <ndular@gitlab.com>
Date: Thu, 17 Sep 2020 12:25:14 +0200
Subject: [PATCH] Remove accept terms checkbox for signup

To remove obstacles in our signup process, we now only render a text
that states that the user accepts the terms of service when clicking
register instead of checking the checkbox.
---
 app/controllers/registrations_controller.rb   |  30 +---
 ...mental_separate_sign_up_flow_box.html.haml |  11 +-
 app/views/devise/shared/_signup_box.html.haml |   8 +-
 .../shared/_terms_of_service_notice.html.haml |   5 +
 .../nicolasdular-remove-tos-checkobx.yml      |   5 +
 .../trial_registrations/_signup_box.html.haml |   6 +-
 .../trial_registrations/signup_spec.rb        |   2 -
 lib/gitlab/experimentation.rb                 |   3 -
 locale/gitlab.pot                             |   8 +-
 qa/qa/page/main/sign_up.rb                    |   3 -
 .../registrations_controller_spec.rb          | 136 ++----------------
 spec/features/users/signup_spec.rb            |  39 +----
 12 files changed, 30 insertions(+), 226 deletions(-)
 create mode 100644 app/views/devise/shared/_terms_of_service_notice.html.haml
 create mode 100644 changelogs/unreleased/nicolasdular-remove-tos-checkobx.yml

diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb
index 139ef5e0692d8..037c83b062b98 100644
--- a/app/controllers/registrations_controller.rb
+++ b/app/controllers/registrations_controller.rb
@@ -13,16 +13,12 @@ class RegistrationsController < Devise::RegistrationsController
   skip_before_action :required_signup_info, :check_two_factor_requirement, only: [:welcome, :update_registration]
   prepend_before_action :check_captcha, only: :create
   before_action :whitelist_query_limiting, :ensure_destroy_prerequisites_met, only: [:destroy]
-  before_action :ensure_terms_accepted,
-    if: -> { action_name == 'create' && Gitlab::CurrentSettings.current_application_settings.enforce_terms? }
   before_action :load_recaptcha, only: :new
 
   feature_category :authentication_and_authorization
 
   def new
     if experiment_enabled?(:signup_flow)
-      track_experiment_event(:terms_opt_in, 'start')
-
       @resource = build_resource
     else
       redirect_to new_user_session_path(anchor: 'register-pane')
@@ -36,7 +32,6 @@ def create
     super do |new_user|
       persist_accepted_terms_if_required(new_user)
       set_role_required(new_user)
-      track_terms_experiment(new_user)
       yield new_user if block_given?
     end
 
@@ -86,10 +81,8 @@ def persist_accepted_terms_if_required(new_user)
     return unless new_user.persisted?
     return unless Gitlab::CurrentSettings.current_application_settings.enforce_terms?
 
-    if terms_accepted?
-      terms = ApplicationSetting::Term.latest
-      Users::RespondToTermsService.new(new_user, terms).execute(accepted: true)
-    end
+    terms = ApplicationSetting::Term.latest
+    Users::RespondToTermsService.new(new_user, terms).execute(accepted: true)
   end
 
   def set_role_required(new_user)
@@ -185,18 +178,6 @@ def whitelist_query_limiting
     Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-foss/issues/42380')
   end
 
-  def ensure_terms_accepted
-    return if terms_accepted?
-
-    redirect_to new_user_session_path, alert: _('You must accept our Terms of Service and privacy policy in order to register an account')
-  end
-
-  def terms_accepted?
-    return true if experiment_enabled?(:terms_opt_in)
-
-    Gitlab::Utils.to_boolean(params[:terms_opt_in])
-  end
-
   def path_for_signed_in_user(user)
     if requires_confirmation?(user)
       users_almost_there_path
@@ -213,13 +194,6 @@ def requires_confirmation?(user)
     true
   end
 
-  def track_terms_experiment(new_user)
-    return unless new_user.persisted?
-
-    track_experiment_event(:terms_opt_in, 'end')
-    record_experiment_user(:terms_opt_in)
-  end
-
   def load_recaptcha
     Gitlab::Recaptcha.load_configurations!
   end
diff --git a/app/views/devise/shared/_experimental_separate_sign_up_flow_box.html.haml b/app/views/devise/shared/_experimental_separate_sign_up_flow_box.html.haml
index ecabb4495cce0..621bbb32a1394 100644
--- a/app/views/devise/shared/_experimental_separate_sign_up_flow_box.html.haml
+++ b/app/views/devise/shared/_experimental_separate_sign_up_flow_box.html.haml
@@ -28,21 +28,12 @@
         = f.label :password, class: 'label-bold'
         = f.password_field :password, class: "form-control bottom", data: { qa_selector: 'new_user_password_field' }, required: true, pattern: ".{#{@minimum_password_length},}", title: _("Minimum length is %{minimum_password_length} characters.") % { minimum_password_length: @minimum_password_length }
         %p.gl-field-hint.text-secondary= _('Minimum length is %{minimum_password_length} characters') % { minimum_password_length: @minimum_password_length }
-      - if Gitlab::CurrentSettings.current_application_settings.enforce_terms? && !experiment_enabled?(:terms_opt_in)
-        .form-group
-          = check_box_tag :terms_opt_in, '1', false, required: true, data: { qa_selector: 'new_user_accept_terms_checkbox' }
-          = label_tag :terms_opt_in do
-            - terms_link = link_to s_("I accept the|Terms of Service and Privacy Policy"), terms_path, target: "_blank"
-            - accept_terms_label = _("I accept the %{terms_link}") % { terms_link: terms_link }
-            = accept_terms_label.html_safe
       = render_if_exists 'devise/shared/email_opted_in', f: f
       %div
       - if show_recaptcha_sign_up?
         = recaptcha_tags
       .submit-container.mt-3
         = f.submit _("Register"), class: "btn-register btn btn-block btn-success mb-0 p-2", data: { qa_selector: 'new_user_register_button' }
-      - if experiment_enabled?(:terms_opt_in)
-        %p.gl-text-gray-500.gl-mt-5.gl-mb-0
-          = html_escape(_("By clicking Register, I agree that I have read and accepted the GitLab %{linkStart}Terms of Use and Privacy Policy%{linkEnd}")) % { linkStart: "<a href='#{terms_path}' target='_blank' rel='noreferrer noopener'>".html_safe, linkEnd: '</a>'.html_safe }
+      = render 'devise/shared/terms_of_service_notice'
       - if omniauth_enabled? && button_based_providers_enabled?
         = render 'devise/shared/experimental_separate_sign_up_flow_omniauth_box'
diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml
index 1fd81cdbac262..f4ac9ad696bd5 100644
--- a/app/views/devise/shared/_signup_box.html.haml
+++ b/app/views/devise/shared/_signup_box.html.haml
@@ -28,16 +28,10 @@
         = f.label :password, class: 'label-bold'
         = f.password_field :password, class: "form-control bottom", data: { qa_selector: 'new_user_password_field' }, required: true, pattern: ".{#{@minimum_password_length},}", title: _("Minimum length is %{minimum_password_length} characters.") % { minimum_password_length: @minimum_password_length }
         %p.gl-field-hint.text-secondary= _('Minimum length is %{minimum_password_length} characters') % { minimum_password_length: @minimum_password_length }
-      - if Gitlab::CurrentSettings.current_application_settings.enforce_terms?
-        .form-group
-          = check_box_tag :terms_opt_in, '1', false, required: true, data: { qa_selector: 'new_user_accept_terms_checkbox' }
-          = label_tag :terms_opt_in do
-            - terms_link = link_to s_("I accept the|Terms of Service and Privacy Policy"), terms_path, target: "_blank"
-            - accept_terms_label = _("I accept the %{terms_link}") % { terms_link: terms_link }
-            = accept_terms_label.html_safe
       = render_if_exists 'devise/shared/email_opted_in', f: f
       %div
       - if show_recaptcha_sign_up?
         = recaptcha_tags
       .submit-container
         = f.submit _("Register"), class: "btn-register btn", data: { qa_selector: 'new_user_register_button' }
+      = render 'devise/shared/terms_of_service_notice'
diff --git a/app/views/devise/shared/_terms_of_service_notice.html.haml b/app/views/devise/shared/_terms_of_service_notice.html.haml
new file mode 100644
index 0000000000000..46b043b283180
--- /dev/null
+++ b/app/views/devise/shared/_terms_of_service_notice.html.haml
@@ -0,0 +1,5 @@
+- company_name = Gitlab.com? ? 'GitLab' : ''
+
+- if Gitlab::CurrentSettings.current_application_settings.enforce_terms?
+  %p.gl-text-gray-500.gl-mt-5.gl-mb-0
+    = html_escape(_("By clicking Register, I agree that I have read and accepted the %{company_name} %{linkStart}Terms of Use and Privacy Policy%{linkEnd}")) % { linkStart: "<a href='#{terms_path}' target='_blank' rel='noreferrer noopener'>".html_safe, linkEnd: '</a>'.html_safe, company_name: company_name }
diff --git a/changelogs/unreleased/nicolasdular-remove-tos-checkobx.yml b/changelogs/unreleased/nicolasdular-remove-tos-checkobx.yml
new file mode 100644
index 0000000000000..704bc965ff4bf
--- /dev/null
+++ b/changelogs/unreleased/nicolasdular-remove-tos-checkobx.yml
@@ -0,0 +1,5 @@
+---
+title: Remove accept terms checkbox for signup
+merge_request: 42581
+author:
+type: changed
diff --git a/ee/app/views/trial_registrations/_signup_box.html.haml b/ee/app/views/trial_registrations/_signup_box.html.haml
index dc51f3860158c..ec880154ba5d0 100644
--- a/ee/app/views/trial_registrations/_signup_box.html.haml
+++ b/ee/app/views/trial_registrations/_signup_box.html.haml
@@ -27,11 +27,6 @@
         = f.label :password, for: 'new_user_password', class: 'label-bold'
         = f.password_field :password, class: 'form-control bottom', data: { qa_selector: 'new_user_password_field' }, required: true, pattern: ".{#{@minimum_password_length},}", title: _("Minimum length is %{minimum_password_length} characters.") % { minimum_password_length: @minimum_password_length }
         %p.gl-field-hint.text-secondary= _('Minimum length is %{minimum_password_length} characters') % { minimum_password_length: @minimum_password_length }
-        .form-group
-          = check_box_tag :terms_opt_in, '1', false, required: true, data: { qa_selector: 'new_user_accept_terms_checkbox' }
-          = label_tag :terms_opt_in, for: 'terms_opt_in', class: 'form-check-label' do
-            - terms_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: terms_path }
-            = _("I accept the %{terms_link_start}Terms of Service and Privacy Policy%{terms_link_end}").html_safe % { terms_link_start: terms_link_start, terms_link_end: '</a>'.html_safe }
         .form-group
           = f.check_box :email_opted_in, data: { qa_selector: 'new_user_email_opted_in_checkbox' }
           = f.label :email_opted_in, _("I'd like to receive updates via email about GitLab"), class: 'form-check-label'
@@ -40,3 +35,4 @@
         = recaptcha_tags
       .submit-container
         = f.submit _("Continue"), class: "btn-register btn", data: { qa_selector: 'new_user_register_button' }
+      = render 'devise/shared/terms_of_service_notice'
diff --git a/ee/spec/features/trial_registrations/signup_spec.rb b/ee/spec/features/trial_registrations/signup_spec.rb
index 21c3c1eea0b70..7bb68a2306135 100644
--- a/ee/spec/features/trial_registrations/signup_spec.rb
+++ b/ee/spec/features/trial_registrations/signup_spec.rb
@@ -37,8 +37,6 @@
           fill_in 'new_user_email',      with: user_attrs[:email]
           fill_in 'new_user_password',   with: user_attrs[:password]
 
-          check 'terms_opt_in'
-
           click_button 'Continue'
         end
 
diff --git a/lib/gitlab/experimentation.rb b/lib/gitlab/experimentation.rb
index 4457c65c519fa..229caebc268d3 100644
--- a/lib/gitlab/experimentation.rb
+++ b/lib/gitlab/experimentation.rb
@@ -51,9 +51,6 @@ module Experimentation
       new_create_project_ui: {
         tracking_category: 'Manage::Import::Experiment::NewCreateProjectUi'
       },
-      terms_opt_in: {
-        tracking_category: 'Growth::Acquisition::Experiment::TermsOptIn'
-      },
       contact_sales_btn_in_app: {
         tracking_category: 'Growth::Conversion::Experiment::ContactSalesInApp'
       },
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 8d38319762e2e..663ed9d4a3cd5 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -4433,7 +4433,7 @@ msgstr ""
 msgid "By URL"
 msgstr ""
 
-msgid "By clicking Register, I agree that I have read and accepted the GitLab %{linkStart}Terms of Use and Privacy Policy%{linkEnd}"
+msgid "By clicking Register, I agree that I have read and accepted the %{company_name} %{linkStart}Terms of Use and Privacy Policy%{linkEnd}"
 msgstr ""
 
 msgid "By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format."
@@ -13285,9 +13285,6 @@ msgstr ""
 msgid "However, you are already a member of this %{member_source}. Sign in using a different account to accept the invitation."
 msgstr ""
 
-msgid "I accept the %{terms_link_start}Terms of Service and Privacy Policy%{terms_link_end}"
-msgstr ""
-
 msgid "I accept the %{terms_link}"
 msgstr ""
 
@@ -29781,9 +29778,6 @@ msgstr ""
 msgid "You may close the milestone now."
 msgstr ""
 
-msgid "You must accept our Terms of Service and privacy policy in order to register an account"
-msgstr ""
-
 msgid "You must be logged in to search across all of GitLab"
 msgstr ""
 
diff --git a/qa/qa/page/main/sign_up.rb b/qa/qa/page/main/sign_up.rb
index 8be3b2291b608..98bbbc530278a 100644
--- a/qa/qa/page/main/sign_up.rb
+++ b/qa/qa/page/main/sign_up.rb
@@ -11,7 +11,6 @@ class SignUp < Page::Base
           element :new_user_email_field
           element :new_user_password_field
           element :new_user_register_button
-          element :new_user_accept_terms_checkbox
         end
 
         view 'app/views/registrations/welcome.html.haml' do
@@ -25,8 +24,6 @@ def sign_up!(user)
           fill_element :new_user_email_field, user.email
           fill_element :new_user_password_field, user.password
 
-          check_element :new_user_accept_terms_checkbox if has_element?(:new_user_accept_terms_checkbox)
-
           signed_in = retry_until do
             click_element :new_user_register_button if has_element?(:new_user_register_button)
 
diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb
index c3080b50f443d..cca453fd0754d 100644
--- a/spec/controllers/registrations_controller_spec.rb
+++ b/spec/controllers/registrations_controller_spec.rb
@@ -37,46 +37,6 @@
         expect(response).to redirect_to(new_user_session_path(anchor: 'register-pane'))
       end
     end
-
-    context 'with sign up flow and terms_opt_in experiment being enabled' do
-      before do
-        stub_experiment(signup_flow: true, terms_opt_in: true)
-      end
-
-      context 'when user is not part of the experiment' do
-        before do
-          stub_experiment_for_user(signup_flow: true, terms_opt_in: false)
-        end
-
-        it 'tracks event with right parameters' do
-          expect(Gitlab::Tracking).to receive(:event).with(
-            'Growth::Acquisition::Experiment::TermsOptIn',
-            'start',
-            label: anything,
-            property: 'control_group'
-          )
-
-          subject
-        end
-      end
-
-      context 'when user is part of the experiment' do
-        before do
-          stub_experiment_for_user(signup_flow: true, terms_opt_in: true)
-        end
-
-        it 'tracks event with right parameters' do
-          expect(Gitlab::Tracking).to receive(:event).with(
-            'Growth::Acquisition::Experiment::TermsOptIn',
-            'start',
-            label: anything,
-            property: 'experimental_group'
-          )
-
-          subject
-        end
-      end
-    end
   end
 
   describe '#create' do
@@ -353,100 +313,26 @@
       end
     end
 
-    context 'when terms are enforced' do
-      before do
-        enforce_terms
-      end
-
-      it 'redirects back with a notice when the checkbox was not checked' do
-        subject
-
-        expect(flash[:alert]).to eq(_('You must accept our Terms of Service and privacy policy in order to register an account'))
-      end
-
-      it 'creates the user with agreement when terms are accepted' do
-        post :create, params: user_params.merge(terms_opt_in: '1')
-
-        expect(controller.current_user).to be_present
-        expect(controller.current_user.terms_accepted?).to be(true)
-      end
-
-      context 'when experiment terms_opt_in is enabled' do
+    context 'terms of service' do
+      context 'when terms are enforced' do
         before do
-          stub_experiment(terms_opt_in: true)
+          enforce_terms
         end
 
-        context 'when user is part of the experiment' do
-          before do
-            stub_experiment_for_user(terms_opt_in: true)
-          end
-
-          it 'creates the user with accepted terms' do
-            subject
-
-            expect(controller.current_user).to be_present
-            expect(controller.current_user.terms_accepted?).to be(true)
-          end
-        end
-
-        context 'when user is not part of the experiment' do
-          before do
-            stub_experiment_for_user(terms_opt_in: false)
-          end
-
-          it 'creates the user without accepted terms' do
-            subject
+        it 'creates the user with accepted terms' do
+          subject
 
-            expect(flash[:alert]).to eq(_('You must accept our Terms of Service and privacy policy in order to register an account'))
-          end
+          expect(controller.current_user).to be_present
+          expect(controller.current_user.terms_accepted?).to be(true)
         end
       end
-    end
-
-    describe 'tracking data' do
-      context 'with sign up flow and terms_opt_in experiment being enabled' do
-        before do
-          stub_experiment(signup_flow: true, terms_opt_in: true)
-        end
-
-        it 'records user for the terms_opt_in experiment' do
-          expect(controller).to receive(:record_experiment_user).with(:terms_opt_in)
 
+      context 'when terms are not enforced' do
+        it 'creates the user without accepted terms' do
           subject
-        end
-
-        context 'when user is not part of the experiment' do
-          before do
-            stub_experiment_for_user(signup_flow: true, terms_opt_in: false)
-          end
-
-          it 'tracks event with right parameters' do
-            expect(Gitlab::Tracking).to receive(:event).with(
-              'Growth::Acquisition::Experiment::TermsOptIn',
-              'end',
-              label: anything,
-              property: 'control_group'
-            )
-
-            subject
-          end
-        end
-
-        context 'when user is part of the experiment' do
-          before do
-            stub_experiment_for_user(signup_flow: true, terms_opt_in: true)
-          end
-
-          it 'tracks event with right parameters' do
-            expect(Gitlab::Tracking).to receive(:event).with(
-              'Growth::Acquisition::Experiment::TermsOptIn',
-              'end',
-              label: anything,
-              property: 'experimental_group'
-            )
 
-            subject
-          end
+          expect(controller.current_user).to be_present
+          expect(controller.current_user.terms_accepted?).to be(false)
         end
       end
     end
diff --git a/spec/features/users/signup_spec.rb b/spec/features/users/signup_spec.rb
index 0ede19810d9ff..c59121626f034 100644
--- a/spec/features/users/signup_spec.rb
+++ b/spec/features/users/signup_spec.rb
@@ -222,22 +222,13 @@ def fill_in_signup_form
       enforce_terms
     end
 
-    it 'requires the user to check the checkbox' do
+    it 'renders text that the user confirms terms by clicking register' do
       visit new_user_registration_path
 
-      fill_in_signup_form
-      click_button 'Register'
-
-      expect(current_path).to eq new_user_session_path
-      expect(page).to have_content(/you must accept our terms of service/i)
-    end
-
-    it 'asks the user to accept terms before going to the dashboard' do
-      visit new_user_registration_path
+      expect(page).to have_content(/By clicking Register, I agree that I have read and accepted the Terms of Use and Privacy Policy/)
 
       fill_in_signup_form
-      check :terms_opt_in
-      click_button "Register"
+      click_button 'Register'
 
       expect(current_path).to eq users_sign_up_welcome_path
     end
@@ -364,28 +355,4 @@ def fill_in_signup_form
   it_behaves_like 'Signup'
   it_behaves_like 'Signup name validation', 'new_user_first_name', 127, 'First name'
   it_behaves_like 'Signup name validation', 'new_user_last_name', 127, 'Last name'
-
-  context 'when terms_opt_in experimental is enabled' do
-    include TermsHelper
-
-    before do
-      enforce_terms
-      stub_experiment(signup_flow: true, terms_opt_in: true)
-      stub_experiment_for_user(signup_flow: true, terms_opt_in: true)
-    end
-
-    it 'terms are checked by default' do
-      new_user = build_stubbed(:user)
-
-      visit new_user_registration_path
-      fill_in 'new_user_first_name', with: new_user.first_name
-      fill_in 'new_user_last_name', with: new_user.last_name
-      fill_in 'new_user_username', with: new_user.username
-      fill_in 'new_user_email', with: new_user.email
-      fill_in 'new_user_password', with: new_user.password
-      click_button 'Register'
-
-      expect(current_path).to eq users_sign_up_welcome_path
-    end
-  end
 end
-- 
GitLab