Project

General

Profile

Defect #33941 » fixed-33941.patch

Yuichi HARADA, 2020-09-01 08:08

View differences:

app/controllers/account_controller.rb
441 441
  def register_automatically(user, &block)
442 442
    # Automatic activation
443 443
    user.activate
444
    user.last_login_on = Time.now
444
    user.last_login_on = Time.current
445 445
    if user.save
446 446
      self.logged_user = user
447 447
      flash[:notice] = l(:notice_account_activated)
app/controllers/activities_controller.rb
55 55
      end
56 56
    end
57 57

  
58
    events = @activity.events(@date_from, @date_to)
58
    events = @activity.events(@date_from.beginning_of_day, @date_to.end_of_day)
59 59

  
60 60
    if events.empty? || stale?(:etag => [@activity.scope, @date_to, @date_from, @with_subprojects, @author, events.first, events.size, User.current, current_language])
61 61
      respond_to do |format|
app/models/query.rb
1454 1454
  end
1455 1455

  
1456 1456
  def date_for_user_time_zone(y, m, d)
1457
    if tz = User.current.time_zone
1458
      tz.local y, m, d
1459
    else
1460
      Time.local y, m, d
1461
    end
1457
    (User.current.time_zone || Time.current.time_zone).local y, m, d
1462 1458
  end
1463 1459

  
1464 1460
  # Returns a SQL clause for a date or datetime field.
1465 1461
  def date_clause(table, field, from, to, is_custom_filter)
1462
    field_type = Module.const_get("#{table}".classify).columns_hash["#{field}"].type rescue nil
1466 1463
    s = []
1467
    if from
1468
      if from.is_a?(Date)
1469
        from = date_for_user_time_zone(from.year, from.month, from.day).yesterday.end_of_day
1470
      else
1471
        from = from - 1 # second
1472
      end
1473
      if self.class.default_timezone == :utc
1474
        from = from.utc
1475
      end
1476
      s << ("#{table}.#{field} > '%s'" % [quoted_time(from, is_custom_filter)])
1477
    end
1478
    if to
1479
      if to.is_a?(Date)
1480
        to = date_for_user_time_zone(to.year, to.month, to.day).end_of_day
1464
    if field_type == :date
1465
      {
1466
        :from => from,
1467
        :to => to,
1468
      }.each do |key, val|
1469
        next unless val
1470
        val = val.to_date
1471
        s << ("#{table}.#{field} #{key == :from ? '>=' : '<='} '%s'" % [self.class.connection.quoted_date(val)])
1481 1472
      end
1482
      if self.class.default_timezone == :utc
1483
        to = to.utc
1473
    else
1474
      {
1475
        :from => from,
1476
        :to => to,
1477
      }.each do |key, val|
1478
        next unless val
1479
        if val.is_a?(Date)
1480
          val = date_for_user_time_zone(val.year, val.month, val.day)
1481
          val = val.yesterday if key == :from
1482
          val = val.end_of_day
1483
        else
1484
          val = val + (key == :from ? -1 : 0) # second
1485
        end
1486
        if self.class.default_timezone == :utc
1487
          val = val.utc
1488
        end
1489
        s << ("#{table}.#{field} #{key == :from ? '>' : '<='} '%s'" % [quoted_time(val, is_custom_filter)])
1484 1490
      end
1485
      s << ("#{table}.#{field} <= '%s'" % [quoted_time(to, is_custom_filter)])
1486 1491
    end
1487 1492
    s.join(' AND ')
1488 1493
  end
app/models/setting.rb
93 93

  
94 94
  # Hash used to cache setting values
95 95
  @cached_settings = {}
96
  @cached_cleared_on = Time.now
96
  @cached_cleared_on = Time.current
97 97

  
98 98
  def value
99 99
    v = read_attribute(:value)
......
269 269
  # Clears the settings cache
270 270
  def self.clear_cache
271 271
    @cached_settings.clear
272
    @cached_cleared_on = Time.now
272
    @cached_cleared_on = Time.current
273 273
    logger.info "Settings cache cleared." if logger
274 274
  end
275 275

  
app/models/token.rb
67 67
    end
68 68

  
69 69
    if validity_time
70
      Time.now - validity_time
70
      Time.current - validity_time
71 71
    end
72 72
  end
73 73

  
app/models/user.rb
342 342
  def salt_password(clear_password)
343 343
    self.salt = User.generate_salt
344 344
    self.hashed_password = User.hash_password("#{salt}#{User.hash_password clear_password}")
345
    self.passwd_changed_on = Time.now.change(:usec => 0)
345
    self.passwd_changed_on = Time.current.change(:usec => 0)
346 346
  end
347 347

  
348 348
  # Does the backend storage allow this user to change their password?
......
405 405
  end
406 406

  
407 407
  def time_zone
408
    @time_zone ||= (self.pref.time_zone.blank? ? nil : ActiveSupport::TimeZone[self.pref.time_zone])
408
    @time_zone ||= (self.pref.time_zone.blank? ? Time.current.time_zone : ActiveSupport::TimeZone[self.pref.time_zone])
409 409
  end
410 410

  
411 411
  def force_default_language?
......
567 567

  
568 568
  # Returns the current day according to user's time zone
569 569
  def today
570
    if time_zone.nil?
571
      Date.today
572
    else
573
      time_zone.today
574
    end
570
    time_zone&.today || Date.current
575 571
  end
