Files
bible/rules/patterns/testing-policy/contract.md
Michael Chus 0005f3e41a Compress always-on contracts and restore pagination fields
The always-on set is paid by every session, so it gets the tightest
form: git-sync-check shrinks to its procedural core, testing-policy
moves the table-test example to README.md and folds the agent
instructions into the rules, go-code-style inlines the error-wrapping
example. Per-session read cost drops from 403 to 336 lines.

Also restore the pagination response fields in table-management: the
previous dedup replaced them with a reference to go-api, which the
table router line does not load.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 10:05:00 +03:00

48 lines
3.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.
# 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/`.
- Не использовать реальные сетевые вызовы и реальную БД в юнит-тестах.
## Мейнтейнс
- Сломанный тест — чинится или удаляется в том же коммите где сломался.
- Закомментированный тест — не допускается. Если тест неактуален — удалить.
- Тест, проверяющий удалённую функциональность — удалить вместе с функциональностью.
- При удалении функциональности — удалить соответствующие тесты в том же коммите.