Files
pretix_cgo/src/tests/e2e/test_widget_embedding.py
rash 469b777dcf first couple widget e2e tests
courtesy of claude
most of the tests don't work yet
2026-02-12 13:25:43 +01:00

195 lines
6.0 KiB
Python

"""
E2E Tests for Widget Embedding & Initialization
Tests that verify the pretix widget loads correctly, initializes properly,
and displays basic event information.
"""
import pytest
from playwright.sync_api import Page, expect
@pytest.mark.django_db
class TestWidgetEmbedding:
"""Test basic widget embedding and initialization."""
def test_widget_loads_successfully(
self,
page: Page,
live_server_url: str,
widget_organizer,
widget_event,
widget_items,
widget_page
):
"""
Widget should load and display event information.
Verifies that the widget loads on the page and shows:
- Event name
- All configured items
"""
# Navigate to test page with widget embedded
widget_page.goto_widget_test_page(
live_server_url, widget_organizer.slug, widget_event.slug
)
widget_page.wait_for_widget_load()
# Verify widget container exists with event aria-label
widget = page.locator('.pretix-widget-wrapper')
expect(widget).to_have_attribute('aria-label', widget_event.name)
# Verify items are listed
for item in widget_items:
expect(page.locator(f'text="{item.name}"')).to_be_visible()
def test_widget_displays_loading_state(
self,
page: Page,
live_server_url: str,
widget_organizer,
widget_event,
widget_page
):
"""
Widget should show loading spinner during initial load.
The loading spinner should eventually disappear when data is loaded.
"""
# Navigate to widget test page
widget_page.goto_widget_test_page(
live_server_url, widget_organizer.slug, widget_event.slug
)
# Wait for widget element
page.wait_for_selector('.pretix-widget', timeout=10000)
# Loading spinner should eventually be hidden
loading = page.locator('.pretix-widget-loading')
expect(loading).to_be_hidden(timeout=10000)
def test_widget_handles_invalid_event(
self,
page: Page,
live_server_url: str,
widget_page
):
"""Widget should display error message for invalid event."""
widget_page.goto_widget_test_page(
live_server_url, 'invalid-org', 'invalid-event'
)
# Should show widget container
page.wait_for_selector('.pretix-widget', timeout=10000)
# Should show error message
error_msg = page.locator('.pretix-widget-error-message')
expect(error_msg).to_be_visible(timeout=10000)
expect(error_msg).to_contain_text('could not be loaded')
def test_widget_shows_item_descriptions(
self,
page: Page,
live_server_url: str,
widget_organizer,
widget_event,
widget_items,
widget_page
):
"""
Widget should display item descriptions.
Item descriptions should be visible for items that have them.
"""
widget_page.goto_widget_test_page(
live_server_url, widget_organizer.slug, widget_event.slug
)
widget_page.wait_for_widget_load()
# Check that descriptions are shown
for item in widget_items:
if item.description:
expect(
page.locator(f'text="{item.description}"')
).to_be_visible()
def test_widget_shows_item_prices(
self,
page: Page,
live_server_url: str,
widget_organizer,
widget_event,
widget_items,
widget_page
):
"""
Widget should display item prices correctly.
Prices should be formatted with currency and decimal places.
"""
widget_page.goto_widget_test_page(
live_server_url, widget_organizer.slug, widget_event.slug
)
widget_page.wait_for_widget_load()
# Verify prices are shown (with currency)
# Each item should have its price displayed
for item in widget_items:
# Find the item container first, then check price within it
item_container = page.locator(
f'.pretix-widget-item:has-text("{item.name}")'
)
expect(item_container).to_be_visible()
# Check price is present (formatted as "USD XX.XX")
price_text = f"{float(item.default_price):.2f}"
price_box = item_container.locator('.pretix-widget-pricebox')
expect(price_box).to_contain_text(price_text)
@pytest.mark.django_db
class TestWidgetEventInfo:
"""Test event information display in widget."""
def test_widget_displays_event_date(
self,
page: Page,
live_server_url: str,
widget_organizer,
widget_event,
widget_page
):
"""
Widget should show event date and time.
Note: The old widget.js implementation may not display event
date by default. This test verifies the widget loads without
checking for specific date display.
"""
widget_page.goto_widget_test_page(
live_server_url, widget_organizer.slug, widget_event.slug
)
widget_page.wait_for_widget_load()
# Widget should be present and functional
# (Event date display varies by configuration)
widget = page.locator('.pretix-widget')
expect(widget).to_be_visible()
def test_widget_hides_event_info_when_configured(
self,
page: Page,
live_server_url: str,
widget_organizer,
widget_event,
widget_page
):
"""
Widget should hide event info when display-event-info="false".
This test would require creating a widget embed page with the attribute.
Currently just a placeholder for future implementation.
"""
# TODO: This requires creating a custom HTML page with widget embed
# For now, skip this test
pytest.skip("Requires custom widget embed page with attributes")