576 572

  
577 573
  # Returns the day of +time+ according to user's time zone
......
580 576
  end
581 577

  
582 578
  def convert_time_to_user_timezone(time)
583
    if self.time_zone
584
      time.in_time_zone(self.time_zone)
585
    else
586
      time.utc? ? time.localtime : time
587
    end
579
    time.in_time_zone(self.time_zone || Time.current.time_zone)
588 580
  end
589 581

  
590 582
  def logged?
app/views/common/feed.atom.builder
9 9
  xml.link    "rel" => "alternate", "href" => url_for(:params => request.query_parameters.merge(:format => nil, :key => nil), :only_path => false, :protocol => protocol, :host => host)
10 10
  xml.id      home_url
11 11
  xml.icon    favicon_url
12
  xml.updated((@items.first ? @items.first.event_datetime : Time.now).xmlschema)
12
  xml.updated((@items.first ? @items.first.event_datetime : Time.current).xmlschema)
13 13
  xml.author  { xml.name "#{Setting.app_title}" }
14 14
  xml.generator(:uri => Redmine::Info.url) { xml.text! Redmine::Info.app_name; }
15 15
  @items.each do |item|
app/views/journals/index.builder
7 7
  xml.link    "rel" => "alternate", "href" => home_url
8 8
  xml.id      home_url
9 9
  xml.icon    favicon_url
10
  xml.updated((@journals.first ? @journals.first.event_datetime : Time.now).xmlschema)
10
  xml.updated((@journals.first ? @journals.first.event_datetime : Time.current).xmlschema)
11 11
  xml.author  { xml.name "#{Setting.app_title}" }
12 12
  @journals.each do |change|
13 13
    issue = change.issue
lib/redmine/database.rb
76 76
      def timestamp_to_date(column, time_zone)
77 77
        if postgresql?
78 78
          if time_zone
79
            identifier = ActiveSupport::TimeZone.find_tzinfo(time_zone.name).identifier
80
            "(#{column}::timestamptz AT TIME ZONE '#{identifier}')::date"
79
            offset_tz = time_zone.utc_offset
80
            offset_default =
81
              Time.now.__send__(ActiveRecord::Base.default_timezone == :utc ? :utc : :localtime).utc_offset
82
            "(#{column} + INTERVAL '#{offset_tz - offset_default} SECOND')::date"
81 83
          else
82 84
            "#{column}::date"
83 85
          end
84 86
        elsif mysql?
85 87
          if time_zone
86
            user_identifier = ActiveSupport::TimeZone.find_tzinfo(time_zone.name).identifier
87
            local_identifier = ActiveSupport::TimeZone.find_tzinfo(Time.zone.name).identifier
88
            "DATE(CONVERT_TZ(#{column},'#{local_identifier}', '#{user_identifier}'))"
88
            offset_tz = time_zone.utc_offset
89
            offset_default =
90
              Time.now.__send__(ActiveRecord::Base.default_timezone == :utc ? :utc : :localtime).utc_offset
91
            "DATE(#{column} + INTERVAL #{offset_tz - offset_default} SECOND)"
89 92
          else
90 93
            "DATE(#{column})"
91 94
          end
test/fixtures/issues.yml
111 111
  assigned_to_id:
112 112
  author_id: 2
113 113
  status_id: 1
114
  start_date: <%= Date.today.to_s(:db) %>
114
  start_date: <%= Date.current.to_s(:db) %>
115 115
  due_date: <%= 1.days.from_now.to_date.to_s(:db) %>
116 116
  root_id: 6
117 117
  lft: 1
......
131 131
  author_id: 2
132 132
  status_id: 1
133 133
  start_date: <%= 10.days.ago.to_s(:db) %>
134
  due_date: <%= Date.today.to_s(:db) %>
134
  due_date: <%= Date.current.to_s(:db) %>
135 135
  lock_version: 0
136 136
  root_id: 7
137 137
  lft: 1
......
171 171
  assigned_to_id:
172 172
  author_id: 2
173 173
  status_id: 1
174
  start_date: <%= Date.today.to_s(:db) %>
174
  start_date: <%= Date.current.to_s(:db) %>
175 175
  due_date: <%= 1.days.from_now.to_date.to_s(:db) %>
176 176
  root_id: 9
177 177
  lft: 1
......
190 190
  assigned_to_id:
191 191
  author_id: 2
192 192
  status_id: 1
193
  start_date: <%= Date.today.to_s(:db) %>
193
  start_date: <%= Date.current.to_s(:db) %>
194 194
  due_date: <%= 1.days.from_now.to_date.to_s(:db) %>
195 195
  root_id: 10
196 196
  lft: 1
test/functional/issues_controller_test.rb
408 408
  end
409 409

  
410 410
  def test_index_grouped_by_created_on_if_time_zone_is_utc
411
    # TODO: test fails with mysql
412
    skip if mysql?
413 411
    skip unless IssueQuery.new.groupable_columns.detect {|c| c.name == :created_on}
414

  
415
    @request.session[:user_id] = 2
416
    User.find(2).pref.update(time_zone: 'UTC')
412
    current_user = User.find(2)
413
    @request.session[:user_id] = current_user.id
414
    current_user.pref.update(time_zone: 'UTC')
417 415

  
418 416
    get(
419 417
      :index,
......
424 422
    )
425 423
    assert_response :success
426 424

  
427
    assert_select 'tr.group span.name', :text => '07/19/2006' do
