# E2E Test Utilities Quick Reference ## Test Utilities (`e2e/support/test-utilities.ts`) ### Data Generators ```typescript // Generate a single flight generateFlight({ direction: 'departure' | 'arrival', cityCode: 'MOW', status: 'scheduled' | 'boarding' | 'departed' | 'arrived' | 'delayed' | 'cancelled', date: '2026-04-06', }); // Generate multiple flights generateFlights(20, { direction: 'departure', cityCode: 'MOW' }); // Generate schedule entry generateScheduleEntry({ from: 'MOW', to: 'AER', dateFrom: '2026-04-06', dateTo: '2026-04-12', direct: true, }); // Generate schedule entries generateScheduleEntries(50); // Generate destination generateDestination({ departureCity: 'MOW', arrivalCity: 'AER', flightCount: 45, dates: ['2026-04-06', '2026-04-07'], }); // Generate destinations generateDestinations(20); ``` ### Constants ```typescript CITIES; // 20 cities with codes AIRPORTS; // 10+ airports FLIGHT_NUMBERS; // 20 flight numbers AIRLINE_CODES; // ['SU', 'FV'] AIRLINE_NAMES; // { SU: 'Aeroflot', FV: 'Rossiya' } AIRCRAFT_TYPES; // 7 aircraft types STATUS_TYPES; // 10 flight statuses ``` ### URL Helpers ```typescript buildRouteParam('MOW', '2026-04-06'); // 'MOW-20260406' buildOnlineBoardPath('departure', 'MOW', '2026-04-06'); // '/onlineboard/departure/MOW-20260406' buildSchedulePath(); // '/schedule' buildFlightsMapPath(); // '/flights-map' buildFlightDetailsPath('SU 1124', '2026-04-06'); // '/SU1124-20260406' ``` ### Search Helpers ```typescript searchFlightByNumber(page, 'SU 1124', '2026-04-06'); searchFlightByRoute(page, 'Moscow', 'Sochi', '2026-04-06'); searchFlightByDate(page, '2026-04-06'); openFlightDetails(page, 0); ``` ### Assertion Helpers ```typescript expectUrlToMatch(page, /pattern/); expectElementToBeVisible(locator); expectElementToBeHidden(locator); expectElementToHaveText(locator, 'text'); expectElementToContainText(locator, 'text'); expectElementToHaveAttribute(locator, 'attr', 'value'); expectElementToHaveClass(locator, 'class'); expectElementToBeEnabled(locator); expectElementToBeDisabled(locator); expectElementToBeChecked(locator); expectElementToBeUnchecked(locator); expectElementToHaveValue(locator, 'value'); expectElementToHaveCount(locator, 5); expectElementToBeFocused(locator); expectElementNotToBeFocused(locator); ``` ### Date Helpers ```typescript getToday(); // '2026-04-06' getTomorrow(); // '2026-04-07' getYesterday(); // '2026-04-05' getFutureDate(7); // '2026-04-13' getPastDate(7); // '2026-03-30' formatDateForUrl(date); formatDateForDisplay(date, 'ru'); ``` ### Error Generators ```typescript generateNotFoundError(); // 404 generateBadRequestError(); // 400 generateUnauthorizedError(); // 401 generateForbiddenError(); // 403 generateServerError(); // 500 generateTimeoutError(); // 504 ``` ## Fixtures ### cities.json ```json { "code": "MOW", "name": "Moscow", "nameRu": "Москва", "latitude": 55.7558, "longitude": 37.6173, "country": "Russia", "countryCode": "RU" } ``` ### flights.json ```json { "flights": { "domestic": { ... }, "international": { ... }, "scheduled": { ... }, "arrived": { ... }, "delayed": { ... }, "cancelled": { ... } } } ``` ### routes.json ```json { "routes": { "moscow-sochi": { "departure": "MOW", "arrival": "AER", "duration": "2h 15m", "flights": [ ... ] } } } ``` ### api-responses.json Complete API response templates for all endpoints. ### errors.json Error response examples for all HTTP status codes. ## Templates 8 template files in `e2e/integration/templates/`: 1. **online-board-arrival.template.ts** - 40+ tests 2. **online-board-departure.template.ts** - 40+ tests 3. **online-board-route.template.ts** - 35+ tests 4. **online-board-flight.template.ts** - 45+ tests 5. **schedule-search.template.ts** - 30+ tests 6. **flight-details.template.ts** - 40+ tests 7. **flights-map.template.ts** - 30+ tests 8. **popular-requests.template.ts** - 30+ tests Total: 300+ tests ## Usage Example ```typescript import { test, expect } from '@playwright/test'; import { generateFlight, generateFlights, getToday, searchFlightByNumber, verifyFlightCard, } from '@e2e/support/test-utilities'; test('should display flight board', async ({ page }) => { const today = getToday(); await page.goto(`/ru-ru/onlineboard/departure/MOW-${today.replace(/-/g, '')}`); await page.waitForLoadState('networkidle'); const flight = generateFlight({ direction: 'departure', cityCode: 'MOW' }); await searchFlightByNumber(page, flight.flightNumber); await verifyFlightCard(page, flight); }); ``` ## Running Tests ```bash pnpm e2e # Run all tests pnpm e2e -- tests/landing.spec.ts # Run specific test pnpm e2e --headless # Run headless pnpm e2e --ui # Run with UI pnpm e2e --trace on # Run with trace ```