"""UIE-05: E2E tests for language toggle — FR/EN switching and localStorage persistence.""" from __future__ import annotations import pytest # --------------------------------------------------------------------------- # Task 1 (Phase 12-01): navigator.language auto-detection # --------------------------------------------------------------------------- def test_navigator_language_en_sets_lang_en(browser, live_server: str) -> None: """When localStorage is empty and navigator.language is 'en-US', lang defaults to 'en'.""" context = browser.new_context(locale="en-US") page = context.new_page() # Clear any saved preference so localStorage fallback is not used page.goto(f"{live_server}/", wait_until="domcontentloaded") page.evaluate("localStorage.removeItem('imptune_lang')") # Reload so the alpine:init IIFE runs with no localStorage and en-US locale page.reload(wait_until="domcontentloaded") page.wait_for_function( "document.querySelector('nav a[href=\"/printers\"]').textContent.trim() !== ''", timeout=3000, ) lang = page.evaluate("Alpine.store('i18n').lang") assert lang == "en", f"Expected 'en' when navigator.language is 'en-US', got '{lang}'" context.close() def test_navigator_language_fr_sets_lang_fr(browser, live_server: str) -> None: """When localStorage is empty and navigator.language is 'fr-FR', lang defaults to 'fr'.""" context = browser.new_context(locale="fr-FR") page = context.new_page() page.goto(f"{live_server}/", wait_until="domcontentloaded") page.evaluate("localStorage.removeItem('imptune_lang')") page.reload(wait_until="domcontentloaded") page.wait_for_function( "document.querySelector('nav a[href=\"/printers\"]').textContent.trim() !== ''", timeout=3000, ) lang = page.evaluate("Alpine.store('i18n').lang") assert lang == "fr", f"Expected 'fr' when navigator.language is 'fr-FR', got '{lang}'" context.close() def test_localstorage_wins_over_navigator_language(browser, live_server: str) -> None: """localStorage preference wins over navigator.language when a value is saved.""" # Browser locale is 'en-US' but localStorage says 'fr' → should use 'fr' context = browser.new_context(locale="en-US") page = context.new_page() page.goto(f"{live_server}/", wait_until="domcontentloaded") page.evaluate("localStorage.setItem('imptune_lang', 'fr')") page.reload(wait_until="domcontentloaded") page.wait_for_function( "document.querySelector('nav a[href=\"/printers\"]').textContent.trim() !== ''", timeout=3000, ) lang = page.evaluate("Alpine.store('i18n').lang") assert lang == "fr", f"Expected localStorage 'fr' to win over navigator.language 'en-US', got '{lang}'" # Cleanup page.evaluate("localStorage.removeItem('imptune_lang')") context.close() # --------------------------------------------------------------------------- # Original toggle and persistence tests # --------------------------------------------------------------------------- def test_language_toggle_switches_nav_label(page, live_server: str) -> None: """Clicking FR/EN button switches nav label from French to English.""" page.goto(f"{live_server}/", wait_until="domcontentloaded") # Default lang is 'fr' — nav should show French labels # Wait for Alpine to hydrate page.wait_for_function( "document.querySelector('nav a[href=\"/printers\"]').textContent.trim() !== ''", timeout=3000, ) # In French, printers nav label = 'Imprimantes' printers_label_fr = page.text_content("nav a[href='/printers']").strip() assert printers_label_fr == "Imprimantes", f"Expected 'Imprimantes', got '{printers_label_fr}'" # Click the language toggle button page.click("button[title='Toggle language']") # Wait for label to update page.wait_for_function( "document.querySelector('nav a[href=\"/printers\"]').textContent.trim() === 'Printers'", timeout=2000, ) printers_label_en = page.text_content("nav a[href='/printers']").strip() assert printers_label_en == "Printers" # Cleanup: reset to fr page.evaluate("localStorage.setItem('imptune_lang', 'fr')") def test_language_persists_across_reload(page, live_server: str) -> None: """After switching to EN, language is preserved on page reload.""" page.goto(f"{live_server}/", wait_until="domcontentloaded") # Switch to English page.click("button[title='Toggle language']") page.wait_for_function( "document.querySelector('nav a[href=\"/printers\"]').textContent.trim() === 'Printers'", timeout=2000, ) # Reload page.reload(wait_until="domcontentloaded") page.wait_for_function( "document.querySelector('nav a[href=\"/printers\"]').textContent.trim() !== ''", timeout=3000, ) label_after_reload = page.text_content("nav a[href='/printers']").strip() assert label_after_reload == "Printers" # Cleanup: reset to fr page.evaluate("localStorage.setItem('imptune_lang', 'fr')")