trainUs/tests/test_about.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

143 lines
5.8 KiB
Python

"""
About Dialog Tests
- test_about_button_visible: The About TrainUs button is visible on the Settings page
- test_about_dialog_opens: Clicking the button opens the About modal
- test_about_dialog_shows_app_version: Application version is displayed and non-empty
- test_about_dialog_shows_db_version: Database version is displayed and non-empty
- test_about_dialog_shows_author: Author name is displayed
- test_about_dialog_shows_links: Repository and website links are present
- test_about_notice_visible: Notice text is displayed inline in the About dialog
- test_about_license_btn_opens_dialog: View License button opens the license modal on top of About
- test_about_dialog_closes: The modal can be closed with the close button
- test_about_dialog_labels_french: Labels are translated when language is French
"""
from playwright.sync_api import Page, expect
def _wait_for_db(page: Page, app_url: str):
"""Navigate and wait for the database to be ready."""
page.goto(app_url)
page.wait_for_function(
"document.documentElement.getAttribute('data-db-ready') === 'true'",
timeout=15000,
)
def _go_to_settings(page: Page, app_url: str):
"""Navigate to the settings page and wait for DB."""
_wait_for_db(page, app_url)
page.click('a[href="#/settings"]')
page.wait_for_selector('[data-testid="settings-language"]')
def _open_about(page: Page, app_url: str):
"""Navigate to settings and open the About dialog."""
_go_to_settings(page, app_url)
page.click('[data-testid="settings-about"]')
page.wait_for_selector('[data-testid="modal-card"]')
def test_about_button_visible(page: Page, app_url: str):
"""The About TrainUs button is visible on the Settings page."""
_go_to_settings(page, app_url)
expect(page.locator('[data-testid="settings-about"]')).to_be_visible()
def test_about_dialog_opens(page: Page, app_url: str):
"""Clicking the About button opens the modal dialog."""
_open_about(page, app_url)
expect(page.locator('[data-testid="modal-card"]')).to_be_visible()
expect(page.locator('[data-testid="modal-title"]')).to_be_visible()
def test_about_dialog_shows_app_version(page: Page, app_url: str):
"""Application version field is visible and contains a non-empty value."""
_open_about(page, app_url)
version_el = page.locator('[data-testid="about-app-version"]')
expect(version_el).to_be_visible()
version_text = version_el.inner_text().strip()
assert version_text, "Application version should not be empty"
# Version follows semver pattern (e.g. 1.0.0)
import re
assert re.match(r'^\d+\.\d+\.\d+', version_text), (
f"Application version '{version_text}' does not look like a semver string"
)
def test_about_dialog_shows_db_version(page: Page, app_url: str):
"""Database version field is visible and contains a non-empty numeric value."""
_open_about(page, app_url)
db_version_el = page.locator('[data-testid="about-db-version"]')
expect(db_version_el).to_be_visible()
db_version_text = db_version_el.inner_text().strip()
assert db_version_text, "Database version should not be empty"
assert db_version_text.isdigit(), (
f"Database version '{db_version_text}' should be a numeric value"
)
def test_about_dialog_shows_author(page: Page, app_url: str):
"""Author name 'David Florance' is displayed in the About dialog."""
_open_about(page, app_url)
expect(page.locator('[data-testid="modal-card"]')).to_contain_text("David Florance")
def test_about_dialog_shows_links(page: Page, app_url: str):
"""Repository and website links are present in the About dialog."""
_open_about(page, app_url)
expect(page.locator('[data-testid="about-repo-link"]')).to_be_visible()
expect(page.locator('[data-testid="about-website-link"]')).to_be_visible()
def test_about_notice_visible(page: Page, app_url: str):
"""Notice text is displayed inline in the About dialog."""
_open_about(page, app_url)
notice = page.locator('[data-testid="about-notice"]')
expect(notice).to_be_visible()
expect(notice).to_contain_text("TrainUs")
def test_about_license_btn_opens_dialog(page: Page, app_url: str):
"""Clicking View License opens the license modal on top of the About dialog."""
_open_about(page, app_url)
btn = page.locator('[data-testid="about-license-btn"]')
expect(btn).to_be_visible()
expect(btn).to_be_enabled()
btn.click()
expect(page.locator('[data-testid="license-dialog-content"]')).to_be_visible()
expect(page.locator('[data-testid="about-app-version"]')).to_be_visible()
def test_about_dialog_closes(page: Page, app_url: str):
"""The About modal can be dismissed with the close button."""
_open_about(page, app_url)
page.click('[data-testid="modal-close"]')
expect(page.locator('[data-testid="modal-card"]')).not_to_be_visible()
def test_about_dialog_labels_french(page: Page, app_url: str):
"""About dialog labels are translated when the language is set to French."""
_go_to_settings(page, app_url)
# Switch to French
page.select_option('[data-testid="settings-language"]', 'fr')
page.wait_for_function(
"window.__repos.settings.get('language').then(v => v === 'fr')",
timeout=5000,
)
page.click('[data-testid="settings-about"]')
page.wait_for_selector('[data-testid="modal-card"]')
expect(page.locator('[data-testid="modal-title"]')).to_have_text("À propos de TrainUs")
expect(page.locator('[data-testid="modal-card"]')).to_contain_text("Version de l'application")
expect(page.locator('[data-testid="modal-card"]')).to_contain_text("Version de la base de données")
# Reset to English
page.click('[data-testid="modal-close"]')
page.select_option('[data-testid="settings-language"]', 'en')
page.wait_for_function(
"window.__repos.settings.get('language').then(v => v === 'en')",
timeout=5000,
)