133 lines
5.0 KiB
Python
133 lines
5.0 KiB
Python
"""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')")
|