Files
TS_Proto/qa/app-model.md
T
2026-10-10 21:57:24 +05:30

79 lines
3.8 KiB
Markdown

# App model — grounding index for test generation
> Generated by `npm run qa:index` from the codebase. Do not edit by hand.
Base URL: `http://localhost:4200` · Auth: basic (header `X-Tenant`)
## Accounts
| const | email | tenant | role |
| --- | --- | --- | --- |
| `SKYLINE_AGENT` | agent@skyline.test | skyline | agent |
| `SKYLINE_ADMIN` | admin@skyline.test | skyline | admin |
| `GLOBETROTTER_AGENT` | agent@globetrotter.test | globetrotter | agent |
| `GLOBETROTTER_ADMIN` | admin@globetrotter.test | globetrotter | admin |
_Password: see `DEMO_PASSWORD` in accounts.ts. Credentials verified within the named tenant; take accounts from e2e/fixtures/accounts.ts, never hardcode._
## Routes
- `/login`
- `/dashboard`
- `/search`
- `/book/:flightId`
- `/bookings`
- `/bookings/:bookingId`
## Areas (spec file → report area)
- `auth.spec.ts` — Signing in and sessions
- `search.spec.ts` — Searching for flights
- `booking.spec.ts` — Booking and cancelling
- `tenant-isolation.spec.ts` — Keeping agencies separate
- `dashboard.spec.ts` — Agency dashboard
- `simulation.spec.ts` — Behaviour when things go wrong
- `responsive.spec.ts` — Phones and small screens
## API endpoints
| method | path | auth |
| --- | --- | --- |
| GET | `/api/session` | required |
| GET | `/api/flights` | required |
| GET | `/api/flights/{id}` | required |
| GET | `/api/airports` | required |
| GET | `/api/airlines` | required |
| GET | `/api/bookings` | required |
| POST | `/api/bookings` | required |
| GET | `/api/bookings/{id}` | required |
| POST | `/api/bookings/{id}/cancel` | required |
| GET | `/api/dashboard` | required |
| GET | `/api/health` | public |
| GET | `/api/tenants` | public |
## Page objects (use these — no raw selectors in specs)
### `e2e/pages/bookings.page.ts` — BookingsPage, BookingDetailPage
- locators: `rows`, `emptyState`, `filterAll`, `filterConfirmed`, `filterCancelled`, `confirmationBanner`, `reference`, `statusBadge`, `travellerRows`, `totalPaid`, `cancelButton`, `confirmCancelButton`, `keepButton`, `cancelledNotice`
- methods: `goto()`, `settled()`, `rowFor(reference: string)`, `open(reference: string)`, `filterBy(status: 'all' | 'confirmed' | 'cancelled')`, `bookingReference()`, `cancel(expectedReference: string)`
### `e2e/pages/checkout.page.ts` — CheckoutPage
- locators: `travellerFieldsets`, `addTraveller`, `contactEmail`, `contactPhone`, `confirm`, `total`, `error`, `seatsLeft`
- methods: `waitUntilReady()`, `totalAmount()`, `fillTraveller(index: number, traveller: Traveller)`, `fillTravellers(travellers: Traveller[])`, `removeTraveller(index: number)`, `confirmBooking()`
### `e2e/pages/dashboard.page.ts` — DashboardPage
- locators: `greeting`, `tiles`, `recentRows`, `topRoutes`
- methods: `goto()`, `settled()`, `tileValue(label: string)`
### `e2e/pages/login.page.ts` — LoginPage
- locators: `tenantSelect`, `email`, `password`, `submit`, `error`, `demoChips`
- methods: `goto()`, `useDemoChip(account: Account)`, `fill(account: Account, password = account.password)`, `signIn(account: Account)`, `signInExpectingFailure(account: Account, password: string)`
### `e2e/pages/search.page.ts` — FlightCard, SearchPage
- locators: `root`, `origin`, `destination`, `date`, `cabin`, `travellers`, `searchButton`, `resetButton`, `sort`, `resultSummary`, `results`, `emptyState`, `nextPage`, `prevPage`
- methods: `fare()`, `seatsLeft()`, `flightNumber()`, `durationMinutes()`, `goto()`, `card(index = 0)`, `settled()`, `searchRoute(from: string, to: string)`, `setTravellers(n: number)`, `sortBy(value: 'price' | 'duration' | 'departure')`, `totalResults()`, `cardForFlight(flightNumber: string)`
### `e2e/pages/shell.page.ts` — ShellPage
- locators: `agencyName`, `agencySlug`, `accountName`, `accountMeta`, `signOut`
- methods: `goToDashboard()`, `goToSearch()`, `goToBookings()`, `signOutAndWait()`