food-market/docs/uat-report-2026-10-09.md
nns a539c31cbc
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
docs(uat): часть C отчёта (per-control в браузере) + прогресс done + nightly step 3d
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:11:33 +05:00

109 lines
9.9 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–P4 на ширине телефона (390px) — ✅
Playwright-спека `stage-ui-uat-mobile.spec.ts` (в nightly-наборе): 16 экранов —
dashboard, catalog/products, counterparties, inventory/{stock,movements,enters,losses,
inventories}, purchases/supplies, sales/retail, money/{accounts,shifts}, reports/{sales,
stock,profit}, settings/employees — **без горизонтального скролла**, без console-ошибок и 5xx.
Скриншоты: `tests/e2e/reports/uat-mobile/` (галерея `index.html`). Все 16 — ✓.
Плюс на «Остатках» (390px): по умолчанию виден товар со стоком с артикулом/штрихкодом,
нулевой скрыт; тумблер «Показать нулевые» показывает нулевой — визуально подтверждено
(`stock-includeZero-390.png`).
### B3a. UI-гейтинг прав по ролям (demo-admin/keeper/cashier) — ✅ (попутно)
menu-walk (watchdog step 9) прошёл для 3 ролей и подтвердил разное меню: admin 34 пункта,
keeper 17, cashier 8 — reload каждого пункта без 4xx/5xx/toast.error/console.error. 3/3 ✓.
### B3b. Реальное окно кассы на Windows 11 с новым лого — ✅ (rebrand)
Снято на win11-kassa-test VM (`foodmarket.Pos.exe --demo`): заголовок «ALL MARKET · Касса»,
крупное лого all market, «Касса» рядом, экран продажи целиком, таскбар Windows 11.
`docs/rebrand-screenshots/now-pos-win11.png` (коммит rebrand:, отдельно от фиксов).
### B4. Прочие найденные и починенные баги (детали в filters-sweep-progress.md)
- Будущие времена в «Последние продажи» — нормализация даты к UTC + clamp будущего.
- `causeUserId=null` в алертах минуса — автор пишется для всех типов документов.
- Устаревший oversell-тест (409) приведён к политике «минус разрешён».
- `food-market.UnitTests` не компилировался (FakeServer) — починен, юнит-тесты снова идут.
## Часть C. Per-control UI-UAT в браузере (доделано 2026-10-09)
Методика: каждый контрол в РЕАЛЬНОМ браузере (Playwright, стенд) должен слать на API
правильный параметр (поиск→search, сортировка→sort, фильтр→свой параметр, пагинация→page=2,
экспорт→/export&format); семантику «параметр→правильные строки» независимо держит
filters-sweep (21/21). Жизненный цикл документа — настоящими кнопками UI. Данные — свежая
temp-орг, ожидаемое тест считает сам. Спеки: `stage-ui-uat-controls.spec.ts`,
`stage-ui-uat-permissions.spec.ts` (в nightly step 3d).
**Контролы списков — 21/21 ✓** (✗ нет):
| Экран | Контролы (✓) |
|---|---|
| Товары | поиск · сброс · сортировка(название) · пагинация(page=2) · экспорт |
| Приёмки | поиск · фильтр оплаты(paid) · сортировка(№) · экспорт · жизненный цикл: провести→снять→удалить |
| Продажи (чеки) | поиск · сортировка(дата) |
| Движения | фильтр по складу(storeId) |
| Контрагенты | поиск |
| Оприходования | поиск |
| Списания | поиск |
| Инвентаризации | поиск |
| Возвраты поставщику | поиск |
Сортировка/пагинация на документных списках используют те же общие компоненты
(`useCatalogList`+`DataTable`) и серверный OrderBy, что и проверенные Товары/Приёмки;
монотонность сортировки и разбиение пагинации независимо проверены в filters-sweep.
**Гейтинг прав по ролям — 2/2 ✓**: кассир и кладовщик по ПРЯМОМУ URL к админ-разделам
(/settings/*, /catalog/{counterparties,stores,retail-points}, /money/*) видят страницу
«Нет доступа» (RoleGuard), а не данные; разрешённые разделы открываются. Меню- и
API-гейтинг (403) — в full-chain. Кнопки действий на не-RoleGuard-страницах недоступны,
т.к. запрос данных отдаёт 403 (страница без данных → без кнопок действий).
## Остаётся на следующие итерации (честно)
- Полностью ручной обход редких экранов (накладные по фото, лояльность, промо) — вне P1–P3.
- Реальное окно POS на Windows 11 с новым лого — снято (`docs/rebrand-screenshots/now-pos-win11.png`).