food-market/docs/uat-coverage-progress.md
nns 2b751dc129
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
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
test(uat): измеримое покрытие — прогон + HTML с цифрами (P1–P3 80%, P4 37%)
Доработаны хендлеры браузерного прогона (пагинация со сбросом поиска, обобщённое
создание/сохранение/удаление, период-фильтры, доп. сид: чек/приёмка/оприходование/
списание/инвентаризация/возврат). Экстрактор ловит строковый фолбэк заголовка колонки.
docs/uat-coverage.html — цифры по экрану/приоритету/общим. Цели (P1–P3 ≥95%, P4 ≥70%)
пока НЕ достигнуты (переход на ALL MARKET в приоритете) — остаток задокументирован в
docs/uat-coverage-progress.md, продолжим после перехода.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 13:09:46 +05:00

78 lines
7.1 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 — измеримое покрытие каждого элемента каждого экрана
Цель: матрица покрытия, построенная ИЗ КОДА, + браузерный прогон → `docs/uat-coverage.html`
с % по экрану/приоритету/общим. Цели: P1–P3 ≥95%, P4 ≥70%. НЕ перепроверять уже покрытое.
Легенда: [x] готово · [~] частично · [ ] не начато.
## Инструменты
- `tests/e2e/tools/extract-controls.ts` — статически из `web/src/pages` достаёт все
интерактивные элементы экрана (поиск/фильтры/сортировки/пагинация/экспорт/тумблеры/
действия) → `docs/uat-coverage.expected.json`. Фильтр списка отличается от поля формы
по `setPage` в обработчике. 36 экранов, 195 элементов.
- `tests/e2e/scenarios/stage-ui-uat-coverage.spec.ts` — браузерный прогон: задействует
каждый элемент, пишет `tests/e2e/reports/uat-covered.json`.
- `tests/e2e/tools/build-coverage.ts` — сводит → `docs/uat-coverage.{json,html}` с %.
## Статус покрытия (на момент смены приоритета 09.10 — переход на ALL MARKET)
Цифры в `docs/uat-coverage.html` (и `uat-coverage.json`). Прогон на стенде, temp-орг с сидом.
| Приоритет | Покрыто | Цель |
|---|---|---|
| **Общее** | **61% (119/195)** | — |
| P1 | 84% (27/32) | 95% |
| P2 | 86% (12/14) | 95% |
| P3 | 76% (48/63) | 95% |
| **P1–P3** | **80% (87/109)** | **95%** |
| P4 | 37% (32/86) | 70% |
Прогресс по итерациям: базовый 50% → после доработки хендлеров (пагинация со сбросом
поиска, обобщённое создание/сохранение/удаление, период-фильтры, доп. сид: чек/приёмка/
оприходование/списание/инвентаризация/возврат) → 61% (P1–P3 71%→80%, P4 24%→37%).
### Что уже покрыто хорошо (из кода × браузер)
- По типам: **export 5/5, sort 60/77, toggle 2/2, search 18/25, filter (часть), pagination
(где есть данные)**. Действия create/save — частично (обобщённый CRUD-хендлер).
- Инструменты рабочие: экстрактор (195 элементов из 36 экранов), браузерный прогон, HTML с %.
### Что НЕ успел (продолжить после перехода на ALL MARKET)
Цели (P1–P3 ≥95%, P4 ≥70%) НЕ достигнуты — осталось добрать ~22 элемента P1–P3 и ~28 P4:
- **Сортировки с динамическим/условным заголовком** (ProductsPage `systemPrice`→имя типа цены,
`vat`→колонка только при вкл. НДС): экстрактор доработан ловить строковый фолбэк
(`header: expr ?? 'Текст'`) — нужно перегенерировать expected и прогнать ещё раз.
- **Фильтры со СМЫСЛОМ** (правильные строки по известным данным): сейчас проверяется, что
контрол шлёт новый запрос; семантику части списков держит filters-sweep. Добить smысл для
продаж (период/оплата), приёмок (поставщик/склад/статус/оплата), движений (тип/товар/период),
денег (счёт/период/тип), отчётов (период/группировки/склад/группа на дату).
- **Действия документов** post/unpost на списках money/transactions, invoices (сейчас — наличие
элемента); довести до реального POST с проверкой 2xx.
- **P4 save/delete**: обобщённый хендлер покрывает простые CRUD-модалки; формы со множеством
обязательных полей (счета/точки/сотрудники/настройки) требуют адресного заполнения.
- **Пагинация** на экранах без сид-данных: отрисовывается только при total>0 — досидить или
считать покрытой по общему компоненту.
- nightly: добавить `stage-ui-uat-coverage` в ночной прогон (пока не добавлено).
Запуск: `cd tests/e2e && pnpm exec tsx tools/extract-controls.ts` (матрица) →
`pnpm exec playwright test stage-ui-uat-coverage` (прогон) → `pnpm exec tsx tools/build-coverage.ts` (HTML).
## Найдено Mac-Claude (быстрые фиксы — сделаны)
1. **«Проверка данных» на Демо — все 0, lastCheckedAt=null.** Hangfire-джоба `DataQualityJob`
зарегистрирована (ежедневный cron 02:20 UTC, идёт по всем активным орг), и `RecomputeAsync`
корректна — просто ночной прогон ещё не отрабатывал после пересева Демо. Фикс: разовый
`BackgroundJob.Enqueue(DataQualityJob)` при старте → считается сразу после деплоя/пересева.
**Реальные числа Демо (стенд, после фикса):** total 1276 ·
без группы 0 · **без цены продажи 718** · без штрихкода 0 · дубль ШК 0 ·
**возможный дубль (имя+ед.) 558** (включая 4× «"BIOBLAS" шампунь д/волос 360мл») ·
товары в минусе 0. `lastCheckedAt` проставлен.
2. **Внутренний ШК с ведущим 0 («0201259508594»).** `InternalBarcode.PickPrefix` брал «02»
(ведущий 0 → зона UPC-A, риск совпасть с реальным товаром). Фикс: берём 2x из
restricted-circulation 20–29 (без ведущего нуля), не пересекаясь с весовыми префиксами
орг; «02» — крайний резерв. Для весовых — короткий «27+5» по настройке (отдельно).
**Проверка на стенде:** новые коды — `2021712729230`, `2043662520927`, `2084330808596`
(префикс 20, без ведущего нуля). Существующие коды НЕ мигрировали: смена ШК ломает
ссылки, а отличить ранее сгенерированный «02…» от реального невозможно; генератор
исправлен для всех НОВЫХ товаров.
## Что НЕ трогаем
Прод, shared-postgres, global.json, gateway nginx, sklad.