From b1b08d39bcffedb42203a8d22341c69078581c36 Mon Sep 17 00:00:00 2001 From: Jens Kraemer Date: Thu, 31 Aug 2023 15:59:52 +0800 Subject: [PATCH 1/2] use admin layout for global notes - also swaps h2 and contextual div in index view for consistency reasons --- app/controllers/global_note_templates_controller.rb | 5 +++-- app/views/global_note_templates/index.html.erb | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/global_note_templates_controller.rb b/app/controllers/global_note_templates_controller.rb index 3a48a716..2ffc4490 100644 --- a/app/controllers/global_note_templates_controller.rb +++ b/app/controllers/global_note_templates_controller.rb @@ -2,10 +2,11 @@ # noinspection RubocopInspection class GlobalNoteTemplatesController < ApplicationController - layout 'base' + layout 'admin' + self.main_menu = false + menu_item :redmine_issue_templates helper :issues helper :issue_templates - menu_item :issues before_action :find_object, only: %i[show update destroy] before_action :find_project, only: %i[update] diff --git a/app/views/global_note_templates/index.html.erb b/app/views/global_note_templates/index.html.erb index 36ead811..69c10c0a 100644 --- a/app/views/global_note_templates/index.html.erb +++ b/app/views/global_note_templates/index.html.erb @@ -1,4 +1,3 @@ -

<%=h "#{l(:global_note_templates, default: 'Global Note Templates')}" %>

<%= render partial: 'common/nodata', locals: { trackers: trackers } %>
<%= link_to(l(:label_new_templates), @@ -10,6 +9,7 @@ { controller: 'settings', action: 'plugin', id: 'redmine_issue_templates' }, class: 'issue_template icon plugins') %>
+

<%=h "#{l(:global_note_templates, default: 'Global Note Templates')}" %>

<% if template_map.blank? %> From c91d9eded6824436ec174ec514805d46a366f131 Mon Sep 17 00:00:00 2001 From: Jens Kraemer Date: Thu, 31 Aug 2023 16:42:33 +0800 Subject: [PATCH 2/2] global_notes fixes - adds functional test for global notes - require_admin on all actions - removes :previewable routing concern from global_notes as there is no :preview action --- .../global_note_templates_controller.rb | 2 +- config/routes.rb | 2 +- .../global_note_templates_controller_test.rb | 106 ++++++++++++++++++ 3 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 test/functional/global_note_templates_controller_test.rb diff --git a/app/controllers/global_note_templates_controller.rb b/app/controllers/global_note_templates_controller.rb index 2ffc4490..ff191093 100644 --- a/app/controllers/global_note_templates_controller.rb +++ b/app/controllers/global_note_templates_controller.rb @@ -10,7 +10,7 @@ class GlobalNoteTemplatesController < ApplicationController before_action :find_object, only: %i[show update destroy] before_action :find_project, only: %i[update] - before_action :require_admin, only: %i[index new show], excep: [:preview] + before_action :require_admin # # Action for global template : Admin right is required. diff --git a/config/routes.rb b/config/routes.rb index 941df588..ad52f2eb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -40,5 +40,5 @@ end # for global note temlate - resources :global_note_templates, except: [:edit], concerns: %i[previewable] + resources :global_note_templates, except: [:edit] end diff --git a/test/functional/global_note_templates_controller_test.rb b/test/functional/global_note_templates_controller_test.rb new file mode 100644 index 00000000..31bfe961 --- /dev/null +++ b/test/functional/global_note_templates_controller_test.rb @@ -0,0 +1,106 @@ +require File.expand_path('../test_helper', __dir__) +require 'minitest/autorun' + +class GlobalNoteTemplatesControllerTest < Redmine::ControllerTest + fixtures :projects, :users, :trackers, :global_note_templates + + include Redmine::I18n + + def setup + @request.session[:user_id] = 1 # Admin + @request.env['HTTP_REFERER'] = '/' + @project = Project.find(1) + EnabledModule.create! project_id: 1, name: 'issue_templates' unless @project.module_enabled?('issue_templates') + end + + def test_should_require_admin + @request.session[:user_id] = 2 # non-Admin + + get :index + assert_response 403 + + get :new + assert_response 403 + + get :show, params: { id: 1 } + assert_response 403 + + post :create, params: { global_note_template: { description: 'Test.' } } + assert_response 403 + + patch :update, params: { id: 1, global_note_template: { description: 'Test.' } } + assert_response 403 + + delete :destroy, params: { id: 1 } + assert_response 403 + end + + def test_get_index + get :index + assert_response :success + assert_select 'div.template_box h3.template_tracker', 'Bug' + end + + def test_update_template + put :update, params: { id: 1, global_note_template: { description: 'Update Test Global template2' } } + t = GlobalNoteTemplate.find(1) + assert_redirected_to controller: 'global_note_templates', action: 'show', id: 1 + assert_equal 'Update Test Global template2', t.description + end + + def test_update_template_with_empty_name + put :update, params: { id: 1, global_note_template: { name: '' } } + assert_response :success + t = GlobalNoteTemplate.find(1) + assert_not_equal '', t.name + + # render :show + assert_select 'h2.global_note_template', "#{l(:global_note_templates)}: #1" + # Error message should be displayed. + assert_select 'div#errorExplanation', { count: 1, text: /Template name cannot be blank/ }, @response.body.to_s + end + + def test_destroy_template + GlobalNoteTemplate.update_all(enabled: false) + assert_difference ->{ GlobalNoteTemplate.count }, -1 do + delete :destroy, params: { id: 1 } + assert_redirected_to controller: 'global_note_templates', action: 'index' + end + assert_raise(ActiveRecord::RecordNotFound) { GlobalNoteTemplate.find(1) } + end + + def test_new_template + get :new + assert_response :success + end + + def test_create_template + assert_difference ->{ GlobalNoteTemplate.count } do + post :create, params: { global_note_template: { name: 'Global Template newtitle for creation test', + description: 'Global Template description for creation test', + tracker_id: 1, enabled: 1, author_id: 1 } } + assert_response :redirect + end + + assert_response :redirect + + assert template = GlobalNoteTemplate.order(id: :desc).first + assert_equal('Global Template newtitle for creation test', template.name) + assert_equal('Global Template description for creation test', template.description) + assert_equal(1, template.tracker.id) + assert_equal(1, template.author.id) + end + + def test_create_template_fail + assert_no_difference 'GlobalNoteTemplate.count' do + # when title blank, validation bloks to save. + post :create, params: { global_note_template: { name: '', description: 'description', tracker_id: 1, enabled: 1, author_id: 1 } } + assert_response :success + end + + # render :new + assert_select 'h2', text: "#{l(:global_note_templates)} / #{l(:button_add)}" + # Error message should be displayed. + assert_select 'div#errorExplanation', { count: 1, text: /Template name cannot be blank/ }, @response.body.to_s + end +end