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

7 KiB
Raw Blame History

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