From 4b5fd2495fc7966c995f537432214c8f85a0de4e Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Wed, 18 Mar 2026 13:03:48 +1100 Subject: [PATCH] Restore multilingual spec --- spec/system/consumer/multilingual_spec.rb | 197 ++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 spec/system/consumer/multilingual_spec.rb diff --git a/spec/system/consumer/multilingual_spec.rb b/spec/system/consumer/multilingual_spec.rb new file mode 100644 index 0000000000..2d5df6446b --- /dev/null +++ b/spec/system/consumer/multilingual_spec.rb @@ -0,0 +1,197 @@ +# frozen_string_literal: true + +require 'system_helper' + +RSpec.describe 'Multilingual' do + include AuthenticationHelper + include WebHelper + include ShopWorkflow + include UIComponentHelper + include CookieHelper + + it 'has three locales available' do + expect(Rails.application.config.i18n[:default_locale]).to eq 'en' + expect(Rails.application.config.i18n[:locale]).to eq 'en' + expect(Rails.application.config.i18n[:available_locales]).to eq ['en', 'es', 'pt'] + end + + it '18n-js fallsback to default language' do + # in backend it doesn't until we change enforce_available_locales to `true` + visit root_path + set_i18n_locale('it') + expect(get_i18n_translation('label_shops')).to eq 'Shops' + end + + context 'can switch language by params' do + it 'in root path' do + visit root_path + expect(pick_i18n_locale).to eq 'en' + expect(get_i18n_translation('label_shops')).to eq 'Shops' + expect(cookies_name).not_to include('locale') + expect(page).to have_content 'SHOPS' + + visit root_path(locale: 'es') + expect(pick_i18n_locale).to eq 'es' + expect(get_i18n_translation('label_shops')).to eq 'Tiendas' + expect_menu_and_cookie_in_es + + # it is not in the list of available of available_locales + visit root_path(locale: 'it') + expect(pick_i18n_locale).to eq 'es' + expect(get_i18n_translation('label_shops')).to eq 'Tiendas' + expect_menu_and_cookie_in_es + end + + context 'with a product in the cart' do + let(:distributor) { create(:distributor_enterprise, with_payment_and_shipping: true) } + let!(:order_cycle) { + create(:simple_order_cycle, distributors: [distributor], variants: [product.variants.first]) + } + let(:product) { create(:simple_product) } + let(:order) { create(:order, order_cycle:, distributor:) } + + before do + pick_order order + add_product_to_cart order, product, quantity: 1 + end + + it "in the cart page" do + visit main_app.cart_path(locale: 'es') + + expect_menu_and_cookie_in_es + expect(page).to have_content 'Precio' + end + + it "visiting checkout as a guest user" do + visit checkout_path(locale: 'es') + + expect_menu_and_cookie_in_es + expect(page).to have_content 'Iniciar sesión' + end + end + end + + context 'with user' do + let(:user) { create(:user) } + + it 'updates user locale from cookie if it is empty' do + visit root_path(locale: 'es') + + expect_menu_and_cookie_in_es + expect(user.locale).to be_nil + login_as user + visit root_path + + expect_menu_and_cookie_in_es + end + + it 'updates user locale and stays in cookie after logout' do + login_as user + + visit root_path(locale: 'es') + user.reload + + expect(user.locale).to eq 'es' + + logout + + expect_menu_and_cookie_in_es + expect(page).to have_content '¿Estás interesada en entrar en Open Food Network?' + end + + context "visiting checkout as logged user" do + let!(:zone) { create(:zone_with_member) } + let(:supplier) { create(:supplier_enterprise) } + let(:distributor) { create(:distributor_enterprise, charges_sales_tax: true) } + let(:product) { + create(:taxed_product, supplier_id: supplier.id, price: 10, zone:) + } + let(:variant) { product.variants.first } + let!(:order_cycle) { + create(:simple_order_cycle, suppliers: [supplier], distributors: [distributor], + coordinator: create(:distributor_enterprise), + variants: [variant]) + } + + let(:free_shipping) { + create(:shipping_method, require_ship_address: false) + } + let!(:payment) { + create(:payment_method, distributors: [distributor], + name: "Payment") + } + let(:order) { + create(:order_ready_for_confirmation, distributor:) + } + before do + pick_order order + login_as user + end + + it "on the details step" do + visit checkout_step_path(:details, locale: 'es') + + expect_menu_and_cookie_in_es + expect(page).to have_content "Sus detalles" + end + + it "on the payment step" do + visit checkout_step_path(:payment, locale: 'es') + + expect_menu_and_cookie_in_es + expect(page).to have_content "Puede revisar y confirmar su pedido" + end + + it "on the summary step" do + visit checkout_step_path(:summary, locale: 'es') + + expect_menu_and_cookie_in_es + expect(page).to have_content "Detalles de entrega" + end + end + end + + describe "using the language switcher UI" do + context "when there is only one language available" do + before do + allow(ENV).to receive(:[]).and_call_original + allow(ENV).to receive(:[]).with("LOCALE").and_return("en") + allow(ENV).to receive(:[]).with("AVAILABLE_LOCALES").and_return("en") + end + + it "hides the dropdown language menu" do + visit root_path + expect(page).not_to have_css 'ul.right li.language-switcher.has-dropdown' + end + end + + context "when there are multiple languages available" do + before do + allow(ENV).to receive(:[]).and_call_original + allow(ENV).to receive(:[]).with("LOCALE").and_return("en") + allow(ENV).to receive(:[]).with("AVAILABLE_LOCALES").and_return("en,es") + end + + it "allows switching language via the main navigation" do + visit root_path + + expect(page).to have_content 'SHOPS' + + find('.language-switcher').click + within '.language-switcher .dropdown' do + expect(page).not_to have_link 'English', href: '/locales/en' + expect(page).to have_link 'Español', href: '/locales/es' + + find('li a[href="/locales/es"]').click + end + + expect_menu_and_cookie_in_es + end + end + end +end + +def expect_menu_and_cookie_in_es + expect(cookies_name['locale']).to have_attributes(value: "es") + expect(page).to have_content 'TIENDAS' +end