143 lines
5.8 KiB
Python
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,
|
|
)
|