425
    group_name = format_date(current_user.convert_time_to_user_timezone(issues(:issues_002).created_on))
426
    assert_select 'tr.group span.name', :text => group_name do
428 427
      assert_select '+ span.count', :text => '2'
429 428
    end
430 429
  end
......
444 443
    )
445 444
    assert_response :success
446 445

  
447
    # group_name depends on localtime
448
    group_name = format_date(Issue.second.created_on.localtime)
446
    group_name = format_date(current_user.convert_time_to_user_timezone(issues(:issues_002).created_on))
449 447
    assert_select 'tr.group span.name', :text => group_name do
450 448
      assert_select '+ span.count', :text => '2'
451 449
    end
......
3381 3379
      )
3382 3380
      assert_response :success
3383 3381
      assert_select 'input[name=?][value=?]', 'issue[start_date]',
3384
                    Date.today.to_s
3382
                    Date.current.to_s
3385 3383
    end
3386 3384
  end
3387 3385

  
......
3831 3829
                           :id => Issue.last.id
3832 3830
      issue = Issue.find_by_subject('This is the test_new issue')
3833 3831
      assert_not_nil issue
3834
      assert_equal Date.today, issue.start_date
3832
      assert_equal Date.current, issue.start_date
3835 3833
    end
3836 3834
  end
3837 3835

  
test/helpers/application_helper_test.rb
1505 1505

  
1506 1506
  def test_due_date_distance_in_words
1507 1507
    to_test = {
1508
      Date.today => 'Due in 0 days',
1509
      Date.today + 1 => 'Due in 1 day',
1510
      Date.today + 100 => 'Due in about 3 months',
1511
      Date.today + 20000 => 'Due in over 54 years',
1512
      Date.today - 1 => '1 day late',
1513
      Date.today - 100 => 'about 3 months late',
1514
      Date.today - 20000 => 'over 54 years late',
1508
      Date.current => 'Due in 0 days',
1509
      Date.current + 1 => 'Due in 1 day',
1510
      Date.current + 100 => 'Due in about 3 months',
1511
      Date.current + 20000 => 'Due in over 54 years',
1512
      Date.current - 1 => '1 day late',
1513
      Date.current - 100 => 'about 3 months late',
1514
      Date.current - 20000 => 'over 54 years late',
1515 1515
    }
1516 1516
    ::I18n.locale = :en
1517 1517
    to_test.each do |date, expected|
test/helpers/settings_helper_test.rb
24 24
  include ERB::Util
25 25

  
26 26
  def test_date_format_setting_options_should_include_human_readable_format
27
    Date.stubs(:today).returns(Date.parse("2015-07-14"))
28

  
29
    options = date_format_setting_options('en')
30
    assert_include ["2015-07-14 (yyyy-mm-dd)", "%Y-%m-%d"], options
27
    travel_to Date.parse("2015-07-14") do
28
      options = date_format_setting_options('en')
29
      assert_include ["2015-07-14 (yyyy-mm-dd)", "%Y-%m-%d"], options
30
    end
31 31
  end
32 32
end
test/unit/lib/redmine/helpers/gantt_test.rb
37 37
  end
38 38

  
39 39
  def today
40
    @today ||= Date.today
40
    @today ||= Date.current
41 41
  end
42 42
  private :today
43 43

  
......
364 364
    create_gantt
365 365
    [gantt_start - 1, gantt_start].each do |start_date|
366 366
      @output_buffer = @gantt.line(start_date, gantt_start, 30, false, 'line', :format => :html, :zoom => 4)
367
      # the leftmost date (Date.today - 14 days)
367
      # the leftmost date (Date.current - 14 days)
368 368
      assert_select 'div.task_todo[style*="left:0px"]', 1, @output_buffer
369 369
      assert_select 'div.task_todo[style*="width:2px"]', 1, @output_buffer
370 370
    end
......
374 374
    create_gantt
375 375
    [gantt_end, gantt_end + 1].each do |end_date|
376 376
      @output_buffer = @gantt.line(gantt_end, end_date, 30, false, 'line', :format => :html, :zoom => 4)
377
      # the rightmost date (Date.today + 14 days)
377
      # the rightmost date (Date.current + 14 days)
378 378
      assert_select 'div.task_todo[style*="left:112px"]', 1, @output_buffer
379 379
      assert_select 'div.task_todo[style*="width:2px"]', 1, @output_buffer
380 380
    end
test/unit/lib/redmine/i18n_test.rb
88 88

  
89 89
  def test_time_format
90 90
    set_language_if_valid 'en'
91
    now = Time.parse('2011-02-20 15:45:22')
91
    now = Time.zone.parse('2011-02-20 15:45:22')
92 92
    with_settings :time_format => '%H:%M' do
93 93
      with_settings :date_format => '' do
94
        assert_equal '02/20/2011 15:45', format_time(now)
95
        assert_equal '15:45', format_time(now, false)
94
        assert_equal now.strftime('%m/%d/%Y %H:%M'), format_time(now)
95
        assert_equal now.strftime('%H:%M'), format_time(now, false)
96 96
      end
97 97
      with_settings :date_format => '%Y-%m-%d' do
98
        assert_equal '2011-02-20 15:45', format_time(now)
99
        assert_equal '15:45', format_time(now, false)
98
        assert_equal now.strftime('%Y-%m-%d %H:%M'), format_time(now)
