- 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>
7 KiB
Приёмочное тестирование (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.