diff --git a/docs/ux-ui-acceptance-candidate.md b/docs/ux-ui-acceptance-candidate.md new file mode 100644 index 00000000..4b7fe36a --- /dev/null +++ b/docs/ux-ui-acceptance-candidate.md @@ -0,0 +1,49 @@ +# Кандидат итоговой приёмки UX/UI — 2026-10-15 + +Статус: **основная UI-регрессия263 принята; отдельная context-регрессия264 запланирована**. Этот документ не разрешает выпуск, push или развёртывание в production. Этап12.5 пока открыт. + +## Проверенный контур + +- Debian13/Docker Compose, PostgreSQL18.6, Portal1.3.1; один backend. +- Два тестовых CHR RouterOS7.24.5:194.226.121.150 и104.165.244.7. HTTP REST используется по разрешению владельца стенда. +- Backend `ux-certificates258`: `sha256:984684709e619972bae8657208e3150d12f1c4f2b5642fecf5286a5d87e9fe71`. +- Frontend `ux-accessibility261`: `sha256:eec4410f1109a46e864d695cfb4311fdb9a224247549c8a9e78e44c6c0e455cb`. +- Основной ПК и узкий экран320px, обе темы. Android StrongSwan full-tunnel/reconnect подтверждены пользователем227; прочие ОС этим не принимаются. + +Точные версии активных образов: [deployment261](ux-ui/acceptance/ui261-deployment.json). История решений: [план](ux-ui-plan.md), [журнал](ux-ui-progress.md), [внешняя матрица](ux-ui-remaining-acceptance.md). + +## Критерии этапа12 + +| Критерий | Фактический результат | Граница доказательства | +| --- | --- | --- | +| Общая оболочка, доступность и адаптивность |260/261:120 уникальных default states30 экранов, обе темы/1440 и320px; профильные клавиатурные проверки и исправленный фокус при смене URL | Результаты разных фаз сохранены; это не полный ручной screen-reader аудит и не все состояния каждой формы | +| Достоверность данных и операций | Unknown/partial состояния и подтверждение операций проверены профильными наборами и реальными сценариями журнала; в259 проверены native ID/key/fingerprint, TLS и canonical dates | Успех HTTP сам по себе не принят за применение; произвольные внешние конфигурации не охвачены | +| Производительность | Большие списки — локальная12.3.83;260 — synthetic timings с отдельным ожиданием ответов API;262 —10min REST soak/252 запросов | Это измерения конкретного стенда, без заявления field CWV, maximum throughput или бесконечной устойчивости | +| Сборки и регрессия | Backend257:25 profiles; certificates258:9 scripts/build/lint; frontend261:production build, source528 matched; профильные E2E260/261 пройдены | UI263:1393 initial +3 targeted =1396 unique passed,0 skipped/flaky; context-набор ожидает отдельного264, исторический результат не выдан за новый | +| Реальные интеграции | Portal/Telegram195–201, Android227, S3/limited bridge restore/retention228–240, GeoIP mirror242, контейнеры248, ACME250/renewal259 | Успех этих сценариев не подтверждает все сторонние клиенты/провайдеры и многопроцессную установку | +| ReUI | Frame/base-nova/установленные компоненты; semantic Badge variants; vendor/theme/motion не изменены; checklist и scoped проверки зафиксированы260/261 | Вне проверенных состояний могут оставаться проблемы; автоматический axe не является полной сертификацией WCAG | + +Краткие протоколы: [UI260](ux-ui/acceptance/ui260-summary.json), [UI261](ux-ui/acceptance/ui261-summary.json), [REST262](ux-ui/acceptance/rest262-summary.json), [UI263](ux-ui/acceptance/ui263-summary.json), [ACME259](ux-ui/acceptance/acme259-native-rotation.json). + +## Что остаётся за пределами подтверждённого контура + +| Группа | Что не подтверждено / чего не хватает | +| --- | --- | +| Клиентские ОС и доступность | Windows/macOS/iOS VPN; другие Android-конфигурации; ручная проверка screen reader/assistive technology | +| Внешняя сеть | Публичного IPv6 на стенде нет; независимые WAN, физическая потеря пути, outer IPv6 и maximum throughput не приняты | +| Масштаб и устойчивость | Несколько полноценных backend/worker со всеми writers, длительные rekey/failover/DB disconnect; контролируемые multi-process тесты не заменяют весь этот контур | +| PKI и маршрутизация | Произвольные PKI/OID/path-length/политики, все конфигурации IPv6/address pool; CA revocation ACME отдельно не принят | +| Внешние сервисы | Публикация Gitea CI не запускалась по правилу no push; прямой licensed MaxMind отсутствует в текущей реализации; EvoBGP на стенде выключен и не настроен | +| S3 | Большой native export, произвольная миграция бакетов и работа нескольких экземпляров требуют отдельной приёмки; полный restore конфигурации CHR не выполнялся | + +Эти строки — ограничения доказательств и возможностей текущей реализации. Они не превращаются автоматически в поручение реализовать новые функции или получить отсутствующее оборудование. + +## Состояние стенда и сохранность + +После ACME259 восстановлены исходные SSL/native certificates/files/export и приватные SQL-настройки; собственные DNS/issue jobs и приватные ACME fixtures удалены. Контрольные проверки обоих CHR успешны; пароли не менялись. Последующие260–262 не изменяли конфигурацию устройств. ECMP261 проверялся как локальный черновик, затем возвращён off. + +Коммиты только локальные, без push. В полном UI-наборе263 фактический Next dev manifest направляет unmocked proxy на недоступный `127.0.0.1:9`; исходные371 screenshot-файл сохранены перед запуском и сверены:124 перезаписанных восстановлены, SHA-256 всех371 совпал; два исторических JSON также восстановлены. + +## Следующий шаг + +Выполнить отдельный context-набор264, затем завершить акт для предоставленного лабораторного контура с сохранением перечисленных ограничений. Публикация и production-развёртывание в текущий объём не входят. diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index f90aa818..1dbe0403 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -1,6 +1,6 @@ # UX/UI: протокол внешней приёмки 12.5 -Актуальное продолжение 2026-10-15: 262 — ten-minute REST soak после shared pool fix прошёл:21 волна×12 GET,252 запросов/504 device observations,200/errornull везде, новые receipts, native writes0. UI260/261 покрывает120 unique default states30 экранов. Runtime backend258/frontend261. Следующий263 — полная актуальная локальная UI-регрессия с изоляцией backend и сохранением screenshots; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 263 — основной UI-набор принят:1393 initial +3 targeted =1396 уникальных сценариев, без пропусков; исходные371 screenshots и два исторических JSON восстановлены. Production backend258/frontend261. Далее264 — отдельная context-регрессия и итоговый акт; границы внешней приёмки сохраняются. IPsec78: реальный PSK responder established, mode-config198.18.78.10 и online=true подтверждены API; точные собственные объекты удалены. Сертификатный/DN online, late failure и history restore остаются открытыми. [Отчёт](ux-ui/acceptance/ipsec-mode-config-2026-10-09.json), [журнал](ux-ui-progress.md). @@ -18,6 +18,14 @@ OSPF84: real GRE Full adjacency/private routes/Ping3/3 и4 live PC/320px URL/bro BFD85: Up/Full/own route/Ping,4 live UI и loss/withdrawal/recovery приняты; exact own cleanup8 коллекций×2 passed. Withdrawal5,245ms не подтверждает sub-second BFD timing; этот вопрос открыт. Runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json). +## 12.5.263 — полная UI-регрессия и согласованный фокус выбранной строки (2026-10-15) + +Основной Playwright-набор:1396 сценариев в235 файлах,39min39s. Первый прогон:1393 passed/3 failed, skipped0/flaky0/global errors0. Все три отказа — прежний тестовый контракт ServerTileRail в collector-probes-tables: после260 фокус находится на выбранном option, контейнер listbox больше не Tab stop. Исправлены только тестовые обращения к фокусу; URL, End/Home/стрелки, границы площадок, поиск, pagination, mobile Escape и axe сохранены. Повторены ровно три отказавших сценария:3 passed/12.6s. Итого1396 уникальных принятых сценариев; это не1399 и не один полностью зелёный исходный прогон. [Протокол и результаты по файлам](ux-ui/acceptance/ui263-summary.json). + +BACKEND_INTERNAL_URL направлен на недоступный127.0.0.1:9; effective Next dev manifest проверен, диагностический GET вернул500. Перед запуском сохранены371 исходных screenshot-файл;124 перезаписанных восстановлены, SHA-256 всех371 совпал, новых файлов0. Два исторических backups241 JSON, перезаписанных тестами, восстановлены из предварительно чистого HEAD. Чужие исходные изменения сохранены. Production/native конфигурации не менялись, runtime backend258/frontend261. Context-набор исключён существующей конфигурацией и не выдан за новый прогон. + +Следующий264 — актуальная отдельная context-регрессия и итоговый акт в границах предоставленного стенда. Ограничения внешних ОС/IPv6/WAN/multi-instance и ручного screen reader перечисляются отдельно; no push сохраняется. + ## 12.5.262 — десятиминутная устойчивость REST после ограничения соединений (2026-10-15) Реальный Portal UI login; JWT только в памяти процесса, не в отчёте/файле. Затем прямой localhost8000 SSH tunnel к backend258, endpoint GET /api/certificates/state:21 волна через30s,12 одновременно инициированных Node fetch запросов в каждой. Первый и последний запросы разделены полноценным окном600916ms. Frontend развёртывался/проверялся в части окна, обычные фоновые коллекторы работали; тест не зависел от frontend restart. [Полный протокол](ux-ui/acceptance/rest262-soak.json). diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index f6845c25..1ffa6402 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,9 +1,17 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-15: 262 — ten-minute REST soak после shared pool fix прошёл:21 волна×12 GET,252 запросов/504 device observations,200/errornull везде, новые receipts, native writes0. UI260/261 покрывает120 unique default states30 экранов. Runtime backend258/frontend261. Следующий263 — полная актуальная локальная UI-регрессия с изоляцией backend и сохранением screenshots; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 263 — основной UI-набор принят:1393 initial +3 targeted =1396 уникальных сценариев, без пропусков; исходные371 screenshots и два исторических JSON восстановлены. Production backend258/frontend261. Далее264 — отдельная context-регрессия и итоговый акт; границы внешней приёмки сохраняются. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-15. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. +## 12.5.263 — полная UI-регрессия и согласованный фокус выбранной строки (2026-10-15) + +Основной Playwright-набор:1396 сценариев в235 файлах,39min39s. Первый прогон:1393 passed/3 failed, skipped0/flaky0/global errors0. Все три отказа — прежний тестовый контракт ServerTileRail в collector-probes-tables: после260 фокус находится на выбранном option, контейнер listbox больше не Tab stop. Исправлены только тестовые обращения к фокусу; URL, End/Home/стрелки, границы площадок, поиск, pagination, mobile Escape и axe сохранены. Повторены ровно три отказавших сценария:3 passed/12.6s. Итого1396 уникальных принятых сценариев; это не1399 и не один полностью зелёный исходный прогон. [Протокол и результаты по файлам](ux-ui/acceptance/ui263-summary.json). + +BACKEND_INTERNAL_URL направлен на недоступный127.0.0.1:9; effective Next dev manifest проверен, диагностический GET вернул500. Перед запуском сохранены371 исходных screenshot-файл;124 перезаписанных восстановлены, SHA-256 всех371 совпал, новых файлов0. Два исторических backups241 JSON, перезаписанных тестами, восстановлены из предварительно чистого HEAD. Чужие исходные изменения сохранены. Production/native конфигурации не менялись, runtime backend258/frontend261. Context-набор исключён существующей конфигурацией и не выдан за новый прогон. + +Следующий264 — актуальная отдельная context-регрессия и итоговый акт в границах предоставленного стенда. Ограничения внешних ОС/IPv6/WAN/multi-instance и ручного screen reader перечисляются отдельно; no push сохраняется. + ## 12.5.262 — десятиминутная устойчивость REST после ограничения соединений (2026-10-15) Реальный Portal UI login; JWT только в памяти процесса, не в отчёте/файле. Затем прямой localhost8000 SSH tunnel к backend258, endpoint GET /api/certificates/state:21 волна через30s,12 одновременно инициированных Node fetch запросов в каждой. Первый и последний запросы разделены полноценным окном600916ms. Frontend развёртывался/проверялся в части окна, обычные фоновые коллекторы работали; тест не зависел от frontend restart. [Полный протокол](ux-ui/acceptance/rest262-soak.json). diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 85bcd210..be73e28c 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-15: 262 — ten-minute REST soak после shared pool fix прошёл:21 волна×12 GET,252 запросов/504 device observations,200/errornull везде, новые receipts, native writes0. UI260/261 покрывает120 unique default states30 экранов. Runtime backend258/frontend261. Следующий263 — полная актуальная локальная UI-регрессия с изоляцией backend и сохранением screenshots; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 263 — основной UI-набор принят:1393 initial +3 targeted =1396 уникальных сценариев, без пропусков; исходные371 screenshots и два исторических JSON восстановлены. Production backend258/frontend261. Далее264 — отдельная context-регрессия и итоговый акт; границы внешней приёмки сохраняются. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -38,6 +38,14 @@ | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | | 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная12.3.83; внешняя12.5 открыта, блоки1–262. ACME259; default UI260/261:120 states30 экранов; REST262 ten-minute252 requests passed. Runtime backend258/frontend261. Следующий263 — итоговая локальная UI-регрессия. | +## 12.5.263 — полная UI-регрессия и согласованный фокус выбранной строки (2026-10-15) + +Основной Playwright-набор:1396 сценариев в235 файлах,39min39s. Первый прогон:1393 passed/3 failed, skipped0/flaky0/global errors0. Все три отказа — прежний тестовый контракт ServerTileRail в collector-probes-tables: после260 фокус находится на выбранном option, контейнер listbox больше не Tab stop. Исправлены только тестовые обращения к фокусу; URL, End/Home/стрелки, границы площадок, поиск, pagination, mobile Escape и axe сохранены. Повторены ровно три отказавших сценария:3 passed/12.6s. Итого1396 уникальных принятых сценариев; это не1399 и не один полностью зелёный исходный прогон. [Протокол и результаты по файлам](ux-ui/acceptance/ui263-summary.json). + +BACKEND_INTERNAL_URL направлен на недоступный127.0.0.1:9; effective Next dev manifest проверен, диагностический GET вернул500. Перед запуском сохранены371 исходных screenshot-файл;124 перезаписанных восстановлены, SHA-256 всех371 совпал, новых файлов0. Два исторических backups241 JSON, перезаписанных тестами, восстановлены из предварительно чистого HEAD. Чужие исходные изменения сохранены. Production/native конфигурации не менялись, runtime backend258/frontend261. Context-набор исключён существующей конфигурацией и не выдан за новый прогон. + +Следующий264 — актуальная отдельная context-регрессия и итоговый акт в границах предоставленного стенда. Ограничения внешних ОС/IPv6/WAN/multi-instance и ручного screen reader перечисляются отдельно; no push сохраняется. + ## 12.5.262 — десятиминутная устойчивость REST после ограничения соединений (2026-10-15) Реальный Portal UI login; JWT только в памяти процесса, не в отчёте/файле. Затем прямой localhost8000 SSH tunnel к backend258, endpoint GET /api/certificates/state:21 волна через30s,12 одновременно инициированных Node fetch запросов в каждой. Первый и последний запросы разделены полноценным окном600916ms. Frontend развёртывался/проверялся в части окна, обычные фоновые коллекторы работали; тест не зависел от frontend restart. [Полный протокол](ux-ui/acceptance/rest262-soak.json). diff --git a/docs/ux-ui-remaining-acceptance.md b/docs/ux-ui-remaining-acceptance.md index a0dc8f99..853c1ce6 100644 --- a/docs/ux-ui-remaining-acceptance.md +++ b/docs/ux-ui-remaining-acceptance.md @@ -1,11 +1,19 @@ # Оставшаяся внешняя приёмка — 2026-10-15 -Актуальное продолжение 2026-10-15: 262 — ten-minute REST soak после shared pool fix прошёл:21 волна×12 GET,252 запросов/504 device observations,200/errornull везде, новые receipts, native writes0. UI260/261 покрывает120 unique default states30 экранов. Runtime backend258/frontend261. Следующий263 — полная актуальная локальная UI-регрессия с изоляцией backend и сохранением screenshots; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 263 — основной UI-набор принят:1393 initial +3 targeted =1396 уникальных сценариев, без пропусков; исходные371 screenshots и два исторических JSON восстановлены. Production backend258/frontend261. Далее264 — отдельная context-регрессия и итоговый акт; границы внешней приёмки сохраняются. Это актуальная матрица после 12.5.262. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-certificates258`, frontend `ux-accessibility261`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. +## 12.5.263 — полная UI-регрессия и согласованный фокус выбранной строки (2026-10-15) + +Основной Playwright-набор:1396 сценариев в235 файлах,39min39s. Первый прогон:1393 passed/3 failed, skipped0/flaky0/global errors0. Все три отказа — прежний тестовый контракт ServerTileRail в collector-probes-tables: после260 фокус находится на выбранном option, контейнер listbox больше не Tab stop. Исправлены только тестовые обращения к фокусу; URL, End/Home/стрелки, границы площадок, поиск, pagination, mobile Escape и axe сохранены. Повторены ровно три отказавших сценария:3 passed/12.6s. Итого1396 уникальных принятых сценариев; это не1399 и не один полностью зелёный исходный прогон. [Протокол и результаты по файлам](ux-ui/acceptance/ui263-summary.json). + +BACKEND_INTERNAL_URL направлен на недоступный127.0.0.1:9; effective Next dev manifest проверен, диагностический GET вернул500. Перед запуском сохранены371 исходных screenshot-файл;124 перезаписанных восстановлены, SHA-256 всех371 совпал, новых файлов0. Два исторических backups241 JSON, перезаписанных тестами, восстановлены из предварительно чистого HEAD. Чужие исходные изменения сохранены. Production/native конфигурации не менялись, runtime backend258/frontend261. Context-набор исключён существующей конфигурацией и не выдан за новый прогон. + +Следующий264 — актуальная отдельная context-регрессия и итоговый акт в границах предоставленного стенда. Ограничения внешних ОС/IPv6/WAN/multi-instance и ручного screen reader перечисляются отдельно; no push сохраняется. + ## 12.5.262 — десятиминутная устойчивость REST после ограничения соединений (2026-10-15) Реальный Portal UI login; JWT только в памяти процесса, не в отчёте/файле. Затем прямой localhost8000 SSH tunnel к backend258, endpoint GET /api/certificates/state:21 волна через30s,12 одновременно инициированных Node fetch запросов в каждой. Первый и последний запросы разделены полноценным окном600916ms. Frontend развёртывался/проверялся в части окна, обычные фоновые коллекторы работали; тест не зависел от frontend restart. [Полный протокол](ux-ui/acceptance/rest262-soak.json). diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index bdb1244e..0cb63a9c 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-15: 262 — ten-minute REST soak после shared pool fix прошёл:21 волна×12 GET,252 запросов/504 device observations,200/errornull везде, новые receipts, native writes0. UI260/261 покрывает120 unique default states30 экранов. Runtime backend258/frontend261. Следующий263 — полная актуальная локальная UI-регрессия с изоляцией backend и сохранением screenshots; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 263 — основной UI-набор принят:1393 initial +3 targeted =1396 уникальных сценариев, без пропусков; исходные371 screenshots и два исторических JSON восстановлены. Production backend258/frontend261. Далее264 — отдельная context-регрессия и итоговый акт; границы внешней приёмки сохраняются. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -4152,6 +4152,14 @@ Real Portal/browser API, provider local verified: создан один job ро Runtime backend ux-backup234/frontend ux-routing218 healthy; новое application image для volume-only fix не требовалось. Пароли CHR не менялись, S3 mutations0 в235, configs body/JWT не опубликованы, private local manifest удалён. Исходные10 missing local files не восстановлены и records не удалены. Force-recreate — не host reboot/power loss/fsync/DR приёмка. Далее236 — UX недоступных local files, затем version retention границы и оставшиеся7 группы матрицы; multi-instance guard не принимается. Этап12.5 открыт. +## 12.5.263 — полная UI-регрессия и согласованный фокус выбранной строки (2026-10-15) + +Основной Playwright-набор:1396 сценариев в235 файлах,39min39s. Первый прогон:1393 passed/3 failed, skipped0/flaky0/global errors0. Все три отказа — прежний тестовый контракт ServerTileRail в collector-probes-tables: после260 фокус находится на выбранном option, контейнер listbox больше не Tab stop. Исправлены только тестовые обращения к фокусу; URL, End/Home/стрелки, границы площадок, поиск, pagination, mobile Escape и axe сохранены. Повторены ровно три отказавших сценария:3 passed/12.6s. Итого1396 уникальных принятых сценариев; это не1399 и не один полностью зелёный исходный прогон. [Протокол и результаты по файлам](ux-ui/acceptance/ui263-summary.json). + +BACKEND_INTERNAL_URL направлен на недоступный127.0.0.1:9; effective Next dev manifest проверен, диагностический GET вернул500. Перед запуском сохранены371 исходных screenshot-файл;124 перезаписанных восстановлены, SHA-256 всех371 совпал, новых файлов0. Два исторических backups241 JSON, перезаписанных тестами, восстановлены из предварительно чистого HEAD. Чужие исходные изменения сохранены. Production/native конфигурации не менялись, runtime backend258/frontend261. Context-набор исключён существующей конфигурацией и не выдан за новый прогон. + +Следующий264 — актуальная отдельная context-регрессия и итоговый акт в границах предоставленного стенда. Ограничения внешних ОС/IPv6/WAN/multi-instance и ручного screen reader перечисляются отдельно; no push сохраняется. + ## 12.5.262 — десятиминутная устойчивость REST после ограничения соединений (2026-10-15) Реальный Portal UI login; JWT только в памяти процесса, не в отчёте/файле. Затем прямой localhost8000 SSH tunnel к backend258, endpoint GET /api/certificates/state:21 волна через30s,12 одновременно инициированных Node fetch запросов в каждой. Первый и последний запросы разделены полноценным окном600916ms. Frontend развёртывался/проверялся в части окна, обычные фоновые коллекторы работали; тест не зависел от frontend restart. [Полный протокол](ux-ui/acceptance/rest262-soak.json). diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index fa130ecf..b84c398b 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -1,6 +1,6 @@ # Тестовый сервер UX/UI — 2026-10-10 -Актуальное продолжение 2026-10-15: 262 — ten-minute REST soak после shared pool fix прошёл:21 волна×12 GET,252 запросов/504 device observations,200/errornull везде, новые receipts, native writes0. UI260/261 покрывает120 unique default states30 экранов. Runtime backend258/frontend261. Следующий263 — полная актуальная локальная UI-регрессия с изоляцией backend и сохранением screenshots; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 263 — основной UI-набор принят:1393 initial +3 targeted =1396 уникальных сценариев, без пропусков; исходные371 screenshots и два исторических JSON восстановлены. Production backend258/frontend261. Далее264 — отдельная context-регрессия и итоговый акт; границы внешней приёмки сохраняются. | Параметр | Проверенное состояние | | --- | --- | @@ -34,6 +34,14 @@ OSPF84: real GRE Full adjacency/private routes/Ping3/3 и4 live PC/320px URL/bro BFD85: Up/Full/own route/Ping,4 live UI и loss/withdrawal/recovery приняты; exact own cleanup8 коллекций×2 passed. Withdrawal5,245ms не подтверждает sub-second BFD timing; этот вопрос открыт. Runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json). +## 12.5.263 — полная UI-регрессия и согласованный фокус выбранной строки (2026-10-15) + +Основной Playwright-набор:1396 сценариев в235 файлах,39min39s. Первый прогон:1393 passed/3 failed, skipped0/flaky0/global errors0. Все три отказа — прежний тестовый контракт ServerTileRail в collector-probes-tables: после260 фокус находится на выбранном option, контейнер listbox больше не Tab stop. Исправлены только тестовые обращения к фокусу; URL, End/Home/стрелки, границы площадок, поиск, pagination, mobile Escape и axe сохранены. Повторены ровно три отказавших сценария:3 passed/12.6s. Итого1396 уникальных принятых сценариев; это не1399 и не один полностью зелёный исходный прогон. [Протокол и результаты по файлам](ux-ui/acceptance/ui263-summary.json). + +BACKEND_INTERNAL_URL направлен на недоступный127.0.0.1:9; effective Next dev manifest проверен, диагностический GET вернул500. Перед запуском сохранены371 исходных screenshot-файл;124 перезаписанных восстановлены, SHA-256 всех371 совпал, новых файлов0. Два исторических backups241 JSON, перезаписанных тестами, восстановлены из предварительно чистого HEAD. Чужие исходные изменения сохранены. Production/native конфигурации не менялись, runtime backend258/frontend261. Context-набор исключён существующей конфигурацией и не выдан за новый прогон. + +Следующий264 — актуальная отдельная context-регрессия и итоговый акт в границах предоставленного стенда. Ограничения внешних ОС/IPv6/WAN/multi-instance и ручного screen reader перечисляются отдельно; no push сохраняется. + ## 12.5.262 — десятиминутная устойчивость REST после ограничения соединений (2026-10-15) Реальный Portal UI login; JWT только в памяти процесса, не в отчёте/файле. Затем прямой localhost8000 SSH tunnel к backend258, endpoint GET /api/certificates/state:21 волна через30s,12 одновременно инициированных Node fetch запросов в каждой. Первый и последний запросы разделены полноценным окном600916ms. Frontend развёртывался/проверялся в части окна, обычные фоновые коллекторы работали; тест не зависел от frontend restart. [Полный протокол](ux-ui/acceptance/rest262-soak.json). diff --git a/docs/ux-ui/acceptance/ui263-summary.json b/docs/ux-ui/acceptance/ui263-summary.json new file mode 100644 index 00000000..434296d5 --- /dev/null +++ b/docs/ux-ui/acceptance/ui263-summary.json @@ -0,0 +1,1253 @@ +{ + "date": "2026-10-15", + "block": "12.5.263", + "status": "accepted", + "sourceHeadBeforeTestFix": "c88d31fa", + "productionFrontendSourceCommit": "3d51bba8", + "productionCodeChanged": false, + "full": { + "startTime": "2026-10-15T07:39:57.180Z", + "duration": 2378508.187, + "expected": 1393, + "skipped": 0, + "unexpected": 3, + "flaky": 0, + "files": 235, + "globalErrors": 0, + "rawReportSha256": "84b1b41c1881f60e134b1e580c60e5bd04f5700750c43a3836ad44bdc0fba541" + }, + "targeted": { + "startTime": "2026-10-15T08:20:58.541Z", + "duration": 12570.199, + "expected": 3, + "skipped": 0, + "unexpected": 0, + "flaky": 0, + "rawReportSha256": "071c081f942b3d7d5256d2de7963932b1565219609607a1da7e482eca051e190" + }, + "uniqueAccepted": 1396, + "failuresResolved": [ + { + "file": "collector-probes-tables.spec.ts", + "title": "Large server rail: URL, страницы, поиск и клавиатура на1001 устройстве/dark", + "cause": "Test focused the old listbox container; block260 intentionally moved roving DOM focus to the selected option.", + "resolution": "Focus selected option; preserve keyboard, URL, pagination, site boundary, mobile Escape and axe assertions.", + "finalStatus": "passed" + }, + { + "file": "collector-probes-tables.spec.ts", + "title": "Large server rail: URL, страницы, поиск и клавиатура на1001 устройстве/light", + "cause": "Test focused the old listbox container; block260 intentionally moved roving DOM focus to the selected option.", + "resolution": "Focus selected option; preserve keyboard, URL, pagination, site boundary, mobile Escape and axe assertions.", + "finalStatus": "passed" + }, + { + "file": "collector-probes-tables.spec.ts", + "title": "Large server rail: выбранное устройство и граница площадок", + "cause": "Test focused the old listbox container; block260 intentionally moved roving DOM focus to the selected option.", + "resolution": "Focus selected option; preserve keyboard, URL, pagination, site boundary, mobile Escape and axe assertions.", + "finalStatus": "passed" + } + ], + "isolation": { + "date": "2026-10-15", + "block": "12.5.263", + "path": "/api/acceptance-isolation-263", + "status": 500, + "proxyTarget": "http://127.0.0.1:9", + "effectiveDevManifestConfirmed": true, + "method": "GET", + "initialProbeNote": "Status accepted; reporter buffers web-server stderr, so the initial stderr assertion failed. Effective dev manifest is checked instead." + }, + "preservation": { + "originalScreenshotFiles": 371, + "restoredAfterFullRun": 124, + "finalHashesVerified": 371, + "newScreenshotFiles": 0, + "historicalBackupJsonRestored": 2, + "preexistingUserChangesPreserved": true + }, + "bounds": [ + "Default Playwright suite only; existing context config exclusions unchanged.", + "1393 initial passes plus 3 matched targeted passes; not a single all-green full run.", + "No native device/configuration operations; proxy target unavailable.", + "No new production build: only test assertions and documentation changed." + ], + "files": { + "accessibility-shell.spec.ts": { + "total": 20, + "initialPassed": 20, + "acceptedAfterTargetedRerun": 0 + }, + "admin-tables.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "alerts-history.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "alerts-layout.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "alerts-outbox.spec.ts": { + "total": 8, + "initialPassed": 8, + "acceptedAfterTargetedRerun": 0 + }, + "alerts-pickers.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "alerts-prefix.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "alerts-preview.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "alerts-reader.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "alerts-rules.spec.ts": { + "total": 9, + "initialPassed": 9, + "acceptedAfterTargetedRerun": 0 + }, + "alerts-target-issues.spec.ts": { + "total": 5, + "initialPassed": 5, + "acceptedAfterTargetedRerun": 0 + }, + "alerts-targets.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "alerts-telegram.spec.ts": { + "total": 10, + "initialPassed": 10, + "acceptedAfterTargetedRerun": 0 + }, + "auth-return-path.spec.ts": { + "total": 10, + "initialPassed": 10, + "acceptedAfterTargetedRerun": 0 + }, + "backups-data.spec.ts": { + "total": 12, + "initialPassed": 12, + "acceptedAfterTargetedRerun": 0 + }, + "backups-dialog-layout.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "backups-file-state.spec.ts": { + "total": 6, + "initialPassed": 6, + "acceptedAfterTargetedRerun": 0 + }, + "backups-job.spec.ts": { + "total": 9, + "initialPassed": 9, + "acceptedAfterTargetedRerun": 0 + }, + "backups-layout.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "backups-operations.spec.ts": { + "total": 12, + "initialPassed": 12, + "acceptedAfterTargetedRerun": 0 + }, + "backups-record-only.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "backups-settings.spec.ts": { + "total": 9, + "initialPassed": 9, + "acceptedAfterTargetedRerun": 0 + }, + "backups-states-layout.spec.ts": { + "total": 9, + "initialPassed": 9, + "acceptedAfterTargetedRerun": 0 + }, + "backups-storage.spec.ts": { + "total": 7, + "initialPassed": 7, + "acceptedAfterTargetedRerun": 0 + }, + "backups-url.spec.ts": { + "total": 5, + "initialPassed": 5, + "acceptedAfterTargetedRerun": 0 + }, + "bgp-data.spec.ts": { + "total": 13, + "initialPassed": 13, + "acceptedAfterTargetedRerun": 0 + }, + "bgp-layout.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "bgp-links-freshness.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "certificates-acme.spec.ts": { + "total": 10, + "initialPassed": 10, + "acceptedAfterTargetedRerun": 0 + }, + "certificates-data.spec.ts": { + "total": 12, + "initialPassed": 12, + "acceptedAfterTargetedRerun": 0 + }, + "certificates-issue.spec.ts": { + "total": 7, + "initialPassed": 7, + "acceptedAfterTargetedRerun": 0 + }, + "certificates-layout.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "certificates-renew.spec.ts": { + "total": 10, + "initialPassed": 10, + "acceptedAfterTargetedRerun": 0 + }, + "certificates-url.spec.ts": { + "total": 6, + "initialPassed": 6, + "acceptedAfterTargetedRerun": 0 + }, + "collector-probes-tables.spec.ts": { + "total": 7, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 3 + }, + "communities-copy.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "config-history.spec.ts": { + "total": 11, + "initialPassed": 11, + "acceptedAfterTargetedRerun": 0 + }, + "containers-data.spec.ts": { + "total": 14, + "initialPassed": 14, + "acceptedAfterTargetedRerun": 0 + }, + "containers-layout.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "containers-operations.spec.ts": { + "total": 15, + "initialPassed": 15, + "acceptedAfterTargetedRerun": 0 + }, + "containers-url.spec.ts": { + "total": 10, + "initialPassed": 10, + "acceptedAfterTargetedRerun": 0 + }, + "dashboard-data.spec.ts": { + "total": 61, + "initialPassed": 61, + "acceptedAfterTargetedRerun": 0 + }, + "dashboard-permissions.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "data-collection-geoip.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "data-collection-history.spec.ts": { + "total": 5, + "initialPassed": 5, + "acceptedAfterTargetedRerun": 0 + }, + "data-collection-operations.spec.ts": { + "total": 10, + "initialPassed": 10, + "acceptedAfterTargetedRerun": 0 + }, + "data-collection-race.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "data-collection-responsive.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "data-collection-settings.spec.ts": { + "total": 16, + "initialPassed": 16, + "acceptedAfterTargetedRerun": 0 + }, + "data-collection-snapshot.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "data-collection-status.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "evobgp-catalog-error.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "evobgp-consumers.spec.ts": { + "total": 18, + "initialPassed": 18, + "acceptedAfterTargetedRerun": 0 + }, + "evobgp-counts.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "evobgp-form.spec.ts": { + "total": 7, + "initialPassed": 7, + "acceptedAfterTargetedRerun": 0 + }, + "evobgp-provider.spec.ts": { + "total": 8, + "initialPassed": 8, + "acceptedAfterTargetedRerun": 0 + }, + "evobgp-responsive.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "evobgp-test-receipt.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "filters-copy-target.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "filters-copy.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "filters-data.spec.ts": { + "total": 5, + "initialPassed": 5, + "acceptedAfterTargetedRerun": 0 + }, + "filters-delete.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "filters-freshness.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "filters-gateways.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "filters-history-lock.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "filters-ipsec-gateways.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "filters-layout.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "filters-move.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "filters-read-race.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "filters-save.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "firewall-address-toggle.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "firewall-data.spec.ts": { + "total": 8, + "initialPassed": 8, + "acceptedAfterTargetedRerun": 0 + }, + "firewall-delete.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "firewall-draft-reset.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "firewall-freshness.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "firewall-history-lock.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "firewall-move.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "firewall-partial.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "firewall-save.spec.ts": { + "total": 8, + "initialPassed": 8, + "acceptedAfterTargetedRerun": 0 + }, + "firewall-stale.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "firewall-tables.spec.ts": { + "total": 5, + "initialPassed": 5, + "acceptedAfterTargetedRerun": 0 + }, + "firewall-toggle.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "geoip-responsive.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "geoip-settings.spec.ts": { + "total": 10, + "initialPassed": 10, + "acceptedAfterTargetedRerun": 0 + }, + "gre-badge-accessibility.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "gre-data.spec.ts": { + "total": 8, + "initialPassed": 8, + "acceptedAfterTargetedRerun": 0 + }, + "gre-delete.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "gre-export-compatibility.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "gre-fastpath.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "gre-form.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "gre-freshness.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "gre-ipv6-export.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "gre-ipv6.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "gre-keepalive.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "gre-links.spec.ts": { + "total": 8, + "initialPassed": 8, + "acceptedAfterTargetedRerun": 0 + }, + "gre-menu-refresh.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "gre-pools.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "gre-psk.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "gre-readiness.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "gre-secrets.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "gre-toggle.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "gre-vxlan-layout.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "history-restore-rights.spec.ts": { + "total": 24, + "initialPassed": 24, + "acceptedAfterTargetedRerun": 0 + }, + "ipsec-cert.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "ipsec-data.spec.ts": { + "total": 15, + "initialPassed": 15, + "acceptedAfterTargetedRerun": 0 + }, + "ipsec-delete.spec.ts": { + "total": 10, + "initialPassed": 10, + "acceptedAfterTargetedRerun": 0 + }, + "ipsec-freshness.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "ipsec-gre-tables.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "ipsec-init.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "ipsec-layout.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "ipsec-links.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "ipsec-mutation-result.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "ipsec-operation-lock.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "ipsec-peer.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "ipsec-readiness.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "ipsec-user.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "large-backups-file-state.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "large-backups.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-bgp.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-certificates.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-communities.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-filters.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-firewall-scenario.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-firewall.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-gre.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-optimizer-community.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-optimizer-homes.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-optimizer-ospf-preview.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-optimizer-probes.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "large-optimizer-routes.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-optimizer-wan-matrix.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "large-ospf-bfd.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-ospf-neighbors.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "large-ospf-routes.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-recursive-form.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-recursive-routes.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "large-servers.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-speed-history.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-statistics-pivot.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "large-statistics.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-uptime-resources.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-users.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-vxlan.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-wireguard-interfaces.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "large-wireguard-peers.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "migrated-tables.spec.ts": { + "total": 6, + "initialPassed": 6, + "acceptedAfterTargetedRerun": 0 + }, + "navigation.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "netflow-responsive.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "netflow-settings.spec.ts": { + "total": 17, + "initialPassed": 17, + "acceptedAfterTargetedRerun": 0 + }, + "network-filters-table.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "network-kpi-readability.spec.ts": { + "total": 10, + "initialPassed": 10, + "acceptedAfterTargetedRerun": 0 + }, + "network-map-data.spec.ts": { + "total": 12, + "initialPassed": 12, + "acceptedAfterTargetedRerun": 0 + }, + "network-map-detail.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "network-map-flow.spec.ts": { + "total": 8, + "initialPassed": 8, + "acceptedAfterTargetedRerun": 0 + }, + "network-map-layout.spec.ts": { + "total": 8, + "initialPassed": 8, + "acceptedAfterTargetedRerun": 0 + }, + "network-map-url.spec.ts": { + "total": 7, + "initialPassed": 7, + "acceptedAfterTargetedRerun": 0 + }, + "network-readonly.spec.ts": { + "total": 20, + "initialPassed": 20, + "acceptedAfterTargetedRerun": 0 + }, + "operational-a11y.spec.ts": { + "total": 24, + "initialPassed": 24, + "acceptedAfterTargetedRerun": 0 + }, + "optimizer-matrix-geometry.spec.ts": { + "total": 6, + "initialPassed": 6, + "acceptedAfterTargetedRerun": 0 + }, + "optimizer-site-summary.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "ospf-bfd-conflict.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "ospf-data.spec.ts": { + "total": 7, + "initialPassed": 7, + "acceptedAfterTargetedRerun": 0 + }, + "ospf-freshness.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "ospf-identity.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "ospf-interface-values.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "ospf-layout.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "ospf-links.spec.ts": { + "total": 10, + "initialPassed": 10, + "acceptedAfterTargetedRerun": 0 + }, + "ospf-operations.spec.ts": { + "total": 8, + "initialPassed": 8, + "acceptedAfterTargetedRerun": 0 + }, + "ospf-route-cidr.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "ospf-states.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "ospf-values.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "page-header.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "portal-runtime-links.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "probes-data.spec.ts": { + "total": 31, + "initialPassed": 31, + "acceptedAfterTargetedRerun": 0 + }, + "probes-layout.spec.ts": { + "total": 5, + "initialPassed": 5, + "acceptedAfterTargetedRerun": 0 + }, + "probes-schedule.spec.ts": { + "total": 8, + "initialPassed": 8, + "acceptedAfterTargetedRerun": 0 + }, + "probes-source.spec.ts": { + "total": 7, + "initialPassed": 7, + "acceptedAfterTargetedRerun": 0 + }, + "recursive-routes-data.spec.ts": { + "total": 15, + "initialPassed": 15, + "acceptedAfterTargetedRerun": 0 + }, + "recursive-routes-layout.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "recursive-routes-links.spec.ts": { + "total": 11, + "initialPassed": 11, + "acceptedAfterTargetedRerun": 0 + }, + "recursive-routes-table.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "recursive-routes-values.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "releases-layout.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "route-optimizer-data.spec.ts": { + "total": 10, + "initialPassed": 10, + "acceptedAfterTargetedRerun": 0 + }, + "route-optimizer-layout.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "route-optimizer-observed.spec.ts": { + "total": 6, + "initialPassed": 6, + "acceptedAfterTargetedRerun": 0 + }, + "route-optimizer-ospf-apply.spec.ts": { + "total": 8, + "initialPassed": 8, + "acceptedAfterTargetedRerun": 0 + }, + "route-optimizer-ospf-preview.spec.ts": { + "total": 15, + "initialPassed": 15, + "acceptedAfterTargetedRerun": 0 + }, + "route-optimizer-tables.spec.ts": { + "total": 6, + "initialPassed": 6, + "acceptedAfterTargetedRerun": 0 + }, + "route-optimizer-trust.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "routing-contrast.spec.ts": { + "total": 8, + "initialPassed": 8, + "acceptedAfterTargetedRerun": 0 + }, + "routing-tables.spec.ts": { + "total": 10, + "initialPassed": 10, + "acceptedAfterTargetedRerun": 0 + }, + "server-rail-accessibility.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "servers.spec.ts": { + "total": 35, + "initialPassed": 35, + "acceptedAfterTargetedRerun": 0 + }, + "settings-general.spec.ts": { + "total": 8, + "initialPassed": 8, + "acceptedAfterTargetedRerun": 0 + }, + "sidebar-counts.spec.ts": { + "total": 5, + "initialPassed": 5, + "acceptedAfterTargetedRerun": 0 + }, + "statistics-data.spec.ts": { + "total": 15, + "initialPassed": 15, + "acceptedAfterTargetedRerun": 0 + }, + "stepper-accessibility.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "system-database-form.spec.ts": { + "total": 8, + "initialPassed": 8, + "acceptedAfterTargetedRerun": 0 + }, + "system-database-receipt.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "terminal-data.spec.ts": { + "total": 17, + "initialPassed": 17, + "acceptedAfterTargetedRerun": 0 + }, + "terminal-layout.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-binding-status.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-catalog.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-details.spec.ts": { + "total": 10, + "initialPassed": 10, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-flow-selection.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-flow.spec.ts": { + "total": 28, + "initialPassed": 28, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-gap-confidence.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-history-confidence.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-ipv6-labels.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-list.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-live-confidence.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-live.spec.ts": { + "total": 5, + "initialPassed": 5, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-mobile.spec.ts": { + "total": 6, + "initialPassed": 6, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-peak-confidence.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-peer-warning.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-response-validation.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "traffic-volume.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "uptime-links.spec.ts": { + "total": 69, + "initialPassed": 69, + "acceptedAfterTargetedRerun": 0 + }, + "uptime-ping-measurement.spec.ts": { + "total": 3, + "initialPassed": 3, + "acceptedAfterTargetedRerun": 0 + }, + "uptime-speed-data.spec.ts": { + "total": 11, + "initialPassed": 11, + "acceptedAfterTargetedRerun": 0 + }, + "uptime-speed-interface.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "uptime-speed-unknown.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "users-catalog.spec.ts": { + "total": 17, + "initialPassed": 17, + "acceptedAfterTargetedRerun": 0 + }, + "users-data.spec.ts": { + "total": 12, + "initialPassed": 12, + "acceptedAfterTargetedRerun": 0 + }, + "users-layout.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "users-operations.spec.ts": { + "total": 15, + "initialPassed": 15, + "acceptedAfterTargetedRerun": 0 + }, + "vpn-inventory.spec.ts": { + "total": 4, + "initialPassed": 4, + "acceptedAfterTargetedRerun": 0 + }, + "vxlan-freshness.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "vxlan-links.spec.ts": { + "total": 16, + "initialPassed": 16, + "acceptedAfterTargetedRerun": 0 + }, + "vxlan-table.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "wireguard-ipv6.spec.ts": { + "total": 2, + "initialPassed": 2, + "acceptedAfterTargetedRerun": 0 + }, + "wireguard-links.spec.ts": { + "total": 41, + "initialPassed": 41, + "acceptedAfterTargetedRerun": 0 + }, + "wireguard-menu-refresh.spec.ts": { + "total": 1, + "initialPassed": 1, + "acceptedAfterTargetedRerun": 0 + }, + "wireguard-tables.spec.ts": { + "total": 5, + "initialPassed": 5, + "acceptedAfterTargetedRerun": 0 + } + } +} diff --git a/tests/e2e/collector-probes-tables.spec.ts b/tests/e2e/collector-probes-tables.spec.ts index 7104a243..a4405af6 100644 --- a/tests/e2e/collector-probes-tables.spec.ts +++ b/tests/e2e/collector-probes-tables.spec.ts @@ -125,7 +125,7 @@ for (const theme of ["dark", "light"]) test(`Large server rail: URL, стран await expect(rail.getByText("951–1000 из 1001", { exact: true })).toBeVisible() expect(await rail.locator("*").count()).toBeLessThan(1200) await info.attach("large-rail-metrics", { body: JSON.stringify({ fixtureDevices: 1001, renderedOptions: await list.getByRole("option").count(), railNodes: await rail.locator("*").count(), domNodes: await page.locator("*").count() }), contentType: "application/json" }) - await list.focus() + await list.getByRole("option", { selected: true }).focus() await page.keyboard.press("End") await expect(page).toHaveURL(url => url.searchParams.get("server") === "1001" && url.searchParams.get("keep") === "1") await expect(list.getByRole("option")).toHaveCount(1) @@ -155,7 +155,7 @@ for (const theme of ["dark", "light"]) test(`Large server rail: URL, стран await expect(sheet.getByRole("option", { selected: true })).toContainText("Источник 1000") expect(await page.evaluate(() => document.documentElement.scrollWidth <= innerWidth)).toBe(true) expect(await sheet.getByRole("button", { name: "Следующие устройства", exact: true }).evaluate(el => el.getBoundingClientRect().right <= innerWidth)).toBe(true) - expect(await sheet.getByRole("listbox", { name: "Серверы", exact: true }).evaluate(el => { const id = el.getAttribute("aria-activedescendant"); return !!id && el.contains(document.getElementById(id)) })).toBe(true) + await sheet.getByRole("option", { selected: true }).focus(); await expect(sheet.getByRole("option", { selected: true })).toBeFocused() await page.addScriptTag({ content: axe.source }) const audit = await page.evaluate(async () => (window as unknown as { axe: typeof axe }).axe.run(document.querySelector('[role="dialog"]')!, { runOnly: { type: "tag", values: ["wcag2a", "wcag2aa", "wcag21a", "wcag21aa", "wcag22aa"] } })) await info.attach("large-rail-axe", { body: JSON.stringify(audit), contentType: "application/json" }) @@ -172,7 +172,7 @@ test("Large server rail: выбранное устройство и границ await expect(list.getByRole("option")).toHaveCount(1) await expect(list.getByRole("option", { selected: true })).toContainText("Источник 1000") await expect(rail.getByText("Площадка B", { exact: true })).toBeVisible() - await list.focus() + await list.getByRole("option", { selected: true }).focus() await page.keyboard.press("End") await expect(list.getByRole("option", { selected: true })).toContainText("Цель") await expect(list.getByRole("option")).toHaveCount(50)