99
        assert_equal now.strftime('%H:%M'), format_time(now, false)
100 100
      end
101 101
    end
102 102
  end
103 103

  
104 104
  def test_time_format_default
105 105
    set_language_if_valid 'en'
106
    now = Time.parse('2011-02-20 15:45:22')
106
    now = Time.zone.parse('2011-02-20 15:45:22')
107 107
    with_settings :time_format => '' do
108 108
      with_settings :date_format => '' do
109
        assert_equal '02/20/2011 03:45 PM', format_time(now)
110
        assert_equal '03:45 PM', format_time(now, false)
109
        assert_equal now.strftime('%m/%d/%Y %I:%M %p'), format_time(now)
110
        assert_equal now.strftime('%I:%M %p'), format_time(now, false)
111 111
      end
112 112
      with_settings :date_format => '%Y-%m-%d' do
113
        assert_equal '2011-02-20 03:45 PM', format_time(now)
114
        assert_equal '03:45 PM', format_time(now, false)
113
        assert_equal now.strftime('%Y-%m-%d %I:%M %p'), format_time(now)
114
        assert_equal now.strftime('%I:%M %p'), format_time(now, false)
115 115
      end
116 116
    end
117 117
  end
118 118

  
119 119
  def test_utc_time_format
120 120
    set_language_if_valid 'en'
121
    now = Time.now
121
    now = Time.current
122 122
    with_settings :date_format => '%d %m %Y', :time_format => '%H %M' do
123
      assert_equal now.localtime.strftime('%d %m %Y %H %M'), format_time(now.utc), "User time zone was #{User.current.time_zone}"
124
      assert_equal now.localtime.strftime('%H %M'), format_time(now.utc, false)
123
      assert_equal now.strftime('%d %m %Y %H %M'), format_time(now.utc), "User time zone was #{User.current.time_zone}"
124
      assert_equal now.strftime('%H %M'), format_time(now.utc, false)
125 125
    end
126 126
  end
127 127

  
test/unit/mail_handler_test.rb
289 289
    with_settings :default_issue_start_date_to_creation_date => '1' do
290 290
      issue = submit_email('ticket_with_cc.eml', :issue => {:project => 'ecookbook'})
291 291
      assert issue.is_a?(Issue)
292
      assert_equal Date.today, issue.start_date
292
      assert_equal Date.current, issue.start_date
293 293
    end
294 294
  end
295 295

  
test/unit/mailer_test.rb
685 685
  end
686 686

  
687 687
  def test_reminders
688
    users(:users_003).pref.update_attribute :time_zone, 'UTC' # dlopper
689 688
    days = 42
690 689
    Mailer.reminders(:days => days)
691 690
    assert_equal 1, ActionMailer::Base.deliveries.size
......
709 708
    with_settings :default_language => 'fr' do
710 709
      user = User.find(3)
711 710
      user.update_attribute :language, ''
712
      user.pref.update_attribute :time_zone, 'UTC'
713 711
      Mailer.reminders(:days => 42)
714 712
      assert_equal 1, ActionMailer::Base.deliveries.size
715 713
      mail = last_email
......
736 734
  end
737 735

  
738 736
  def test_reminders_for_users
739
    users(:users_003).pref.update_attribute :time_zone, 'UTC' # dlopper
740 737
    Mailer.reminders(:days => 42, :users => ['5'])
741 738
    assert_equal 0, ActionMailer::Base.deliveries.size # No mail for dlopper
742 739
    Mailer.reminders(:days => 42, :users => ['3'])
......
752 749
      Member.create!(:project_id => 1, :principal => group, :role_ids => [1])
753 750
      [users(:users_002), users(:users_003)].each do |user| # jsmith, dlopper
754 751
        group.users << user
755
        user.pref.update_attribute :time_zone, 'UTC'
756 752
      end
757 753

  
758 754
      Issue.update_all(:assigned_to_id => nil)
......
810 806

  
811 807
  def test_reminders_should_sort_issues_by_due_date
812 808
    user = User.find(2)
813
    user.pref.update_attribute :time_zone, 'UTC'
814 809
    Issue.generate!(:assigned_to => user, :due_date => 2.days.from_now, :subject => 'quux')
815 810
    Issue.generate!(:assigned_to => user, :due_date => 0.days.from_now, :subject => 'baz')
816 811
    Issue.generate!(:assigned_to => user, :due_date => 1.days.from_now, :subject => 'qux')
test/unit/query_test.rb
523 523
    assert !query.valid?
524 524
  end
525 525

  
526
  def test_date_filter_should_not_accept_invalid_timestamp_values
527
    query = IssueQuery.new(:name => '_')
528
    query.add_filter('created_on', '=', ['2011-01-30T24:00:01'])
529

  
530
    assert query.has_filter?('created_on')
531
    assert !query.valid?
532
  end
533

  
526 534
  def test_relative_date_filter_should_not_accept_non_integer_values
527 535
    query = IssueQuery.new(:name => '_')
528 536
    query.add_filter('created_on', '>t-', ['a'])
......
534 542
  def test_operator_date_equals
535 543
    query = IssueQuery.new(:name => '_')
536 544
    query.add_filter('due_date', '=', ['2011-07-10'])
537
    assert_match /issues\.due_date > '#{quoted_date "2011-07-09"} 23:59:59(\.\d+)?' AND issues\.due_date <= '#{quoted_date "2011-07-10"} 23:59:59(\.\d+)?/,
