Замечание воспроизведено на стенде: настоящие файлы консоли под локальным макетом Control API. Пачка из 15 накопленных событий при подключении к потоку даёт 22 обновления дашборда, то есть 44 запроса примерно за 0,1 секунды с одной вкладки. В установившемся режиме слияния соседних событий нет ни одного. В задании было написано, что эффект не измерен — исправлено. Туда же уточнение проверки: мерить нужно пачку, а не установившийся режим. В задание по тестам добавлен найденный при показе дефект текста: строка подтверждения направления заканчивается двумя точками. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
82 lines
5.5 KiB
Markdown
82 lines
5.5 KiB
Markdown
# Поведенческие тесты веб-консоли
|
||
|
||
- **Кому:** `antigravity`
|
||
- **Дата:** 2026-08-19
|
||
- **От кого:** главный агент (`claude`), по разбору PR #63 —
|
||
`agents/claude/done/2026-08-18-review-pr63-console-links.md`
|
||
- **Ветка:** `antigravity/console-behaviour-tests`
|
||
- **Файл отчёта:** `../done/2026-08-19-console-behaviour-tests.md`
|
||
|
||
## Что нужно сделать
|
||
|
||
Покрыть тестами поведение веб-консоли, а не наличие разметки.
|
||
|
||
Сейчас `tests/ServerMonitorManager.Control.Tests/WebConsoleTests.cs` состоит
|
||
из проверок вида `Assert.Contains("id=\"create-link-btn\"", html)`. Такие
|
||
тесты проходят и при полностью нерабочем `app.js`: они доказывают, что в
|
||
`index.html` есть элемент с нужным идентификатором, и ничего больше. При этом
|
||
в PR #63 977 строк изменений — почти целиком логика на JavaScript.
|
||
|
||
Нужны тесты, падающие при поломке поведения. Как минимум:
|
||
|
||
1. **Создание Link** — форма отправляет `POST /api/v1/control/links` с
|
||
`sourceNodeId`, `targetNodeId`, `protocol`, `port`, `ttl`, `reason` и
|
||
заголовком идемпотентности; повторная отправка той же формы использует
|
||
**тот же** ключ, а новое открытие формы — новый.
|
||
2. **Отклонение неверного ввода до отправки** — совпадающие источник и
|
||
назначение, пустой `reason`, порт вне 1–65535: запрос не уходит.
|
||
3. **Отключение Link** — `POST /api/v1/control/links/{id}/disable`,
|
||
и повторное нажатие на уже отключённом Link не отправляет запрос.
|
||
4. **Разбор потока событий** — событие, разорванное на границе чанка NDJSON,
|
||
собирается и попадает в журнал целиком; строка, не являющаяся JSON,
|
||
не роняет поток.
|
||
5. **Ограничение журнала** — после 150 событий в списке остаётся 100,
|
||
и остаются последние.
|
||
6. **Разбор Problem Details** — ответ `400` с `detail` показывается
|
||
оператору текстом, а не молча.
|
||
|
||
Способ проверки выбираешь сам и обосновываешь в отчёте: тесты на JS-движке,
|
||
проверка через headless-браузер в CI или вынос логики из `app.js` в
|
||
тестируемый модуль. Требование одно: тест должен падать, когда поведение
|
||
сломано. Если для этого нужна новая зависимость или шаг в CI — предложи в
|
||
отчёте, не добавляй молча.
|
||
|
||
## Замечено при показе консоли
|
||
|
||
Мелкий дефект текста, найденный при прогоне консоли на стенде. Исправить
|
||
здесь же, отдельного задания он не стоит.
|
||
|
||
Строка подтверждения направления заканчивается двумя точками:
|
||
|
||
```
|
||
Открытие доступа: с узла «demo-hub» к узлу «demo-home», протокол TCP, порт 443, на 60 мин..
|
||
```
|
||
|
||
Сокращение «мин.» уже содержит точку, и к нему добавляется точка
|
||
предложения. Тест из пункта 1 должен проверять эту строку целиком, тогда
|
||
дефект и не вернётся.
|
||
|
||
## Границы
|
||
|
||
Только тесты и, если это необходимо для тестируемости, реорганизация
|
||
`src/ServerMonitorManager.Control/wwwroot/app.js` без изменения поведения.
|
||
Не менять эндпоинты Control, не трогать `deploy/**`, релизные workflow,
|
||
Desktop и bootstrap. Троттлинг обновления дашборда — отдельное задание
|
||
`2026-08-19-console-events-throttle.md`, здесь его не делать.
|
||
|
||
## Как проверить результат
|
||
|
||
- каждый новый тест предъявить дважды: зелёным на исправном коде и **красным**
|
||
на намеренно сломанном поведении. В отчёт — вывод обоих прогонов. Тест,
|
||
который не показан падающим, ничего не доказывает;
|
||
- `dotnet test` целиком — зелёный, с выводом;
|
||
- прогоны CI на PR — ссылками.
|
||
|
||
## Контекст и ограничения
|
||
|
||
Соглашение 6 из `agents/claude/notes/2026-08-18-передача-состояния.md`:
|
||
зелёный CI не означает работающую машину. Этим заданием закрывается именно
|
||
такой разрыв, поэтому «тесты добавлены и проходят» критерием приёмки не
|
||
является — нужен показанный отказ.
|
||
|
||
Формат отчёта — раздел в описании PR плюс файл в `done/`.
|