"""E2E tests for the newsletter subscription form.""" from __future__ import annotations import pytest from playwright.sync_api import Page, expect def _nav_newsletter_form(page: Page): """Return the newsletter form in the home page sidebar aside.""" return page.locator("aside").locator("form[data-newsletter-form]").first @pytest.mark.e2e def test_subscribe_valid_email_shows_confirmation(page: Page, base_url: str) -> None: page.goto(f"{base_url}/", wait_until="networkidle") form = _nav_newsletter_form(page) form.locator('input[type="email"]').fill("playwright-test@example.com") form.get_by_role("button", name="Subscribe").click() # JS sets the data-newsletter-message text on success message = form.locator("[data-newsletter-message]") expect(message).to_have_text("Check your email to confirm your subscription.", timeout=5_000) @pytest.mark.e2e def test_subscribe_invalid_email_shows_error(page: Page, base_url: str) -> None: page.goto(f"{base_url}/", wait_until="networkidle") form = _nav_newsletter_form(page) # Disable the browser's native HTML5 email validation so the JS handler # fires and sends the bad value to the server (which returns 400). page.evaluate("document.querySelector('aside form[data-newsletter-form]').setAttribute('novalidate', '')") form.locator('input[type="email"]').fill("not-an-email") form.get_by_role("button", name="Subscribe").click() message = form.locator("[data-newsletter-message]") expect(message).to_have_text("Please enter a valid email.", timeout=5_000) @pytest.mark.e2e def test_subscribe_from_article_aside(page: Page, base_url: str) -> None: """Newsletter form embedded in the article aside also works.""" page.goto(f"{base_url}/articles/nightly-playwright-journey/", wait_until="networkidle") aside_form = page.locator("aside").locator("form[data-newsletter-form]") aside_form.locator('input[type="email"]').fill("aside-test@example.com") aside_form.get_by_role("button", name="Subscribe").click() message = aside_form.locator("[data-newsletter-message]") expect(message).to_have_text("Check your email to confirm your subscription.", timeout=5_000) @pytest.mark.e2e def test_subscribe_duplicate_email_still_shows_confirmation(page: Page, base_url: str) -> None: """Submitting the same address twice must not expose an error to the user.""" email = "dupe-e2e@example.com" page.goto(f"{base_url}/", wait_until="networkidle") form = _nav_newsletter_form(page) form.locator('input[type="email"]').fill(email) form.get_by_role("button", name="Subscribe").click() message = form.locator("[data-newsletter-message]") expect(message).to_have_text("Check your email to confirm your subscription.", timeout=5_000) # Second submission — form resets after first, so fill again form.locator('input[type="email"]').fill(email) form.get_by_role("button", name="Subscribe").click() expect(message).to_have_text("Check your email to confirm your subscription.", timeout=5_000)