aboutsummaryrefslogtreecommitdiffstats
path: root/actionview/test/template/date_helper_i18n_test.rb
blob: f100a011a83f76252a91e3a756768d4d56d51719 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# frozen_string_literal: true

require "abstract_unit"
require "active_support/core_ext/integer/time"

class DateHelperDistanceOfTimeInWordsI18nTests < ActiveSupport::TestCase
  include ActionView::Helpers::DateHelper
  attr_reader :request

  def setup
    @from = Time.utc(2004, 6, 6, 21, 45, 0)
  end

  # distance_of_time_in_words

  def test_distance_of_time_in_words_calls_i18n
    { # with include_seconds
      [2.seconds,  { include_seconds: true }]  => [:'less_than_x_seconds', 5],
      [9.seconds,  { include_seconds: true }]  => [:'less_than_x_seconds', 10],
      [19.seconds, { include_seconds: true }]  => [:'less_than_x_seconds', 20],
      [30.seconds, { include_seconds: true }]  => [:'half_a_minute',       nil],
      [59.seconds, { include_seconds: true }]  => [:'less_than_x_minutes', 1],
      [60.seconds, { include_seconds: true }]  => [:'x_minutes',           1],

      # without include_seconds
      [29.seconds,          { include_seconds: false }] => [:'less_than_x_minutes', 1],
      [60.seconds,          { include_seconds: false }] => [:'x_minutes',           1],
      [44.minutes,          { include_seconds: false }] => [:'x_minutes',           44],
      [61.minutes,          { include_seconds: false }] => [:'about_x_hours',       1],
      [24.hours,            { include_seconds: false }] => [:'x_days',              1],
      [30.days,             { include_seconds: false }] => [:'about_x_months',      1],
      [60.days,             { include_seconds: false }] => [:'x_months',            2],
      [1.year,              { include_seconds: false }] => [:'about_x_years',       1],
      [3.years + 6.months,  { include_seconds: false }] => [:'over_x_years',        3],
      [3.years + 10.months, { include_seconds: false }] => [:'almost_x_years',      4]

      }.each do |passed, expected|
      assert_distance_of_time_in_words_translates_key passed, expected
    end
  end

  def test_distance_of_time_in_words_calls_i18n_with_custom_scope
    {
      [30.days, { scope: :'datetime.distance_in_words_ago' }] => [:'about_x_months', 1],
      [60.days, { scope: :'datetime.distance_in_words_ago' }] => [:'x_months',       2],
    }.each do |passed, expected|
      assert_distance_of_time_in_words_translates_key(passed, expected, scope: :'datetime.distance_in_words_ago')
    end
  end

  def test_time_ago_in_words_passes_locale
    assert_called_with(I18n, :t, [:less_than_x_minutes, scope: :'datetime.distance_in_words', count: 1, locale: "ru"]) do
      time_ago_in_words(15.seconds.ago, locale: "ru")
    end
  end

  def test_distance_of_time_pluralizations
    { [:'less_than_x_seconds', 1]   => "less than 1 second",
      [:'less_than_x_seconds', 2]   => "less than 2 seconds",
      [:'less_than_x_minutes', 1]   => "less than a minute",
      [:'less_than_x_minutes', 2]   => "less than 2 minutes",
      [:'x_minutes',           1]   => "1 minute",
      [:'x_minutes',           2]   => "2 minutes",
      [:'about_x_hours',       1]   => "about 1 hour",
      [:'about_x_hours',       2]   => "about 2 hours",
      [:'x_days',              1]   => "1 day",
      [:'x_days',              2]   => "2 days",
      [:'about_x_years',       1]   => "about 1 year",
      [:'about_x_years',       2]   => "about 2 years",
      [:'over_x_years',        1]   => "over 1 year",
      [:'over_x_years',        2]   => "over 2 years"

      }.each do |args, expected|
      key, count = *args
      assert_equal expected, I18n.t(key, count: count, scope: "datetime.distance_in_words")
    end
  end

  def assert_distance_of_time_in_words_translates_key(passed, expected, expected_options = {})
    diff, passed_options = *passed
    key, count = *expected
    to = @from + diff

    options = { locale: "en", scope: :'datetime.distance_in_words' }.merge!(expected_options)
    options[:count] = count if count

    assert_called_with(I18n, :t, [key, options]) do
      distance_of_time_in_words(@from, to, passed_options.merge(locale: "en"))
    end
  end
end

class DateHelperSelectTagsI18nTests < ActiveSupport::TestCase
  include ActionView::Helpers::DateHelper
  attr_reader :request

  # select_month

  def test_select_month_given_use_month_names_option_does_not_translate_monthnames
    assert_not_called(I18n, :translate) do
      select_month(8, locale: "en", use_month_names: Date::MONTHNAMES)
    end
  end

  def test_select_month_translates_monthnames
    assert_called_with(I18n, :translate, [:'date.month_names', locale: "en"], returns: Date::MONTHNAMES) do
      select_month(8, locale: "en")
    end
  end

  def test_select_month_given_use_short_month_option_translates_abbr_monthnames
    assert_called_with(I18n, :translate, [:'date.abbr_month_names', locale: "en"], returns: Date::ABBR_MONTHNAMES) do
      select_month(8, locale: "en", use_short_month: true)
    end
  end

  def test_date_or_time_select_translates_prompts
    prompt_defaults = { year: "Year", month: "Month", day: "Day", hour: "Hour", minute: "Minute", second: "Seconds" }
    defaults = { [:'date.order', locale: "en", default: []] => %w(year month day) }

    prompt_defaults.each do |key, prompt|
      defaults[[("datetime.prompts." + key.to_s).to_sym, locale: "en"]] = prompt
    end

    prompts_check = -> (prompt, x) do
      @prompt_called ||= 0

      return_value = defaults[[prompt, x]]
      @prompt_called += 1 if return_value.present?

      return_value
    end

    I18n.stub(:translate, prompts_check) do
      datetime_select("post", "updated_at", locale: "en", include_seconds: true, prompt: true, use_month_names: Date::MONTHNAMES)
    end
    assert_equal defaults.count, @prompt_called
  end

  # date_or_time_select

  def test_date_or_time_select_given_an_order_options_does_not_translate_order
    assert_not_called(I18n, :translate) do
      datetime_select("post", "updated_at", order: [:year, :month, :day], locale: "en", use_month_names: Date::MONTHNAMES)
    end
  end

  def test_date_or_time_select_given_no_order_options_translates_order
    assert_called_with(I18n, :translate, [ [:'date.order', locale: "en", default: []], [:"date.month_names", { locale: "en" }] ], returns: %w(year month day)) do
      datetime_select("post", "updated_at", locale: "en")
    end
  end

  def test_date_or_time_select_given_invalid_order
    assert_called_with(I18n, :translate, [:'date.order', locale: "en", default: []], returns: %w(invalid month day)) do
      assert_raise StandardError do
        datetime_select("post", "updated_at", locale: "en")
      end
    end
  end

  def test_date_or_time_select_given_symbol_keys
    assert_called_with(I18n, :translate, [ [:'date.order', locale: "en", default: []], [:"date.month_names", { locale: "en" }] ], returns: [:year, :month, :day]) do
      datetime_select("post", "updated_at", locale: "en")
    end
  end
end