food-market/docs/uat-report-2026-10-09.md
nns d380e186a8 feat(uat): дружелюбный заголовок валидации + mobile-UAT 390px + отчёт
- ValidationFilter (FluentValidation-путь): русский заголовок «Проверьте
  правильность заполнения» через ModelErrorTranslator вместо дефолтного англ.
  «One or more validation errors occurred» (сообщения полей уже были русскими).
- stage-ui-uat-mobile.spec.ts: P1-экраны на 390px без h-scroll/console/5xx +
  проверка «Остатки» (артикул/штрихкод, тумблер «показать нулевые»).
- docs/uat-report-2026-10-09.md: матрица покрытия (уже-зелёное vs проверено
  сейчас) по требованию владельца; галерея скринов reports/uat-mobile/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 10:16:47 +05:00

77 lines
7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Приёмочное тестирование (UAT) — 2026-10-09
Стенд: `https://test.admin.food-market.kz`. Исполнитель: автономная сессия (Opus 4.8).
Правило владельца: **не перепроверять уже проверенное**, тестировать только непокрытое;
отчёт — двумя частями.
## Часть A. Уже покрыто (регрессия, НЕ перепроверяем заново)
| Область | Чем покрыто | Где |
|---|---|---|
| Сквозная «жизнь магазина» (регистрация→справочники→сотрудники/точки→деньги→3 приёмки→оплаты→смена/продажи/возврат/Z→склад→отчёты→инварианты→откат), сверка ЧИСЕЛ | full-chain e2e (режим C temp-орг + режим B демо) | `tests/e2e/full-chain.sh`, nightly step 3b, watchdog step 11 |
| Доступность всех пунктов меню, роутинг | menu-walk e2e | watchdog step 9 (4-час каденция) |
| Касса (POS): продажа/оплата/отложенные/смена/деньги, кросс-платформенный рендер | POS `--uitest`/smoke + headless-скриншоты (24 кадра) | `src/food-market.pos`, [[pos_done]] |
| iOS «FM Склад»: остатки по группе, штрихкоды, /api/me права, весовые этикетки | integration MobileApiTests | `tests/food-market.IntegrationTests/MobileApiTests.cs` |
| Отрицательные остатки: разрешение продажи/списания в минус, алерт, recount, авто-resolve | integration NegativeStockTests | там же |
| Отчёт остатков на дату, прибыль, продажи, ABC | integration StockReport/Profit/Sales/AbcReportTests | там же |
| Деньги/смена: внесения/выемки, авто-открытие смены, Z-отчёт | integration MoneyModule + full-chain | там же |
| Мультитенантность/авторизация/роли/2FA/SSO/лояльность/промо | integration + watchdog step 7 | [[sprint27_done]] и др. |
| Простой/расширенный режим (гейтинг функций) | AdvancedMode unit+integration+e2e | [[sprint29_done]] |
## Часть B. Проверено сейчас (непокрытое ранее)
### B1. Баг владельца «показать нулевые» + фильтры (Часть 1–2) — ✅
Полная сверка — в `docs/filters-sweep-progress.md`. Кратко:
| # | Проверка | Ожидание | Факт | ✓/✗ |
|---|---|---|---|---|
| 1 | Demo (30 894), `stock` без флага | только с остатком | total 12 | ✓ |
| 2 | Demo, `stock?includeZero=true` | все не-услуги/не-архив | **30 894** | ✓ |
| 3 | 4× «BIOBLAS шампунь» | различимы, не удалены, нулевой виден | разные арт.+ШК; art 19677 qty 0 виден | ✓ |
| 4 | `catalog?productGroupId=<g>` | фильтрует (был игнор) | 5047 (как groupId) | ✓ |
| 5 | `stock?groupId&includeZero` (iOS) | товары группы с нулями | 5047 (было 0) | ✓ |
| 6 | filters-sweep (21 смысловых проверок) | все сходятся | 21/21 ✓ | ✓ |
| 7 | Производительность (30k, стр. 500) | < 500 мс | 162–399 мс | ✓ |
### B2. Ошибки ввода — дружелюбный русский (не 500 / не технический англ.) — ✅
Проба POST с кривыми телами на 6 типах (fresh temp-орг), ни одного 500 / утечки классов:
| Эндпоинт | Вход | Ответ | ✓/✗ |
|---|---|---|---|
| `inventory/losses` | enum «ХЗ» | «Неверное значение поля «Причина»» | ✓ |
| `sales/retail` | payment «нал» | «Неверное значение поля «Оплата»» | ✓ |
| `catalog/products` | packaging «штук» | «Неверное значение поля «Фасовка»» | ✓ |
| `inventory/enters` | пустое тело | «Поле StoreId обязательно.» | ✓ |
| `catalog/counterparties` | пустое имя | «Название обязательно.» (+рус. заголовок) | ✓ |
| `inventory/transfers` | в простом режиме | 403 «доступно в расширенном режиме» | ✓ |
### B3. Экраны P1 на ширине телефона (390px) — ✅
Playwright-спека `stage-ui-uat-mobile.spec.ts` (в nightly-наборе): dashboard, catalog/products,
inventory/stock, sales/retail, reports — **без горизонтального скролла**, без console-ошибок и 5xx.
Скриншоты: `tests/e2e/reports/uat-mobile/` (галерея `index.html`).
| Экран | 390px без h-scroll | console/5xx | ✓/✗ |
|---|---|---|---|
| Дашборд | да | чисто | ✓ |
| Товары | да | чисто | ✓ |
| Остатки | да | чисто | ✓ |
| Продажи | да | чисто | ✓ |
| Отчёты | да | чисто | ✓ |
Плюс на «Остатках» (390px): по умолчанию виден товар со стоком с артикулом/штрихкодом,
нулевой скрыт; тумблер «Показать нулевые» показывает нулевой — визуально подтверждено
(`stock-includeZero-390.png`).
### B4. Прочие найденные и починенные баги (детали в filters-sweep-progress.md)
- Будущие времена в «Последние продажи» — нормализация даты к UTC + clamp будущего.
- `causeUserId=null` в алертах минуса — автор пишется для всех типов документов.
- Устаревший oversell-тест (409) приведён к политике «минус разрешён».
- `food-market.UnitTests` не компилировался (FakeServer) — починен, юнит-тесты снова идут.
## Остаётся на следующие итерации (честно, не покрыто этой сессией)
- Ручной обход КАЖДОГО контрола на КАЖДОМ экране P2–P4 в браузере (периоды/статусы/
сорт на продажах/приёмках/движениях/контрагентах/сотрудниках). Частично покрыто
filters-sweep (списки) и menu-walk (достижимость); полный per-control UI-UAT — далее.
- UI-гейтинг прав для роли «кассир» в вебе (API-права покрыты /api/me; UI-скрытие — далее).
- Реальное окно POS на Windows 11 с новым лого (VM-захват) — отдельная задача [[pos_windows_capture]].