tasks: заведена задача про конвенцию тестов
- tests-convention: разобрать кандидатов пункта «Тесты» и записать docs/conventions/tests.md, четыре критерия приёмки с оракулами - пункт «Тесты» снят из convention-candidates и заменён ссылкой, чтобы не жить вторым домом
This commit is contained in:
@@ -41,6 +41,7 @@
|
|||||||
- [🧹 Кэшировать ответы метабаз с TTL (и опционально LLM)](items/metadata-cache.md) — повторные и ретраящиеся прогоны бьют TMDB/TVDB/TVMaze одним запросом — кэш с TTL сэкономил бы лимиты и ускорил «Распознать заново»
|
- [🧹 Кэшировать ответы метабаз с TTL (и опционально LLM)](items/metadata-cache.md) — повторные и ретраящиеся прогоны бьют TMDB/TVDB/TVMaze одним запросом — кэш с TTL сэкономил бы лимиты и ускорил «Распознать заново»
|
||||||
- [✨ Чистить БД от терминальных задач и сырых ответов LLM старше срока хранения](items/db-retention-cleanup.md) — терминальные задачи и сырые ответы LLM копятся вечно — без авточистки список загрузок и БД деградируют по мере эксплуатации
|
- [✨ Чистить БД от терминальных задач и сырых ответов LLM старше срока хранения](items/db-retention-cleanup.md) — терминальные задачи и сырые ответы LLM копятся вечно — без авточистки список загрузок и БД деградируют по мере эксплуатации
|
||||||
- [🧹 Свести термины домена в словарь единого языка](items/ubiquitous-language-glossary.md) — наименования домена расходятся между спеками, UI и кодом — нет единого глоссария (на нём же стоит агент-ревьювер наименований)
|
- [🧹 Свести термины домена в словарь единого языка](items/ubiquitous-language-glossary.md) — наименования домена расходятся между спеками, UI и кодом — нет единого глоссария (на нём же стоит агент-ревьювер наименований)
|
||||||
|
- [🧹 Разобрать кандидатов по тестам и записать конвенцию](items/tests-convention.md) — как пишем тесты, не записано нигде: пункт «Тесты» в convention-candidates не пересматривали, он обещает фикстуры в testdata/, которых в проекте нет — а трение накопилось (четыре внешних клиента, fakeStore с инъекцией ошибок, env-гейты, флаки-прогон, diff-coverage)
|
||||||
- [🔬 Потолок нагрузки: 100 одновременных загрузок, план-максимум 1000](items/scale-100-downloads.md) — Зафиксировать в НФТ ориентир 100/1000 загрузок + аудит узких мест (SQLite, воркер, поллинг)
|
- [🔬 Потолок нагрузки: 100 одновременных загрузок, план-максимум 1000](items/scale-100-downloads.md) — Зафиксировать в НФТ ориентир 100/1000 загрузок + аудит узких мест (SQLite, воркер, поллинг)
|
||||||
- [🔬 Завершение загрузки через webhook](items/completion-webhook.md) — завершение сейчас ловим поллингом qBittorrent — webhook реагировал бы быстрее, но связывает нас с его конфигом (решим по опыту эксплуатации)
|
- [🔬 Завершение загрузки через webhook](items/completion-webhook.md) — завершение сейчас ловим поллингом qBittorrent — webhook реагировал бы быстрее, но связывает нас с его конфигом (решим по опыту эксплуатации)
|
||||||
- [🔬 Кандидаты в конвенции кода](items/convention-candidates.md) — накоплен список кандидатов (внешние клиенты, конкурентность, тесты, CLI, время) — надо решить, что из них стало реальным трением, а что выдумано вперёд
|
- [🔬 Кандидаты в конвенции кода](items/convention-candidates.md) — накоплен список кандидатов (внешние клиенты, конкурентность, тесты, CLI, время) — надо решить, что из них стало реальным трением, а что выдумано вперёд
|
||||||
|
|||||||
@@ -28,10 +28,10 @@
|
|||||||
`http.DefaultClient`, ретраи с backoff и потолком, HTTP-прокси из конфига.
|
`http.DefaultClient`, ретраи с backoff и потолком, HTTP-прокси из конфига.
|
||||||
Кандидат на общий конструктор клиента вместо копипасты в
|
Кандидат на общий конструктор клиента вместо копипасты в
|
||||||
`qbt`/`llm`/`jellyfin`/`metadata`. Самый живой пункт: клиентов уже четыре.
|
`qbt`/`llm`/`jellyfin`/`metadata`. Самый живой пункт: клиентов уже четыре.
|
||||||
- **Тесты.** Table-driven, фикстуры в `testdata/`, `t.Parallel()` где
|
- ~~**Тесты.**~~ Вынесены отдельной задачей —
|
||||||
безопасно, зафиксировать stdlib `testing` против `testify`, разделение
|
[tests-convention](tests-convention.md): кандидат разошёлся с проектом
|
||||||
быстрых и интеграционных (`*_integration_test.go` + env-гейты уже есть), что
|
(обещал фикстуры в `testdata/`, которого нет), и разбирать его надо вместе с
|
||||||
считаем обязательным к покрытию.
|
тем, что накопилось в самих тестах.
|
||||||
|
|
||||||
**Кандидаты в строку-инвариант, а не в документ**
|
**Кандидаты в строку-инвариант, а не в документ**
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
# 🧹 Разобрать кандидатов по тестам и записать конвенцию
|
||||||
|
|
||||||
|
- **Тип:** chore
|
||||||
|
- **Категория:** Инфраструктура
|
||||||
|
- **Зачем:** как пишем тесты, не записано нигде: пункт «Тесты» в convention-candidates не пересматривали, он обещает фикстуры в testdata/, которых в проекте нет — а трение накопилось (четыре внешних клиента, fakeStore с инъекцией ошибок, env-гейты, флаки-прогон, diff-coverage)
|
||||||
|
- **Теги:** sprint:2026-08-06
|
||||||
|
|
||||||
|
В `docs/conventions/` пять записей, и ни одна не про тесты. Знание о том, как
|
||||||
|
они здесь устроены, живёт в головах и в самих файлах: фикстуры чужих форматов
|
||||||
|
константами (`testdata` не заводился сознательно), интеграционные за env-гейтами
|
||||||
|
в `*_integration_test.go`, инъекция ошибок хранилища через `fakeStore`,
|
||||||
|
архитектурные правила тестом-сканером `internal/archrules` с русскими именами,
|
||||||
|
покрытие изменённых строк меряет гейт.
|
||||||
|
|
||||||
|
Пункт «Тесты» в [convention-candidates](convention-candidates.md) с тех пор не
|
||||||
|
пересматривали, и он уже расходится с проектом: обещает фикстуры в `testdata/`,
|
||||||
|
которого нет и который запрещён `CLAUDE.md`. Часть остальных кандидатов
|
||||||
|
проверяется замером, а не мнением: table-driven используется в 18 пакетах из 19,
|
||||||
|
`t.Parallel()` — ни разу, `testify` в `go.mod` не подключён.
|
||||||
|
|
||||||
|
Правило каталога конвенций — «пишем по мере реального трения, а не вперёд».
|
||||||
|
Трение здесь и есть: тема `autotests` идёт первым проходом на любой метке ревью,
|
||||||
|
а дома у неё нет — источником ей служит только семантика гейта из `CLAUDE.md`,
|
||||||
|
то есть «что краснеет», а не «что стоит проверять».
|
||||||
|
|
||||||
|
## Затрагивает
|
||||||
|
|
||||||
|
- `docs/conventions/tests.md` — новый файл записи конвенции;
|
||||||
|
- `docs/conventions/README.md` — строка в индексе «Записи» и, возможно, строки в
|
||||||
|
таблице «Механизировано»;
|
||||||
|
- `docs/tasks/items/convention-candidates.md` — пункт «Тесты» уходит из списка
|
||||||
|
кандидатов;
|
||||||
|
- `.golangci.yml` и `internal/archrules` — только если что-то из решённого
|
||||||
|
выражается правилом, а не прозой.
|
||||||
|
|
||||||
|
## Критерии приёмки
|
||||||
|
|
||||||
|
- Каждый кандидат пункта «Тесты» получил исход поимённо: в прозу, в правило или
|
||||||
|
выброшен как выдуманный вперёд. **Оракул:** в `convention-candidates.md`
|
||||||
|
пункта «Тесты» больше нет, а судьба каждого его подпункта названа — в новой
|
||||||
|
конвенции, в таблице «Механизировано» или в `REJECTED`-строке причины.
|
||||||
|
- `docs/conventions/tests.md` заведён и назван в индексе. **Оракул:** `task
|
||||||
|
gate`, шаг `canon` — файл вне канона и битая ссылка краснят безусловно.
|
||||||
|
- Ни одно утверждение конвенции не расходится с тем, как код устроен сегодня:
|
||||||
|
фикстуры описаны как лежат, `testdata` не обещан, число пакетов и приёмов не
|
||||||
|
выдумано. **Оракул:** `grep -r testdata` по репозиторию пуст, и агент
|
||||||
|
`doc-code-drift` на ближайшей сессии не даёт находки по этому файлу.
|
||||||
|
- Выражаемое правилом не осталось прозой. **Оракул:** каждое утверждение новой
|
||||||
|
конвенции либо отсутствует в таблице «Механизировано», либо стоит там с
|
||||||
|
адресом механизации — конфигом линтера или тестом `internal/archrules`.
|
||||||
|
|
||||||
|
## Рамки
|
||||||
|
|
||||||
|
Существующие тесты под новую конвенцию не переписываются — она применяется к
|
||||||
|
тому, что пишется дальше. `testdata/` не заводится: отказ от него записан в
|
||||||
|
`CLAUDE.md`, и его пересмотр — отдельное решение, а не побочный эффект этой
|
||||||
|
задачи.
|
||||||
Reference in New Issue
Block a user