Project

General

Profile

Feature #36320 » 0001-Upgrade-to-rails-7.1-beta1.patch

patch for r22317 - Takashi Kato, 2023-09-24 17:42

View differences:

Gemfile
2 2

  
3 3
ruby '>= 2.7.0', '< 3.3.0'
4 4

  
5
gem 'rails', '6.1.7.6'
5
gem 'rails', github: 'rails/rails', tag: 'v7.1.0.beta1'
6 6
gem 'rouge', '~> 4.1.0'
7 7
gem 'mini_mime', '~> 1.1.0'
8
gem "actionpack-xml_parser"
8
gem "actionpack-xml_parser", '~> 2.0.1'
9 9
gem 'roadie-rails', '~> 3.0.0'
10 10
gem 'marcel'
11 11
gem 'mail', '~> 2.8.1'
......
86 86
  warn("Please configure your config/database.yml first")
87 87
end
88 88

  
89
group :development, :test do
90
  gem 'debug'
91
end
92

  
89 93
group :development do
90 94
  gem 'listen', '~> 3.3'
91 95
  gem "yard"
app/controllers/attachments_controller.rb
100 100
  def upload
101 101
    # Make sure that API users get used to set this content type
102 102
    # as it won't trigger Rails' automatic parsing of the request body for parameters
103
    unless request.content_type == 'application/octet-stream'
103
    unless request.media_type == 'application/octet-stream'
104 104
      head 406
105 105
      return
106 106
    end
app/helpers/application_helper.rb
259 259
    when Array
260 260
      formatted_objects = object.map {|o| format_object(o, html)}
261 261
      html ? safe_join(formatted_objects, ', ') : formatted_objects.join(', ')
262
    when Time
262
    when Time, ActiveSupport::TimeWithZone
263 263
      format_time(object)
264 264
    when Date
265 265
      format_date(object)
......
634 634
                 'span', nil,
635 635
                 :class => "name icon icon-#{principal.class.name.downcase}"
636 636
               )
637
            ) + principal
637
            ) + principal.to_s
638 638
        )
639 639
    end
640 640
    s.html_safe
app/models/attachment.rb
345 345
  #   })
346 346
  #
347 347
  def self.update_attachments(attachments, params)
348
    params = params.transform_keys {|key| key.to_i}
349

  
348
    converted = {}
349
    params.each {|key, val| converted[key.to_i] = val}
350 350
    saved = true
351 351
    transaction do
352 352
      attachments.each do |attachment|
353
        if p = params[attachment.id]
354
          attachment.filename = p[:filename] if p.key?(:filename)
355
          attachment.description = p[:description] if p.key?(:description)
353
        if file = converted[attachment.id]
354
          attachment.filename = file[:filename] if file.key?(:filename)
355
          attachment.description = file[:description] if file.key?(:description)
356 356
          saved &&= attachment.save
357 357
        end
358 358
      end
app/models/query.rb
257 257
  has_and_belongs_to_many :roles, :join_table => "#{table_name_prefix}queries_roles#{table_name_suffix}", :foreign_key => "query_id"
258 258
  serialize :filters
259 259
  serialize :column_names
260
  serialize :sort_criteria, Array
261
  serialize :options, Hash
260
  serialize :sort_criteria, type: Array
261
  serialize :options, type: Hash
262 262

  
263 263
  validates_presence_of :name
264 264
  validates_length_of :name, :maximum => 255
......
1631 1631
      else
1632 1632
        from = from - 1 # second
1633 1633
      end
1634
      if self.class.default_timezone == :utc
1634
      if ActiveRecord.default_timezone == :utc
1635 1635
        from = from.utc
1636 1636
      end
1637 1637
      s << ("#{table}.#{field} > '%s'" % [quoted_time(from, is_custom_filter)])
......
1640 1640
      if to.is_a?(Date)
1641 1641
        to = date_for_user_time_zone(to.year, to.month, to.day).end_of_day
1642 1642
      end
1643
      if self.class.default_timezone == :utc
1643
      if ActiveRecord.default_timezone == :utc
1644 1644
        to = to.utc
1645 1645
      end