545
    assert_match /issues\.due_date >= '#{quoted_date '2011-07-10'}' AND issues\.due_date <= '#{quoted_date '2011-07-10'}'/,
538 546
                 query.statement
539 547
    find_issues_with_query(query)
548

  
549
    query = IssueQuery.new(:name => '_')
550
    query.add_filter('updated_on', '=', ['2011-07-10'])
551
    assert_match /issues\.updated_on > '#{quoted_date Time.zone.parse('2011-07-09').end_of_day}' AND issues\.updated_on <= '#{quoted_date Time.zone.parse('2011-07-10').end_of_day}'/,
552
                 query.statement
553
    find_issues_with_query(query)
554
  end
555

  
556
  def test_operator_date_equals_with_timestamp
557
    query = IssueQuery.new(:name => '_')
558
    query.add_filter('due_date', '=', ['2011-07-10T19:13:52'])
559
    assert_match /issues\.due_date >= '#{quoted_date '2011-07-10T19:13:52'}' AND issues\.due_date <= '#{quoted_date '2011-07-10T19:13:52'}'/, query.statement
560
    find_issues_with_query(query)
561

  
562
    query = IssueQuery.new(:name => '_')
563
    query.add_filter('updated_on', '=', ['2011-07-10T19:13:52'])
564
    assert_match /issues\.updated_on > '#{quoted_date '2011-07-10T19:13:51'.to_time}' AND issues\.updated_on <= '#{quoted_date '2011-07-10T19:13:52'.to_time}'/, query.statement
565
    find_issues_with_query(query)
540 566
  end
541 567

  
542 568
  def test_operator_date_lesser_than
543 569
    query = IssueQuery.new(:name => '_')
544 570
    query.add_filter('due_date', '<=', ['2011-07-10'])
545
    assert_match /issues\.due_date <= '#{quoted_date "2011-07-10"} 23:59:59(\.\d+)?/, query.statement
571
    assert_match /issues\.due_date <= '#{quoted_date '2011-07-10'}'/, query.statement
572
    find_issues_with_query(query)
573

  
574
    query = IssueQuery.new(:name => '_')
575
    query.add_filter('updated_on', '<=', ['2011-07-10'])
576
    assert_match /issues\.updated_on <= '#{quoted_date Time.zone.parse('2011-07-10').end_of_day}'/, query.statement
546 577
    find_issues_with_query(query)
547 578
  end
548 579

  
549 580
  def test_operator_date_lesser_than_with_timestamp
581
    query = IssueQuery.new(:name => '_')
582
    query.add_filter('due_date', '<=', ['2011-07-10T19:13:52'])
583
    assert_match /issues\.due_date <= '#{quoted_date '2011-07-10T19:13:52'}/, query.statement
584
    find_issues_with_query(query)
585

  
550 586
    query = IssueQuery.new(:name => '_')
551 587
    query.add_filter('updated_on', '<=', ['2011-07-10T19:13:52'])
552
    assert_match /issues\.updated_on <= '#{quoted_date "2011-07-10"} 19:13:52/, query.statement
588
    assert_match /issues\.updated_on <= '#{quoted_date '2011-07-10T19:13:52'.to_time}/, query.statement
553 589
    find_issues_with_query(query)
554 590
  end
555 591

  
556 592
  def test_operator_date_greater_than
557 593
    query = IssueQuery.new(:name => '_')
558 594
    query.add_filter('due_date', '>=', ['2011-07-10'])
559
    assert_match /issues\.due_date > '#{quoted_date "2011-07-09"} 23:59:59(\.\d+)?'/, query.statement
595
    assert_match /issues\.due_date >= '#{quoted_date '2011-07-10'}'/, query.statement
596
    find_issues_with_query(query)
597

  
598
    query = IssueQuery.new(:name => '_')
599
    query.add_filter('updated_on', '>=', ['2011-07-10'])
600
    assert_match /issues\.updated_on > '#{quoted_date Time.zone.parse('2011-07-09').end_of_day}'/, query.statement
560 601
    find_issues_with_query(query)
561 602
  end
562 603

  
563 604
  def test_operator_date_greater_than_with_timestamp
605
    query = IssueQuery.new(:name => '_')
606
    query.add_filter('due_date', '>=', ['2011-07-10T19:13:52'])
607
    assert_match /issues\.due_date >= '#{quoted_date '2011-07-10T19:13:52'}'/, query.statement
608
    find_issues_with_query(query)
609

  
564 610
    query = IssueQuery.new(:name => '_')
565 611
    query.add_filter('updated_on', '>=', ['2011-07-10T19:13:52'])
566
    assert_match /issues\.updated_on > '#{quoted_date "2011-07-10"} 19:13:51(\.0+)?'/, query.statement
612
    assert_match /issues\.updated_on > '#{quoted_date '2011-07-10T19:13:51'.to_time}'/, query.statement
567 613
    find_issues_with_query(query)
568 614
  end
569 615

  
570 616
  def test_operator_date_between
571 617
    query = IssueQuery.new(:name => '_')
572 618
    query.add_filter('due_date', '><', ['2011-06-23', '2011-07-10'])
573
    assert_match /issues\.due_date > '#{quoted_date "2011-06-22"} 23:59:59(\.\d+)?' AND issues\.due_date <= '#{quoted_date "2011-07-10"} 23:59:59(\.\d+)?'/,
