diff --git a/tests/e2e/test_i18n_toggle.py b/tests/e2e/test_i18n_toggle.py new file mode 100644 index 0000000..ff19f49 --- /dev/null +++ b/tests/e2e/test_i18n_toggle.py @@ -0,0 +1,59 @@ +"""UIE-05: E2E tests for language toggle — FR/EN switching and localStorage persistence.""" +from __future__ import annotations +import pytest + + +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')") diff --git a/tests/e2e/test_theme_toggle.py b/tests/e2e/test_theme_toggle.py new file mode 100644 index 0000000..b47f73a --- /dev/null +++ b/tests/e2e/test_theme_toggle.py @@ -0,0 +1,50 @@ +"""UIE-04: E2E tests for theme toggle — data-theme cycling and localStorage persistence.""" +from __future__ import annotations +import pytest + + +def test_theme_cycles_on_click(page, live_server: str) -> None: + """Clicking theme button cycles data-theme attribute: auto -> light -> dark -> auto.""" + page.goto(f"{live_server}/", wait_until="domcontentloaded") + + # Initial state: auto (default from base.html) + initial_theme = page.evaluate("document.documentElement.getAttribute('data-theme')") + assert initial_theme == "auto" + + # Click once -> light + page.click("button[aria-label='auto']") + page.wait_for_function( + "document.documentElement.getAttribute('data-theme') === 'light'", + timeout=2000, + ) + assert page.evaluate("document.documentElement.getAttribute('data-theme')") == "light" + + # Click again -> dark + page.click("button[aria-label='light']") + page.wait_for_function( + "document.documentElement.getAttribute('data-theme') === 'dark'", + timeout=2000, + ) + assert page.evaluate("document.documentElement.getAttribute('data-theme')") == "dark" + + +def test_theme_persists_across_reload(page, live_server: str) -> None: + """After clicking theme toggle, the chosen theme is restored on reload.""" + page.goto(f"{live_server}/", wait_until="domcontentloaded") + + # Switch to light mode + page.click("button[aria-label='auto']") + page.wait_for_function( + "document.documentElement.getAttribute('data-theme') === 'light'", + timeout=2000, + ) + + # Reload the page + page.reload(wait_until="domcontentloaded") + + # Theme should still be light (from localStorage) + theme_after_reload = page.evaluate("document.documentElement.getAttribute('data-theme')") + assert theme_after_reload == "light" + + # Cleanup: reset to auto + page.evaluate("localStorage.setItem('imptune_theme', 'auto')")