diff options
author | Jarka Kadlecova <jarka@gitlab.com> | 2017-06-13 10:25:25 +0200 |
---|---|---|
committer | Jarka Kadlecova <jarka@gitlab.com> | 2017-06-13 15:11:44 +0200 |
commit | 0975455ae675940bd6a7b97e67de25a433e6ca17 (patch) | |
tree | cea8986cf19958a502bb5bc373bf20ee121bcd6b | |
parent | 323d9f1f5767d74d4aaa858b9e07677430571ac3 (diff) | |
download | gitlab-ce-33097-issue-tracker.tar.gz |
Associate Issues tab only with internal issues tracker33097-issue-tracker
-rw-r--r-- | app/controllers/projects/issues_controller.rb | 15 | ||||
-rw-r--r-- | app/policies/project_policy.rb | 2 | ||||
-rw-r--r-- | changelogs/unreleased/33097-issue-tracker.yml | 4 | ||||
-rw-r--r-- | spec/controllers/projects/issues_controller_spec.rb | 75 | ||||
-rw-r--r-- | spec/features/projects/features_visibility_spec.rb | 14 | ||||
-rw-r--r-- | spec/policies/project_policy_spec.rb | 36 |
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) } |