Files
pretix_cgo/src/tests/e2e/test_widget_errors.py
2026-02-18 17:12:55 +01:00

117 lines
3.1 KiB
Python

"""
E2E Tests for Error Handling
Tests that verify:
- Error message on invalid event
- Error message shows "Open ticket shop" link
- Sold out items show unavailable state
"""
import pytest
from playwright.sync_api import Page, expect
@pytest.mark.django_db
class TestErrorDisplay:
"""Test error messages and states."""
def test_invalid_event_shows_error_message(
self,
page: Page,
live_server_url: str,
organizer,
event,
widget_page
):
"""
Loading a non-existent event should show an error message.
"""
widget_page.goto(
live_server_url, organizer.slug, 'nonexistent-event')
# Should show error message
expect(page.locator(
'.pretix-widget-error-message'
)).to_be_visible()
def test_error_shows_open_in_new_tab_link(
self,
page: Page,
live_server_url: str,
organizer,
event,
widget_page
):
"""
Error state should include a link to open the ticket shop
in a new tab as a fallback.
"""
widget_page.goto(
live_server_url, organizer.slug, 'nonexistent-event')
# Should show fallback action link
action_link = page.locator('.pretix-widget-error-action a')
expect(action_link).to_be_visible()
# Link should open in new tab
expect(action_link).to_have_attribute('target', '_blank')
@pytest.mark.django_db
class TestSoldOutState:
"""Test sold out item display."""
def test_sold_out_item_shows_unavailable(
self,
page: Page,
live_server_url: str,
organizer,
event,
item_sold_out,
widget_page
):
"""
Items with zero quota should show as unavailable/sold out.
"""
item = item_sold_out
widget_page.goto(
live_server_url, organizer.slug, event.slug)
item_elem = page.locator(
f'.pretix-widget-item:has-text("{item.name}")')
expect(item_elem).to_be_visible()
# Should not have a quantity input or checkbox (sold out)
input_count = item_elem.locator(
'input[type="number"], input[type="checkbox"]').count()
assert input_count == 0
def test_sold_out_item_shows_status_text(
self,
page: Page,
live_server_url: str,
organizer,
event,
item_sold_out,
widget_page
):
"""
Sold out items should show a status message like
"Sold out" or "Currently unavailable".
"""
item = item_sold_out
widget_page.goto(
live_server_url, organizer.slug, event.slug)
item_elem = page.locator(
f'.pretix-widget-item:has-text("{item.name}")')
# Should show some unavailability text
avail_col = item_elem.locator(
'.pretix-widget-item-availability-col')
expect(avail_col).to_be_visible()
# The text could be "Sold out", "Currently unavailable", etc.
avail_text = avail_col.inner_text()
assert len(avail_text.strip()) > 0