Files
grecia/spec/components/layout/locale_switcher_component_spec.rb
Javi Martín 647121d13e Allow different locales per tenant
Note that, currently, we take these settings from the database but we
don't provide a way to edit them through the admin interface, so the
locales must be manually introduced through a Rails console.

While we did consider using a comma-separated list, we're using spaces
in order to be consistent with the way we store the allowed content
types settings.

The `enabled_locales` nomenclature, which contrasts with
`available_locales`, is probably subconsciously based on similar
patterns like the one Nginx uses to enable sites.

Note that we aren't using `Setting.enabled_locales` in the globalize
initializer when setting the fallbacks. This means the following test
(which we could add to the shared globalizable examples) would fail:

```
it "Falls back to an enabled locale if the fallback is not enabled" do
  Setting["locales.default"] = "en"
  Setting["locales.enabled"] = "fr en"
  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 "In English"
  end
end
```

The reason is that the code making this test pass could be:

```
def Globalize.set_fallbacks_to_all_available_locales
  Globalize.fallbacks = I18n.available_locales.index_with do |locale|
    ((I18n.fallbacks[locale] & Setting.enabled_locales) + Setting.enabled_locales).uniq
  end
end
```

However, this would make it impossible to run `rake db:migrate` on new
applications because the initializer would try to load the `Setting`
model but the `settings` table wouldn't exist at that point.

Besides, this is a really rare case that IMHO we don't need to support.
For this scenario, an installation would have to enable a locale, create
records with contents in that locale, then disable that locale and have
that locale as a fallback for a language where content for that record
wasn't created. If that happened, it would be solved by creating content
for that record in every enabled language.
2024-06-05 16:10:56 +02:00

117 lines
3.2 KiB
Ruby

require "rails_helper"
describe Layout::LocaleSwitcherComponent do
let(:component) { Layout::LocaleSwitcherComponent.new }
around do |example|
with_request_url("/") { example.run }
end
context "with only one language" do
before { allow(I18n).to receive(:available_locales).and_return([:en]) }
it "doesn't render anything" do
render_inline component
expect(page).not_to be_rendered
end
end
context "with many languages" do
before { allow(I18n).to receive(:available_locales).and_return(%i[de en es fr nl]) }
it "renders a form to select the language" do
render_inline component
expect(page).to have_css "form"
expect(page).to have_select "Language:", options: %w[Deutsch English Español Français Nederlands]
expect(page).not_to have_css "ul"
end
it "selects the current locale" do
render_inline component
expect(page).to have_select "Language:", selected: "English"
end
context "missing language names" do
let!(:default_enforce) { I18n.enforce_available_locales }
before do
I18n.enforce_available_locales = false
allow(I18n).to receive(:available_locales).and_return(%i[de en es fr nl wl])
end
after { I18n.enforce_available_locales = default_enforce }
it "renders the locale key" do
render_inline component
expect(page).to have_select "Language:", with_options: ["wl"]
end
end
end
context "with a few languages" do
before do
allow(I18n).to receive(:available_locales).and_return(%i[en es fr])
end
it "renders a list of links" do
render_inline component
expect(page).to have_css "ul"
expect(page).to have_link "English", href: "/?locale=en"
expect(page).to have_link "Español", href: "/?locale=es"
expect(page).to have_link "Français", href: "/?locale=fr"
expect(page).not_to have_css "form"
end
it "marks the current locale" do
render_inline component
expect(page).to have_css "[aria-current]", count: 1
expect(page).to have_css "[aria-current]", exact_text: "English"
end
end
context "when the target language has a different text direction than the current language" do
let!(:default_locales) { I18n.available_locales }
before do
I18n.available_locales = %i[ar en]
I18n.reload!
end
after do
I18n.available_locales = default_locales
I18n.reload!
end
it "disables Turbolinks for language links" do
render_inline component
expect(page).to have_link "عربى", href: "/?locale=ar"
expect(page).to have_css "[href='/?locale=ar'][data-turbolinks=false]"
expect(page).to have_link "English", href: "/?locale=en"
expect(page).to have_css "[href='/?locale=en'][data-turbolinks=true]"
end
end
context "when not all available locales are enabled" do
before do
allow(I18n).to receive(:available_locales).and_return(%i[en es fr])
Setting["locales.enabled"] = "es fr"
end
it "displays the enabled locales" do
render_inline component
expect(page).to have_link count: 2
expect(page).to have_link "Español"
expect(page).to have_link "Français"
expect(page).not_to have_link "English"
end
end
end