forked from CGM_Public/pretix_original
117 lines
3.1 KiB
Python
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
|