375bcfb0fa
Copies Playwright e2e tests (58 specs, 300+ tests) designed for cross-app testing. Adapts API mocks to match real Aeroflot dictionary format (title objects with multilingual keys), adds board/schedule/days endpoint mocks, and provides Angular-specific Playwright config on port 4203.
218 lines
4.8 KiB
Markdown
218 lines
4.8 KiB
Markdown
# 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
|
|
```
|