forked from CGM_Public/pretix_original
112 lines
3.3 KiB
Python
112 lines
3.3 KiB
Python
"""
|
|
E2E Tests for Loading States & Performance
|
|
|
|
Tests that verify:
|
|
- Loading spinner appears during widget initialization
|
|
- Loading spinner disappears after content loads
|
|
- Widget loads within acceptable time
|
|
- No JavaScript errors during widget initialization
|
|
"""
|
|
import pytest
|
|
from playwright.sync_api import Page, expect
|
|
|
|
|
|
@pytest.mark.django_db
|
|
class TestLoadingStates:
|
|
"""Test loading states and transitions."""
|
|
|
|
def test_loading_spinner_disappears_after_load(
|
|
self,
|
|
page: Page,
|
|
live_server_url: str,
|
|
widget_organizer,
|
|
widget_event,
|
|
widget_items,
|
|
widget_page
|
|
):
|
|
"""
|
|
Loading spinner should be hidden once widget content loads.
|
|
"""
|
|
widget_page.goto_widget_test_page(
|
|
live_server_url, widget_organizer.slug, widget_event.slug)
|
|
widget_page.wait_for_widget_load()
|
|
|
|
# Loading spinner should be hidden (display:none)
|
|
loading = page.locator('.pretix-widget-loading')
|
|
expect(loading).to_be_hidden()
|
|
|
|
def test_widget_loads_within_timeout(
|
|
self,
|
|
page: Page,
|
|
live_server_url: str,
|
|
widget_organizer,
|
|
widget_event,
|
|
widget_items,
|
|
widget_page
|
|
):
|
|
"""
|
|
Widget should fully load within 15 seconds.
|
|
"""
|
|
widget_page.goto_widget_test_page(
|
|
live_server_url, widget_organizer.slug, widget_event.slug)
|
|
|
|
# Widget should appear within 15s
|
|
page.wait_for_selector('.pretix-widget', timeout=15000)
|
|
|
|
# Items should be visible within 15s total
|
|
expect(page.locator(
|
|
f'.pretix-widget-item:has-text("{widget_items[0].name}")'
|
|
)).to_be_visible(timeout=15000)
|
|
|
|
def test_no_javascript_errors_on_load(
|
|
self,
|
|
page: Page,
|
|
live_server_url: str,
|
|
widget_organizer,
|
|
widget_event,
|
|
widget_items,
|
|
widget_page
|
|
):
|
|
"""
|
|
Widget should load without any JavaScript console errors.
|
|
"""
|
|
errors = []
|
|
page.on('pageerror', lambda err: errors.append(str(err)))
|
|
|
|
widget_page.goto_widget_test_page(
|
|
live_server_url, widget_organizer.slug, widget_event.slug)
|
|
widget_page.wait_for_widget_load()
|
|
|
|
# No JS errors should have occurred
|
|
assert len(errors) == 0, f"JavaScript errors: {errors}"
|
|
|
|
|
|
@pytest.mark.django_db
|
|
class TestWidgetReload:
|
|
"""Test widget behavior on page interactions."""
|
|
|
|
def test_widget_css_loads_correctly(
|
|
self,
|
|
page: Page,
|
|
live_server_url: str,
|
|
widget_organizer,
|
|
widget_event,
|
|
widget_items,
|
|
widget_page
|
|
):
|
|
"""
|
|
Widget CSS should load and apply styles.
|
|
No SCSS syntax should leak into rendered styles.
|
|
"""
|
|
widget_page.goto_widget_test_page(
|
|
live_server_url, widget_organizer.slug, widget_event.slug)
|
|
widget_page.wait_for_widget_load()
|
|
|
|
# Check that widget has actual styled dimensions
|
|
# (not zero-height which would indicate CSS failure)
|
|
widget = page.locator('.pretix-widget')
|
|
box = widget.bounding_box()
|
|
assert box is not None
|
|
assert box['height'] > 50 # Widget should have meaningful height
|
|
assert box['width'] > 100 # Widget should have meaningful width
|