619
    assert_match /issues\.due_date >= '#{quoted_date '2011-06-23'}' AND issues\.due_date <= '#{quoted_date '2011-07-10'}'/,
620
                 query.statement
621
    find_issues_with_query(query)
622

  
623
    query = IssueQuery.new(:name => '_')
624
    query.add_filter('updated_on', '><', ['2011-06-23', '2011-07-10'])
625
    assert_match /issues\.updated_on > '#{quoted_date Time.zone.parse('2011-06-22').end_of_day}' AND issues\.updated_on <= '#{quoted_date Time.zone.parse('2011-07-10').end_of_day}'/,
626
                 query.statement
627
    find_issues_with_query(query)
628
  end
629

  
630
  def test_operator_date_between_with_timestamp
631
    query = IssueQuery.new(:name => '_')
632
    query.add_filter('due_date', '><', ['2011-06-23T19:13:52', '2011-07-10T19:13:52'])
633
    assert_match /issues\.due_date >= '#{quoted_date '2011-06-23T19:13:52'}' AND issues\.due_date <= '#{quoted_date '2011-07-10T19:13:52'}'/,
634
                 query.statement
635
    find_issues_with_query(query)
636

  
637
    query = IssueQuery.new(:name => '_')
638
    query.add_filter('updated_on', '><', ['2011-06-23T19:13:52', '2011-07-10T19:13:52'])
639
    assert_match /issues\.updated_on > '#{quoted_date '2011-06-23T19:13:51'.to_time}' AND issues\.updated_on <= '#{quoted_date '2011-07-10T19:13:52'.to_time}'/,
574 640
                 query.statement
575 641
    find_issues_with_query(query)
576 642
  end
577 643

  
578 644
  def test_operator_in_more_than
579
    Issue.find(7).update_attribute(:due_date, (Date.today + 15))
645
    Issue.find(7).update_attribute(:due_date, (Date.current + 15))
580 646
    query = IssueQuery.new(:project => Project.find(1), :name => '_')
581 647
    query.add_filter('due_date', '>t+', ['15'])
582 648
    issues = find_issues_with_query(query)
583 649
    assert !issues.empty?
584
    issues.each {|issue| assert(issue.due_date >= (Date.today + 15))}
650
    issues.each {|issue| assert(issue.due_date >= (Date.current + 15))}
585 651
  end
586 652

  
587 653
  def test_operator_in_less_than
......
589 655
    query.add_filter('due_date', '<t+', ['15'])
590 656
    issues = find_issues_with_query(query)
591 657
    assert !issues.empty?
592
    issues.each {|issue| assert(issue.due_date <= (Date.today + 15))}
658
    issues.each {|issue| assert(issue.due_date <= (Date.current + 15))}
593 659
  end
594 660

  
595 661
  def test_operator_in_the_next_days
......
597 663
    query.add_filter('due_date', '><t+', ['15'])
598 664
    issues = find_issues_with_query(query)
599 665
    assert !issues.empty?
600
    issues.each {|issue| assert(issue.due_date >= Date.today && issue.due_date <= (Date.today + 15))}
666
    issues.each {|issue| assert(issue.due_date >= Date.current && issue.due_date <= (Date.current + 15))}
601 667
  end
602 668

  
603 669
  def test_operator_less_than_ago
604
    Issue.find(7).update_attribute(:due_date, (Date.today - 3))
670
    Issue.find(7).update_attribute(:due_date, (Date.current - 3))
605 671
    query = IssueQuery.new(:project => Project.find(1), :name => '_')
606 672
    query.add_filter('due_date', '>t-', ['3'])
607 673
    issues = find_issues_with_query(query)
608 674
    assert !issues.empty?
609
    issues.each {|issue| assert(issue.due_date >= (Date.today - 3))}
675
    issues.each {|issue| assert(issue.due_date >= (Date.current - 3))}
610 676
  end
611 677

  
612 678
  def test_operator_in_the_past_days
613
    Issue.find(7).update_attribute(:due_date, (Date.today - 3))
679
    Issue.find(7).update_attribute(:due_date, (Date.current - 3))
614 680
    query = IssueQuery.new(:project => Project.find(1), :name => '_')
615 681
    query.add_filter('due_date', '><t-', ['3'])
616 682
    issues = find_issues_with_query(query)
617 683
    assert !issues.empty?
618
    issues.each {|issue| assert(issue.due_date >= (Date.today - 3) && issue.due_date <= Date.today)}
684
    issues.each {|issue| assert(issue.due_date >= (Date.current - 3) && issue.due_date <= Date.current)}
619 685
  end
620 686

  
621 687
  def test_operator_more_than_ago
622
    Issue.find(7).update_attribute(:due_date, (Date.today - 10))
688
    Issue.find(7).update_attribute(:due_date, (Date.current - 10))
623 689
    query = IssueQuery.new(:project => Project.find(1), :name => '_')
624 690
    query.add_filter('due_date', '<t-', ['10'])
625 691
    assert query.statement.include?("#{Issue.table_name}.due_date <=")
626 692
    issues = find_issues_with_query(query)
627 693
    assert !issues.empty?
628
    issues.each {|issue| assert(issue.due_date <= (Date.today - 10))}
694
    issues.each {|issue| assert(issue.due_date <= (Date.current - 10))}
629 695
  end
630 696

  
631 697
  def test_operator_in
632
    Issue.find(7).update_attribute(:due_date, (Date.today + 2))
