From 7e79d9c0c7d9e6033793200dc18a270fc6f65efc Mon Sep 17 00:00:00 2001
From: Alexandru Croitor <acroitor@gitlab.com>
Date: Fri, 10 Jul 2020 12:13:55 +0300
Subject: [PATCH] Add license tire feature check

Check that Jira issues integration feature is available for the
projeect in its current plan tire.
---
 app/models/project.rb                         |  1 +
 .../integrations/jira/issues_controller.rb    |  2 +-
 .../integrations/jira/issues_finder.rb        |  2 +-
 ee/app/helpers/ee/services_helper.rb          |  2 +-
 ee/app/models/ee/project.rb                   |  4 +++
 ee/app/models/license.rb                      |  1 +
 .../app}/services/jira/jql_builder_service.rb |  0
 .../jira/requests/issues/list_service.rb      |  0
 .../jira/issues_controller_spec.rb            |  8 ++++--
 .../jira/jira_issues_list_spec.rb             | 16 +++++++++++-
 .../services/user_activates_jira_spec.rb      | 16 ++++++++++++
 .../integrations/jira/issues_finder_spec.rb   | 26 ++++++++++---------
 .../services/jira/jql_builder_service_spec.rb |  0
 .../jira/requests/issues/list_service_spec.rb |  0
 14 files changed, 60 insertions(+), 18 deletions(-)
 rename {app => ee/app}/finders/projects/integrations/jira/issues_finder.rb (97%)
 rename {app => ee/app}/services/jira/jql_builder_service.rb (100%)
 rename {app => ee/app}/services/jira/requests/issues/list_service.rb (100%)
 rename {spec => ee/spec}/finders/projects/integrations/jira/issues_finder_spec.rb (93%)
 rename {spec => ee/spec}/services/jira/jql_builder_service_spec.rb (100%)
 rename {spec => ee/spec}/services/jira/requests/issues/list_service_spec.rb (100%)

diff --git a/app/models/project.rb b/app/models/project.rb
index 5183c03de477..8cbc278f6a05 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 448f2bb8129c..8fc7df2a3817 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 239ff4ba2b20..64588705aff4 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 33bbde53daa3..4228ea2b6d7f 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 b8e329205b66..a32e06661898 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 503c4459d5f1..4bbb5e9791c0 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 542adf7a0975..f48aa93b4471 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 502dbbeca824..674484189282 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 362bf678589a..a5737d9c44a7 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 fd55585cc3bc..2850869c4ead 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
-- 
GitLab