Files
grecia/spec/models/concerns/globalizable.rb
Javi Martín e49c32638d Use if instead of skip to skip tests
This way the tests won't appear as "pending" when running the test
suite, and so we get rid of a lot of noise in the test results. There
doesn't seem to be a way to call `skip` without the test being marked as
"pending".

Note that in the globalizable tests we need to build a factory before
deciding whether an atribute is required or not (particularly for the
milestone factory, since milestone attributes are required depending on
the presence of other attributes). This isn't possible before we're
inside the test, so we can't add an `if:` condition to the test. So
we're adding the condition inside the test instead. A minor
inconvenience of this method is the test still runs even when the
condition is `false`.
2022-04-07 15:34:10 +02:00

192 lines
5.8 KiB
Ruby

require "spec_helper"
shared_examples_for "globalizable" do |factory_name|
let(:record) do
if factory_name == :budget_phase
create(:budget).phases.last
else
create(factory_name)
end
end
let(:fields) { record.translated_attribute_names }
let(:required_fields) { fields.select { |field| record.send(:required_attribute?, field) } }
let(:attribute) { required_fields.sample || fields.sample }
before do
record.update!(attribute => "In English")
I18n.with_locale(:es) do
record.update!(required_fields.map { |field| [field, "En español"] }.to_h)
record.update!(attribute => "En español")
end
record.reload
end
describe "Add a translation" do
it "Maintains existing translations" do
record.update!(translations_attributes: [
{ locale: :fr }.merge(fields.map { |field| [field, "En Français"] }.to_h)
])
record.reload
expect(record.send(attribute)).to eq "In English"
I18n.with_locale(:es) { expect(record.send(attribute)).to eq "En español" }
I18n.with_locale(:fr) { expect(record.send(attribute)).to eq "En Français" }
end
it "Works with non-underscored locale name" do
record.update!(translations_attributes: [
{ locale: :"pt-BR" }.merge(fields.map { |field| [field, "Português"] }.to_h)
])
record.reload
expect(record.send(attribute)).to eq "In English"
I18n.with_locale(:es) { expect(record.send(attribute)).to eq "En español" }
I18n.with_locale(:"pt-BR") { expect(record.send(attribute)).to eq "Português" }
end
it "Does not create invalid translations in the database" do
if required_fields.any?
record.update(translations_attributes: [{ locale: :fr }])
expect(record.translations.map(&:locale)).to match_array %i[en es fr]
record.reload
expect(record.translations.map(&:locale)).to match_array %i[en es]
end
end
it "Does not automatically add a translation for the current locale" do
record.translations.destroy_all
record.reload
record.update!(translations_attributes: [
{ locale: :de }.merge(fields.map { |field| [field, "Deutsche Sprache"] }.to_h)
])
record.reload
expect(record.translations.map(&:locale)).to eq [:de]
end
end
describe "Update a translation" do
it "Changes the existing translation" do
record.update!(translations_attributes: [
{ id: record.translations.find_by(locale: :es).id, attribute => "Actualizado" }
])
record.reload
expect(record.send(attribute)).to eq "In English"
I18n.with_locale(:es) { expect(record.send(attribute)).to eq "Actualizado" }
end
it "Does not save invalid translations" do
if required_fields.any?
record.update(translations_attributes: [
{ id: record.translations.find_by(locale: :es).id, attribute => "" }
])
I18n.with_locale(:es) { expect(record.send(attribute)).to eq "" }
record.reload
I18n.with_locale(:es) { expect(record.send(attribute)).to eq "En español" }
end
end
it "Does not automatically add a translation for the current locale" do
record.translations.find_by(locale: :en).destroy!
record.reload
record.update!(translations_attributes: [
{ id: record.translations.first.id }.merge(fields.map { |field| [field, "Actualizado"] }.to_h)
])
record.reload
expect(record.translations.map(&:locale)).to eq [:es]
end
end
describe "Remove a translation" do
it "Keeps the other languages" do
record.update!(translations_attributes: [
{ id: record.translations.find_by(locale: :en).id, _destroy: true }
])
record.reload
expect(record.translations.map(&:locale)).to eq [:es]
end
it "Does not remove all translations" do
if required_fields.any?
record.translations_attributes = [
{ id: record.translations.find_by(locale: :en).id, _destroy: true },
{ id: record.translations.find_by(locale: :es).id, _destroy: true }
]
expect(record).not_to be_valid
record.reload
expect(record.translations.map(&:locale)).to match_array %i[en es]
end
end
it "Does not remove translations when there's invalid data" do
if required_fields.any?
record.translations_attributes = [
{ id: record.translations.find_by(locale: :es).id, attribute => "" },
{ id: record.translations.find_by(locale: :en).id, _destroy: true }
]
expect(record).not_to be_valid
record.reload
expect(record.translations.map(&:locale)).to match_array %i[en es]
end
end
end
describe "Fallbacks" do
before do
I18n.with_locale(:de) do
record.update!(required_fields.map { |field| [field, "Deutsche Sprache"] }.to_h)
record.update!(attribute => "Deutsche Sprache")
end
end
it "Falls back to a defined fallback" do
allow(I18n.fallbacks).to receive(:[]).and_return([:fr, :es])
Globalize.set_fallbacks_to_all_available_locales
I18n.with_locale(:fr) do
expect(record.send(attribute)).to eq "En español"
end
end
it "Falls back to the first available locale without a defined fallback" do
allow(I18n.fallbacks).to receive(:[]).and_return([:fr])
Globalize.set_fallbacks_to_all_available_locales
I18n.with_locale(:fr) do
expect(record.send(attribute)).to eq "Deutsche Sprache"
end
end
it "Falls back to the first available locale after removing a locale" do
expect(record.send(attribute)).to eq "In English"
record.update!(translations_attributes: [
{ id: record.translations.find_by(locale: :en).id, _destroy: true }
])
expect(record.send(attribute)).to eq "Deutsche Sprache"
end
end
end