698
    Issue.find(7).update_attribute(:due_date, (Date.current + 2))
633 699
    query = IssueQuery.new(:project => Project.find(1), :name => '_')
634 700
    query.add_filter('due_date', 't+', ['2'])
635 701
    issues = find_issues_with_query(query)
636 702
    assert !issues.empty?
637
    issues.each {|issue| assert_equal((Date.today + 2), issue.due_date)}
703
    issues.each {|issue| assert_equal((Date.current + 2), issue.due_date)}
638 704
  end
639 705

  
640 706
  def test_operator_ago
641
    Issue.find(7).update_attribute(:due_date, (Date.today - 3))
707
    Issue.find(7).update_attribute(:due_date, (Date.current - 3))
642 708
    query = IssueQuery.new(:project => Project.find(1), :name => '_')
643 709
    query.add_filter('due_date', 't-', ['3'])
644 710
    issues = find_issues_with_query(query)
645 711
    assert !issues.empty?
646
    issues.each {|issue| assert_equal((Date.today - 3), issue.due_date)}
712
    issues.each {|issue| assert_equal((Date.current - 3), issue.due_date)}
647 713
  end
648 714

  
649 715
  def test_operator_today
......
651 717
    query.add_filter('due_date', 't', [''])
652 718
    issues = find_issues_with_query(query)
653 719
    assert !issues.empty?
654
    issues.each {|issue| assert_equal Date.today, issue.due_date}
720
    issues.each {|issue| assert_equal Date.current, issue.due_date}
655 721
  end
656 722

  
657 723
  def test_operator_tomorrow
......
714 780
  end
715 781

  
716 782
  def test_range_for_this_week_with_week_starting_on_monday
717
    I18n.locale = :fr
718
    assert_equal '1', I18n.t(:general_first_day_of_week)
719

  
720
    Date.stubs(:today).returns(Date.parse('2011-04-29'))
721

  
722
    query = IssueQuery.new(:project => Project.find(1), :name => '_')
723
    query.add_filter('due_date', 'w', [''])
724
    assert_match /issues\.due_date > '#{quoted_date "2011-04-24"} 23:59:59(\.\d+)?' AND issues\.due_date <= '#{quoted_date "2011-05-01"} 23:59:59(\.\d+)?/,
725
                 query.statement
726
    I18n.locale = :en
783
    with_locale :fr do
784
      assert_equal '1', I18n.t(:general_first_day_of_week)
785

  
786
      travel_to Date.parse('2011-04-29') do
787
        query = IssueQuery.new(:project => Project.find(1), :name => '_')
788
        query.add_filter('due_date', 'w', [''])
789
        assert_match /issues\.due_date >= '#{quoted_date '2011-04-25'}' AND issues\.due_date <= '#{quoted_date '2011-05-01'}'/,
790
                     query.statement
791
      end
792
    end
727 793
  end
728 794

  
729 795
  def test_range_for_this_week_with_week_starting_on_sunday
730
    I18n.locale = :en
731
    assert_equal '7', I18n.t(:general_first_day_of_week)
732

  
733
    Date.stubs(:today).returns(Date.parse('2011-04-29'))
734

  
735
    query = IssueQuery.new(:project => Project.find(1), :name => '_')
736
    query.add_filter('due_date', 'w', [''])
737
    assert_match /issues\.due_date > '#{quoted_date "2011-04-23"} 23:59:59(\.\d+)?' AND issues\.due_date <= '#{quoted_date "2011-04-30"} 23:59:59(\.\d+)?/,
738
                 query.statement
796
    with_locale :en do
797
      assert_equal '7', I18n.t(:general_first_day_of_week)
798

  
799
      travel_to Date.parse('2011-04-29') do
800
        query = IssueQuery.new(:project => Project.find(1), :name => '_')
801
        query.add_filter('due_date', 'w', [''])
802
        assert_match /issues\.due_date >= '#{quoted_date '2011-04-24'}' AND issues\.due_date <= '#{quoted_date '2011-04-30'}'/,
803
                     query.statement
804
      end
805
    end
739 806
  end
740 807

  
741 808
  def test_range_for_next_week_with_week_starting_on_monday
742
    I18n.locale = :fr
743
    assert_equal '1', I18n.t(:general_first_day_of_week)
744

  
745
    Date.stubs(:today).returns(Date.parse('2011-04-29')) # Friday
746

  
747
    query = IssueQuery.new(:project => Project.find(1), :name => '_')
748
    query.add_filter('due_date', 'nw', [''])
749
    assert_match /issues\.due_date > '#{quoted_date "2011-05-01"} 23:59:59(\.\d+)?' AND issues\.due_date <= '#{quoted_date "2011-05-08"} 23:59:59(\.\d+)?/,
750
                 query.statement
751
    I18n.locale = :en
809
    with_locale :fr do
810
      assert_equal '1', I18n.t(:general_first_day_of_week)
811

  
812
      travel_to Date.parse('2011-04-29') do
813
        query = IssueQuery.new(:project => Project.find(1), :name => '_')
814
        query.add_filter('due_date', 'nw', [''])
815
        assert_match /issues\.due_date >= '#{quoted_date '2011-05-02'}' AND issues\.due_date <= '#{quoted_date '2011-05-08'}'/,
816
                     query.statement
817
      end
818
    end
752 819
  end
753 820

  
754 821
  def test_range_for_next_week_with_week_starting_on_sunday