1646 1646
      s << ("#{table}.#{field} <= '%s'" % [quoted_time(to, is_custom_filter)])
app/models/role.rb
76 76
  has_many :members, :through => :member_roles
77 77
  acts_as_positioned :scope => :builtin
78 78

  
79
  serialize :permissions, ::Role::PermissionsAttributeCoder
79
  serialize :permissions, coder: ::Role::PermissionsAttributeCoder
80 80
  store :settings, :accessors => [:permissions_all_trackers, :permissions_tracker_ids]
81 81

  
82 82
  validates_presence_of :name
app/views/custom_fields/_visibility_by_project_selector.html.erb
4 4
  <div id="custom_field_project_ids">
5 5
    <% project_ids = @custom_field.project_ids.to_a %>
6 6
    <%= render_project_nested_lists(Project.all) do |p|
7
      content_tag('label', check_box_tag('custom_field[project_ids][]', p.id, project_ids.include?(p.id), :id => nil) + ' ' + p)
7
      content_tag('label', check_box_tag('custom_field[project_ids][]', p.id, project_ids.include?(p.id), :id => nil) + ' ' + p.to_s)
8 8
    end %>
9 9
    <%= hidden_field_tag('custom_field[project_ids][]', '', :id => nil) %>
10 10
  </div>
config/application.rb
23 23
    # Application configuration should go into files in config/initializers
24 24
    # -- all .rb files in that directory are automatically loaded.
25 25

  
26
    # Custom directories with classes and modules you want to be autoloadable.
27
    config.autoloader = :zeitwerk
26
    # Adds `lib` to `config.autoload_paths` and `config.eager_load_paths`.
27
    config.autoload_lib(ignore: %w(tasks generators plugins))
28 28

  
29 29
    # Only load the plugins named here, in the order given (default is alphabetical).
30 30
    # :all can be used as a placeholder for all plugins not explicitly named.
31 31
    # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
32 32

  
33
    config.active_support.remove_deprecated_time_with_zone_name = true
34
    config.active_support.cache_format_version = 7.0
35

  
33 36
    config.active_record.store_full_sti_class = true
34 37
    config.active_record.default_timezone = :local
