forked from CGM_Public/pretix_original
195 lines
6.0 KiB
Python
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")
|