forked from CGM_Public/pretix_original
first couple widget e2e tests
courtesy of claude most of the tests don't work yet
This commit is contained in:
120
src/tests/e2e/test_widget_errors.py
Normal file
120
src/tests/e2e/test_widget_errors.py
Normal file
@@ -0,0 +1,120 @@
|
||||
"""
|
||||
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,
|
||||
widget_organizer,
|
||||
widget_event,
|
||||
widget_page
|
||||
):
|
||||
"""
|
||||
Loading a non-existent event should show an error message.
|
||||
"""
|
||||
widget_page.goto_widget_test_page(
|
||||
live_server_url, widget_organizer.slug, 'nonexistent-event')
|
||||
widget_page.wait_for_widget_load()
|
||||
|
||||
# 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,
|
||||
widget_organizer,
|
||||
widget_event,
|
||||
widget_page
|
||||
):
|
||||
"""
|
||||
Error state should include a link to open the ticket shop
|
||||
in a new tab as a fallback.
|
||||
"""
|
||||
widget_page.goto_widget_test_page(
|
||||
live_server_url, widget_organizer.slug, 'nonexistent-event')
|
||||
widget_page.wait_for_widget_load()
|
||||
|
||||
# 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,
|
||||
widget_organizer,
|
||||
widget_event,
|
||||
widget_item_sold_out,
|
||||
widget_page
|
||||
):
|
||||
"""
|
||||
Items with zero quota should show as unavailable/sold out.
|
||||
"""
|
||||
item = widget_item_sold_out
|
||||
|
||||
widget_page.goto_widget_test_page(
|
||||
live_server_url, widget_organizer.slug, widget_event.slug)
|
||||
widget_page.wait_for_widget_load()
|
||||
|
||||
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,
|
||||
widget_organizer,
|
||||
widget_event,
|
||||
widget_item_sold_out,
|
||||
widget_page
|
||||
):
|
||||
"""
|
||||
Sold out items should show a status message like
|
||||
"Sold out" or "Currently unavailable".
|
||||
"""
|
||||
item = widget_item_sold_out
|
||||
|
||||
widget_page.goto_widget_test_page(
|
||||
live_server_url, widget_organizer.slug, widget_event.slug)
|
||||
widget_page.wait_for_widget_load()
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user