- Add tests/e2e/test_smoke.py: page-load error check for all pages - Add tests/e2e/test_interactions.py: click every interactable, diff errors, XFAIL expected demo failures, flag regressions as XPASS - Fix conftest get_page_errors() to use text_content() instead of inner_text() so errors inside collapsed expanders are captured with their actual message text (inner_text respects CSS display:none) - Fix tests/e2e/modes/demo.py base_url to include /peregrine path prefix (STREAMLIT_SERVER_BASE_URL_PATH=peregrine set in demo container) App fixes surfaced by the harness: - task_runner.py: add DEMO_MODE guard for discovery task — previously crashed with FileNotFoundError on search_profiles.yaml before any demo guard could fire; now returns friendly error immediately - 6_Interview_Prep.py: stop auto-triggering LLM session on page load in demo mode; show "AI features disabled" info instead, preventing a silent st.error() inside the collapsed Practice Q&A expander Both smoke and interaction tests now pass clean against demo mode.
61 lines
2.2 KiB
Python
61 lines
2.2 KiB
Python
"""
|
|
Smoke pass — navigate each page, wait for Streamlit to settle, assert no errors on load.
|
|
Errors on page load are always real bugs (not mode-specific).
|
|
|
|
Run: pytest tests/e2e/test_smoke.py --mode=demo
|
|
"""
|
|
from __future__ import annotations
|
|
import pytest
|
|
|
|
from tests.e2e.conftest import wait_for_streamlit, get_page_errors, get_console_errors, screenshot_on_fail
|
|
from tests.e2e.models import ModeConfig
|
|
from tests.e2e.pages.home_page import HomePage
|
|
from tests.e2e.pages.job_review_page import JobReviewPage
|
|
from tests.e2e.pages.apply_page import ApplyPage
|
|
from tests.e2e.pages.interviews_page import InterviewsPage
|
|
from tests.e2e.pages.interview_prep_page import InterviewPrepPage
|
|
from tests.e2e.pages.survey_page import SurveyPage
|
|
from tests.e2e.pages.settings_page import SettingsPage
|
|
|
|
PAGE_CLASSES = [
|
|
HomePage, JobReviewPage, ApplyPage, InterviewsPage,
|
|
InterviewPrepPage, SurveyPage, SettingsPage,
|
|
]
|
|
|
|
|
|
@pytest.mark.e2e
|
|
def test_smoke_all_pages(active_modes, mode_contexts, playwright):
|
|
"""For each active mode: navigate to every page and assert no errors on load."""
|
|
failures: list[str] = []
|
|
|
|
for mode in active_modes:
|
|
ctx = mode_contexts[mode.name]
|
|
page = ctx.new_page()
|
|
console_msgs: list = []
|
|
page.on("console", lambda msg: console_msgs.append(msg))
|
|
|
|
page.goto(mode.base_url)
|
|
wait_for_streamlit(page)
|
|
|
|
for PageClass in PAGE_CLASSES:
|
|
pg = PageClass(page, mode, console_msgs)
|
|
pg.navigate()
|
|
console_msgs.clear()
|
|
|
|
dom_errors = pg.get_errors()
|
|
console_errors = pg.get_console_errors()
|
|
|
|
if dom_errors or console_errors:
|
|
shot_path = screenshot_on_fail(page, mode.name, f"smoke_{PageClass.__name__}")
|
|
detail = "\n".join(
|
|
[f" DOM: {e.message}" for e in dom_errors]
|
|
+ [f" Console: {e}" for e in console_errors]
|
|
)
|
|
failures.append(
|
|
f"[{mode.name}] {PageClass.nav_label} — errors on load:\n{detail}\n screenshot: {shot_path}"
|
|
)
|
|
|
|
page.close()
|
|
|
|
if failures:
|
|
pytest.fail("Smoke test failures:\n\n" + "\n\n".join(failures))
|