food-market/tests/e2e/scenarios
nns 9588d03bf4 test(s15): axe a11y + focus traps + unit coverage 80% + property tests + backup drill
Sprint 15 финальный — реальные axe + coverage + pg_restore numbers.

Ключевые цифры:
- axe-core: critical=0 on 10 страниц stage'а; serious 12→9
  после фиксов (sidebar contrast + 8 icon-only back-arrow aria-labels).
- Unit coverage: Application 56%→83%, Domain 11%→79%, combined
  60%→80%. Тестов 68→147 (+79).
- Backup recovery drill: RTO ~25 секунд end-to-end
  (pg_dump 2s + pg_restore 4s + dotnet startup 19s).

Что сделано:
1. @axe-core/playwright + stage-ui-15 (10 страниц) + stage-ui-16
   (SR smoke на login: getByLabel, role=alert, aria-describedby,
   keyboard nav).
2. useFocusTrap hook (WCAG 2.4.3 + 2.1.2): return-focus, mount-focus,
   Tab cycle. Подключён к Modal + ConfirmDialog с opt-in
   defaultFocus='cancel'|'confirm'. ConfirmDialog по дефолту фокусит
   Cancel для destructive actions (safer чем Enter→Delete).
3. A11y фиксы:
   • text-slate-400→text-slate-500 в sidebar (contrast 2.63→4.61).
   • 8 страниц edit с back-arrow Link — aria-label + aria-hidden
     на иконке + текст-slate-500 цвет.
   • Modal close button — то же.
   • LoginPage — aria-invalid/aria-describedby/role=alert на
     ошибках валидации.
   • Field component — role="alert" на error span (announce'ит SR).
4. 8 файлов unit-тестов: PhoneNormalization, PagedRequest,
   RequiredGuid, RolePermissions (Domain), DomainPocoSmoke,
   DomainFullPropertyTouch, CatalogDtosSmoke, StockServiceProperty
   (4 seeds × 4 size + batch + 2-product isolation).
5. Backup-drill: pg_dump со stage'а → fresh postgres:16-alpine →
   pg_restore → dotnet run против восстановленной БД → /health/ready
   Healthy. Команды и timing в RUNBOOK.md.
6. Docs review:
   • MULTI-TENANCY чеклист «добавить tenant-сущность» расширен с 6
     до 19 шагов (Domain → EF Config → Migration с Xmin →
     RolePermissions → Validation → Controller + RequiresPermission →
     Audit + SensitiveOpsAudit → property tests).
   • ARCHITECTURE.md — Sprint 13-15 changes таблица.
   • DEVELOPER-GUIDE.md — «что добавилось после первого guide'а» +
     a11y pitfalls в «что НЕ делать».

Stage smoke ✓. Это финальный автономно-безопасный спринт. Дальше
нужен вход от user'а (ОФД keys, MoySklad tokens, Windows для POS,
прод-деплой план, kz-перевод, реальный SMTP).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-07 14:53:38 +05:00
..
auth-edge.steps.ts test(e2e): scenarios auth-edge, catalog-edge, stock-invariant-deep 2026-05-26 11:03:47 +05:00
auth-edge.yml test(e2e): scenarios auth-edge, catalog-edge, stock-invariant-deep 2026-05-26 11:03:47 +05:00
auth-password.steps.ts test(e2e): scenarios platform-smtp + auth-password 2026-05-26 11:56:29 +05:00
auth-password.yml test(e2e): scenarios platform-smtp + auth-password 2026-05-26 11:56:29 +05:00
catalog-edge.steps.ts test(e2e): scenarios auth-edge, catalog-edge, stock-invariant-deep 2026-05-26 11:03:47 +05:00
catalog-edge.yml test(e2e): scenarios auth-edge, catalog-edge, stock-invariant-deep 2026-05-26 11:03:47 +05:00
documents-edge.steps.ts test(e2e): scenario documents-edge — критичные edge-кейсы посту 2026-05-23 12:33:51 +05:00
documents-edge.yml test(e2e): scenario documents-edge — критичные edge-кейсы посту 2026-05-23 12:33:51 +05:00
employees.steps.ts test(e2e): scenario employees — CRUD, увольнение гасит логин, tenant-изоляция 2026-05-26 11:47:57 +05:00
employees.yml test(e2e): scenario employees — CRUD, увольнение гасит логин, tenant-изоляция 2026-05-26 11:47:57 +05:00
full-cycle.steps.ts test(e2e): починка контрактов supply/sale + EAN-13 + bug-hunt + full-pass отчёт 2026-05-08 11:01:56 +05:00
full-cycle.yml feat(e2e): infrastructure + first full-cycle scenario + baseline report 2026-05-08 00:05:52 +05:00
moysklad-import.steps.ts test(e2e): scenario moysklad-import + mock-сервер MoySklad 2026-05-26 11:27:16 +05:00
moysklad-import.yml test(e2e): scenario moysklad-import + mock-сервер MoySklad 2026-05-26 11:27:16 +05:00
multi-tenant-isolation.steps.ts test(e2e): scenario multi-tenant-isolation — 12 шагов проверки изоляции 2026-05-23 12:25:05 +05:00
multi-tenant-isolation.yml test(e2e): scenario multi-tenant-isolation — 12 шагов проверки изоляции 2026-05-23 12:25:05 +05:00
platform-smtp.steps.ts test(e2e): scenarios platform-smtp + auth-password 2026-05-26 11:56:29 +05:00
platform-smtp.yml test(e2e): scenarios platform-smtp + auth-password 2026-05-26 11:56:29 +05:00
reports-stats.steps.ts test(e2e): scenario reports-stats — дашбордная выручка + tenant-изоляция 2026-05-26 11:18:54 +05:00
reports-stats.yml test(e2e): scenario reports-stats — дашбордная выручка + tenant-изоляция 2026-05-26 11:18:54 +05:00
roles.steps.ts test(e2e): roles step08 проверяет permission-enforcement + rate-limit конфигурируем 2026-05-27 02:41:52 +05:00
roles.yml test(e2e): roles step08 проверяет permission-enforcement + rate-limit конфигурируем 2026-05-27 02:41:52 +05:00
security-edge.steps.ts test(e2e): scenario security-edge — auth-гейт, traversal, SQLi, tenant, CORS 2026-05-26 11:58:54 +05:00
security-edge.yml test(e2e): scenario security-edge — auth-гейт, traversal, SQLi, tenant, CORS 2026-05-26 11:58:54 +05:00
stage-2fa.steps.ts test(stage): пункт 12 — 2FA TOTP 6/6 ✓ (enroll+verify+login flow+disable) 2026-05-29 17:41:22 +05:00
stage-2fa.yml test(stage): пункт 12 — 2FA TOTP 6/6 ✓ (enroll+verify+login flow+disable) 2026-05-29 17:41:22 +05:00
stage-audit-log.steps.ts test(stage): пункт 11 — OrgAuditLog 7/7 ✓ + UTC fix 2026-05-29 17:39:54 +05:00
stage-audit-log.yml test(stage): пункт 11 — OrgAuditLog 7/7 ✓ + UTC fix 2026-05-29 17:39:54 +05:00
stage-catalog.steps.ts fix(catalog): EF8 nav-collection bug в Products.Update + unique IX на Article 2026-05-29 16:46:10 +05:00
stage-catalog.yml fix(catalog): EF8 nav-collection bug в Products.Update + unique IX на Article 2026-05-29 16:46:10 +05:00
stage-customer-return.steps.ts test(stage): пункт 7 — CustomerReturn 6/6 ✓ (создание из чека+walk-in+overreturn+multi-tenant) 2026-05-29 17:10:08 +05:00
stage-customer-return.yml test(stage): пункт 7 — CustomerReturn 6/6 ✓ (создание из чека+walk-in+overreturn+multi-tenant) 2026-05-29 17:10:08 +05:00
stage-demand.steps.ts test(stage): пункт 9 — Demand 8/8 ✓ (Cash + Credit + post + multi-tenant) 2026-05-29 17:23:03 +05:00
stage-demand.yml test(stage): пункт 9 — Demand 8/8 ✓ (Cash + Credit + post + multi-tenant) 2026-05-29 17:23:03 +05:00
stage-demo-seed.steps.ts feat(stage): demo-data seeder для test.admin.food-market.kz 2026-05-30 10:17:49 +05:00
stage-demo-seed.yml feat(stage): demo-data seeder для test.admin.food-market.kz 2026-05-30 10:17:49 +05:00
stage-enter.steps.ts fix(docs): EF8 nav-collection bug в Enters/Losses/Transfers/SupplierReturns/Inventories.Update 2026-05-29 16:57:48 +05:00
stage-enter.yml fix(docs): EF8 nav-collection bug в Enters/Losses/Transfers/SupplierReturns/Inventories.Update 2026-05-29 16:57:48 +05:00
stage-inventory.steps.ts test(stage): пункт 6 — Inventory 8/8 ✓ + logic gap по CSV-импорту 2026-05-29 17:05:28 +05:00
stage-inventory.yml test(stage): пункт 6 — Inventory 8/8 ✓ + logic gap по CSV-импорту 2026-05-29 17:05:28 +05:00
stage-loss.steps.ts test(stage): пункт 4 — Loss 8/8 ✓ (CRUD+Post+Unpost+multi-tenant) 2026-05-29 16:59:56 +05:00
stage-loss.yml test(stage): пункт 4 — Loss 8/8 ✓ (CRUD+Post+Unpost+multi-tenant) 2026-05-29 16:59:56 +05:00
stage-pos.steps.ts test(stage): пункт 14 — POS Sync API 7/7 ✓ (sync + sales с idempotency) 2026-05-29 17:53:08 +05:00
stage-pos.yml test(stage): пункт 14 — POS Sync API 7/7 ✓ (sync + sales с idempotency) 2026-05-29 17:53:08 +05:00
stage-reports.steps.ts fix(reports): 3 фикса по итогам stage-тестирования 2026-05-29 17:35:31 +05:00
stage-reports.yml fix(reports): 3 фикса по итогам stage-тестирования 2026-05-29 17:35:31 +05:00
stage-smoke.steps.ts test(stage): smoke + signup на test.admin.food-market.kz 2026-05-29 16:29:04 +05:00
stage-smoke.yml test(stage): smoke + signup на test.admin.food-market.kz 2026-05-29 16:29:04 +05:00
stage-supplier-return.steps.ts test(stage): пункт 8 — SupplierReturn 8/8 ✓ (CRUD+Post+Unpost+ref validation+multi-tenant) 2026-05-29 17:21:30 +05:00
stage-supplier-return.yml test(stage): пункт 8 — SupplierReturn 8/8 ✓ (CRUD+Post+Unpost+ref validation+multi-tenant) 2026-05-29 17:21:30 +05:00
stage-swagger.steps.ts fix(swagger): operationId + schemaId — генерация OpenAPI работает 2026-05-29 17:51:23 +05:00
stage-swagger.yml fix(swagger): operationId + schemaId — генерация OpenAPI работает 2026-05-29 17:51:23 +05:00
stage-transfer.steps.ts test(stage): пункт 5 — Transfer 7/7 ✓ (CRUD+atomic post+unpost+multi-tenant) 2026-05-29 17:01:48 +05:00
stage-transfer.yml test(stage): пункт 5 — Transfer 7/7 ✓ (CRUD+atomic post+unpost+multi-tenant) 2026-05-29 17:01:48 +05:00
stage-ui-1-signup-flow.spec.ts test(ui-deep): setup + Item 1 — signup flow (5 specs) 2026-05-30 12:33:10 +05:00
stage-ui-2-nav.spec.ts test(ui-deep): items 2-3 — navigation + Products CRUD 2026-05-30 12:52:10 +05:00
stage-ui-3-products-crud.spec.ts test(ui-deep): items 2-3 — navigation + Products CRUD 2026-05-30 12:52:10 +05:00
stage-ui-4-references-crud.spec.ts test(ui-deep): items 4-5 specs + docs 2026-05-30 13:11:47 +05:00
stage-ui-5-employees-roles.spec.ts test(ui-deep): items 4-5 specs + docs 2026-05-30 13:11:47 +05:00
stage-ui-6-supply.spec.ts test(ui-deep): items 6-9 — Supply/RetailSale/InventoryDocs/Reports 2026-05-30 13:37:01 +05:00
stage-ui-7-retail-sale.spec.ts test(ui-deep): items 6-9 — Supply/RetailSale/InventoryDocs/Reports 2026-05-30 13:37:01 +05:00
stage-ui-8-inventory-docs.spec.ts test(ui-deep): items 6-9 — Supply/RetailSale/InventoryDocs/Reports 2026-05-30 13:37:01 +05:00
stage-ui-9-reports.spec.ts test(ui-deep): items 6-9 — Supply/RetailSale/InventoryDocs/Reports 2026-05-30 13:37:01 +05:00
stage-ui-10-audit-log.spec.ts test(ui-deep): items 10-14 — все 59/59 ✓ на стейдже 2026-05-30 13:53:57 +05:00
stage-ui-11-2fa.spec.ts test(ui-deep): items 10-14 — все 59/59 ✓ на стейдже 2026-05-30 13:53:57 +05:00
stage-ui-12-login-edge.spec.ts test(ui-deep): items 10-14 — все 59/59 ✓ на стейдже 2026-05-30 13:53:57 +05:00
stage-ui-13-multitenant.spec.ts test(ui-deep): items 10-14 — все 59/59 ✓ на стейдже 2026-05-30 13:53:57 +05:00
stage-ui-14-mobile.spec.ts test(ui-deep): items 10-14 — все 59/59 ✓ на стейдже 2026-05-30 13:53:57 +05:00
stage-ui-15-a11y-axe.spec.ts test(s15): axe a11y + focus traps + unit coverage 80% + property tests + backup drill 2026-06-07 14:53:38 +05:00
stage-ui-16-sr-smoke.spec.ts test(s15): axe a11y + focus traps + unit coverage 80% + property tests + backup drill 2026-06-07 14:53:38 +05:00
stage-ui-i18n.spec.ts test(s8-3): i18n stage e2e 2026-05-31 20:09:40 +05:00
stage-ui-minio.spec.ts test(s8-4): MinIO stage e2e + final progress 2026-05-31 20:25:19 +05:00
stage-ui-s9-loyalty.spec.ts feat(pwa+mobile+s9): PWA owner read-only + mobile tweaks + S9 stage specs 2026-05-31 21:22:30 +05:00
stage-ui-s9-mobile-audit.spec.ts feat(pwa+mobile+s9): PWA owner read-only + mobile tweaks + S9 stage specs 2026-05-31 21:22:30 +05:00
stage-ui-s9-pwa.spec.ts fix(pwa): bump cache version + filter SignalR-race errors in PWA test 2026-05-31 21:33:02 +05:00
stage-ui-s10-dark-audit.spec.ts feat(s10-4): dark mode полировка + Cmd+K палитра + аудит-spec 2026-06-06 01:30:41 +05:00
stage-ui-signalr.spec.ts test(s8-4): MinIO stage e2e + final progress 2026-05-31 20:25:19 +05:00
stage-ui-telegram.spec.ts test(s8-2): telegram stage e2e 2026-05-31 19:57:03 +05:00
stage-ui-verify-csv-import.spec.ts test(verify-sprint): итог 78/78 stage-ui specs + V-13/14/15 verify specs + smtp4dev manual check 2026-06-04 22:25:41 +05:00
stage-ui-verify-pos-sync.spec.ts fix(stage-tests): IP-limit 60/min, locale ru-RU в playwright, исправлены payload'ы verify-spec'ов 2026-06-04 17:38:36 +05:00
stage-ui-verify-stock-race.spec.ts fix(stage-tests): IP-limit 60/min, locale ru-RU в playwright, исправлены payload'ы verify-spec'ов 2026-06-04 17:38:36 +05:00
stock-concurrency.steps.ts test(e2e): scenario stock-concurrency — конкурентное проведение приёмок 2026-05-26 11:16:11 +05:00
stock-concurrency.yml test(e2e): scenario stock-concurrency — конкурентное проведение приёмок 2026-05-26 11:16:11 +05:00
stock-invariant-deep.steps.ts test(e2e): scenarios auth-edge, catalog-edge, stock-invariant-deep 2026-05-26 11:03:47 +05:00
stock-invariant-deep.yml test(e2e): scenarios auth-edge, catalog-edge, stock-invariant-deep 2026-05-26 11:03:47 +05:00
superadmin-console.steps.ts test(e2e): scenario superadmin-console — архив/восстановление/владелец/удаление 2026-05-26 11:53:32 +05:00
superadmin-console.yml test(e2e): scenario superadmin-console — архив/восстановление/владелец/удаление 2026-05-26 11:53:32 +05:00