From 211cbd68f65b37bfeb17f3583264c0ff479be1a4 Mon Sep 17 00:00:00 2001 From: Roy Zwambag Date: Thu, 30 Nov 2023 14:43:38 +0100 Subject: [PATCH 1/4] Update condition to check cut-off date --- ee/app/policies/ee/global_policy.rb | 11 +++-- ee/spec/policies/global_policy_spec.rb | 62 +++++++++++++++++++------- 2 files changed, 55 insertions(+), 18 deletions(-) diff --git a/ee/app/policies/ee/global_policy.rb b/ee/app/policies/ee/global_policy.rb index 5fd1e63305b6fe..da18d2fa19d340 100644 --- a/ee/app/policies/ee/global_policy.rb +++ b/ee/app/policies/ee/global_policy.rb @@ -59,10 +59,15 @@ module GlobalPolicy ::License.feature_available?(:code_suggestions) end - condition(:code_suggestions_enabled_by_instance) do + condition(:code_suggestions_enabled_for_user) do next true if ::Gitlab.org_or_com? - ::Gitlab::CurrentSettings.instance_level_code_suggestions_enabled + if ::CodeSuggestions::SelfManaged::SERVICE_START_DATE.past? + @user.code_suggestions_add_on_available? + else # Before service start date + # TODO: Remove this else branch after the service start date + ::Gitlab::CurrentSettings.instance_level_code_suggestions_enabled + end end condition(:code_suggestions_enabled_by_user) do @@ -151,7 +156,7 @@ module GlobalPolicy enable :admin_instance_external_audit_events end - rule { code_suggestions_licensed & code_suggestions_enabled_by_user & code_suggestions_enabled_by_instance } + rule { code_suggestions_licensed & code_suggestions_enabled_by_user & code_suggestions_enabled_for_user } .enable :access_code_suggestions rule { code_suggestions_disabled_by_group }.prevent :access_code_suggestions diff --git a/ee/spec/policies/global_policy_spec.rb b/ee/spec/policies/global_policy_spec.rb index ed0f44d84cd670..41429135247924 100644 --- a/ee/spec/policies/global_policy_spec.rb +++ b/ee/spec/policies/global_policy_spec.rb @@ -602,25 +602,57 @@ end context 'when not on .org or .com' do - where(:licensed, :instance_level_code_suggestions_enabled, :cs_matcher) do - true | false | be_disallowed(:access_code_suggestions) - true | true | be_allowed(:access_code_suggestions) - true | false | be_disallowed(:access_code_suggestions) - true | true | be_allowed(:access_code_suggestions) - false | false | be_disallowed(:access_code_suggestions) - false | true | be_disallowed(:access_code_suggestions) - false | false | be_disallowed(:access_code_suggestions) - false | true | be_disallowed(:access_code_suggestions) + context 'when it is before the code suggestions service start date' do + # TODO: When CS service start date has passed, we can remove this + around do |example| + travel_to(::CodeSuggestions::SelfManaged::SERVICE_START_DATE - 1.second) do + example.run + end + end + + where(:licensed, :instance_level_code_suggestions_enabled, :cs_matcher) do + true | false | be_disallowed(:access_code_suggestions) + true | true | be_allowed(:access_code_suggestions) + false | false | be_disallowed(:access_code_suggestions) + false | true | be_disallowed(:access_code_suggestions) + end + + with_them do + before do + allow(::Gitlab).to receive(:org_or_com?).and_return(false) + stub_ee_application_setting( + instance_level_code_suggestions_enabled: instance_level_code_suggestions_enabled + ) + stub_licensed_features(code_suggestions: licensed) + end + + it { is_expected.to cs_matcher } + end end - with_them do - before do - allow(::Gitlab).to receive(:org_or_com?).and_return(false) - stub_ee_application_setting(instance_level_code_suggestions_enabled: instance_level_code_suggestions_enabled) - stub_licensed_features(code_suggestions: licensed) + context 'when it is past the code suggestions service start date' do + around do |example| + travel_to(::CodeSuggestions::SelfManaged::SERVICE_START_DATE + 1.second) do + example.run + end end - it { is_expected.to cs_matcher } + where(:licensed, :cs_seat_assigned, :cs_matcher) do + true | true | be_allowed(:access_code_suggestions) + true | false | be_disallowed(:access_code_suggestions) + false | false | be_disallowed(:access_code_suggestions) + false | true | be_disallowed(:access_code_suggestions) + end + + with_them do + before do + allow(::Gitlab).to receive(:org_or_com?).and_return(false) + stub_licensed_features(code_suggestions: licensed) + allow(current_user).to receive(:code_suggestions_add_on_available?).and_return(cs_seat_assigned) + end + + it { is_expected.to cs_matcher } + end end end end -- GitLab From a2ee5a2e65738c080ec16bac2bf6f67c3f10480b Mon Sep 17 00:00:00 2001 From: Roy Zwambag Date: Mon, 8 Jan 2024 14:19:05 +0100 Subject: [PATCH 2/4] Add correct check for Self managed SA --- ee/app/models/ee/user.rb | 4 +++- ee/spec/models/ee/user_spec.rb | 29 +++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/ee/app/models/ee/user.rb b/ee/app/models/ee/user.rb index f9d7ebe4ee18b4..721e42dd6610ca 100644 --- a/ee/app/models/ee/user.rb +++ b/ee/app/models/ee/user.rb @@ -608,7 +608,9 @@ def namespaces_ids_with_code_suggestions_enabled end def code_suggestions_add_on_available? - code_suggestions_add_on_available_namespace_ids.any? + return code_suggestions_add_on_available_namespace_ids.any? if gitlab_saas? + + GitlabSubscriptions::UserAddOnAssignment.by_user(self).any? end def eligible_for_self_managed_code_suggestions? diff --git a/ee/spec/models/ee/user_spec.rb b/ee/spec/models/ee/user_spec.rb index 001a295da47d95..47f3c957b69e8a 100644 --- a/ee/spec/models/ee/user_spec.rb +++ b/ee/spec/models/ee/user_spec.rb @@ -3048,17 +3048,42 @@ describe '#code_suggestions_add_on_available?' do subject { user.code_suggestions_add_on_available? } - it 'returns true when the user belongs to a namespace with add on subscription' do + it 'returns true when the user belongs to a namespace with an add-on subscription' do allow(user).to receive(:code_suggestions_add_on_available_namespace_ids).and_return([1]) is_expected.to eq(true) end - it 'returns false when the user does not belong to a namespace with add on subscription' do + it 'returns false when the user does not belong to a namespace with add-on subscription' do allow(user).to receive(:code_suggestions_add_on_available_namespace_ids).and_return([]) is_expected.to eq(false) end + + context 'on self-managed' do + let(:user) { create(:user) } + let_it_be(:code_suggestions) { create(:gitlab_subscription_add_on) } + + let_it_be(:add_on_purchase) do + create(:gitlab_subscription_add_on_purchase, namespace: nil, add_on: code_suggestions) + end + + context "when the user is assigned" do + before do + create(:gitlab_subscription_user_add_on_assignment, user: user, add_on_purchase: add_on_purchase) + end + + it 'return true' do + expect(user.code_suggestions_add_on_available?).to be_truthy + end + end + + context "when the user is not assigned" do + it 'return false' do + expect(user.code_suggestions_add_on_available?).to be_falsey + end + end + end end describe '#billable_code_suggestions_root_group_ids' do -- GitLab From 9b4034844faea1cd5707e6f76d3303111200f50d Mon Sep 17 00:00:00 2001 From: Roy Zwambag Date: Mon, 8 Jan 2024 14:27:25 +0100 Subject: [PATCH 3/4] Merge spec checks --- ee/spec/policies/global_policy_spec.rb | 30 +++++++++++++++++--------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/ee/spec/policies/global_policy_spec.rb b/ee/spec/policies/global_policy_spec.rb index 41429135247924..ac371ffa5b7147 100644 --- a/ee/spec/policies/global_policy_spec.rb +++ b/ee/spec/policies/global_policy_spec.rb @@ -610,11 +610,16 @@ end end - where(:licensed, :instance_level_code_suggestions_enabled, :cs_matcher) do - true | false | be_disallowed(:access_code_suggestions) - true | true | be_allowed(:access_code_suggestions) - false | false | be_disallowed(:access_code_suggestions) - false | true | be_disallowed(:access_code_suggestions) + # :cs_seat_assigned should be ignored by the code here + where(:licensed, :instance_level_code_suggestions_enabled, :cs_seat_assigned, :cs_matcher) do + true | false | true | be_disallowed(:access_code_suggestions) + true | false | false | be_disallowed(:access_code_suggestions) + true | true | true | be_allowed(:access_code_suggestions) + true | true | false | be_allowed(:access_code_suggestions) + false | false | true | be_disallowed(:access_code_suggestions) + false | false | false | be_disallowed(:access_code_suggestions) + false | true | true | be_disallowed(:access_code_suggestions) + false | true | false | be_disallowed(:access_code_suggestions) end with_them do @@ -637,11 +642,16 @@ end end - where(:licensed, :cs_seat_assigned, :cs_matcher) do - true | true | be_allowed(:access_code_suggestions) - true | false | be_disallowed(:access_code_suggestions) - false | false | be_disallowed(:access_code_suggestions) - false | true | be_disallowed(:access_code_suggestions) + # :instance_level_code_suggestions_enabled should be ignored by the code here + where(:licensed, :instance_level_code_suggestions_enabled, :cs_seat_assigned, :cs_matcher) do + true | false | true | be_allowed(:access_code_suggestions) + true | false | false | be_disallowed(:access_code_suggestions) + true | true | true | be_allowed(:access_code_suggestions) + true | true | false | be_disallowed(:access_code_suggestions) + false | false | true | be_disallowed(:access_code_suggestions) + false | false | false | be_disallowed(:access_code_suggestions) + false | true | true | be_disallowed(:access_code_suggestions) + false | true | false | be_disallowed(:access_code_suggestions) end with_them do -- GitLab From d4ad2a41e2a25298935cc1332ac934f42bbd2d7b Mon Sep 17 00:00:00 2001 From: Roy Zwambag Date: Mon, 8 Jan 2024 14:29:36 +0100 Subject: [PATCH 4/4] Add saas flag to specs --- ee/spec/models/ee/user_spec.rb | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ee/spec/models/ee/user_spec.rb b/ee/spec/models/ee/user_spec.rb index 47f3c957b69e8a..6fd4f88ca23d9b 100644 --- a/ee/spec/models/ee/user_spec.rb +++ b/ee/spec/models/ee/user_spec.rb @@ -3048,16 +3048,18 @@ describe '#code_suggestions_add_on_available?' do subject { user.code_suggestions_add_on_available? } - it 'returns true when the user belongs to a namespace with an add-on subscription' do - allow(user).to receive(:code_suggestions_add_on_available_namespace_ids).and_return([1]) + context 'on saas', :saas do + it 'returns true when the user belongs to a namespace with an add-on subscription' do + allow(user).to receive(:code_suggestions_add_on_available_namespace_ids).and_return([1]) - is_expected.to eq(true) - end + is_expected.to eq(true) + end - it 'returns false when the user does not belong to a namespace with add-on subscription' do - allow(user).to receive(:code_suggestions_add_on_available_namespace_ids).and_return([]) + it 'returns false when the user does not belong to a namespace with add-on subscription' do + allow(user).to receive(:code_suggestions_add_on_available_namespace_ids).and_return([]) - is_expected.to eq(false) + is_expected.to eq(false) + end end context 'on self-managed' do -- GitLab