server-monitor-manager/agents/antigravity/inbox/2026-08-19-console-behaviour-tests.md
Ochenstarik 28e447da0d chore(agents): измеренные числа в задании по троттлингу консоли
Замечание воспроизведено на стенде: настоящие файлы консоли под локальным
макетом Control API. Пачка из 15 накопленных событий при подключении к
потоку даёт 22 обновления дашборда, то есть 44 запроса примерно за 0,1
секунды с одной вкладки. В установившемся режиме слияния соседних событий
нет ни одного. В задании было написано, что эффект не измерен — исправлено.

Туда же уточнение проверки: мерить нужно пачку, а не установившийся режим.
В задание по тестам добавлен найденный при показе дефект текста: строка
подтверждения направления заканчивается двумя точками.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 16:32:25 +07:00

82 lines
5.5 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.

# Поведенческие тесты веб-консоли
- **Кому:** `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`, порт вне 165535: запрос не уходит.
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/`.