# Клиент и тесты сервера `src/.test/client_test.py` используется и для ручного запуска, и в интеграционных тестах. Он ожидает `token_ask`, отвечает `token_answer`, ожидает `handshake_ask`, отвечает `handshake_answer` и подтверждает состояние `air` ответом на heartbeat. Затем ручной запуск отправляет десять пакетов телеметрии с heartbeat между ними. Каждое ожидание ответа имеет таймаут; импорт файла не запускает клиент. После запуска сервера: ```bat src\.test\start_client.bat rover --count 10 --interval 1 ``` Для запроса восстановления укажите старые значения из вывода клиента: ```bat src\.test\start_client.bat rover --old-token 123 --old-upf 456 ``` Сейчас сервер не сообщает результат восстановления отдельным ответом. Клиент сообщает только факт отправки запроса; heartbeat подтверждает новый handshake, но сам по себе не доказывает успешное восстановление. Запуск всех тестов из корня `server`: ```bat D:\_Programs\anaconda\envs\sites\python.exe -m pytest -q ``` Также можно запустить `tests/start_tests.bat`. Только проверки самого клиента: ```bat tests\start_tests.bat tests/test_client_protocol.py -q ``` Интеграционные тесты проверяют подключение, метаданные портов, телеметрию, heartbeat, немедленное закрытие транспорта и сохранение отключённой сессии, отключение после пяти команд в неправильном состоянии протокола, перенос данных и маршрутов в обе стороны, отказ для активной/отсутствующей сессии и неверного `upf`, а также однократность восстановления. Дополнительные проверки: - `test_session.py`: все этапы подключения, истечение и продление дедлайна, остановка воркера, ошибки последовательности и повторный handshake. - `test_session_manager.py`: обработка событий, истечение окна восстановления, однократность переноса и безопасность старой отложенной очистки. - `test_router.py`: перенос ссылок в обе стороны, несвязанные маршруты, окончательное удаление связей и данные отправителя при пересылке. - `test_source_validation.py`: синтаксис исходников и docstring каждого теста. В `test_client_run.py` также проверяются настоящие TCP-таймауты в состояниях `new/token/ready/air` и сохранение соединения после продления heartbeat. Краткое описание каждой проверки находится в docstring её функции. Интеграционные тесты запускают настоящий TCP-обработчик, сессии и роутер на свободном локальном порту. Маршруты задаются явно внутри теста: правила API/GUI не предполагаются. Изолированные проверки менеджера используют наблюдатель вызовов роутера; настоящий роутер дополнительно проверяется отдельно. В сценариях с таймерами подменяются только часы и ожидания времени в памяти. Тест явно продвигает время и освобождает нужное ожидание, поэтому реальные паузы в 5/60 секунд не нужны. Методы сессии, её воркер, обработчики менеджера и маршрутизация не подменяются. Неопределённые имена часов не добавляются тестами: такие ошибки остаются видимыми. Фоновые задачи завершаются или отменяются при выходе из каждого сценария; ошибки воркеров не скрываются. `fixtures/client_run_expected.json` оставлен как исторический эталон старого сценария. Новые тесты проверяют ответы протокола и состояние сервера, а не логи.