diff options
author | Bob Van Landuyt <bob@vanlanduyt.co> | 2018-08-16 14:15:54 +0200 |
---|---|---|
committer | Bob Van Landuyt <bob@vanlanduyt.co> | 2018-08-25 18:43:21 +0200 |
commit | 08c0a1b8527287457cb8db5f41c368af192c606b (patch) | |
tree | 2534ee8c44c34213d4d82cb8aad0d61fa326b78f /spec/rubocop | |
parent | 842377ab3c5b80a3758ad8c36dc3358bd265bc10 (diff) | |
download | gitlab-ce-08c0a1b8527287457cb8db5f41c368af192c606b.tar.gz |
Reject ruby interpolation in externalized stringsbvl-correct-interpolation-i18n
When using ruby interpolation in externalized strings, they can't be
detected. Which means they will never be presented to be translated.
To mix variables into translations we need to use `sprintf`
instead.
Instead of:
_("Hello #{subject}")
Use:
_("Hello %{subject}) % { subject: 'world' }
Diffstat (limited to 'spec/rubocop')
-rw-r--r-- | spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb b/spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb new file mode 100644 index 00000000000..7bd50866577 --- /dev/null +++ b/spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +require 'spec_helper' + +require 'rubocop' +require 'rubocop/rspec/support' + +require_relative '../../../rubocop/cop/ruby_interpolation_in_translation' + +# Disabling interpolation check as we deliberately want to have #{} in strings. +# rubocop:disable Lint/InterpolationCheck +describe RuboCop::Cop::RubyInterpolationInTranslation do + subject(:cop) { described_class.new } + + it 'does not add an offence for a regular messages' do + inspect_source('_("Hello world")') + + expect(cop.offenses).to be_empty + end + + it 'adds the correct offence when using interpolation in a string' do + inspect_source('_("Hello #{world}")') + + offense = cop.offenses.first + + expect(offense.location.source).to eq('#{world}') + expect(offense.message).to eq('Don\'t use ruby interpolation #{} inside translated strings, instead use %{}') + end + + it 'detects when using a ruby interpolation in the first argument of a pluralized string' do + inspect_source('n_("Hello #{world}", "Hello world")') + + expect(cop.offenses).not_to be_empty + end + + it 'detects when using a ruby interpolation in the second argument of a pluralized string' do + inspect_source('n_("Hello world", "Hello #{world}")') + + expect(cop.offenses).not_to be_empty + end + + it 'detects when using interpolation in a namespaced translation' do + inspect_source('s_("Hello|#{world}")') + + expect(cop.offenses).not_to be_empty + end + + it 'does not add an offence for messages defined over multiple lines' do + source = <<~SRC + _("Hello "\ + "world ") + SRC + + inspect_source(source) + expect(cop.offenses).to be_empty + end + + it 'adds an offence for violations in a message defined over multiple lines' do + source = <<~SRC + _("Hello "\ + "\#{world} ") + SRC + + inspect_source(source) + expect(cop.offenses).not_to be_empty + end +end +# rubocop:enable Lint/InterpolationCheck |