# 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()`