diff --git a/app/models/project.rb b/app/models/project.rb index 5183c03de477f3e3c02537a4d038e9619d5d1a7a..8cbc278f6a05e6b50d7097a9dd35684ffb674f6a 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -2469,6 +2469,7 @@ def metrics_setting def service_desk_enabled Gitlab::ServiceDesk.enabled?(project: self) end + alias_method :service_desk_enabled?, :service_desk_enabled def service_desk_address diff --git a/ee/app/controllers/projects/integrations/jira/issues_controller.rb b/ee/app/controllers/projects/integrations/jira/issues_controller.rb index 448f2bb8129cb034e2e306bda73c2df1f298acea..8fc7df2a38178fc4e3a15736acf84fb930e13d6b 100644 --- a/ee/app/controllers/projects/integrations/jira/issues_controller.rb +++ b/ee/app/controllers/projects/integrations/jira/issues_controller.rb @@ -69,7 +69,7 @@ def default_sort_order protected def check_feature_enabled! - return render_404 unless Feature.enabled?(:jira_integration, project) && project.external_issue_tracker + return render_404 unless project.jira_issues_integration_available? && project.external_issue_tracker end def render_bad_request(error) diff --git a/app/finders/projects/integrations/jira/issues_finder.rb b/ee/app/finders/projects/integrations/jira/issues_finder.rb similarity index 97% rename from app/finders/projects/integrations/jira/issues_finder.rb rename to ee/app/finders/projects/integrations/jira/issues_finder.rb index 239ff4ba2b209c66d88fc631856a2b1528abdf0d..64588705aff4cc5384ada3af82d27ba725db4da7 100644 --- a/app/finders/projects/integrations/jira/issues_finder.rb +++ b/ee/app/finders/projects/integrations/jira/issues_finder.rb @@ -25,7 +25,7 @@ def initialize(project, params = {}) end def execute - return [] unless Feature.enabled?(:jira_integration, project) + return [] unless project.jira_issues_integration_available? raise IntegrationError, _('Jira service not configured.') unless jira_service&.active? diff --git a/ee/app/helpers/ee/services_helper.rb b/ee/app/helpers/ee/services_helper.rb index 33bbde53daa3d107f316905d66e7dcc45ed33a75..4228ea2b6d7f29e48bc9e1c7e3925f913406cf61 100644 --- a/ee/app/helpers/ee/services_helper.rb +++ b/ee/app/helpers/ee/services_helper.rb @@ -6,7 +6,7 @@ module ServicesHelper override :project_jira_issues_integration? def project_jira_issues_integration? - ::Feature.enabled?(:jira_integration, @project) && @project.jira_service.issues_enabled + @project.jira_issues_integration_available? && @project.jira_service.issues_enabled end override :integration_form_data diff --git a/ee/app/models/ee/project.rb b/ee/app/models/ee/project.rb index b8e329205b664555e79954cf297291af2e7b8c84..a32e066618981b1d979753f8f4b911c4a8cb9be4 100644 --- a/ee/app/models/ee/project.rb +++ b/ee/app/models/ee/project.rb @@ -313,6 +313,10 @@ def feature_available?(feature, user = nil) end end + def jira_issues_integration_available? + feature_available?(:jira_issues_integration) + end + def multiple_approval_rules_available? feature_available?(:multiple_approval_rules) end diff --git a/ee/app/models/license.rb b/ee/app/models/license.rb index 503c4459d5f13abf8645858a0372c9bbbcdf7602..4bbb5e9791c0f37d62e6e3bf55898ecbc7253a60 100644 --- a/ee/app/models/license.rb +++ b/ee/app/models/license.rb @@ -82,6 +82,7 @@ class License < ApplicationRecord group_saml issues_analytics jira_dev_panel_integration + jira_issues_integration ldap_group_sync_filter merge_pipelines merge_request_performance_metrics diff --git a/app/services/jira/jql_builder_service.rb b/ee/app/services/jira/jql_builder_service.rb similarity index 100% rename from app/services/jira/jql_builder_service.rb rename to ee/app/services/jira/jql_builder_service.rb diff --git a/app/services/jira/requests/issues/list_service.rb b/ee/app/services/jira/requests/issues/list_service.rb similarity index 100% rename from app/services/jira/requests/issues/list_service.rb rename to ee/app/services/jira/requests/issues/list_service.rb diff --git a/ee/spec/controllers/projects/integrations/jira/issues_controller_spec.rb b/ee/spec/controllers/projects/integrations/jira/issues_controller_spec.rb index 542adf7a09754801457bee9f466d25fbd9a41ea6..f48aa93b4471ec7b805e86fb746fa0768a43326e 100644 --- a/ee/spec/controllers/projects/integrations/jira/issues_controller_spec.rb +++ b/ee/spec/controllers/projects/integrations/jira/issues_controller_spec.rb @@ -8,6 +8,10 @@ let(:project) { create(:project) } let(:user) { create(:user) } + before do + stub_licensed_features(jira_issues_integration: true) + end + describe 'GET #index' do before do sign_in(user) @@ -15,9 +19,9 @@ create(:jira_service, project: project) end - context 'when jira_integration feature disabled' do + context 'when jira_issues_integration licensed feature is not available' do it 'returns 404 status' do - stub_feature_flags(jira_integration: false) + stub_licensed_features(jira_issues_integration: false) get :index, params: { namespace_id: project.namespace, project_id: project } diff --git a/ee/spec/features/integrations/jira/jira_issues_list_spec.rb b/ee/spec/features/integrations/jira/jira_issues_list_spec.rb index 502dbbeca8242076bb3d49ed3a838a25b76fccf5..6744841892820b92440e2aaa229908b9e1cb668e 100644 --- a/ee/spec/features/integrations/jira/jira_issues_list_spec.rb +++ b/ee/spec/features/integrations/jira/jira_issues_list_spec.rb @@ -3,15 +3,29 @@ require 'spec_helper' RSpec.describe 'Jira issues list' do - let_it_be(:project) { create(:project) } + let_it_be(:project, refind: true) { create(:project) } let_it_be(:jira_integration) { create(:jira_service, project: project, issues_enabled: true) } let(:user) { create(:user) } before do + stub_licensed_features(jira_issues_integration: true) project.add_user(user, :developer) sign_in(user) end + context 'when jira_issues_integration licensed feature is not available' do + before do + stub_licensed_features(jira_issues_integration: false) + end + + it 'renders "Create new issue" button' do + visit project_integrations_jira_issues_path(project) + + expect(page).to have_gitlab_http_status(:not_found) + expect(page).not_to have_link('Create new issue in Jira') + end + end + it 'renders "Create new issue" button' do visit project_integrations_jira_issues_path(project) diff --git a/ee/spec/features/projects/services/user_activates_jira_spec.rb b/ee/spec/features/projects/services/user_activates_jira_spec.rb index 362bf678589a6dbb7adeaa1ccf107a5a75a2debc..a5737d9c44a740a899a1eb87fda466dbff062282 100644 --- a/ee/spec/features/projects/services/user_activates_jira_spec.rb +++ b/ee/spec/features/projects/services/user_activates_jira_spec.rb @@ -9,6 +9,7 @@ describe 'user sets and activates Jira Service' do context 'when Jira connection test succeeds' do before do + stub_licensed_features(jira_issues_integration: true) allow_any_instance_of(JiraService).to receive(:issues_enabled) { true } server_info = { key: 'value' }.to_json stub_request(:get, test_url).with(basic_auth: %w(username password)).to_return(body: server_info) @@ -26,6 +27,21 @@ expect(page).not_to have_link('Jira', href: url) end end + + context 'when jira_issues_integration feature is not available' do + before do + stub_licensed_features(jira_issues_integration: false) + end + + it 'does not show Jira links to sidebar menu' do + page.within('.nav-sidebar') do + expect(page).not_to have_link('Jira Issues', href: project_integrations_jira_issues_path(project)) + expect(page).not_to have_link('Issue List', href: project_integrations_jira_issues_path(project), visible: false) + expect(page).not_to have_link('Open Jira', href: url, visible: false) + expect(page).to have_link('Jira', href: url) + end + end + end end end end diff --git a/spec/finders/projects/integrations/jira/issues_finder_spec.rb b/ee/spec/finders/projects/integrations/jira/issues_finder_spec.rb similarity index 93% rename from spec/finders/projects/integrations/jira/issues_finder_spec.rb rename to ee/spec/finders/projects/integrations/jira/issues_finder_spec.rb index fd55585cc3bc55ea5030db6bd06defde043fde23..2850869c4ead48706f2a15719feb72b425e87f06 100644 --- a/spec/finders/projects/integrations/jira/issues_finder_spec.rb +++ b/ee/spec/finders/projects/integrations/jira/issues_finder_spec.rb @@ -3,25 +3,18 @@ require 'spec_helper' RSpec.describe Projects::Integrations::Jira::IssuesFinder do - let_it_be(:project, reload: true) { create(:project) } + let_it_be(:project, refind: true) { create(:project) } let_it_be(:jira_service, reload: true) { create(:jira_service, project: project) } let(:params) { {} } let(:service) { described_class.new(project, params) } + before do + stub_licensed_features(jira_issues_integration: true) + end + describe '#execute' do subject(:issues) { service.execute } - context 'when jira_integration feature flag is not enabled' do - before do - stub_feature_flags(jira_integration: false) - end - - it 'exits early and returns no issues' do - expect(issues.size).to eq 0 - expect(service.total_count).to be_nil - end - end - context 'when jira service integration does not have project_key' do it 'raises error' do expect { subject }.to raise_error(Projects::Integrations::Jira::IntegrationError, 'Jira project key is not configured') @@ -131,5 +124,14 @@ end end end + + context 'when jira_issues_integration licensed feature is not available' do + it 'exits early and returns no issues' do + stub_licensed_features(jira_issues_integration: false) + + expect(issues.size).to eq 0 + expect(service.total_count).to be_nil + end + end end end diff --git a/spec/services/jira/jql_builder_service_spec.rb b/ee/spec/services/jira/jql_builder_service_spec.rb similarity index 100% rename from spec/services/jira/jql_builder_service_spec.rb rename to ee/spec/services/jira/jql_builder_service_spec.rb diff --git a/spec/services/jira/requests/issues/list_service_spec.rb b/ee/spec/services/jira/requests/issues/list_service_spec.rb similarity index 100% rename from spec/services/jira/requests/issues/list_service_spec.rb rename to ee/spec/services/jira/requests/issues/list_service_spec.rb