http: тесты приёма переписаны на подставные адаптеры

- проверки больше не зовут ffprobe и не меняют рабочий каталог процесса;
  добавлены случаи на отказ чтения метаданных и на отсутствие поля audio
- заведена спека intake на приём по HTTP, ADR о подставных адаптерах,
  запись в журнал ревью о проверке, которая не могла упасть
- go test снят из объявленных долгов CLAUDE.md, послабление errcheck
  для _test.go в .golangci.yml убрано
This commit is contained in:
av
2026-08-11 08:35:11 +03:00
parent bb973b0a68
commit 6c04c801c9
14 changed files with 1175 additions and 205 deletions
@@ -0,0 +1,51 @@
# Проверки не зовут внешних программ
- **Дата:** 2026-08-11
- **Источник:** openspec/changes/archive/2026-08-11-fix-http-handler-tests/design.md
## Решение
Тесты приёма получают длительность записи от подставного источника метаданных, а
не от `ffprobe`. Годность содержимого судит адаптер, тест судит наш код.
## Почему
Цитата из источника, раздел `Decisions`:
> **проверять приём сквозь настоящий `ffprobe`.** Отвергнуто: это проверка
> внешней программы, а не нашего кода. Она найдёт отказ `ffprobe` и не найдёт
> ошибку в приёме — ровно наоборот тому, зачем эти тесты писались.
Отвергнуты там же два очевидных пути, и оба по записанным правилам проекта, а не
по вкусу:
> **положить настоящую запись в `testdata`.** Отвергнуто дважды: `.gitignore`
> строкой `*.m4a` её не пустит, а `CLAUDE.md` прямо говорит, что `testdata` в
> проекте нет и тесты создают нужное во временном каталоге. Снимать запрет ради
> теста — менять правило проекта под удобство одного файла;
>
> **порождать запись `ffmpeg` прямо в тесте.** Отвергнуто: проверка приёма
> начинает требовать установленных `ffmpeg` и `ffprobe`, а критерий приёмки
> требует обратного — прогона с `ffprobe`, убранным из `PATH`.
Решение попадает в журнал как **намеренный отказ от очевидного подхода**: файл с
настоящей записью в `testdata` — первое, что сделал бы человек, и отказ от него
из кода не виден.
## Последствия
- `+` прогон проверок на чистом клоне зелёный без подготовки файлов руками и без
установленных внешних программ. Проверено сборкой тестового бинарника и
прогоном под `env -i PATH=<пустой каталог>`.
- `+` ветка отказа чтения метаданных впервые проверяема: подставной источник
умеет вернуть ошибку, настоящий `ffprobe` по заказу не отказывает.
- `+` проверки не держат состояния процесса: каталог хранения задаётся снаружи,
`os.Chdir` ушёл, и параллельный прогон перестал быть запрещённым.
- `` разбор вывода настоящего `ffprobe` не проверяется ничем: своего теста у
`internal/adapter/metaviewer/ffmpeg` нет. Формально покрытие не потеряно —
прежние проверки звали его так, что он всегда отказывал, — но дыра теперь
наша и записана в [../review.md](../review.md), «Перестали проверять
сознательно».
- `` правило распространяется на будущие проверки: узел, чья работа и есть
обращение к внешней программе, придётся проверять иначе, и чем — здесь не
решено.
+5 -5
View File
@@ -31,9 +31,9 @@
| Дата | Запись | Статус |
| --- | --- | --- |
| 2026-08-11 | [Проверки не зовут внешних программ](ADR-2026-08-11-stub-adapters-in-tests.md) | |
Записей нет: канон заведён 2026-08-10, а решения, принятые до него, источника в
архиве изменений не имеют — сочинять их задним числом правило запрещает.
Ближайшие кандидаты назовёт первое же изменение, которое тронет хранилище или
вход: замена SQLite на PocketBase и вход через OIDC оба проходят триггер
«дорогой откат».
Решения, принятые до заведения канона 2026-08-10, источника в архиве изменений
не имеют — сочинять их задним числом правило запрещает. Ближайшие кандидаты
назовёт первое же изменение, которое тронет хранилище или вход: замена SQLite на
PocketBase и вход через OIDC оба подпадают под критерий «дорогой откат».