Files
thrillwiki_django_no_react/backend/tests/e2e/test_park_browsing.py

183 lines
5.9 KiB
Python

"""
E2E tests for park browsing functionality.
These tests verify the complete user journey for browsing parks
using Playwright for browser automation.
"""
import pytest
from playwright.sync_api import Page, expect
@pytest.mark.e2e
class TestParkListPage:
"""E2E tests for park list page."""
def test__park_list__displays_parks(self, page: Page, live_server, parks_data):
"""Test park list page displays parks."""
page.goto(f"{live_server.url}/parks/")
# Verify page title or heading
expect(page.locator("h1")).to_be_visible()
# Should display park cards or list items
park_items = page.locator("[data-testid='park-card'], .park-item, .park-list-item")
expect(park_items.first).to_be_visible()
def test__park_list__shows_park_name(self, page: Page, live_server, parks_data):
"""Test park list shows park names."""
page.goto(f"{live_server.url}/parks/")
# First park should be visible
first_park = parks_data[0]
expect(page.get_by_text(first_park.name)).to_be_visible()
def test__park_list__click_park__navigates_to_detail(
self, page: Page, live_server, parks_data
):
"""Test clicking a park navigates to detail page."""
page.goto(f"{live_server.url}/parks/")
first_park = parks_data[0]
# Click on the park
page.get_by_text(first_park.name).first.click()
# Should navigate to detail page
expect(page).to_have_url(f"**/{first_park.slug}/**")
def test__park_list__search__filters_results(self, page: Page, live_server, parks_data):
"""Test search functionality filters parks."""
page.goto(f"{live_server.url}/parks/")
# Find search input
search_input = page.locator(
"input[type='search'], input[name='q'], input[placeholder*='search' i]"
)
if search_input.count() > 0:
search_input.first.fill("E2E Test Park 0")
# Wait for results to filter
page.wait_for_timeout(500)
# Should show only matching park
expect(page.get_by_text("E2E Test Park 0")).to_be_visible()
@pytest.mark.e2e
class TestParkDetailPage:
"""E2E tests for park detail page."""
def test__park_detail__displays_park_info(self, page: Page, live_server, parks_data):
"""Test park detail page displays park information."""
park = parks_data[0]
page.goto(f"{live_server.url}/parks/{park.slug}/")
# Verify park name is displayed
expect(page.get_by_role("heading", name=park.name)).to_be_visible()
def test__park_detail__shows_rides_section(self, page: Page, live_server, parks_data):
"""Test park detail page shows rides section."""
park = parks_data[0]
page.goto(f"{live_server.url}/parks/{park.slug}/")
# Look for rides section/tab
rides_section = page.locator(
"[data-testid='rides-section'], #rides, [role='tabpanel']"
)
# Or a rides tab
rides_tab = page.get_by_role("tab", name="Rides")
if rides_tab.count() > 0:
rides_tab.click()
# Should show rides
ride_items = page.locator(".ride-item, .ride-card, [data-testid='ride-item']")
expect(ride_items.first).to_be_visible()
def test__park_detail__shows_status(self, page: Page, live_server, parks_data):
"""Test park detail page shows park status."""
park = parks_data[0]
page.goto(f"{live_server.url}/parks/{park.slug}/")
# Status badge or indicator should be visible
status_indicator = page.locator(
".status-badge, [data-testid='status'], .park-status"
)
expect(status_indicator.first).to_be_visible()
@pytest.mark.e2e
class TestParkFiltering:
"""E2E tests for park filtering functionality."""
def test__filter_by_status__updates_results(self, page: Page, live_server, parks_data):
"""Test filtering parks by status updates results."""
page.goto(f"{live_server.url}/parks/")
# Find status filter
status_filter = page.locator(
"select[name='status'], [data-testid='status-filter']"
)
if status_filter.count() > 0:
status_filter.first.select_option("OPERATING")
# Wait for results to update
page.wait_for_timeout(500)
# Results should be filtered
def test__clear_filters__shows_all_parks(self, page: Page, live_server, parks_data):
"""Test clearing filters shows all parks."""
page.goto(f"{live_server.url}/parks/")
# Find clear filters button
clear_btn = page.locator(
"[data-testid='clear-filters'], button:has-text('Clear')"
)
if clear_btn.count() > 0:
clear_btn.first.click()
# Wait for results to update
page.wait_for_timeout(500)
@pytest.mark.e2e
class TestParkNavigation:
"""E2E tests for park navigation."""
def test__breadcrumb__navigates_back_to_list(self, page: Page, live_server, parks_data):
"""Test breadcrumb navigation back to park list."""
park = parks_data[0]
page.goto(f"{live_server.url}/parks/{park.slug}/")
# Find breadcrumb
breadcrumb = page.locator("nav[aria-label='breadcrumb'], .breadcrumb")
if breadcrumb.count() > 0:
# Click parks link in breadcrumb
breadcrumb.get_by_role("link", name="Parks").click()
expect(page).to_have_url(f"**/parks/**")
def test__back_button__returns_to_previous_page(
self, page: Page, live_server, parks_data
):
"""Test browser back button returns to previous page."""
page.goto(f"{live_server.url}/parks/")
park = parks_data[0]
page.get_by_text(park.name).first.click()
# Wait for navigation
page.wait_for_url(f"**/{park.slug}/**")
# Go back
page.go_back()
expect(page).to_have_url(f"**/parks/**")