Make all translation lookup errors throw exceptions in test mode

This commit is contained in:
Tom Hughes 2019-12-16 21:39:05 +00:00
parent ac6a872a48
commit 4ee60c0f8f
3 changed files with 49 additions and 29 deletions

View file

@ -42,6 +42,12 @@ I18n.fallbacks.map("no" => "nb")
I18n.enforce_available_locales = false
if Rails.env.test?
I18n.exception_handler = proc do |exception|
raise exception.to_exception
end
end
Rails.configuration.after_initialize do
I18n.available_locales
end

View file

@ -3,51 +3,53 @@ require "test_helper"
class I18nTest < ActiveSupport::TestCase
I18n.available_locales.each do |locale|
define_method("test_#{locale.to_s.underscore}".to_sym) do
# plural_keys = plural_keys(locale)
without_i18n_exceptions do
# plural_keys = plural_keys(locale)
translation_keys.each do |key|
variables = []
translation_keys.each do |key|
variables = []
default_value = I18n.t(key, :locale => I18n.default_locale)
default_value = I18n.t(key, :locale => I18n.default_locale)
if default_value.is_a?(Hash)
variables.push("count")
if default_value.is_a?(Hash)
variables.push("count")
default_value.each_value do |subvalue|
subvalue.scan(/%\{(\w+)\}/) do
default_value.each_value do |subvalue|
subvalue.scan(/%\{(\w+)\}/) do
variables.push(Regexp.last_match(1))
end
end
else
default_value.scan(/%\{(\w+)\}/) do
variables.push(Regexp.last_match(1))
end
end
else
default_value.scan(/%\{(\w+)\}/) do
variables.push(Regexp.last_match(1))
end
end
variables.push("attribute") if key =~ /^(active(model|record)\.)?errors\./
variables.push("attribute") if key =~ /^(active(model|record)\.)?errors\./
value = I18n.t(key, :locale => locale, :fallback => true)
value = I18n.t(key, :locale => locale, :fallback => true)
if value.is_a?(Hash)
value.each do |subkey, subvalue|
# assert plural_keys.include?(subkey), "#{key}.#{subkey} is not a valid plural key"
if value.is_a?(Hash)
value.each do |subkey, subvalue|
# assert plural_keys.include?(subkey), "#{key}.#{subkey} is not a valid plural key"
next if subvalue.nil?
next if subvalue.nil?
subvalue.scan(/%\{(\w+)\}/) do
assert variables.include?(Regexp.last_match(1)), "#{key}.#{subkey} uses unknown interpolation variable #{Regexp.last_match(1)}"
subvalue.scan(/%\{(\w+)\}/) do
assert variables.include?(Regexp.last_match(1)), "#{key}.#{subkey} uses unknown interpolation variable #{Regexp.last_match(1)}"
end
end
else
assert value.is_a?(String), "#{key} is not a string"
value.scan(/%\{(\w+)\}/) do
assert variables.include?(Regexp.last_match(1)), "#{key} uses unknown interpolation variable #{Regexp.last_match(1)}"
end
end
else
assert value.is_a?(String), "#{key} is not a string"
value.scan(/%\{(\w+)\}/) do
assert variables.include?(Regexp.last_match(1)), "#{key} uses unknown interpolation variable #{Regexp.last_match(1)}"
end
end
end
assert %w[ltr rtl].include?(I18n.t("html.dir", :locale => locale)), "html.dir must be ltr or rtl"
assert %w[ltr rtl].include?(I18n.t("html.dir", :locale => locale)), "html.dir must be ltr or rtl"
end
end
end

View file

@ -42,6 +42,18 @@ module ActiveSupport
end
end
##
# execute a block with missing translation exceptions suppressed
def without_i18n_exceptions
exception_handler = I18n.exception_handler
begin
I18n.exception_handler = nil
yield
ensure
I18n.exception_handler = exception_handler
end
end
##
# work round minitest insanity that causes it to tell you
# to use assert_nil to test for nil, which is fine if you're