summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJarka Kadlecova <jarka@gitlab.com>2017-06-13 10:25:25 +0200
committerJarka Kadlecova <jarka@gitlab.com>2017-06-13 15:11:44 +0200
commit0975455ae675940bd6a7b97e67de25a433e6ca17 (patch)
treecea8986cf19958a502bb5bc373bf20ee121bcd6b
parent323d9f1f5767d74d4aaa858b9e07677430571ac3 (diff)
downloadgitlab-ce-33097-issue-tracker.tar.gz
Associate Issues tab only with internal issues tracker33097-issue-tracker
-rw-r--r--app/controllers/projects/issues_controller.rb15
-rw-r--r--app/policies/project_policy.rb2
-rw-r--r--changelogs/unreleased/33097-issue-tracker.yml4
-rw-r--r--spec/controllers/projects/issues_controller_spec.rb75
-rw-r--r--spec/features/projects/features_visibility_spec.rb14
-rw-r--r--spec/policies/project_policy_spec.rb36
6 files changed, 109 insertions, 37 deletions
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index ebb163bf9dc..3f5e1e0bb1d 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -8,7 +8,6 @@ class Projects::IssuesController < Projects::ApplicationController
prepend_before_action :authenticate_user!, only: [:new]
- before_action :redirect_to_external_issue_tracker, only: [:index, :new]
before_action :module_enabled
before_action :issue, only: [:edit, :update, :show, :referenced_merge_requests,
:related_branches, :can_create_branch, :realtime_changes, :create_merge_request]
@@ -254,19 +253,7 @@ class Projects::IssuesController < Projects::ApplicationController
end
def module_enabled
- return render_404 unless @project.feature_available?(:issues, current_user) && @project.default_issues_tracker?
- end
-
- def redirect_to_external_issue_tracker
- external = @project.external_issue_tracker
-
- return unless external
-
- if action_name == 'new'
- redirect_to external.new_issue_path
- else
- redirect_to external.project_path
- end
+ return render_404 unless @project.feature_available?(:issues, current_user)
end
def issue_params
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index 3959b895f44..7443aa1b3d4 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -235,7 +235,7 @@ class ProjectPolicy < BasePolicy
def block_issues_abilities
unless project.feature_available?(:issues, user)
- cannot! :read_issue if project.default_issues_tracker?
+ cannot! :read_issue
cannot! :create_issue
cannot! :update_issue
cannot! :admin_issue
diff --git a/changelogs/unreleased/33097-issue-tracker.yml b/changelogs/unreleased/33097-issue-tracker.yml
new file mode 100644
index 00000000000..0b13f7165db
--- /dev/null
+++ b/changelogs/unreleased/33097-issue-tracker.yml
@@ -0,0 +1,4 @@
+---
+title: Associate Issues tab only with internal issues tracker
+merge_request:
+author:
diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb
index b65e9e0dfc0..18980cde0a6 100644
--- a/spec/controllers/projects/issues_controller_spec.rb
+++ b/spec/controllers/projects/issues_controller_spec.rb
@@ -7,14 +7,39 @@ describe Projects::IssuesController do
describe "GET #index" do
context 'external issue tracker' do
- it 'redirects to the external issue tracker' do
- external = double(project_path: 'https://example.com/project')
- allow(project).to receive(:external_issue_tracker).and_return(external)
- controller.instance_variable_set(:@project, project)
+ before do
+ sign_in(user)
+ project.team << [user, :developer]
- get :index, namespace_id: project.namespace, project_id: project
+ JiraService.create(
+ project: project,
+ active: true,
+ username: 'username',
+ password: 'test',
+ project_key: 'TEST',
+ jira_issue_transition_id: 24,
+ url: 'http://jira.test.com'
+ )
+ end
+
+ context 'when GitLab issues disabled' do
+ it 'returns 404 status' do
+ project.issues_enabled = false
+ project.save
+
+ get :index, namespace_id: project.namespace, project_id: project
- expect(response).to redirect_to('https://example.com/project')
+ expect(response).to have_http_status(404)
+ end
+ end
+
+ context 'when GitLab issues enabled' do
+ it 'renders the "index" template' do
+ get :index, namespace_id: project.namespace, project_id: project
+
+ expect(response).to have_http_status(200)
+ expect(response).to render_template(:index)
+ end
end
end
@@ -45,14 +70,6 @@ describe Projects::IssuesController do
get :index, namespace_id: project.namespace, project_id: project
expect(response).to have_http_status(404)
end
-
- it "returns 404 when external issue tracker is enabled" do
- controller.instance_variable_set(:@project, project)
- allow(project).to receive(:default_issues_tracker?).and_return(false)
-
- get :index, namespace_id: project.namespace, project_id: project
- expect(response).to have_http_status(404)
- end
end
context 'with page param' do
@@ -144,14 +161,32 @@ describe Projects::IssuesController do
project.team << [user, :developer]
end
- it 'redirects to the external issue tracker' do
- external = double(new_issue_path: 'https://example.com/issues/new')
- allow(project).to receive(:external_issue_tracker).and_return(external)
- controller.instance_variable_set(:@project, project)
+ context 'when GitLab issues disabled' do
+ it 'returns 404 status' do
+ project.issues_enabled = false
+ project.save
- get :new, namespace_id: project.namespace, project_id: project
+ external = double(new_issue_path: 'https://example.com/issues/new')
+ allow(project).to receive(:external_issue_tracker).and_return(external)
+ controller.instance_variable_set(:@project, project)
+
+ get :new, namespace_id: project.namespace, project_id: project
- expect(response).to redirect_to('https://example.com/issues/new')
+ expect(response).to have_http_status(404)
+ end
+ end
+
+ context 'when GitLab issues enabled' do
+ it 'renders the "new" template' do
+ external = double(new_issue_path: 'https://example.com/issues/new')
+ allow(project).to receive(:external_issue_tracker).and_return(external)
+ controller.instance_variable_set(:@project, project)
+
+ get :new, namespace_id: project.namespace, project_id: project
+
+ expect(response).to have_http_status(200)
+ expect(response).to render_template(:new)
+ end
end
end
end
diff --git a/spec/features/projects/features_visibility_spec.rb b/spec/features/projects/features_visibility_spec.rb
index c49648f54bd..de7fd1a0a15 100644
--- a/spec/features/projects/features_visibility_spec.rb
+++ b/spec/features/projects/features_visibility_spec.rb
@@ -39,9 +39,8 @@ describe 'Edit Project Settings', feature: true do
end
end
- context "When external issue tracker is enabled" do
+ context "When external issue tracker is enabled and issues enabled on project settings" do
it "does not hide issues tab" do
- project.project_feature.update(issues_access_level: ProjectFeature::DISABLED)
allow_any_instance_of(Project).to receive(:external_issue_tracker).and_return(JiraService.new)
visit namespace_project_path(project.namespace, project)
@@ -50,6 +49,17 @@ describe 'Edit Project Settings', feature: true do
end
end
+ context "When external issue tracker is enabled and issues disabled on project settings" do
+ it "hides issues tab" do
+ project.project_feature.update(issues_access_level: ProjectFeature::DISABLED)
+ allow_any_instance_of(Project).to receive(:external_issue_tracker).and_return(JiraService.new)
+
+ visit namespace_project_path(project.namespace, project)
+
+ expect(page).not_to have_selector(".shortcuts-issues")
+ end
+ end
+
context "pipelines subtabs" do
it "shows builds when enabled" do
visit namespace_project_pipelines_path(project.namespace, project)
diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb
index 0d3af1f4499..385d4c587a4 100644
--- a/spec/policies/project_policy_spec.rb
+++ b/spec/policies/project_policy_spec.rb
@@ -95,6 +95,42 @@ describe ProjectPolicy, models: true do
expect(permissions).not_to include(*wiki_permissions)
end
+ context 'issues feature' do
+ context 'when the feature is disabled' do
+ it 'does not include the issues permissions' do
+ project.issues_enabled = false
+ project.save
+ issues_permissions = [:read_issue, :create_issue, :update_issue, :admin_issue]
+
+ permissions = described_class.abilities(owner, project).to_set
+
+ expect(permissions).not_to include(*issues_permissions)
+ end
+ end
+
+ context 'when the feature is disabled and external tracker configured' do
+ it 'does not include the issues permissions' do
+ JiraService.create(
+ project: project,
+ active: true,
+ username: 'username',
+ password: 'test',
+ project_key: 'TEST',
+ jira_issue_transition_id: 24,
+ url: 'http://jira.test.com'
+ )
+
+ project.issues_enabled = false
+ project.save
+ issues_permissions = [:read_issue, :create_issue, :update_issue, :admin_issue]
+
+ permissions = described_class.abilities(owner, project).to_set
+
+ expect(permissions).not_to include(*issues_permissions)
+ end
+ end
+ end
+
context 'abilities for non-public projects' do
let(:project) { create(:empty_project, namespace: owner.namespace) }