trainUs/tests/test_step0_scaffolding.py
David 352a3d5e88
Some checks are pending
CI / Lint & Format (push) Waiting to run
CI / Build (push) Waiting to run
CI / Tests (${{ matrix.browser }}) (chromium) (push) Waiting to run
CI / Tests (${{ matrix.browser }}) (firefox) (push) Waiting to run
Initial commit
2026-06-18 13:06:57 +02:00

95 lines
3.2 KiB
Python

"""
Step 0 — Scaffolding Tests
- test_app_loads: App loads and renders the shell
- test_nav_routes: All navigation links route correctly
- test_actionbar_shows_title: Action bar displays the current page title
- test_responsive_mobile: Navbar moves to bottom on mobile viewport
- test_i18n_keys_render: i18n keys render as English text (not raw keys)
"""
import re
from playwright.sync_api import Page, expect
def test_app_loads(page: Page, app_url: str):
"""App loads and renders the navbar with the app name."""
page.goto(app_url)
page.wait_for_function(
"document.documentElement.getAttribute('data-db-ready') === 'true'"
" || document.documentElement.getAttribute('data-db-error') !== null",
timeout=15000,
)
expect(page.locator(".navbar-brand")).to_have_text("TrainUs")
expect(page.locator(".actionbar")).to_be_visible()
def test_nav_routes(page: Page, app_url: str):
"""Clicking each nav link navigates to the correct route."""
page.goto(app_url)
page.wait_for_function(
"document.documentElement.getAttribute('data-db-ready') === 'true'",
timeout=15000,
)
routes = {
"Home": "#/home",
"Exercises": "#/exercises",
"Combos": "#/combos",
"Sessions": "#/sessions",
"Statistics": "#/stats",
"Settings": "#/settings",
}
for label, expected_hash in routes.items():
page.locator(f".navbar a:has-text('{label}')").click()
page.wait_for_url(f"**/{expected_hash}")
expect(page).to_have_url(re.compile(re.escape(expected_hash)))
def test_actionbar_shows_title(page: Page, app_url: str):
"""Action bar h1 reflects the current page name."""
page.goto(f"{app_url}/#/exercises")
page.wait_for_function(
"document.documentElement.getAttribute('data-db-ready') === 'true'",
timeout=15000,
)
expect(page.locator(".actionbar h1")).to_have_text("Exercises")
page.goto(f"{app_url}/#/settings")
page.wait_for_function(
"document.documentElement.getAttribute('data-db-ready') === 'true'",
timeout=15000,
)
expect(page.locator(".actionbar h1")).to_have_text("Settings")
def test_responsive_mobile(page: Page, app_url: str):
"""On a narrow viewport, navbar should be at the bottom."""
page.set_viewport_size({"width": 375, "height": 667})
page.goto(app_url)
page.wait_for_function(
"document.documentElement.getAttribute('data-db-ready') === 'true'",
timeout=15000,
)
navbar = page.locator(".navbar")
expect(navbar).to_be_visible()
# Brand should be hidden on mobile
brand = page.locator(".navbar-brand")
expect(brand).to_be_hidden()
def test_i18n_keys_render(page: Page, app_url: str):
"""i18n renders actual text, not raw keys like 'nav.home'."""
page.goto(app_url)
page.wait_for_function(
"document.documentElement.getAttribute('data-db-ready') === 'true'",
timeout=15000,
)
# Check that nav links contain real words, not i18n keys
nav_text = page.locator(".navbar").inner_text()
assert "nav.home" not in nav_text, "i18n keys not resolved"
assert "Home" in nav_text
assert "Settings" in nav_text