From 3f92868dba7f4b486e87e819325e891d32cead3b Mon Sep 17 00:00:00 2001 From: rash Date: Fri, 20 Feb 2026 13:18:06 +0100 Subject: [PATCH] start testing event series widget --- src/tests/e2e/conftest.py | 12 ++-- src/tests/e2e/test_widget_journey_series.py | 72 +++++++++++++++++++++ 2 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 src/tests/e2e/test_widget_journey_series.py diff --git a/src/tests/e2e/conftest.py b/src/tests/e2e/conftest.py index 2bd2b4fda3..eabadfec92 100644 --- a/src/tests/e2e/conftest.py +++ b/src/tests/e2e/conftest.py @@ -127,6 +127,7 @@ def event(organizer): testmode=False, plugins='pretix.plugins.banktransfer', ) + event.set_defaults() event.settings.set('timezone', 'Europe/Berlin') event.settings.set('locale', 'en') event.settings.set('locales', ['en']) @@ -672,11 +673,11 @@ def event_series(organizer): live=True, plugins='pretix.plugins.banktransfer', ) + event.set_defaults() event.settings.set('timezone', 'Europe/Berlin') event.settings.set('locale', 'en') event.settings.set('locales', ['en']) - # Create item + category for the series category = ItemCategory.objects.create( event=event, name='Tickets', @@ -690,11 +691,10 @@ def event_series(organizer): active=True, ) - # Create multiple subevents (dates) subevents = [] base_date = _future_dt(days=30, hour=19) - for i in range(15): # Create 15 dates across 2 months + for i in range(15): se = SubEvent.objects.create( event=event, name=f'Concert Night {i+1}', @@ -778,6 +778,7 @@ def widget_page(page): # Find number input within that row number_input = item_row.locator('input[type="number"]').first + number_input.wait_for(state='visible', timeout=5000) if number_input.count() > 0: number_input.fill(str(quantity)) else: @@ -805,7 +806,10 @@ def widget_page(page): def click_buy_button(self): """Click the buy/register button.""" - buy_button = self.page.locator('button:has-text("Buy"), button:has-text("Register")') + buy_button = self.page.locator(""" + .pretix-widget-action button:has-text("Buy"), + .pretix-widget-action button:has-text("Register") + """) buy_button.first.click() return self diff --git a/src/tests/e2e/test_widget_journey_series.py b/src/tests/e2e/test_widget_journey_series.py new file mode 100644 index 0000000000..ed5eeeed6e --- /dev/null +++ b/src/tests/e2e/test_widget_journey_series.py @@ -0,0 +1,72 @@ +import pytest +from playwright.sync_api import Page, expect + + +@pytest.mark.django_db +class TestEventSeriesJourney: + """ + Complete purchase journeys for an event series. + Tests the different views (calendar, list) and adds multiple items to the cart. + """ + + def test_multi_subevent_journey_list_view( + self, + page: Page, + live_server_url: str, + organizer, + event_series, + widget_page + ): + event, _subevents = event_series + widget_page.goto( + live_server_url, + organizer.slug, + event.slug, + **{'list-type': 'list'} + ) + # page.pause() + page.locator('.pretix-widget-event-list-entry').first.click() + + # expect( + # page.locator( + # '.pretix-widget-item:has-text("Concert Ticket")') + # ).to_be_visible(timeout=15000) + widget_page.select_item_quantity('Concert Ticket', 2) + widget_page.click_buy_button() + + iframe = widget_page.wait_for_iframe_checkout() + expect( + iframe.locator('text=/45\\.00/').first + ).to_be_visible(timeout=15000) + + # Close iframe and go back to list view + widget_page.close_iframe() + page.locator('a[rel="back"]').click() + # widget_page.goto( + # live_server_url, + # organizer.slug, + # event.slug, + # **{'list-type': 'list'} + # ) + + page.locator('.pretix-widget-event-list-entry').nth(1).click() + + # expect( + # page.locator('.pretix-widget-item:has-text("Concert Ticket")') + # ).to_be_visible(timeout=15000) + # widget_page.select_item_quantity('Concert Ticket', 1) + + # Dispatch change event so the widget detects items are selected + # (calcItemsSelected listens for 'change', not 'input') + # page.locator( + # '.pretix-widget-item:has-text("Concert Ticket") ' + # 'input[type=number]' + # ).dispatch_event('change') + page.pause() + widget_page.click_buy_button() + iframe = widget_page.wait_for_iframe_checkout() + + # TODO a bit janky selector + expect( + iframe.locator('text=/90\\.00/').first + ).to_be_visible(timeout=15000)