755
    I18n.locale = :en
756
    assert_equal '7', I18n.t(:general_first_day_of_week)
757

  
758
    Date.stubs(:today).returns(Date.parse('2011-04-29')) # Friday
759

  
760
    query = IssueQuery.new(:project => Project.find(1), :name => '_')
761
    query.add_filter('due_date', 'nw', [''])
762
    assert_match /issues\.due_date > '#{quoted_date "2011-04-30"} 23:59:59(\.\d+)?' AND issues\.due_date <= '#{quoted_date "2011-05-07"} 23:59:59(\.\d+)?/,
763
                 query.statement
822
    with_locale :en do
823
      assert_equal '7', I18n.t(:general_first_day_of_week)
824

  
825
      travel_to Date.parse('2011-04-29') do
826
        query = IssueQuery.new(:project => Project.find(1), :name => '_')
827
        query.add_filter('due_date', 'nw', [''])
828
        assert_match /issues\.due_date >= '#{quoted_date '2011-05-01'}' AND issues\.due_date <= '#{quoted_date '2011-05-07'}'/,
829
                     query.statement
830
      end
831
    end
764 832
  end
765 833

  
766 834
  def test_range_for_next_month
767
    Date.stubs(:today).returns(Date.parse('2011-04-29')) # Friday
768

  
769
    query = IssueQuery.new(:project => Project.find(1), :name => '_')
770
    query.add_filter('due_date', 'nm', [''])
771
    assert_match /issues\.due_date > '#{quoted_date "2011-04-30"} 23:59:59(\.\d+)?' AND issues\.due_date <= '#{quoted_date "2011-05-31"} 23:59:59(\.\d+)?/,
772
                 query.statement
835
    travel_to Date.parse('2011-04-29') do
836
      query = IssueQuery.new(:project => Project.find(1), :name => '_')
837
      query.add_filter('due_date', 'nm', [''])
838
      assert_match /issues\.due_date >= '#{quoted_date '2011-05-01'}' AND issues\.due_date <= '#{quoted_date '2011-05-31'}'/,
839
                   query.statement
840
    end
773 841
  end
774 842

  
775 843
  def test_filter_assigned_to_me
test/unit/user_test.rb
578 578

  
579 579
  def test_today_should_return_the_day_according_to_user_time_zone
580 580
    preference = User.find(1).pref
581
    date = Date.new(2012, 05, 15)
582
    time = Time.gm(2012, 05, 15, 23, 30).utc # 2012-05-15 23:30 UTC
583
    Date.stubs(:today).returns(date)
584
    Time.stubs(:now).returns(time)
585

  
586
    preference.update_attribute :time_zone, 'Baku' # UTC+4
587
    assert_equal '2012-05-16', User.find(1).today.to_s
581
    travel_to Time.gm(2012, 05, 15, 23, 30).utc do
582
      preference.update_attribute :time_zone, 'Baku' # UTC+4
583
      assert_equal '2012-05-16', User.find(1).today.to_s
588 584

  
589
    preference.update_attribute :time_zone, 'La Paz' # UTC-4
590
    assert_equal '2012-05-15', User.find(1).today.to_s
585
      preference.update_attribute :time_zone, 'La Paz' # UTC-4
586
      assert_equal '2012-05-15', User.find(1).today.to_s
591 587

  
592
    preference.update_attribute :time_zone, ''
593
    assert_equal '2012-05-15', User.find(1).today.to_s
588
      preference.update_attribute :time_zone, ''
589
      assert_equal Date.current.to_s, User.find(1).today.to_s
590
    end
594 591
  end
595 592

  
596 593
  def test_time_to_date_should_return_the_date_according_to_user_time_zone
......
604 601
    assert_equal '2012-05-15', User.find(1).time_to_date(time).to_s
605 602

  
606 603
    preference.update_attribute :time_zone, ''
607
    assert_equal time.localtime.to_date.to_s, User.find(1).time_to_date(time).to_s
604
    user = User.find(1)
605
    assert_equal time.in_time_zone(user.time_zone).to_date.to_s, user.time_to_date(time).to_s
608 606
  end
609 607

  
610 608
  def test_convert_time_to_user_timezone_should_return_the_time_according_to_user_time_zone
......
619 617
    assert_equal '2012-05-15 19:30:00 -0400', User.find(1).convert_time_to_user_timezone(time).to_s
620 618

  
621 619
    preference.update_attribute :time_zone, ''
622
    assert_equal time.localtime.to_s, User.find(1).convert_time_to_user_timezone(time).to_s
623
    assert_equal time_not_utc, User.find(1).convert_time_to_user_timezone(time_not_utc)
620
    user = User.find(1)
621
    assert_equal time.in_time_zone(user.time_zone).to_s, user.convert_time_to_user_timezone(time).to_s
622
    assert_equal time_not_utc, user.convert_time_to_user_timezone(time_not_utc)
624 623
  end
625 624

  
626 625
  def test_fields_for_order_statement_should_return_fields_according_user_format_setting
test/unit/version_test.rb
158 158
  end
159 159

  
160 160
  def test_completed_should_be_false_when_due_today
161
    version = Version.create!(:project_id => 1, :effective_date => Date.today, :name => 'Due today')
161
    version = Version.create!(:project_id => 1, :effective_date => Date.current, :name => 'Due today')
162 162
    assert_equal false, version.completed?
163 163
  end
164 164

  
(1-1/2)