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.default"] = "es" 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