# Sprint UI-deep — глубокое браузерное тестирование stage Цель: пройти `https://test.admin.food-market.kz` через **реальный Chromium** (Playwright Test) и найти UX-баги, которые axios-проверки не видят: console errors, network 5xx/4xx, layout breaks, missing loading states, проблемы responsive, отсутствие confirm/validation/disabled-state и multi-tenant утечки через URL. Старт: 2026-05-30. Исполнитель: Claude Opus 4.7 (автономный режим). ## Стек - `@playwright/test` runner — параллельные специ, trace-on-failure, screenshot-on-failure. - `otplib` — генерация TOTP-кодов для item 11 (2FA flow). - Все спецы лежат в `tests/e2e/scenarios/stage-ui-*.spec.ts`. - `tests/e2e/playwright.config.ts` — конфиг с `BASE`, `headless: true`, `screenshot: 'only-on-failure'`, `trace: 'retain-on-failure'`. ## Принципы - Каждый пункт = отдельный spec-файл (.spec.ts). - Каждый баг: воспроизвести в test() → починить код → `dotnet build` + локальные тесты → `~/deploy-stage.sh` → retest spec на стейдже зелёный → коммит фикса → коммит spec → `[x]` в этом доке. - НЕ трогать: `global.json`, прод-стек, POS WPF. ## Чек-лист - [x] **1. Signup → onboarding → первая работа** — `stage-ui-1-signup-flow.spec.ts` (5 specs ✓). Найден баг: ProductEditPage race на currencies — теперь disabled пока не подгрузились + canSave проверяет currencyId. Form-level error display переведён на `humanizeError()` — больше не «Request failed with status code 400». - [x] **2. Дашборд + навигация** — `stage-ui-2-nav.spec.ts` (4 ✓). 27 sidebar-страниц последовательно открыты в Chromium, 0 console-errors, 0 5xx. Активный пункт (aria-current="page") и labels проверены. - [x] **3. Каталог (товары) full CRUD** — `stage-ui-3-products-crud.spec.ts` (5 ✓). Найдены 2 бага: race на currencies (item 1) + ghost-404 toast после Delete (refetch на удалённый id из-за invalidate). Также Modal a11y улучшен. Image upload — через `setInputFiles()`, проверяем response code. - [x] **4. Контрагенты / Группы / Единицы / Типы цен** — `stage-ui-4-references-crud.spec.ts` (4 ✓). Контрагенты: modal CRUD с ConfirmDialog. Группы: create через UI. Типы цен: bootstrap + новая. Единицы — smoke. - [x] **5. Сотрудники + Роли** — `stage-ui-5-employees-roles.spec.ts` (3 ✓). 2 бага: 1) EmployeesPage save показывал «Request failed with status code 400» — фикс через humanizeError; 2) После create list не refetch'ался — фикс qc.invalidateQueries после direct api.post. - [ ] **6. Приёмка (Supply)** — Draft→Post через UI, кнопка disabled без строк, остаток обновлён, Unpost, конкурентность (2 вкладки → 409). - [ ] **7. RetailSale + CustomerReturn** — payment-валидация, oversell-ошибка читаемая, возврат из проведённой продажи кнопкой. - [ ] **8. Складские документы** — Enter/Loss/Transfer/Inventory/SupplierReturn/Demand: создать→провести→остаток. Transfer запрет From==To. Inventory CSV-import. - [ ] **9. Отчёты — Sales/Stock/Profit/ABC** — фильтры через UI, числа сходятся, CSV/XLSX скачивается через page.waitForEvent('download'). - [ ] **10. OrgAuditLog UI** — записи видны, diff раскрывается, фильтры работают. - [ ] **11. 2FA flow** — Enroll, QR, otplib код, Verify, login требует 2FA, Disable. - [ ] **12. Login edge** — неверный пароль (читаемая ошибка), rate-limit 429, forgot-password. - [ ] **13. Multi-tenant изоляция через URL** — 2 контекста, A создаёт товар, B пытается /products/{id-A} → 404. - [ ] **14. Mobile viewport 375x667** — шаги 1-6 на мобильном, найти что ломается. ## Журнал ### 2026-05-30 — старт - Создан этот файл. Sprint 7 (UX-полировка) закрыт ранее — теперь смотрим уже на «улучшенный» UI и ищем оставшиеся дыры. - Подготовка: устанавливаю `@playwright/test`, `otplib`. Конфиг + helper'ы.