# Contract: Testing Policy Version: 1.2 ## Purpose Определяет когда писать тесты, когда не писать, и как их поддерживать. Применяется ко всем проектам на Go. Агенты следуют этим правилам самостоятельно, без запроса подтверждения. See `README.md` for a reference table test. ## Когда тест обязателен Тест пишется всегда, когда код делает нетривиальное преобразование данных или реализует бизнес-логику: - **Парсеры** — любой код, читающий внешний формат (XML, JSON, CSV, бинарный) - **Трансформации** — конвертация единиц, нормализация, маппинг полей - **Бизнес-правила** — расчёты, фильтрация, агрегация, приоритизация - **Граничные случаи** — пустой ввод, нулевые значения, переполнение, отсутствующие поля - **Degraded / legacy states** — legacy schema, interrupted migrations, duplicates, invalid persisted rows, partially migrated tables - **Регрессии** — если баг был найден, тест фиксирует его до исправления Тест пишется в том же коммите, что и функциональность. Функциональность без теста (там где он обязателен) — неполный коммит. Для local-first desktop приложений правила деградированных состояний и recovery-тестов определяются также `local-first-recovery` contract. ## Когда тест не нужен Тест не пишется на код, где он не даёт ценности. Не писать его и не упоминать его отсутствие: - Геттеры и сеттеры: `func (s *Server) Port() int { return s.port }` - Конфиг-структуры и константы - Тривиальный клей: передача параметров, инициализация, dependency wiring - Логирование и форматирование вывода - HTTP-хендлеры без бизнес-логики (только роутинг и вызов сервиса) ## Структура теста - Стандартный Go `testing`. Табличные тесты (`[]struct{ ... }`) — когда случаев больше двух. - Фикстуры (XML, JSON, бинарные данные) — инлайн-константы или файлы в `testdata/`. - Не использовать реальные сетевые вызовы и реальную БД в юнит-тестах. ## Мейнтейнс - Сломанный тест — чинится или удаляется в том же коммите где сломался. - Закомментированный тест — не допускается. Если тест неактуален — удалить. - Тест, проверяющий удалённую функциональность — удалить вместе с функциональностью. - При удалении функциональности — удалить соответствующие тесты в том же коммите.