first couple widget e2e tests

courtesy of claude
most of the tests don't work yet
This commit is contained in:
rash
2026-02-11 23:16:03 +01:00
parent 333dc56ef7
commit 469b777dcf
23 changed files with 5129 additions and 0 deletions

View 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