diff --git a/Gemfile b/Gemfile
index 5b789f9..d1a1282 100644
--- a/Gemfile
+++ b/Gemfile
@@ -2,11 +2,11 @@ source 'https://rubygems.org'
ruby '>= 2.7.0', '< 3.3.0'
-gem 'rails', '6.1.7.6'
+gem 'rails', '7.1.2'
gem 'rouge', '~> 4.2.0'
gem 'request_store', '~> 1.5.0'
gem 'mini_mime', '~> 1.1.0'
-gem "actionpack-xml_parser"
+gem "actionpack-xml_parser", '~> 2.0.1'
gem 'roadie-rails', '~> 3.1.0'
gem 'marcel'
gem 'mail', '~> 2.8.1'
@@ -87,6 +87,10 @@ else
warn("Please configure your config/database.yml first")
end
+group :development, :test do
+ gem 'debug'
+end
+
group :development do
gem 'listen', '~> 3.3'
gem "yard"
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 9bd6b83..a5905ad 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -780,4 +780,25 @@ class ApplicationController < ActionController::Base
def _include_layout?(*args)
api_request? ? false : super
end
+
+ # Note: Overrodes #_url_host_allowed? to avoid
+ # URI::InvalidURIError: URI must be ascii only...
+ # when determining if the redirect destination is its own host.
+ # See: https://bugs.ruby-lang.org/issues/12852
+ def _url_host_allowed?(url)
+ host = Addressable::URI.parse(url.to_s).host
+
+ return true if host == request.host
+ return false unless host.nil?
+ return false unless url.to_s.start_with?("/")
+ !url.to_s.start_with?("//")
+ rescue TypeError
+ false
+ end
+
+ def rendered_format
+ return request.format if api_request?
+
+ super
+ end
end
diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb
index 414ecfd..bc64f01 100644
--- a/app/controllers/attachments_controller.rb
+++ b/app/controllers/attachments_controller.rb
@@ -100,7 +100,7 @@ class AttachmentsController < ApplicationController
def upload
# Make sure that API users get used to set this content type
# as it won't trigger Rails' automatic parsing of the request body for parameters
- unless request.content_type == 'application/octet-stream'
+ unless request.media_type == 'application/octet-stream'
head 406
return
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index a1d989e..7f57113 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -259,7 +259,7 @@ module ApplicationHelper
when Array
formatted_objects = object.map {|o| format_object(o, html)}
html ? safe_join(formatted_objects, ', ') : formatted_objects.join(', ')
- when Time
+ when Time, ActiveSupport::TimeWithZone
format_time(object)
when Date
format_date(object)
@@ -634,7 +634,7 @@ module ApplicationHelper
'span', nil,
:class => "name icon icon-#{principal.class.name.downcase}"
)
- ) + principal
+ ) + principal.to_s
)
end
s.html_safe
diff --git a/app/models/attachment.rb b/app/models/attachment.rb
index 8638205..97dea32 100644
--- a/app/models/attachment.rb
+++ b/app/models/attachment.rb
@@ -345,14 +345,14 @@ class Attachment < ActiveRecord::Base
# })
#
def self.update_attachments(attachments, params)
- params = params.transform_keys {|key| key.to_i}
-
+ converted = {}
+ params.each {|key, val| converted[key.to_i] = val}
saved = true
transaction do
attachments.each do |attachment|
- if p = params[attachment.id]
- attachment.filename = p[:filename] if p.key?(:filename)
- attachment.description = p[:description] if p.key?(:description)
+ if file = converted[attachment.id]
+ attachment.filename = file[:filename] if file.key?(:filename)
+ attachment.description = file[:description] if file.key?(:description)
saved &&= attachment.save
end
end
diff --git a/app/models/query.rb b/app/models/query.rb
index 5630f95..3208dc5 100644
--- a/app/models/query.rb
+++ b/app/models/query.rb
@@ -257,8 +257,8 @@ class Query < ActiveRecord::Base
has_and_belongs_to_many :roles, :join_table => "#{table_name_prefix}queries_roles#{table_name_suffix}", :foreign_key => "query_id"
serialize :filters
serialize :column_names
- serialize :sort_criteria, Array
- serialize :options, Hash
+ serialize :sort_criteria, type: Array
+ serialize :options, type: Hash
validates_presence_of :name
validates_length_of :name, :maximum => 255
@@ -1631,7 +1631,7 @@ class Query < ActiveRecord::Base
else
from = from - 1 # second
end
- if self.class.default_timezone == :utc
+ if ActiveRecord.default_timezone == :utc
from = from.utc
end
s << ("#{table}.#{field} > '%s'" % [quoted_time(from, is_custom_filter)])
@@ -1640,7 +1640,7 @@ class Query < ActiveRecord::Base
if to.is_a?(Date)
to = date_for_user_time_zone(to.year, to.month, to.day).end_of_day
end
- if self.class.default_timezone == :utc
+ if ActiveRecord.default_timezone == :utc
to = to.utc
end
s << ("#{table}.#{field} <= '%s'" % [quoted_time(to, is_custom_filter)])
diff --git a/app/models/role.rb b/app/models/role.rb
index 078419c..1665d79 100644
--- a/app/models/role.rb
+++ b/app/models/role.rb
@@ -76,7 +76,7 @@ class Role < ActiveRecord::Base
has_many :members, :through => :member_roles
acts_as_positioned :scope => :builtin
- serialize :permissions, ::Role::PermissionsAttributeCoder
+ serialize :permissions, coder: ::Role::PermissionsAttributeCoder
store :settings, :accessors => [:permissions_all_trackers, :permissions_tracker_ids]
validates_presence_of :name
diff --git a/app/views/custom_fields/_visibility_by_project_selector.html.erb b/app/views/custom_fields/_visibility_by_project_selector.html.erb
index d92e5cd..25fd497 100644
--- a/app/views/custom_fields/_visibility_by_project_selector.html.erb
+++ b/app/views/custom_fields/_visibility_by_project_selector.html.erb
@@ -4,7 +4,7 @@
<% project_ids = @custom_field.project_ids.to_a %>
<%= render_project_nested_lists(Project.all) do |p|
- content_tag('label', check_box_tag('custom_field[project_ids][]', p.id, project_ids.include?(p.id), :id => nil) + ' ' + p)
+ content_tag('label', check_box_tag('custom_field[project_ids][]', p.id, project_ids.include?(p.id), :id => nil) + ' ' + p.to_s)
end %>
<%= hidden_field_tag('custom_field[project_ids][]', '', :id => nil) %>
diff --git a/config/application.rb b/config/application.rb
index 5e93df1..6b69cb8 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -23,13 +23,24 @@ module RedmineApp
# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded.
- # Custom directories with classes and modules you want to be autoloadable.
- config.autoloader = :zeitwerk
+ # Adds `lib` to `config.autoload_paths` and `config.eager_load_paths`.
+ config.autoload_lib(ignore: %w(tasks generators plugins))
# Only load the plugins named here, in the order given (default is alphabetical).
# :all can be used as a placeholder for all plugins not explicitly named.
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
+ config.load_defaults 7.1
+ config.active_support.key_generator_hash_digest_class = OpenSSL::Digest::SHA1
+ config.active_record.encryption.hash_digest_class = OpenSSL::Digest::SHA1
+ config.active_record.encryption.support_sha1_for_non_deterministic_encryption = true
+ config.active_record.default_column_serializer = YAML
+ config.active_record.belongs_to_required_by_default = false
+ config.action_dispatch.cookies_serializer = :marshal
+ config.action_controller.raise_on_missing_callback_actions = false
+ config.active_support.remove_deprecated_time_with_zone_name = true
+ config.active_support.cache_format_version = 7.1
+
config.active_record.store_full_sti_class = true
config.active_record.default_timezone = :local
config.active_record.yaml_column_permitted_classes = [
diff --git a/config/environments/test.rb b/config/environments/test.rb
index 34056df..f5f184b 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -9,6 +9,8 @@ require 'active_support/core_ext/integer/time'
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
+ config.add_autoload_paths_to_load_path = true
+ config.dom_testing_default_html_version = :html4
config.cache_classes = true
# config.action_view.cache_template_loading = true
@@ -30,7 +32,7 @@ Rails.application.configure do
config.cache_store = :null_store
# Raise exceptions instead of rendering exception templates.
- config.action_dispatch.show_exceptions = true
+ config.action_dispatch.show_exceptions = :all
# Disable request forgery protection in test environment.
config.action_controller.allow_forgery_protection = false
diff --git a/config/initializers/10-patches.rb b/config/initializers/10-patches.rb
index 4bca5ed..db4b497 100644
--- a/config/initializers/10-patches.rb
+++ b/config/initializers/10-patches.rb
@@ -49,16 +49,15 @@ module ActionView
end
class Resolver
- def find_all(name, prefix=nil, partial=false, details={}, key=nil, locals=[])
- locals = locals.map(&:to_s).sort!.freeze
+ def find_all(name, prefix = nil, partial = false, details = {}, key = nil, locals = [])
+ if (details[:formats] & [:xml, :json]).any?
+ details = details.dup
+ details[:formats] = details[:formats].dup + [:api]
- cached(key, [name, prefix, partial], details, locals) do
- if (details[:formats] & [:xml, :json]).any?
- details = details.dup
- details[:formats] = details[:formats].dup + [:api]
- end
- _find_all(name, prefix, partial, details, key, locals)
+ key = ActionView::TemplateDetails::Requested.new(**details) if key
end
+
+ _find_all(name, prefix, partial, details, key, locals)
end
end
end
@@ -69,17 +68,14 @@ ActionView::Base.field_error_proc = Proc.new{ |html_tag, instance| html_tag || '
module ActionView
module Helpers
module Tags
- class Base
- private
- alias :add_options_without_non_empty_blank_option :add_options
+ SelectRenderer.prepend(Module.new do
def add_options(option_tags, options, value = nil)
- if options[:include_blank] == true
- options = options.dup
- options[:include_blank] = ' '.html_safe
+ if options.delete(:include_blank)
+ options[:prompt] = ' '.html_safe
end
- add_options_without_non_empty_blank_option(option_tags, options, value)
+ super
end
- end
+ end)
end
module FormHelper
diff --git a/config/initializers/20-mime_types.rb b/config/initializers/20-mime_types.rb
index 3367334..b0f625f 100644
--- a/config/initializers/20-mime_types.rb
+++ b/config/initializers/20-mime_types.rb
@@ -1,3 +1,4 @@
# frozen_string_literal: true
# Add new mime types for use in respond_to blocks:
+Mime::SET << 'api'
diff --git a/config/initializers/zeitwerk.rb b/config/initializers/zeitwerk.rb
index ab86b28..c9f7286 100644
--- a/config/initializers/zeitwerk.rb
+++ b/config/initializers/zeitwerk.rb
@@ -1,9 +1,6 @@
# frozen_string_literal: true
lib = Rails.root.join('lib/redmine')
-Rails.autoloaders.main.push_dir lib, namespace: Redmine
-Rails.application.config.watchable_dirs[lib] = [:rb]
-
IGNORE_LIST = [
'wiki_formatting/textile/redcloth3.rb',
'core_ext.rb',
diff --git a/lib/redmine/plugin.rb b/lib/redmine/plugin.rb
index 79e310f..85e20f3 100644
--- a/lib/redmine/plugin.rb
+++ b/lib/redmine/plugin.rb
@@ -467,7 +467,7 @@ module Redmine
else
migrations
end
- Migrator.new(:up, selected_migrations, schema_migration, target_version).migrate
+ Migrator.new(:up, selected_migrations, schema_migration, internal_metadata, target_version).migrate
end
def down(target_version = nil)
@@ -477,15 +477,15 @@ module Redmine
else
migrations
end
- Migrator.new(:down, selected_migrations, schema_migration, target_version).migrate
+ Migrator.new(:down, selected_migrations, schema_migration, internal_metadata, target_version).migrate
end
def run(direction, target_version)
- Migrator.new(direction, migrations, schema_migration, target_version).run
+ Migrator.new(direction, migrations, schema_migration, internal_metadata, target_version).run
end
def open
- Migrator.new(:up, migrations, schema_migration)
+ Migrator.new(:up, migrations, schema_migration, internal_metadata)
end
def current_version
@@ -510,7 +510,7 @@ module Redmine
# Delete migrations that don't match .. to_i will work because the number comes first
@all_versions ||= {}
@all_versions[plugin.id.to_s] ||= begin
- sm_table = ::ActiveRecord::SchemaMigration.table_name
+ sm_table = ::ActiveRecord::Base.connection.schema_migration.table_name
migration_versions = ActiveRecord::Base.connection.select_values("SELECT version FROM #{sm_table}")
versions_by_plugins = migration_versions.group_by {|version| version.match(/-(.*)$/).try(:[], 1)}
@all_versions = versions_by_plugins.transform_values! {|versions| versions.map!(&:to_i).sort!}
diff --git a/test/fixtures/issues.yml b/test/fixtures/issues.yml
index 1c2c37f..7092c17 100644
--- a/test/fixtures/issues.yml
+++ b/test/fixtures/issues.yml
@@ -1,8 +1,8 @@
---
issues_001:
- created_on: <%= 3.days.ago.to_s(:db) %>
+ created_on: <%= 3.days.ago.to_fs(:db) %>
project_id: 1
- updated_on: <%= 1.day.ago.to_s(:db) %>
+ updated_on: <%= 1.day.ago.to_fs(:db) %>
priority_id: 4
subject: Cannot print recipes
id: 1
@@ -13,8 +13,8 @@ issues_001:
assigned_to_id:
author_id: 2
status_id: 1
- start_date: <%= 1.day.ago.to_date.to_s(:db) %>
- due_date: <%= 10.day.from_now.to_date.to_s(:db) %>
+ start_date: <%= 1.day.ago.to_date.to_fs(:db) %>
+ due_date: <%= 10.day.from_now.to_date.to_fs(:db) %>
estimated_hours: 200.0
root_id: 1
lft: 1
@@ -34,7 +34,7 @@ issues_002:
assigned_to_id: 3
author_id: 2
status_id: 2
- start_date: <%= 2.day.ago.to_date.to_s(:db) %>
+ start_date: <%= 2.day.ago.to_date.to_fs(:db) %>
due_date:
estimated_hours: 0.5
root_id: 2
@@ -56,16 +56,16 @@ issues_003:
assigned_to_id: 3
author_id: 2
status_id: 1
- start_date: <%= 15.day.ago.to_date.to_s(:db) %>
- due_date: <%= 5.day.ago.to_date.to_s(:db) %>
+ start_date: <%= 15.day.ago.to_date.to_fs(:db) %>
+ due_date: <%= 5.day.ago.to_date.to_fs(:db) %>
estimated_hours: 1.0
root_id: 3
lft: 1
rgt: 2
issues_004:
- created_on: <%= 5.days.ago.to_s(:db) %>
+ created_on: <%= 5.days.ago.to_fs(:db) %>
project_id: 2
- updated_on: <%= 2.days.ago.to_s(:db) %>
+ updated_on: <%= 2.days.ago.to_fs(:db) %>
priority_id: 4
subject: Issue on project 2
id: 4
@@ -80,9 +80,9 @@ issues_004:
lft: 1
rgt: 2
issues_005:
- created_on: <%= 5.days.ago.to_s(:db) %>
+ created_on: <%= 5.days.ago.to_fs(:db) %>
project_id: 3
- updated_on: <%= 2.days.ago.to_s(:db) %>
+ updated_on: <%= 2.days.ago.to_fs(:db) %>
priority_id: 4
subject: Subproject issue
id: 5
@@ -98,9 +98,9 @@ issues_005:
lft: 1
rgt: 2
issues_006:
- created_on: <%= 1.minute.ago.to_s(:db) %>
+ created_on: <%= 1.minute.ago.to_fs(:db) %>
project_id: 5
- updated_on: <%= 1.minute.ago.to_s(:db) %>
+ updated_on: <%= 1.minute.ago.to_fs(:db) %>
priority_id: 4
subject: Issue of a private subproject
id: 6
@@ -111,15 +111,15 @@ issues_006:
assigned_to_id:
author_id: 2
status_id: 1
- start_date: <%= Date.today.to_s(:db) %>
- due_date: <%= 1.days.from_now.to_date.to_s(:db) %>
+ start_date: <%= Date.today.to_fs(:db) %>
+ due_date: <%= 1.days.from_now.to_date.to_fs(:db) %>
root_id: 6
lft: 1
rgt: 2
issues_007:
- created_on: <%= 10.days.ago.to_s(:db) %>
+ created_on: <%= 10.days.ago.to_fs(:db) %>
project_id: 1
- updated_on: <%= 10.days.ago.to_s(:db) %>
+ updated_on: <%= 10.days.ago.to_fs(:db) %>
priority_id: 5
subject: Issue due today
id: 7
@@ -130,16 +130,16 @@ issues_007:
assigned_to_id:
author_id: 2
status_id: 1
- start_date: <%= 10.days.ago.to_s(:db) %>
- due_date: <%= Date.today.to_s(:db) %>
+ start_date: <%= 10.days.ago.to_fs(:db) %>
+ due_date: <%= Date.today.to_fs(:db) %>
lock_version: 0
root_id: 7
lft: 1
rgt: 2
issues_008:
- created_on: <%= 10.days.ago.to_s(:db) %>
+ created_on: <%= 10.days.ago.to_fs(:db) %>
project_id: 1
- updated_on: <%= 10.days.ago.to_s(:db) %>
+ updated_on: <%= 10.days.ago.to_fs(:db) %>
priority_id: 5
subject: Closed issue
id: 8
@@ -156,11 +156,11 @@ issues_008:
root_id: 8
lft: 1
rgt: 2
- closed_on: <%= 3.days.ago.to_s(:db) %>
+ closed_on: <%= 3.days.ago.to_fs(:db) %>
issues_009:
- created_on: <%= 1.minute.ago.to_s(:db) %>
+ created_on: <%= 1.minute.ago.to_fs(:db) %>
project_id: 5
- updated_on: <%= 1.minute.ago.to_s(:db) %>
+ updated_on: <%= 1.minute.ago.to_fs(:db) %>
priority_id: 5
subject: Blocked Issue
id: 9
@@ -171,15 +171,15 @@ issues_009:
assigned_to_id:
author_id: 2
status_id: 1
- start_date: <%= Date.today.to_s(:db) %>
- due_date: <%= 1.days.from_now.to_date.to_s(:db) %>
+ start_date: <%= Date.today.to_fs(:db) %>
+ due_date: <%= 1.days.from_now.to_date.to_fs(:db) %>
root_id: 9
lft: 1
rgt: 2
issues_010:
- created_on: <%= 1.minute.ago.to_s(:db) %>
+ created_on: <%= 1.minute.ago.to_fs(:db) %>
project_id: 5
- updated_on: <%= 1.minute.ago.to_s(:db) %>
+ updated_on: <%= 1.minute.ago.to_fs(:db) %>
priority_id: 5
subject: Issue Doing the Blocking
id: 10
@@ -190,15 +190,15 @@ issues_010:
assigned_to_id:
author_id: 2
status_id: 1
- start_date: <%= Date.today.to_s(:db) %>
- due_date: <%= 1.days.from_now.to_date.to_s(:db) %>
+ start_date: <%= Date.today.to_fs(:db) %>
+ due_date: <%= 1.days.from_now.to_date.to_fs(:db) %>
root_id: 10
lft: 1
rgt: 2
issues_011:
- created_on: <%= 3.days.ago.to_s(:db) %>
+ created_on: <%= 3.days.ago.to_fs(:db) %>
project_id: 1
- updated_on: <%= 1.day.ago.to_s(:db) %>
+ updated_on: <%= 1.day.ago.to_fs(:db) %>
priority_id: 5
subject: Closed issue on a closed version
id: 11
@@ -209,16 +209,16 @@ issues_011:
assigned_to_id:
author_id: 2
status_id: 5
- start_date: <%= 1.day.ago.to_date.to_s(:db) %>
+ start_date: <%= 1.day.ago.to_date.to_fs(:db) %>
due_date:
root_id: 11
lft: 1
rgt: 2
- closed_on: <%= 1.day.ago.to_s(:db) %>
+ closed_on: <%= 1.day.ago.to_fs(:db) %>
issues_012:
- created_on: <%= 3.days.ago.to_s(:db) %>
+ created_on: <%= 3.days.ago.to_fs(:db) %>
project_id: 1
- updated_on: <%= 1.day.ago.to_s(:db) %>
+ updated_on: <%= 1.day.ago.to_fs(:db) %>
priority_id: 5
subject: Closed issue on a locked version
id: 12
@@ -229,16 +229,16 @@ issues_012:
assigned_to_id:
author_id: 3
status_id: 5
- start_date: <%= 1.day.ago.to_date.to_s(:db) %>
+ start_date: <%= 1.day.ago.to_date.to_fs(:db) %>
due_date:
root_id: 12
lft: 1
rgt: 2
- closed_on: <%= 1.day.ago.to_s(:db) %>
+ closed_on: <%= 1.day.ago.to_fs(:db) %>
issues_013:
- created_on: <%= 5.days.ago.to_s(:db) %>
+ created_on: <%= 5.days.ago.to_fs(:db) %>
project_id: 3
- updated_on: <%= 2.days.ago.to_s(:db) %>
+ updated_on: <%= 2.days.ago.to_fs(:db) %>
priority_id: 4
subject: Subproject issue two
id: 13
@@ -254,9 +254,9 @@ issues_013:
rgt: 2
issues_014:
id: 14
- created_on: <%= 15.days.ago.to_s(:db) %>
+ created_on: <%= 15.days.ago.to_fs(:db) %>
project_id: 3
- updated_on: <%= 15.days.ago.to_s(:db) %>
+ updated_on: <%= 15.days.ago.to_fs(:db) %>
priority_id: 5
subject: Private issue on public project
fixed_version_id:
diff --git a/test/fixtures/journals.yml b/test/fixtures/journals.yml
index e6cbd95..0950e01 100644
--- a/test/fixtures/journals.yml
+++ b/test/fixtures/journals.yml
@@ -1,7 +1,7 @@
---
journals_001:
- created_on: <%= 2.days.ago.to_date.to_s(:db) %>
- updated_on: <%= 1.days.ago.to_date.to_s(:db) %>
+ created_on: <%= 2.days.ago.to_date.to_fs(:db) %>
+ updated_on: <%= 1.days.ago.to_date.to_fs(:db) %>
notes: "Journal notes"
id: 1
journalized_type: Issue
@@ -9,24 +9,24 @@ journals_001:
journalized_id: 1
updated_by_id: 1
journals_002:
- created_on: <%= 1.days.ago.to_date.to_s(:db) %>
- updated_on: <%= 1.days.ago.to_date.to_s(:db) %>
+ created_on: <%= 1.days.ago.to_date.to_fs(:db) %>
+ updated_on: <%= 1.days.ago.to_date.to_fs(:db) %>
notes: "Some notes with Redmine links: #2, r2."
id: 2
journalized_type: Issue
user_id: 2
journalized_id: 1
journals_003:
- created_on: <%= 1.days.ago.to_date.to_s(:db) %>
- updated_on: <%= 1.days.ago.to_date.to_s(:db) %>
+ created_on: <%= 1.days.ago.to_date.to_fs(:db) %>
+ updated_on: <%= 1.days.ago.to_date.to_fs(:db) %>
notes: "A comment with inline image: !picture.jpg! and a reference to #1 and r2."
id: 3
journalized_type: Issue
user_id: 2
journalized_id: 2
journals_004:
- created_on: <%= 1.days.ago.to_date.to_s(:db) %>
- updated_on: <%= 1.days.ago.to_date.to_s(:db) %>
+ created_on: <%= 1.days.ago.to_date.to_fs(:db) %>
+ updated_on: <%= 1.days.ago.to_date.to_fs(:db) %>
notes: "A comment with a private version."
id: 4
journalized_type: Issue
@@ -34,8 +34,8 @@ journals_004:
journalized_id: 6
journals_005:
id: 5
- created_on: <%= 1.days.ago.to_date.to_s(:db) %>
- updated_on: <%= 1.days.ago.to_date.to_s(:db) %>
+ created_on: <%= 1.days.ago.to_date.to_fs(:db) %>
+ updated_on: <%= 1.days.ago.to_date.to_fs(:db) %>
notes: "A comment on a private issue."
user_id: 2
journalized_type: Issue
diff --git a/test/fixtures/messages.yml b/test/fixtures/messages.yml
index b193599..5b5fbed 100644
--- a/test/fixtures/messages.yml
+++ b/test/fixtures/messages.yml
@@ -45,8 +45,8 @@ messages_004:
parent_id:
board_id: 1
messages_005:
- created_on: <%= 3.days.ago.to_date.to_s(:db) %>
- updated_on: <%= 3.days.ago.to_date.to_s(:db) %>
+ created_on: <%= 3.days.ago.to_date.to_fs(:db) %>
+ updated_on: <%= 3.days.ago.to_date.to_fs(:db) %>
subject: 'RE: post 2'
id: 5
replies_count: 0
@@ -56,8 +56,8 @@ messages_005:
parent_id: 4
board_id: 1
messages_006:
- created_on: <%= 2.days.ago.to_date.to_s(:db) %>
- updated_on: <%= 2.days.ago.to_date.to_s(:db) %>
+ created_on: <%= 2.days.ago.to_date.to_fs(:db) %>
+ updated_on: <%= 2.days.ago.to_date.to_fs(:db) %>
subject: 'RE: post 2'
id: 6
replies_count: 0
@@ -67,8 +67,8 @@ messages_006:
parent_id: 4
board_id: 1
messages_007:
- created_on: <%= 2.days.ago.to_date.to_s(:db) %>
- updated_on: <%= 2.days.ago.to_date.to_s(:db) %>
+ created_on: <%= 2.days.ago.to_date.to_fs(:db) %>
+ updated_on: <%= 2.days.ago.to_date.to_fs(:db) %>
subject: 'Message on a private project'
id: 7
replies_count: 0
diff --git a/test/fixtures/versions.yml b/test/fixtures/versions.yml
index 8312666..c0c7337 100644
--- a/test/fixtures/versions.yml
+++ b/test/fixtures/versions.yml
@@ -16,7 +16,7 @@ versions_002:
updated_on: 2006-07-19 21:00:33 +02:00
id: 2
description: Stable release
- effective_date: <%= 20.day.from_now.to_date.to_s(:db) %>
+ effective_date: <%= 20.day.from_now.to_date.to_fs(:db) %>
status: locked
sharing: 'none'
wiki_page_title: ECookBookV1
diff --git a/test/integration/layout_test.rb b/test/integration/layout_test.rb
index 6918b11..662ca55 100644
--- a/test/integration/layout_test.rb
+++ b/test/integration/layout_test.rb
@@ -48,8 +48,8 @@ class LayoutTest < Redmine::IntegrationTest
def test_top_menu_and_search_not_visible_when_login_required
with_settings :login_required => '1' do
get '/'
- assert_select "#top-menu > ul", 0
- assert_select "#quick-search", 0
+
+ assert_equal response.status, 302
end
end
diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb
index 52195e5..f6db2ae 100644
--- a/test/unit/query_test.rb
+++ b/test/unit/query_test.rb
@@ -1549,13 +1549,13 @@ class QueryTest < ActiveSupport::TestCase
query = IssueQuery.new(:name => '_')
filter_name = "fixed_version.due_date"
assert_include filter_name, query.available_filters.keys
- query.filters = {filter_name => {:operator => '=', :values => [20.day.from_now.to_date.to_s(:db)]}}
+ query.filters = {filter_name => {:operator => '=', :values => [20.day.from_now.to_date.to_fs(:db)]}}
issues = find_issues_with_query(query)
assert_equal [2], issues.map(&:fixed_version_id).uniq.sort
assert_equal [2, 12], issues.map(&:id).sort
query = IssueQuery.new(:name => '_')
- query.filters = {filter_name => {:operator => '>=', :values => [21.day.from_now.to_date.to_s(:db)]}}
+ query.filters = {filter_name => {:operator => '>=', :values => [21.day.from_now.to_date.to_fs(:db)]}}
assert_equal 0, find_issues_with_query(query).size
end
@@ -2962,7 +2962,7 @@ class QueryTest < ActiveSupport::TestCase
User.current.pref.update_attribute :time_zone, 'Hawaii'
# assume timestamps are stored as utc
- ActiveRecord::Base.default_timezone = :utc
+ ActiveRecord.default_timezone = :utc
from = Date.parse '2016-03-20'
to = Date.parse '2016-03-22'
@@ -2973,7 +2973,7 @@ class QueryTest < ActiveSupport::TestCase
t = Time.new(2016, 3, 23, 9, 59, 59, 0).end_of_hour
assert_equal "table.field > '#{Query.connection.quoted_date f}' AND table.field <= '#{Query.connection.quoted_date t}'", c
ensure
- ActiveRecord::Base.default_timezone = :local # restore Redmine default
+ ActiveRecord.default_timezone = :local # restore Redmine default
end
def test_project_statement_with_closed_subprojects
diff --git a/test/unit/user_query_test.rb b/test/unit/user_query_test.rb
index e5d8dd3..76ad3bd 100644
--- a/test/unit/user_query_test.rb
+++ b/test/unit/user_query_test.rb
@@ -209,7 +209,7 @@ class UserQueryTest < ActiveSupport::TestCase
users = q.results_scope
assert_equal 2, users.size
- assert_equal [2, 1], users.ids
+ assert_equal [2, 1], users.pluck(:id)
end
def find_users_with_query(query)