-
- <%=content_tag(:label, l(:button_activate))%>
- <%=check_box_tag 'settings[enable]', true, @settings['enable'] == "true" %>
-
-
-
- <%=content_tag(:label, l(:label_display_authenticated_user_only))%>
- <%=check_box_tag 'settings[only_authenticated]', true, @settings['only_authenticated'] == "true" %>
-
-
-
- <%=content_tag(:label, l(:label_message_type))%>
- <%= radio_button_tag 'settings[type]', "info", @settings['type'] == "info" %> Info
- <%= radio_button_tag 'settings[type]', "warn", @settings['type'] == "warn" %> Warn
- <%= radio_button_tag 'settings[type]', "alert", @settings['type'] == "alert" %> Alert
- <%= radio_button_tag 'settings[type]', "normal", @settings['type'] == "normal" %> Normal
-
-
-
- <%=content_tag(:label, l(:setting_banner_display_part))%>
- <%= select_tag('settings[display_part]',
- options_for_select([[l(:label_header_only),'header'],
- [l(:label_footer_only),'footer'],[l(:label_both),'both']],@settings['display_part'])) %>
- <%=check_box_tag 'settings[display_only_login_page]', true, @settings['display_only_login_page'] == "true" %>
- <%= l(:label_check_if_banner_show_only_login_page) %>
-
-
-
- <%=content_tag(:label, l(:label_banner_message)) %>
- <%=text_area_tag 'settings[banner_description]', banner_description, :size =>"40x3",
- :class => 'wiki-edit' ,:required => true %>
-
-<%= wikitoolbar_for "settings_banner_description" %>
-
-
-
-
- <%=content_tag(:label, l(:setting_banner_related_link))%>
- <%= text_field_tag 'settings[related_link]', @settings['related_link'], :size => 40 %>
- <%= l(:setting_banner_related_link_description) %>
-
-
-
- <%=content_tag(:label, l(:label_use_timer))%>
-
-<%=check_box_tag 'settings[use_timer]', true, @settings['use_timer'] == "true" , :onclick => '$("#banner_timer_setting").toggle();' %>
-
-
-
-
-
- <%=content_tag(:label, l(:label_start_datetime))%>
- <%= text_field_tag 'settings[start_ymd]', @start_datetime.strftime("%Y-%m-%d"), :size => 10 %>
- <%= select_hour @start_datetime, :prefix => 'settings', :field_name => 'start_hour',
- :time_separator => ':', :include_seconds => false %>:
- <%= select_minute @start_datetime, :prefix => 'settings', :field_name => 'start_min', :time_separator => ':', :include_seconds => false %>
- <%= calendar_for('settings_start_ymd') %> (exp. 2012-12-31 11:00)
-
-
-
-
- <%=content_tag(:label, l(:label_end_datetime))%>
- <%= text_field_tag 'settings[end_ymd]', @end_datetime.strftime("%Y-%m-%d"), :size => 10 %>
- <%= select_hour @end_datetime, :prefix => 'settings',:field_name => 'end_hour',
- :time_separator => ':', :include_seconds => false,:disabled => !@settings['use_timer'] == "true" %>:
- <%= select_minute @end_datetime, :prefix => 'settings',:field_name => 'end_min',
- :time_separator => ':', :include_seconds => false,:disabled => !@settings['use_timer'] == "true" %>
- <%= calendar_for('settings_end_ymd') %> (exp. 2013-01-01 11:00)
-
-
-
-
-
- <%=content_tag(:label, l(:field_updated_on))%>
- <%= @banner_updated_on %>
-
-
-
-
diff --git a/assets/javascripts/banner.js b/assets/javascripts/banner.js
index 5de55e7..535fb7b 100644
--- a/assets/javascripts/banner.js
+++ b/assets/javascripts/banner.js
@@ -1,12 +1,12 @@
/* Code for Banner UI */
function checkDateRange(event, confirm_msg, date_range_error_msg) {
- var s = $('#settings_start_ymd').val() + " " + $('#settings_start_hour').val() + ":" + $('#settings_start_min').val();
- var e = $('#settings_end_ymd').val() + " " + $('#settings_end_hour').val() + ":" + $('#settings_end_min').val();
+ let s = $('#setting_start_ymd').val() + " " + $('#setting_start_hour').val() + ":" + $('#setting_start_min').val();
+ let e = $('#setting_end_ymd').val() + " " + $('#setting_end_hour').val() + ":" + $('#setting_end_min').val();
if (e.replace(/\-\s:/gi, "") < s.replace(/\-\s:/gi, "")) {
window.alert(date_range_error_msg + " (From " + s + " to " + e + ")");
return false;
} else {
- var response = confirm(confirm_msg);
+ let response = confirm(confirm_msg);
if (response) {
return true;
}
@@ -14,34 +14,18 @@ function checkDateRange(event, confirm_msg, date_range_error_msg) {
return false;
}
-function checkDateValue(event, confirm_msg, error_msg) {
- var start_ymd = $("settings_start_ymd").value;
- var start_hour = $("settings_start_hour").value;
- var start_min = $("settings_start_min").value;
-
- var end_ymd = $("settings_end_ymd").value;
- var end_hour = $("settings_end_hour").value;
- var end_min = $("settings_end_min").value;
-
- var s_time = start_ymd.replace("-","") + start_hour + start_min;
- var e_time = end_ymd.replace("-","") + end_hour + end_min;
-
- if (e_time < s_time) {
- window.alert(error_msg);
- event.stop();
- return false;
- }
- var response = confirm(confirm_msg);
- if(!response){
- event.stop();
- }
- return true;
-}
-
function displayTopBanner() {
if (window.matchMedia( '(max-width: 899px)' ).matches) {
$('#content').prepend($('div.banner_area.global_banner').first());
} else {
$('div.banner_area.global_banner').first().insertAfter($('#top-menu'));
- };
+ }
+}
+
+function displayTopAndBottomBanner() {
+ if (window.matchMedia( '(max-width: 899px)' ).matches) {
+ $('#content').prepend($('div.banner_area.global_banner').clone());
+ } else {
+ $('div.banner_area.global_banner').clone().insertAfter($('#top-menu'));
+ }
}
diff --git a/assets/stylesheets/banner.css b/assets/stylesheets/banner.css
index 6adc0a5..484467e 100644
--- a/assets/stylesheets/banner.css
+++ b/assets/stylesheets/banner.css
@@ -62,11 +62,6 @@ span.banner_alert {
background-image: url("../images/alert-msg.png");
}
-#top-menu a.redmine-banner {
- background: url("../images/alert-msg.png") no-repeat;
- color: transparent;
-}
-
span.use_timer {
background: url("../images/icon-timer.png") no-repeat right center;
padding-right: 20px;
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 7e649d5..51a7893 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1,7 +1,7 @@
# English strings go here for Rails i18n
en:
banner: "Banner"
- setting_banner_display_part: "Display Location"
+ setting_banner_display_part: "Display Location"
label_header_only: "Header only"
label_footer_only: "Footer only"
label_both: "Both Header / Footer"
@@ -10,7 +10,7 @@ en:
label_start_datetime: "Start datetime"
label_end_datetime: "End datetime"
label_use_timer: "Use timer"
- error_banner_date_range: "Start date should be prior to End date."
+ error_banner_date_range: "Start date should be prior to End date."
redmine_banner_title: "Go to Banner Setting."
button_off: "Off"
banner_off: "Turn off banner message in your session. (Turn on banner again if Admin updates global banner message.)"
@@ -26,3 +26,5 @@ en:
setting_banner_related_link_description: "If defined, link for more information is appended."
more_info: "[More Info]"
label_more_info: "Link to more information."
+ banner_admin_group: "Banner Admin Group"
+ description_for_banner_admin_group: "Specify a group that can manage the global banner without admin rights."
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index d74fba7..be4a6b8 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -26,5 +26,6 @@ ja:
setting_banner_related_link_description: "関連/詳細情報へのリンクをメッセージに追加します。"
more_info: "[詳細]"
label_more_info: "詳細はこちら。"
-
-
+ banner_admin_group: "バナー管理者グループ"
+ description_for_banner_admin_group: "バナー管理者グループのユーザは、Redmine全体の管理者権限なしでもグローバルバナーを編集できるようになります。"
+
diff --git a/config/routes.rb b/config/routes.rb
index ad2a00b..e6a3b76 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -20,6 +20,11 @@
get 'off', on: :collection
end
+ resources :global_banner, only: %i[show] do
+ get '/', to: 'global_banner#show', on: :collection
+ post '/', to: 'global_banner#update', on: :collection
+ end
+
namespace 'banners' do
namespace 'api' do
resource :global_banner, only: %i[register_banner] do
diff --git a/init.rb b/init.rb
index be45285..3d2bb36 100644
--- a/init.rb
+++ b/init.rb
@@ -1,6 +1,8 @@
+# frozen_string_literal: true
+
require 'redmine'
+require_relative 'app/models/global_banner'
require 'banners/application_hooks'
-require 'banners/settings_controller_patch'
require 'banners/projects_helper_patch'
# NOTE: Keep error message for a while to support Redmine3.x users.
@@ -15,41 +17,30 @@ def banner_version_message(original_message = nil)
USAGE
end
+def banner_admin?
+ GlobalBanner.banner_admin?(User.current)
+end
+
Redmine::Plugin.register :redmine_banner do
begin
name 'Redmine Banner plugin'
author 'Akiko Takano'
author_url 'http://twitter.com/akiko_pusu'
description 'Plugin to show site-wide message, such as maintenacne informations or notifications.'
- version '0.2.2'
+ version '0.3.0'
requires_redmine version_or_higher: '4.0'
url 'https://github.com/akiko-pusu/redmine_banner'
- settings partial: 'settings/redmine_banner', default: {
- enable: 'false',
- banner_description: 'exp. Information about upcoming Service Interruption.',
- type: 'info',
- display_part: 'both',
- use_timer: 'false',
- start_ymd: nil,
- start_hour: nil,
- start_min: nil,
- end_ymd: nil,
- end_hour: nil,
- end_min: nil,
- related_link: nil
- }
- menu :admin_menu, 'icon redmine_banner', { controller: 'settings', action: 'plugin', id: :redmine_banner }, caption: :banner
+ settings partial: nil, default: GlobalBanner::GLOBAL_BANNER_DEFAULT_SETTING
+
+ menu :admin_menu, 'icon redmine_banner', { controller: 'global_banner', action: 'show', "id": nil }, caption: :banner
+ menu :top_menu, :redmine_banner, { controller: 'global_banner', action: 'show', "id": nil }, caption: :banner,
+ last: true,
+ if: proc { banner_admin? }
project_module :banner do
permission :manage_banner, { banner: %I[show edit project_banner_off] }, require: :member
end
-
- Rails.configuration.to_prepare do
- unless SettingsController.included_modules.include?(Banners::SettingsControllerPatch)
- SettingsController.send(:prepend, Banners::SettingsControllerPatch)
- end
- end
rescue ::Redmine::PluginRequirementError => e
raise ::Redmine::PluginRequirementError.new(banner_version_message(e.message)) # rubocop:disable Style/RaiseArgs
end
diff --git a/lib/banners/application_hooks.rb b/lib/banners/application_hooks.rb
index 43591b3..2d0ca20 100644
--- a/lib/banners/application_hooks.rb
+++ b/lib/banners/application_hooks.rb
@@ -1,7 +1,8 @@
+# frozen_string_literal: true
+
module Banners
class BannerHeaderHooks < Redmine::Hook::ViewListener
include ApplicationHelper
- include BannerHelper
def view_layouts_base_html_head(_context = {})
o = stylesheet_link_tag('banner', plugin: 'redmine_banner')
@@ -16,99 +17,83 @@ def view_layouts_base_html_head(_context = {})
class ProjectBannerMessageHooks < Redmine::Hook::ViewListener
def view_layouts_base_content(context = {})
project = context[:project]
- return unless Banners::BannerHelper.enabled?(project)
+ return unless enabled?(project)
banner = Banner.where(project_id: project.id).first
- return '' unless banner && banner.enable_banner?
+ return '' unless banner&.enable_banner?
display_part = banner.display_part
- return '' unless Banners::BannerHelper.action_to_display?(context[:controller], display_part)
+ return '' unless action_to_display?(context[:controller], display_part)
locals_params = { display_part: display_part, banner: banner }
context[:controller].send(
:render_to_string, partial: 'banner/project_body_bottom', locals: locals_params
)
end
- end
- class BannerMessageHooks < Redmine::Hook::ViewListener
- include BannerHelper
-
- # Override for conditional render_on
- # Ref. http://www.redmine.org/boards/3/topics/4316
- #
- def self.render_on(hook, options = {})
- define_method hook do |context|
- context[:controller].send(:render_to_string, { locals: context }.merge(options)) if !options.include?(:if) || evaluate_if_option(options[:if], context)
- end
- end
+ private
- def pass_timer?(_context)
- banner_setting = Setting.plugin_redmine_banner
- return true unless banner_setting['use_timer'] == 'true'
+ def enabled?(project)
+ return false if project.nil?
- now = Time.now
- start_date = get_time(
- banner_setting['start_ymd'],
- banner_setting['start_hour'],
- banner_setting['start_min']
- )
+ project.module_enabled? :banner
+ end
- end_date = get_time(
- banner_setting['end_ymd'],
- banner_setting['end_hour'],
- banner_setting['end_min']
- )
- now.between?(start_date, end_date)
+ def action_to_display?(controller, display_part)
+ return true if display_part == 'all'
+
+ action_name = controller.action_name
+ controller_name = controller.controller_name
+
+ case display_part
+ when 'overview'
+ return true if controller_name == 'projects' && action_name == 'show'
+ when 'overview_and_issues'
+ return true if controller_name == 'issues' || (controller_name == 'projects' && action_name == 'show')
+ when 'new_issue'
+ return true if controller_name == 'issues' && action_name == 'new'
+ else
+ false
+ end
end
+ end
- def should_display_header?(context)
- # When Disabled, false.
- return false if Setting.plugin_redmine_banner['display_part'] == 'footer'
+ class BannerMessageHooks < Redmine::Hook::ViewListener
+ def pass_timer?(global_banner)
+ return true unless global_banner.use_timer?
- pass_timer?(context)
+ Time.zone.now.between?(global_banner.start_time, global_banner.end_time)
end
- def should_display_footer?(context)
- # When Disabled, false.
- return false if Setting.plugin_redmine_banner['display_part'] == 'header'
+ def view_layouts_base_body_bottom(context = {})
+ global_banner = GlobalBanner.find_or_default
- pass_timer?(context)
- end
+ # In case global_banner is not stored.
+ return if global_banner.updated_on.blank? || global_banner.disable?
+ return unless pass_timer?(global_banner)
- render_on :view_layouts_base_body_bottom, partial: 'banner/body_bottom',
- if: :should_display_footer?
+ setting = global_banner.value
+ return unless should_display_on_current_page?(context, setting)
- private
+ banner_description = setting['banner_description']
+ banner_description.force_encoding('UTF-8') if banner_description.respond_to?(:force_encoding)
- def evaluate_if_option(if_option, context)
- return false unless should_display(context)
+ locals_params = { setting: setting.merge(banner_description: banner_description),
+ updated_on: global_banner.updated_on }
- case if_option
- when Symbol
- send(if_option, context)
- when Method, Proc
- if_option.call(context)
- end
+ context[:controller].send(
+ :render_to_string, partial: 'banner/body_bottom', locals: locals_params
+ )
end
- def should_display(context)
- banner_setting = Setting.plugin_redmine_banner
+ def should_display_on_current_page?(context, setting)
return false if ((context[:controller].class.name != 'AccountController') &&
(context[:controller].action_name != 'login')) &&
- (banner_setting['display_only_login_page'] == 'true')
+ (setting['display_only_login_page'] == 'true')
- return false if !User.current.logged? && banner_setting['only_authenticated'] == 'true'
- return false unless banner_setting['enable'] == 'true'
+ return false if !User.current.logged? && setting['only_authenticated'] == 'true'
true
end
end
-
- # TODO: view_layouts_base_after_top_menu is not supported Redmine itself.
- # Now use javascript to insert after top-menu. (Submitted ticket: http://www.redmine.org/issues/9915)
- class BannerTopMenuHooks < BannerMessageHooks
- render_on :view_layouts_base_body_bottom, partial: 'banner/after_top_menu',
- if: :should_display_header?
- end
end
diff --git a/lib/banners/banner_helper.rb b/lib/banners/banner_helper.rb
deleted file mode 100644
index 9bee245..0000000
--- a/lib/banners/banner_helper.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-# frozen_string_literal: true
-
-module Banners
- module BannerHelper
- def get_time(ymd, hour, minute)
- begin
- d = Date.strptime(ymd, '%Y-%m-%d')
- rescue StandardError => e
- logger.warn("Passed value #{ymd} for Banner has wrong format. #{e.message}")
- d = Date.current
- end
- Time.mktime(d.year, d.month, d.day, hour.to_i, minute.to_i)
- end
-
- def enabled?(project)
- return false if project.nil?
-
- project.module_enabled? :banner
- end
-
- def action_to_display?(controller, display_part)
- return true if display_part == 'all'
-
- action_name = controller.action_name
- controller_name = controller.controller_name
-
- case display_part
- when 'overview' then
- return true if controller_name == 'projects' && action_name == 'show'
- when 'overview_and_issues' then
- return true if controller_name == 'issues' || (controller_name == 'projects' && action_name == 'show')
- when 'new_issue' then
- return true if controller_name == 'issues' && action_name == 'new'
- else
- return false
- end
- end
-
- module_function :enabled?, :action_to_display?
- end
-end
diff --git a/lib/banners/settings_controller_patch.rb b/lib/banners/settings_controller_patch.rb
deleted file mode 100644
index 9e074c4..0000000
--- a/lib/banners/settings_controller_patch.rb
+++ /dev/null
@@ -1,93 +0,0 @@
-# Patch for banner plugin. This affects in "plugin" action of Redmine Settings
-# controller.
-# Now banner plugin does not have own model(table). So, datetime informations
-# are stored as string and required datetime validation by controller.
-#
-# TODO Store banner settings to banner's own model (table).
-#
-module Banners
- module SettingsControllerPatch
- extend ActiveSupport::Concern
- include BannerHelper
-
- #
- # Before posting start / end date, do validation check.(In case setting "Use timer".)
- #
- def plugin
- param_id = params[:id]
- return super if param_id != 'redmine_banner'
-
- plugin = Redmine::Plugin.find(param_id)
- settings = Setting["plugin_#{plugin.id}"]
-
- @banner_updated_on = nil
- if Setting.find_by_name('plugin_redmine_banner').present?
- @banner_updated_on = Setting.find_by_name('plugin_redmine_banner').updated_on.localtime
- end
-
- # date range check
- current_time = Time.now
- begin
- # date range check
- @start_datetime = generate_time(settings, 'start', current_time)
- @end_datetime = generate_time(settings, 'end', current_time)
- rescue ArgumentError => ex
- # Ref. https://github.com/akiko-pusu/redmine_banner/issues/11
- # Logging when Argument Error
- if logger
- logger.warn "Redmine Banner Warning: #{ex} / Invalid date setting / From #{settings['start_ymd']} to #{settings['end_ymd']}. Reset to current datetime. "
- end
- @start_datetime = current_time
- @end_datetime = current_time
- settings['use_timer'] = 'false'
- end
-
- if request.post?
- param_settings = params[:settings]
- return super if param_settings[:use_timer] != 'true'
-
- begin
- unless validate_date_range?(param_settings)
- flash[:error] = l(:error_banner_date_range)
- redirect_to action: 'plugin', id: plugin.id
- return
- end
- rescue ArgumentError => ex
- # Argument Error
- # TODO: Exception will happen about 2038 problem. (Fixed on Ruby1.9)
- s_string = "#{param_settings[:start_ymd]} #{param_settings[:start_hour]}:#{param_settings[:start_min]}"
- e_string = "#{param_settings[:end_ymd]} #{param_settings[:end_hour]}:#{param_settings[:end_min]}"
-
- flash[:error] = "#{l(:error_banner_date_range)} / #{ex}: From #{s_string} to #{e_string} "
- redirect_to action: 'plugin', id: plugin.id
- return
- end
- end
-
- # Continue to do default action
- super
- end
-
- private
-
- def generate_time(settings, type, current_time)
- return current_time if settings["#{type}_ymd"].blank?
-
- # generate time
- d = Date.strptime(settings["#{type}_ymd"], '%Y-%m-%d')
- d_year = d.year.to_i
- d_month = d.month.to_i
- d_day = d.day.to_i
- d_hour = settings["#{type}_hour"].blank? ? current_time.hour.to_i : settings["#{type}_hour"].to_i
- d_min = settings["#{type}_min"].blank? ? current_time.min.to_i : settings["#{type}_min"].to_i
- Time.mktime(d_year, d_month, d_day, d_hour, d_min)
- end
-
- def validate_date_range?(param_settings)
- s_time = get_time(param_settings[:start_ymd], param_settings[:start_hour], param_settings[:start_min])
- e_time = get_time(param_settings[:end_ymd], param_settings[:end_hour], param_settings[:end_min])
- e_time > s_time
- end
- end
-end
-
diff --git a/test/controller/global_banner_controller_test.rb b/test/controller/api_global_banner_controller_test.rb
similarity index 96%
rename from test/controller/global_banner_controller_test.rb
rename to test/controller/api_global_banner_controller_test.rb
index 1912307..8d370b7 100644
--- a/test/controller/global_banner_controller_test.rb
+++ b/test/controller/api_global_banner_controller_test.rb
@@ -1,11 +1,11 @@
# frozen_string_literal: true
require File.expand_path('../test_helper', __dir__)
-class GlobalBannerControllerTest < Redmine::IntegrationTest
+class ApiGlobalBannerControllerTest < Redmine::IntegrationTest
fixtures :users
def setup
- @user = User.find_by_login('admin')
+ @user = User.find_by(login: 'admin')
@banner_admin_group = Group.create(name: 'GlobalBanner_Admin')
@non_admin_user = User.find(2)
diff --git a/test/functional/banner_controller_test.rb b/test/functional/banner_controller_test.rb
index 459e9cf..30c6195 100644
--- a/test/functional/banner_controller_test.rb
+++ b/test/functional/banner_controller_test.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require File.expand_path('../test_helper', __dir__)
class BannerControllerTest < Redmine::ControllerTest
fixtures :projects, :users, :roles, :trackers, :members, :member_roles,
@@ -46,7 +48,7 @@ def test_routing_check
end
def test_preview_banner
- get :preview, params: { settings: { banner_description: 'h1. Test data.' } }
+ get :preview, params: { setting: { banner_description: 'h1. Test data.' } }
assert_select 'h1', /Test data\./, @response.body.to_s
end
@@ -58,8 +60,8 @@ def test_edit_without_manage_permission_return_403
Role.find(1).remove_permission! :manage_banner
post :edit, params: { project_id: 1,
- settings: { enabled: '1', description: 'Edit test', use_timer: false,
- display_part: 'all', style: 'alert' } }
+ settings: { enabled: '1', description: 'Edit test', use_timer: false,
+ display_part: 'all', style: 'alert' } }
assert_response 403
end
@@ -77,16 +79,16 @@ def test_non_existing_project_return_404
# set non existing project
post :edit, params: { project_id: 100,
- settings: { enabled: '1', description: 'Edit test', use_timer: false,
- display_part: 'all', style: 'alert' } }
+ settings: { enabled: '1', description: 'Edit test', use_timer: false,
+ display_part: 'all', style: 'alert' } }
assert_response 404
end
def test_redirect_post
@request.session[:user_id] = 1
post :edit, params: { project_id: 1,
- settings: { enabled: '1', description: 'Edit test',
- display_part: 'all', style: 'alert' } }
+ setting: { enabled: '1', description: 'Edit test',
+ display_part: 'all', style: 'alert' } }
assert_response :redirect
assert_redirected_to controller: 'projects',
action: 'settings', id: @project, tab: 'banner'
diff --git a/test/functional/banner_setting_controller_test.rb b/test/functional/banner_setting_controller_test.rb
deleted file mode 100644
index f2e8aa0..0000000
--- a/test/functional/banner_setting_controller_test.rb
+++ /dev/null
@@ -1,120 +0,0 @@
-require File.expand_path('../test_helper', __dir__)
-
-class BannerSettingControllerTest < Redmine::ControllerTest
- include Redmine::I18n
- fixtures :users
-
- def setup
- @controller = SettingsController.new
- @request.session[:user_id] = 1 # admin
-
- # plugin setting
- Redmine::Plugin.register(:redmine_banner) do
- settings partial: 'settings/redmine_banner',
- default: {
- enable: 'false',
- banner_description: 'exp. Information about upcoming Service Interruption.',
- type: 'info',
- display_part: 'both',
- use_timer: 'false',
- start_ymd: nil,
- start_hour: nil,
- start_min: nil,
- end_ymd: nil,
- end_hour: nil,
- end_min: nil,
- related_link: nil
- }
- end
- @settings = Setting['plugin_redmine_banner']
- end
-
- def test_get_banner_settings
- get :plugin, params: { id: 'redmine_banner' }
- assert_response :success
- assert_select 'h2', /Redmine banner/, @response.body.to_s
- end
-
- def test_get_banner_settings_with_bad_format
- # set bad format
- @settings['start_ymd'] = '1999-13-40'
- @settings['start_ymd'] = '2011-1-35'
- @settings['use_timer'] = 'true'
-
- get :plugin, params: { id: 'redmine_banner' }
- assert_response :success
- assert_select 'input[type=checkbox][id=settings_use_timer][value=true]'
- assert_select 'h2', /Redmine banner/, @response.body.to_s
- end
-
- def test_get_banner_settings_with_good_format
- # set bad format
- @settings['start_ymd'] = '1999-12-31'
- @settings['end_ymd'] = '2001-01-05'
- @settings['use_timer'] = 'true'
-
- get :plugin, params: { id: 'redmine_banner' }
- assert_response :success
- assert_select 'input[type=checkbox][id=settings_use_timer][value=true]'
- assert_select 'h2', /Redmine banner/
- end
-
- def test_post_banner_settings_with_good_format
- # set good format
- now = Date.today
- after_day = now + 1
-
- post :plugin, params: { id: 'redmine_banner',
- settings: { end_ymd: after_day.strftime('%Y-%m-%d'), end_min: '03', start_min: '00', start_hour: '00',
- enable: 'true', type: 'warn', display_part: 'both',
- start_ymd: now.strftime('%Y-%m-%d'), use_timer: 'true',
- banner_description: 'exp. Information about upcoming Service Interruption.',
- end_hour: '23' } }
- assert_response :redirect
- assert_redirected_to controller: 'settings', action: 'plugin', id: 'redmine_banner'
- assert_equal I18n.t(:notice_successful_update), flash[:notice]
-
- get :plugin, params: { id: 'redmine_banner' }
- assert_response :success
- assert_select 'div.banner_area' do
- assert_select 'div.banner_warn' do
- assert_select 'p', text: 'exp. Information about upcoming Service Interruption.'
- end
- end
-
- post :plugin, params: { id: 'redmine_banner',
- settings: { end_ymd: '2012-12-31', end_min: '03', start_min: '03', start_hour: '20',
- enable: 'true', type: 'warn', display_part: 'both',
- start_ymd: '2012-03-12', use_timer: 'true',
- banner_description: 'exp. Information about upcoming Service Interruption.',
- end_hour: '23' } }
- assert_response :redirect
- get :plugin, params: { id: 'redmine_banner' }
- assert_response :success
- assert_select 'div.banner_area', false, 'Banner should be off.'
- end
-
- def test_post_banner_settings_with_bad_format
- # set bad format
- post :plugin, params: { id: 'redmine_banner',
- settings: { end_ymd: '2010-03-31', end_min: '03', start_min: '03', start_hour: '20',
- enable: 'true', type: 'warn', display_part: 'both',
- start_ymd: '2013-03-12', use_timer: 'true',
- banner_description: 'exp. Information about upcoming Service Interruption.',
- end_hour: '23' } }
- assert_response :redirect
- assert_redirected_to controller: 'settings', action: 'plugin', id: 'redmine_banner'
- assert_equal I18n.t(:error_banner_date_range), flash[:error]
- end
-
- def test_post_banner_setting_with_non_number_format
- post :plugin, params: { id: 'redmine_banner',
- settings: { end_ymd: 'end_ymd', end_min: 'end_min', start_min: 'start_min', start_hour: 'start_hour',
- enable: 'true', type: 'warn', display_part: 'both',
- start_ymd: 'start_ymd', use_timer: 'true',
- banner_description: 'exp. Information about upcoming Service Interruption.',
- end_hour: 'end_hour' } }
- assert_response :redirect
- assert_not_nil flash[:error]
- end
-end
diff --git a/test/functional/global_banner_controller_test.rb b/test/functional/global_banner_controller_test.rb
new file mode 100644
index 0000000..6fbf59e
--- /dev/null
+++ b/test/functional/global_banner_controller_test.rb
@@ -0,0 +1,118 @@
+# frozen_string_literal: true
+
+require File.expand_path('../test_helper', __dir__)
+
+class GlobalBannerControllerTest < Redmine::ControllerTest
+ include Redmine::I18n
+ fixtures :users
+
+ def setup
+ @controller = GlobalBannerController.new
+ @request.session[:user_id] = 1 # admin
+
+ # plugin setting
+ Redmine::Plugin.register(:redmine_banner) do
+ settings partial: nil,
+ default: {
+ enable: 'false',
+ banner_description: 'exp. Information about upcoming Service Interruption.',
+ type: 'info',
+ display_part: 'both',
+ use_timer: 'false',
+ start_ymd: nil,
+ start_hour: nil,
+ start_min: nil,
+ end_ymd: nil,
+ end_hour: nil,
+ end_min: nil,
+ related_link: nil
+ }
+ end
+ @setting = GlobalBanner.find_or_default.value
+ end
+
+ def test_get_banner_settings
+ get :show
+ assert_response :success
+ assert_select 'h2', /Redmine Banner plugin/, @response.body.to_s
+ end
+
+ def test_get_banner_settings_with_bad_format
+ # set bad format
+ @setting['start_ymd'] = '1999-13-40'
+ @setting['start_ymd'] = '2011-1-35'
+ @setting['use_timer'] = 'true'
+
+ get :show
+ assert_response :success
+ assert_select 'input[type=checkbox][id=setting_use_timer][value=true]'
+ assert_select 'h2', /Redmine Banner plugin/, @response.body.to_s
+ end
+
+ def test_get_banner_settings_with_good_format
+ # set bad format
+ @setting['start_ymd'] = '1999-12-31'
+ @setting['end_ymd'] = '2001-01-05'
+ @setting['use_timer'] = 'true'
+
+ get :show
+ assert_response :success
+ assert_select 'input[type=checkbox][id=setting_use_timer][value=true]'
+ assert_select 'h2', /Redmine Banner plugin/
+ end
+
+ def test_post_banner_settings_with_good_format
+ # set good format
+ now = Time.zone.today
+ after_day = now + 1.day
+
+ post :update, params: { setting: { end_ymd: after_day.strftime('%Y-%m-%d'), end_min: '03', start_min: '00', start_hour: '00',
+ enable: 'true', type: 'warn', display_part: 'both',
+ start_ymd: now.strftime('%Y-%m-%d'), use_timer: 'true',
+ banner_description: 'exp. Information about upcoming Service Interruption.',
+ end_hour: '23' } }
+ assert_response :redirect
+ assert_redirected_to controller: 'global_banner', action: 'show'
+ assert_equal I18n.t(:notice_successful_update), flash[:notice]
+
+ get :show
+ assert_response :success
+ assert_select 'div.banner_area' do
+ assert_select 'div.banner_warn' do
+ assert_select 'p', text: 'exp. Information about upcoming Service Interruption.'
+ end
+ end
+
+ post :update, params: { setting: { end_ymd: '2012-12-31', end_min: '03', start_min: '03', start_hour: '20',
+ enable: 'true', type: 'warn', display_part: 'both',
+ start_ymd: '2012-03-12', use_timer: 'true',
+ banner_description: 'exp. Information about upcoming Service Interruption.',
+ end_hour: '23' } }
+ assert_response :redirect
+ get :show
+ assert_response :success
+ assert_select 'div.banner_area', false, 'Banner should be off.'
+ end
+
+ def test_post_banner_settings_with_bad_format
+ # set bad format
+ post :update, params: { setting: { end_ymd: '2010-03-31', end_min: '03', start_min: '03', start_hour: '20',
+ enable: 'true', type: 'warn', display_part: 'both',
+ start_ymd: '2013-03-12', use_timer: 'true',
+ banner_description: 'exp. Information about upcoming Service Interruption.',
+ end_hour: '23' } }
+ assert_response :redirect
+ assert_redirected_to controller: 'global_banner', action: 'show'
+ assert_equal I18n.t(:error_banner_date_range), flash[:error]
+ end
+
+ def test_post_banner_setting_with_non_number_format
+ post :update, params: { setting: { end_ymd: 'end_ymd', end_min: 'end_min', start_min: 'start_min', start_hour: 'start_hour',
+ enable: 'true', type: 'warn', display_part: 'both',
+ start_ymd: 'start_ymd', use_timer: 'true',
+ banner_description: 'exp. Information about upcoming Service Interruption.',
+ end_hour: 'end_hour' } }
+ assert_response :redirect
+ assert_not_nil flash[:error]
+ end
+end
diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb
index 5913092..735dc7c 100644
--- a/test/functional/projects_controller_test.rb
+++ b/test/functional/projects_controller_test.rb
@@ -1,10 +1,13 @@
+# frozen_string_literal: true
+
require File.expand_path('../test_helper', __dir__)
require 'projects_controller'
# Re-raise errors caught by the controller.
-class ProjectsController; def rescue_action(e)
- raise e
- end
+class ProjectsController
+ def rescue_action(error)
+ raise error
+ end
end
class ProjectsControllerTest < Redmine::ControllerTest
@@ -72,7 +75,7 @@ def test_show_new_issue
@banner.display_part = 'new_issue'
@banner.style = 'alert'
@banner.save!
- get :show, params: { id: 1 }
+ get :show, params: { id: 1 }
assert_response :success
assert_select 'div#project_banner_area div.banner_alert', false
end
@@ -83,7 +86,7 @@ def test_banner_should_be_off_with_banner_module_disabled
@banner.save!
# turn off banner module
@project.disable_module!(:banner)
- assert !@project.reload.enabled_module_names.include?(:banner)
+ assert_not @project.reload.enabled_module_names.include?(:banner)
get :settings, params: { id: 1 }
assert_response :success
diff --git a/test/integration/layout_test.rb b/test/integration/layout_test.rb
index 70994ac..16f4c85 100644
--- a/test/integration/layout_test.rb
+++ b/test/integration/layout_test.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
class LayoutTest < Redmine::IntegrationTest
@@ -35,7 +37,7 @@ def test_project_banner_visible_when_module_on
assert_select 'div#project_banner_area div.banner_info', 0
put '/projects/ecookbook/banner/edit',
- params: { settings: { enabled: '1', style: 'warn', display_part: 'all', banner_description: 'Test banner message.' }, project_id: 'ecookbook' }
+ params: { setting: { enabled: '1', style: 'warn', display_part: 'all', banner_description: 'Test banner message.' }, project_id: 'ecookbook' }
assert_response :redirect
get '/projects/ecookbook/issues'
@@ -47,26 +49,29 @@ def test_display_only_for_login_page
User.current = nil
log_user('admin', 'admin')
- post '/settings/plugin/redmine_banner',
- params: { settings: {
- enable: 'true', type: 'warn', display_part: 'both',
+ post '/global_banner',
+ params: { setting: {
+ enable: 'true', type: 'warn',
+ display_part: 'both',
use_timer: 'false',
- banner_description: 'h1. Test data.',
- display_only_login_page: 'true'
+ display_only_login_page: 'true',
+ banner_description: 'h1. Test data.....'
} }
# Session is cleared
reset!
User.current = nil
- get '/login'
- assert_select 'div.banner_area'
get '/projects'
+
assert_select 'div.banner_area', 0
+ get '/login'
+ assert_select 'div.banner_area'
+
log_user('admin', 'admin')
- post '/settings/plugin/redmine_banner',
- params: { settings: {
+ post '/global_banner',
+ params: { setting: {
enable: 'true', type: 'warn', display_part: 'both',
use_timer: 'false',
banner_description: 'h1. Test data.',
@@ -89,8 +94,8 @@ def test_display_more_link
User.current = nil
log_user('admin', 'admin')
- post '/settings/plugin/redmine_banner',
- params: { settings: {
+ post '/global_banner',
+ params: { setting: {
enable: 'true', type: 'warn', display_part: 'both',
use_timer: 'false',
banner_description: 'h1. Test data.',
@@ -103,8 +108,8 @@ def test_display_more_link
assert_select 'div.banner_more_info', 0
# Update setting.
- post '/settings/plugin/redmine_banner',
- params: { settings: {
+ post '/global_banner',
+ params: { setting: {
enable: 'true', type: 'warn', display_part: 'both',
use_timer: 'false',
banner_description: 'h1. Test data.',
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 04d7d79..b6c73d4 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -1,13 +1,15 @@
+# frozen_string_literal: true
+
begin
require 'simplecov'
require 'simplecov-rcov'
-rescue LoadError => ex
- puts <<-"EOS"
+rescue LoadError => e
+ puts <<-"MESSAGE"
This test should be called only for redmine banner test.
- Test exit with LoadError -- #{ex.message}
+ Test exit with LoadError -- #{e.message}
Please move redmine_banner/Gemfile.local to redmine_banner/Gemfile
and run bundle install if you want to to run tests.
- EOS
+ MESSAGE
exit
end
diff --git a/test/unit/banner_application_hooks_test.rb b/test/unit/banner_application_hooks_test.rb
index bf78595..9079bb0 100644
--- a/test/unit/banner_application_hooks_test.rb
+++ b/test/unit/banner_application_hooks_test.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# To change this template, choose Tools | Templates
# and open the template in the editor.
@@ -7,98 +9,48 @@
class BannerApplicationHooksTest < ActiveSupport::TestCase
def test_is_pass_timer_false_should_be_true
target = Banners::BannerMessageHooks.instance
- context = {}
+ global_banner = GlobalBanner.find_or_default
Setting.plugin_redmine_banner['use_timer'] = 'false'
- assert_equal true, target.pass_timer?(context)
+ assert_equal true, target.pass_timer?(global_banner)
end
def test_is_pass_timer_true_for_passed_time_should_be_false
target = Banners::BannerMessageHooks.instance
- context = {}
- # Test: passed time set - should retuen false.
- Setting.plugin_redmine_banner['use_timer'] = 'true'
-
- Setting.plugin_redmine_banner['start_ymd'] = '1999-12-31'
- Setting.plugin_redmine_banner['start_hour'] = '23'
- Setting.plugin_redmine_banner['start_min'] = '58'
- Setting.plugin_redmine_banner['end_ymd'] = '2000-12-31'
- Setting.plugin_redmine_banner['end_hour'] = '12'
- Setting.plugin_redmine_banner['end_min'] = '59'
- assert_equal false, target.pass_timer?(context)
+ params = {
+ 'use_timer': 'true',
+ 'start_ymd': '1999-12-31',
+ 'start_hour': '23',
+ 'start_min': '58',
+ 'end_ymd': '2000-12-31',
+ 'end_hour': '12',
+ 'end_min': '59'
+ }
+
+ global_banner = GlobalBanner.find_or_default
+ global_banner.merge_value(params)
+ global_banner.save
+ assert_equal false, target.pass_timer?(global_banner.reload)
end
def test_is_pass_timer_true_for_between_time_should_be_true
target = Banners::BannerMessageHooks.instance
- context = {}
- Setting.plugin_redmine_banner['use_timer'] = 'true'
# Test: passed time and the same range - should retuen false.
- Setting.plugin_redmine_banner['start_ymd'] = '1999-12-31'
- Setting.plugin_redmine_banner['start_hour'] = '01'
- Setting.plugin_redmine_banner['start_min'] = '01'
-
- Setting.plugin_redmine_banner['end_ymd'] = '1999-12-31'
- Setting.plugin_redmine_banner['end_hour'] = '01'
- Setting.plugin_redmine_banner['end_min'] = '01'
- assert(!target.pass_timer?(context))
- end
-
- # This should not be happened in 64bit.
- # def test_is_pass_timer_rais_error
- # target = BannerMessageHooks.instance
- # context = {}
- # Setting.plugin_redmine_banner['use_timer'] = "true"
- #
- # Setting.plugin_redmine_banner['start_ymd'] = "1999-12-31"
- # Setting.plugin_redmine_banner['start_hour'] = "01"
- # Setting.plugin_redmine_banner['start_min'] = "01"
- #
- # # Set 2050 (Will be thrown Argument Error)
- # Setting.plugin_redmine_banner['end_ymd'] = "2050-12-31"
- # Setting.plugin_redmine_banner['end_hour'] = "01"
- # Setting.plugin_redmine_banner['end_min'] = "01"
- # assert_raise(ArgumentError){ target.pass_timer?(context) }
- # end
-
- def test_should_not_display_header?
- target = Banners::BannerMessageHooks.instance
- context = {}
- Setting.plugin_redmine_banner['enable'] = 'true'
- Setting.plugin_redmine_banner['display_part'] = 'footer'
- Setting.plugin_redmine_banner['use_timer'] = 'false'
- assert(!target.should_display_header?(context))
- end
-
- def test_should_display_header?
- target = Banners::BannerMessageHooks.instance
- context = {}
- Setting.plugin_redmine_banner['enable'] = 'true'
- Setting.plugin_redmine_banner['display_part'] = 'header'
- Setting.plugin_redmine_banner['use_timer'] = 'false'
- assert(target.should_display_header?(context))
-
- # between test
- now = Time.now
- start_time = now - 60 * 60 * 24
- end_time = now + 60 * 60 * 24
- Setting.plugin_redmine_banner['use_timer'] = 'true'
- Setting.plugin_redmine_banner['start_ymd'] = start_time.strftime('%Y-%m-%d')
- Setting.plugin_redmine_banner['start_hour'] = start_time.strftime('%H')
- Setting.plugin_redmine_banner['start_min'] = start_time.strftime('%M')
-
- Setting.plugin_redmine_banner['end_ymd'] = end_time.strftime('%Y-%m-%d')
- Setting.plugin_redmine_banner['end_hour'] = end_time.strftime('%H')
- Setting.plugin_redmine_banner['end_min'] = end_time.strftime('%M')
- assert(target.should_display_header?(context))
- end
-
- def test_should_display_footer?
- target = Banners::BannerMessageHooks.instance
- context = {}
- Setting.plugin_redmine_banner['enable'] = 'true'
- Setting.plugin_redmine_banner['display_part'] = 'header'
- Setting.plugin_redmine_banner['use_timer'] = 'false'
- assert(!target.should_display_footer?(context))
+ params = {
+ 'use_timer': 'true',
+ 'start_ymd': '1999-12-31',
+ 'start_hour': '01',
+ 'start_min': '01',
+ 'end_ymd': '2000-12-31',
+ 'end_hour': '01',
+ 'end_min': '01'
+ }
+
+ global_banner = GlobalBanner.find_or_default
+ global_banner.merge_value(params)
+ global_banner.save
+
+ assert_not(target.pass_timer?(global_banner.reload))
end
end
diff --git a/test/unit/banner_helper_test.rb b/test/unit/banner_helper_test.rb
deleted file mode 100644
index 39c019d..0000000
--- a/test/unit/banner_helper_test.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
-
-class BannerHelperTest < ActiveSupport::TestCase
- include Banners::BannerHelper
-
- def test_get_time
- y = '2012'
- m = '12'
- d = '31'
- h = '11'
- min = '59'
- ymd = "#{y}-#{m}-#{d}"
- t = Time.mktime(y, m, d, h, min)
- assert_equal true, t == get_time(ymd, h, min)
- end
-
- # This should not be happened in 64bit.
- # def test_get_time_rais_error
- # y = "2050"
- # m = "12"
- # d = "31"
- # h = "11"
- # min = "59"
- # assert_raise(ArgumentError){ get_time("#{y}-#{m}-#{d}",h,min) }
- # end
-end
diff --git a/test/unit/banner_test.rb b/test/unit/banner_test.rb
index f226e65..5c6d43e 100644
--- a/test/unit/banner_test.rb
+++ b/test/unit/banner_test.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
class BannerTest < ActiveSupport::TestCase
diff --git a/test/unit/projects_helper_patch_test.rb b/test/unit/projects_helper_patch_test.rb
index 27714a3..b81de8c 100644
--- a/test/unit/projects_helper_patch_test.rb
+++ b/test/unit/projects_helper_patch_test.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
require File.expand_path(File.dirname(__FILE__) + '/../../lib/banners/projects_helper_patch')
require 'minitest/autorun'