# E2E testid contract (EventHubFrontAdmin) Селекторы: **`data-testid`** + a11y (`getByRole` / `getByLabel`) где имя стабильно. ## Naming | Pattern | Example | |---------|---------| | `page-{name}` | `page-login`, `page-users`, `page-inbox-reports` | | `nav-{slug}` | `nav-users` | | `row-{id}` | dense list / DataTable rows | | `row-activate-{id}` | dense list main click target | | `{entity}-row-{id}` | inbox-specific (`report-row-*`) | | `btn-{action}` | `btn-login`, `btn-save-profile` | | `dialog-{name}` | `dialog-edit-user` | | `filter-{name}` | `filter-users-search` | | `menu-user` / `lang-ru` | avatar dropdown | Helper: `src/lib/testid.ts`. ## Rules - kebab-case; dynamic id = API entity id (or banned word) - Prefer a11y for login fields - Do not decorate decorative wrappers ## Запуск | Команда | Назначение | |---------|------------| | `npm run test:e2e` | mock-suite (CI / PR), API через Playwright route | | `npm run test:e2e:ift` | IFT smoke (живой API), см. ниже | ### IFT / stage учётки Источник истины — env стенда (`EventHubDevOps/ift/.env`, `EventHubDevOps/stage/.env` → на хосте `/opt/eventhub-{ift,stage}/.env`): | Переменная | Назначение | |------------|------------| | `SMOKE_ADMIN_EMAIL` / `SMOKE_ADMIN_PASSWORD` | предпочтительно для smoke/E2E | | `ADMIN_SUPER_EMAIL` / `ADMIN_SUPER_PASSWORD` | fallback, если `SMOKE_ADMIN_*` пустые | Локально: `set -a && source /path/to/ift/.env && set +a && npm run test:e2e:ift`. Workflow `e2e-ift.yml` после Deploy IFT читает те же ключи по SSH с `/opt/eventhub-ift/.env` (нужны уже имеющиеся `IFT_SSH_*`). Опц. secret `E2E_IFT_BASE_URL`.