35 38
    config.active_record.yaml_column_permitted_classes = [
config/environments/test.rb
30 30
  config.cache_store = :null_store
31 31

  
32 32
  # Raise exceptions instead of rendering exception templates.
33
  config.action_dispatch.show_exceptions = true
33
  config.action_dispatch.show_exceptions = :all
34 34

  
35 35
  # Disable request forgery protection in test environment.
36 36
  config.action_controller.allow_forgery_protection = false
config/initializers/10-patches.rb
47 47
      end
48 48
    end
49 49
  end
50

  
51
  class Resolver
52
    def find_all(name, prefix=nil, partial=false, details={}, key=nil, locals=[])
53
      locals = locals.map(&:to_s).sort!.freeze
54

  
55
      cached(key, [name, prefix, partial], details, locals) do
56
        if (details[:formats] & [:xml, :json]).any?
57
          details = details.dup
58
          details[:formats] = details[:formats].dup + [:api]
59
        end
60
        _find_all(name, prefix, partial, details, key, locals)
61
      end
62
    end
63
  end
64 50
end
65 51

  
66 52
ActionView::Base.field_error_proc = Proc.new{ |html_tag, instance| html_tag || ''.html_safe }
......
69 55
module ActionView
70 56
  module Helpers
71 57
    module Tags
72
      class Base
73
        private
74
        alias :add_options_without_non_empty_blank_option :add_options
58
      SelectRenderer.prepend(Module.new do
75 59
        def add_options(option_tags, options, value = nil)
76
          if options[:include_blank] == true
77
            options = options.dup
78
            options[:include_blank] = '&nbsp;'.html_safe
60
          if options.delete(:include_blank)
61
            options[:prompt] = '&nbsp;'.html_safe
79 62
          end
80
          add_options_without_non_empty_blank_option(option_tags, options, value)
63
          super
81 64
        end
82
      end
65
      end)
83 66
    end
84 67

  
85 68
    module FormHelper
......
156 139
  end
157 140
end
158 141

  
142
module ActionView
143
  LookupContext.prepend(Module.new do
144
    def formats=(values)
145
      if (Array(values) & [:xml, :json]).any?
146
        values << :api
147
      end
148
      super values
149
    end
150
  end)
151

  
152
  Rendering.prepend(Module.new do
153
    def rendered_format
154
      if lookup_context.formats.first == :api
155
        return request.format
156
      end
157

  
158
      super
159
    end
160
  end)
161
end
162

  
163
Mime::SET << 'api'
164

  
159 165
# Adds asset_id parameters to assets like Rails 3 to invalidate caches in browser
160 166
module ActionView
161 167
  module Helpers
config/initializers/zeitwerk.rb
1 1
# frozen_string_literal: true
2 2

  
3 3
lib = Rails.root.join('lib/redmine')
4
Rails.autoloaders.main.push_dir lib, namespace: Redmine
5
Rails.application.config.watchable_dirs[lib] = [:rb]
6

  
7 4
IGNORE_LIST = [
8 5
  'wiki_formatting/textile/redcloth3.rb',
9 6
  'core_ext.rb',
lib/redmine/plugin.rb
467 467
          else
468 468
            migrations
469 469
          end
470
        Migrator.new(:up, selected_migrations, schema_migration, target_version).migrate
470
        Migrator.new(:up, selected_migrations, schema_migration, internal_metadata, target_version).migrate
471 471
      end
472 472

  
473 473
      def down(target_version = nil)
......
477 477
          else
478 478
            migrations
479 479
          end
480
        Migrator.new(:down, selected_migrations, schema_migration, target_version).migrate
480
        Migrator.new(:down, selected_migrations, schema_migration, internal_metadata, target_version).migrate
481 481
      end
482 482

  
483 483
      def run(direction, target_version)
484
        Migrator.new(direction, migrations, schema_migration, target_version).run
484
        Migrator.new(direction, migrations, schema_migration, internal_metadata, target_version).run
485 485
      end
486 486

  
487 487
      def open
488
        Migrator.new(:up, migrations, schema_migration)
488
        Migrator.new(:up, migrations, schema_migration, internal_metadata)
489 489
      end
490 490

  
491 491
      def current_version
......
510 510
          # Delete migrations that don't match .. to_i will work because the number comes first
511 511
          @all_versions ||= {}
512 512
          @all_versions[plugin.id.to_s] ||= begin
513
            sm_table = ::ActiveRecord::SchemaMigration.table_name
513
            sm_table = ::ActiveRecord::Base.connection.schema_migration.table_name
514 514
            migration_versions  = ActiveRecord::Base.connection.select_values("SELECT version FROM #{sm_table}")
515 515
            versions_by_plugins = migration_versions.group_by {|version| version.match(/-(.*)$/).try(:[], 1)}
516 516
            @all_versions       = versions_by_plugins.transform_values! {|versions| versions.map!(&:to_i).sort!}
test/fixtures/issues.yml
1 1
---
2 2
issues_001:
3
  created_on: <%= 3.days.ago.to_s(:db) %>
3
  created_on: <%= 3.days.ago.to_fs(:db) %>
4 4
  project_id: 1
5
  updated_on: <%= 1.day.ago.to_s(:db) %>
5
  updated_on: <%= 1.day.ago.to_fs(:db) %>
6 6
  priority_id: 4
7 7
  subject: Cannot print recipes
8 8
  id: 1
......
13 13
  assigned_to_id:
14 14
  author_id: 2
15 15
  status_id: 1
16
  start_date: <%= 1.day.ago.to_date.to_s(:db) %>
17
  due_date: <%= 10.day.from_now.to_date.to_s(:db) %>
16
  start_date: <%= 1.day.ago.to_date.to_fs(:db) %>
17
  due_date: <%= 10.day.from_now.to_date.to_fs(:db) %>
18 18
  estimated_hours: 200.0
19 19
  root_id: 1
20 20
  lft: 1
......
34 34
  assigned_to_id: 3
35 35
  author_id: 2
36 36
  status_id: 2
37
  start_date: <%= 2.day.ago.to_date.to_s(:db) %>
37
  start_date: <%= 2.day.ago.to_date.to_fs(:db) %>
38 38
  due_date:
39 39
  estimated_hours: 0.5
40 40
  root_id: 2
......
56 56
  assigned_to_id: 3
57 57
  author_id: 2
58 58
  status_id: 1
59
  start_date: <%= 15.day.ago.to_date.to_s(:db) %>
60
  due_date: <%= 5.day.ago.to_date.to_s(:db) %>
59
  start_date: <%= 15.day.ago.to_date.to_fs(:db) %>
60
  due_date: <%= 5.day.ago.to_date.to_fs(:db) %>
61 61
  estimated_hours: 1.0
62 62
  root_id: 3
63 63
  lft: 1
64 64
  rgt: 2
65 65
issues_004:
66
  created_on: <%= 5.days.ago.to_s(:db) %>
66
  created_on: <%= 5.days.ago.to_fs(:db) %>
67 67
  project_id: 2
68
  updated_on: <%= 2.days.ago.to_s(:db) %>
68
  updated_on: <%= 2.days.ago.to_fs(:db) %>
69 69
  priority_id: 4
70 70
  subject: Issue on project 2
71 71
  id: 4
......
80 80
  lft: 1
81 81
  rgt: 2
82 82
issues_005:
83
  created_on: <%= 5.days.ago.to_s(:db) %>
83
  created_on: <%= 5.days.ago.to_fs(:db) %>
84 84
  project_id: 3
85
  updated_on: <%= 2.days.ago.to_s(:db) %>
85
  updated_on: <%= 2.days.ago.to_fs(:db) %>
86 86
  priority_id: 4
87 87
  subject: Subproject issue
88 88
  id: 5
......
98 98
  lft: 1
99 99
  rgt: 2
100 100
issues_006:
101
  created_on: <%= 1.minute.ago.to_s(:db) %>
101
  created_on: <%= 1.minute.ago.to_fs(:db) %>
102 102
  project_id: 5
103
  updated_on: <%= 1.minute.ago.to_s(:db) %>
103
  updated_on: <%= 1.minute.ago.to_fs(:db) %>
104 104
  priority_id: 4
105 105
  subject: Issue of a private subproject
106 106
  id: 6
......
111 111
  assigned_to_id:
112 112
  author_id: 2
113 113
  status_id: 1
114
  start_date: <%= Date.today.to_s(:db) %>
115
  due_date: <%= 1.days.from_now.to_date.to_s(:db) %>
114
  start_date: <%= Date.today.to_fs(:db) %>
115
  due_date: <%= 1.days.from_now.to_date.to_fs(:db) %>
116 116
  root_id: 6
117 117
  lft: 1
118 118
  rgt: 2
119 119
issues_007:
120
  created_on: <%= 10.days.ago.to_s(:db) %>
120
  created_on: <%= 10.days.ago.to_fs(:db) %>
121 121
  project_id: 1
122
  updated_on: <%= 10.days.ago.to_s(:db) %>
122
  updated_on: <%= 10.days.ago.to_fs(:db) %>
123 123
  priority_id: 5
124 124
  subject: Issue due today
125 125
  id: 7
......
130 130
  assigned_to_id:
131 131
  author_id: 2
132 132
  status_id: 1
133
  start_date: <%= 10.days.ago.to_s(:db) %>
134
  due_date: <%= Date.today.to_s(:db) %>
133
  start_date: <%= 10.days.ago.to_fs(:db) %>
134
  due_date: <%= Date.today.to_fs(:db) %>
135 135
  lock_version: 0
136 136
  root_id: 7
137 137
  lft: 1
138 138
  rgt: 2
139 139
issues_008:
140
  created_on: <%= 10.days.ago.to_s(:db) %>
140
  created_on: <%= 10.days.ago.to_fs(:db) %>
141 141
  project_id: 1
142
  updated_on: <%= 10.days.ago.to_s(:db) %>
142
  updated_on: <%= 10.days.ago.to_fs(:db) %>
143 143
  priority_id: 5
144 144
  subject: Closed issue
145 145
  id: 8
......
156 156
  root_id: 8
157 157
  lft: 1
158 158
  rgt: 2
159
  closed_on: <%= 3.days.ago.to_s(:db) %>
159
  closed_on: <%= 3.days.ago.to_fs(:db) %>
160 160
issues_009:
161
  created_on: <%= 1.minute.ago.to_s(:db) %>
161
  created_on: <%= 1.minute.ago.to_fs(:db) %>
162 162
  project_id: 5
163
  updated_on: <%= 1.minute.ago.to_s(:db) %>
163
  updated_on: <%= 1.minute.ago.to_fs(:db) %>
164 164
  priority_id: 5
165 165
  subject: Blocked Issue
166 166
  id: 9
......
171 171
  assigned_to_id:
172 172
  author_id: 2
173 173
  status_id: 1
174
  start_date: <%= Date.today.to_s(:db) %>
175
  due_date: <%= 1.days.from_now.to_date.to_s(:db) %>
174
  start_date: <%= Date.today.to_fs(:db) %>
175
  due_date: <%= 1.days.from_now.to_date.to_fs(:db) %>
176 176
  root_id: 9
177 177
  lft: 1
178 178
  rgt: 2
179 179
issues_010:
180
  created_on: <%= 1.minute.ago.to_s(:db) %>
180
  created_on: <%= 1.minute.ago.to_fs(:db) %>
181 181
  project_id: 5
182
  updated_on: <%= 1.minute.ago.to_s(:db) %>
182
  updated_on: <%= 1.minute.ago.to_fs(:db) %>
183 183
  priority_id: 5
184 184
  subject: Issue Doing the Blocking
185 185
  id: 10
......
190 190
  assigned_to_id:
191 191
  author_id: 2
192 192
  status_id: 1
193
  start_date: <%= Date.today.to_s(:db) %>
194
  due_date: <%= 1.days.from_now.to_date.to_s(:db) %>
193
  start_date: <%= Date.today.to_fs(:db) %>
194
  due_date: <%= 1.days.from_now.to_date.to_fs(:db) %>
195 195
  root_id: 10
196 196
  lft: 1
197 197
  rgt: 2
198 198
issues_011:
199
  created_on: <%= 3.days.ago.to_s(:db) %>
199
  created_on: <%= 3.days.ago.to_fs(:db) %>
200 200
  project_id: 1
201
  updated_on: <%= 1.day.ago.to_s(:db) %>
201
  updated_on: <%= 1.day.ago.to_fs(:db) %>
202 202
  priority_id: 5
203 203
  subject: Closed issue on a closed version
204 204
  id: 11
......
209 209
  assigned_to_id:
210 210
  author_id: 2
211 211
  status_id: 5
212
  start_date: <%= 1.day.ago.to_date.to_s(:db) %>
212
  start_date: <%= 1.day.ago.to_date.to_fs(:db) %>
213 213
  due_date:
214 214
  root_id: 11
215 215
  lft: 1
216 216
  rgt: 2
217
  closed_on: <%= 1.day.ago.to_s(:db) %>
217
  closed_on: <%= 1.day.ago.to_fs(:db) %>
218 218
issues_012:
219
  created_on: <%= 3.days.ago.to_s(:db) %>
219
  created_on: <%= 3.days.ago.to_fs(:db) %>
220 220
  project_id: 1
221
  updated_on: <%= 1.day.ago.to_s(:db) %>
221
  updated_on: <%= 1.day.ago.to_fs(:db) %>
222 222
  priority_id: 5
223 223
  subject: Closed issue on a locked version
224 224
  id: 12
......
229 229
  assigned_to_id:
230 230
  author_id: 3
231 231
  status_id: 5
232
  start_date: <%= 1.day.ago.to_date.to_s(:db) %>
232
  start_date: <%= 1.day.ago.to_date.to_fs(:db) %>
233 233
  due_date:
234 234
  root_id: 12
235 235
  lft: 1
236 236
  rgt: 2
237
  closed_on: <%= 1.day.ago.to_s(:db) %>
237
  closed_on: <%= 1.day.ago.to_fs(:db) %>
238 238
issues_013:
239
  created_on: <%= 5.days.ago.to_s(:db) %>
239
  created_on: <%= 5.days.ago.to_fs(:db) %>
240 240
  project_id: 3
241
  updated_on: <%= 2.days.ago.to_s(:db) %>
241
  updated_on: <%= 2.days.ago.to_fs(:db) %>
242 242
  priority_id: 4
243 243
  subject: Subproject issue two
244 244
  id: 13
......
254 254
  rgt: 2
255 255
issues_014:
256 256
  id: 14
257
  created_on: <%= 15.days.ago.to_s(:db) %>
257
  created_on: <%= 15.days.ago.to_fs(:db) %>
258 258
  project_id: 3
259
  updated_on: <%= 15.days.ago.to_s(:db) %>
259
  updated_on: <%= 15.days.ago.to_fs(:db) %>
260 260
  priority_id: 5
261 261
  subject: Private issue on public project
262 262
  fixed_version_id:
test/fixtures/journals.yml
1 1
---
2 2
journals_001:
3
  created_on: <%= 2.days.ago.to_date.to_s(:db) %>
4
  updated_on: <%= 1.days.ago.to_date.to_s(:db) %>
3
  created_on: <%= 2.days.ago.to_date.to_fs(:db) %>
4
  updated_on: <%= 1.days.ago.to_date.to_fs(:db) %>
5 5
  notes: "Journal notes"
6 6
  id: 1
7 7
  journalized_type: Issue
......
9 9
  journalized_id: 1
10 10
  updated_by_id: 1
11 11
journals_002:
12
  created_on: <%= 1.days.ago.to_date.to_s(:db) %>
13
  updated_on: <%= 1.days.ago.to_date.to_s(:db) %>
12
  created_on: <%= 1.days.ago.to_date.to_fs(:db) %>
13
  updated_on: <%= 1.days.ago.to_date.to_fs(:db) %>
14 14
  notes: "Some notes with Redmine links: #2, r2."
15 15
  id: 2
16 16
  journalized_type: Issue
17 17
  user_id: 2
18 18
  journalized_id: 1
19 19
journals_003:
20
  created_on: <%= 1.days.ago.to_date.to_s(:db) %>
21
  updated_on: <%= 1.days.ago.to_date.to_s(:db) %>
20
  created_on: <%= 1.days.ago.to_date.to_fs(:db) %>
21
  updated_on: <%= 1.days.ago.to_date.to_fs(:db) %>
22 22
  notes: "A comment with inline image: !picture.jpg! and a reference to #1 and r2."
23 23
  id: 3
24 24
  journalized_type: Issue
25 25
  user_id: 2
26 26
  journalized_id: 2
27 27
journals_004:
28
  created_on: <%= 1.days.ago.to_date.to_s(:db) %>
29
  updated_on: <%= 1.days.ago.to_date.to_s(:db) %>
28
  created_on: <%= 1.days.ago.to_date.to_fs(:db) %>
29
  updated_on: <%= 1.days.ago.to_date.to_fs(:db) %>
30 30
  notes: "A comment with a private version."
31 31
  id: 4
32 32
  journalized_type: Issue
......
34 34
  journalized_id: 6
35 35
journals_005:
36 36
  id: 5
37
  created_on: <%= 1.days.ago.to_date.to_s(:db) %>
38
  updated_on: <%= 1.days.ago.to_date.to_s(:db) %>
37
  created_on: <%= 1.days.ago.to_date.to_fs(:db) %>
38
  updated_on: <%= 1.days.ago.to_date.to_fs(:db) %>
39 39
  notes: "A comment on a private issue."
40 40
  user_id: 2
41 41
  journalized_type: Issue
test/fixtures/messages.yml
45 45
  parent_id: 
46 46
  board_id: 1
47 47
messages_005: 
48
  created_on: <%= 3.days.ago.to_date.to_s(:db) %>
49
  updated_on: <%= 3.days.ago.to_date.to_s(:db) %>
48
  created_on: <%= 3.days.ago.to_date.to_fs(:db) %>
49
  updated_on: <%= 3.days.ago.to_date.to_fs(:db) %>
50 50
  subject: 'RE: post 2'
51 51
  id: 5
52 52
  replies_count: 0
......
56 56
  parent_id: 4
57 57
  board_id: 1
58 58
messages_006: 
59
  created_on: <%= 2.days.ago.to_date.to_s(:db) %>
60
  updated_on: <%= 2.days.ago.to_date.to_s(:db) %>
59
  created_on: <%= 2.days.ago.to_date.to_fs(:db) %>
60
  updated_on: <%= 2.days.ago.to_date.to_fs(:db) %>
61 61
  subject: 'RE: post 2'
62 62
  id: 6
63 63
  replies_count: 0
......
67 67
  parent_id: 4
68 68
  board_id: 1
69 69
messages_007: 
70
  created_on: <%= 2.days.ago.to_date.to_s(:db) %>
71
  updated_on: <%= 2.days.ago.to_date.to_s(:db) %>
70
  created_on: <%= 2.days.ago.to_date.to_fs(:db) %>
71
  updated_on: <%= 2.days.ago.to_date.to_fs(:db) %>
72 72
  subject: 'Message on a private project'
73 73
  id: 7
74 74
  replies_count: 0
test/fixtures/versions.yml
16 16
  updated_on: 2006-07-19 21:00:33 +02:00
17 17
  id: 2
18 18
  description: Stable release
19
  effective_date: <%= 20.day.from_now.to_date.to_s(:db) %>
19
  effective_date: <%= 20.day.from_now.to_date.to_fs(:db) %>
20 20
  status: locked
21 21
  sharing: 'none'
22 22
  wiki_page_title: ECookBookV1
test/integration/layout_test.rb
48 48
  def test_top_menu_and_search_not_visible_when_login_required
49 49
    with_settings :login_required => '1' do
50 50
      get '/'
51
      assert_select "#top-menu > ul", 0
52
      assert_select "#quick-search", 0
51

  
52
      assert_equal response.status, 302
53 53
    end
54 54
  end
55 55

  
test/unit/query_test.rb
1549 1549
    query = IssueQuery.new(:name => '_')
1550 1550
    filter_name = "fixed_version.due_date"
1551 1551
    assert_include filter_name, query.available_filters.keys
1552
    query.filters = {filter_name => {:operator => '=', :values => [20.day.from_now.to_date.to_s(:db)]}}
1552
    query.filters = {filter_name => {:operator => '=', :values => [20.day.from_now.to_date.to_fs(:db)]}}
1553 1553
    issues = find_issues_with_query(query)
1554 1554
    assert_equal [2], issues.map(&:fixed_version_id).uniq.sort
1555 1555
    assert_equal [2, 12], issues.map(&:id).sort
1556 1556

  
1557 1557
    query = IssueQuery.new(:name => '_')
1558
    query.filters = {filter_name => {:operator => '>=', :values => [21.day.from_now.to_date.to_s(:db)]}}
1558
    query.filters = {filter_name => {:operator => '>=', :values => [21.day.from_now.to_date.to_fs(:db)]}}
1559 1559
    assert_equal 0, find_issues_with_query(query).size
1560 1560
  end
1561 1561

  
......
2962 2962
    User.current.pref.update_attribute :time_zone, 'Hawaii'
2963 2963

  
2964 2964
    # assume timestamps are stored as utc
2965
    ActiveRecord::Base.default_timezone = :utc
2965
    ActiveRecord.default_timezone = :utc
2966 2966

  
2967 2967
    from = Date.parse '2016-03-20'
2968 2968
    to = Date.parse '2016-03-22'
......
2973 2973
    t = Time.new(2016, 3, 23, 9, 59, 59, 0).end_of_hour
2974 2974
    assert_equal "table.field > '#{Query.connection.quoted_date f}' AND table.field <= '#{Query.connection.quoted_date t}'", c
2975 2975
  ensure
2976
    ActiveRecord::Base.default_timezone = :local # restore Redmine default
2976
    ActiveRecord.default_timezone = :local # restore Redmine default
2977 2977
  end
2978 2978

  
2979 2979
  def test_project_statement_with_closed_subprojects
test/unit/user_query_test.rb
186 186
    users = q.results_scope
187 187

  
188 188
    assert_equal 2, users.size
189
    assert_equal [2, 1], users.ids
189
    assert_equal [2, 1], users.pluck(:id)
190 190
  end
191 191

  
192 192
  def find_users_with_query(query)
(5-5/8)