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,60 @@
## 1. Подстановки в сборке теста
- [x] 1.1 Завести в тестовом пакете подставной `contract.AudioMetaViewer`: отдаёт
заданную длительность либо заданную ошибку
- [x] 1.2 Завести подставной `contract.AudioFileConverter` — конвертацию эти
проверки не зовут
- [x] 1.3 `setupTestRouter` принимает каталог хранения и источник метаданных
снаружи; `ffmpegmv` и `ffmpegconv` из импортов пакета уходят
- [x] 1.4 Каталог хранения каждому случаю даёт `t.TempDir()`; `os.Chdir` в файле
не остаётся ни одного
## 2. Сборка запроса
- [x] 2.1 Вспомогательная функция собирает `multipart`-запрос из имени файла и
байтов, а не из пути на диске
- [x] 2.2 Ни один случай не создаёт файлов в текущем каталоге
## 3. Проверки приёма
- [x] 3.1 Приём записи: код `201`, поле `job_id` непустое, поле `status` равно
`created`, содержимое целиком лежит в каталоге хранения одним файлом
- [x] 3.2 Поля `audio` нет: код `400`, сообщение об отсутствии записи
- [x] 3.3 Запись нулевой длины: код `201`
- [x] 3.4 Расширение из имени отправителя: `.m4a`, `.mp3`, `.wav`, а имя без
расширения даёт `.audio`
- [x] 3.5 Источник метаданных вернул ошибку: код `500`, задача не заведена
- [x] 3.6 Опрос готовности: найденная задача даёт `200` с полями `job_id`,
`status` и `created_at`; неизвестный идентификатор даёт `404`
- [x] 3.7 Поля `transcription_text` в ответе нет, пока текста нет — проверяется
по сырому JSON, а не по разобранной структуре
## 4. Линтер
- [x] 4.1 Снять исключение `errcheck` для `_test.go` в `.golangci.yml`
- [x] 4.2 `golangci-lint run` не даёт замечаний сверх четырёх объявленных долгом
в `CLAUDE.md`
## 5. Гейт и приёмка
- [x] 5.1 `go test ./...` зелёный
- [x] 5.2 `task gate` не краснее объявленного долга: из двух известных отказов
остаётся только `golangci-lint`
- [x] 5.3 Каждый критерий приёмки проверен своим оракулом, исход записан
- [x] 5.4 Снять `go test ./...` из списка объявленных долгов в `CLAUDE.md`,
раздел «Гейт»: долг закрыт, и оставленная запись стала бы оправданием для
любого будущего красного `go test` в этом пакете
## Критерии приёмки
Дословно из записи задачи `http-handler-tests-never-green`:
- `go test ./...` зелёный на чистом клоне без ручной подготовки файлов. Оракул —
`git clone` во временный каталог и `go test ./...`.
- Тест приёма не зависит от установленного `ffprobe`: метаданные даёт подставной
`AudioMetaViewer`. Оракул — прогон с временно переименованным `ffprobe` в
`PATH`.
- Отказ разбора метаданных проверяется отдельным случаем и ожидает `500`, а не
`201`. Оракул — тот же тест на подставном, возвращающем ошибку.
- Тесты не меняют рабочий каталог процесса. Оракул — `grep -n 'os.Chdir'
internal/controller/http/transcribe_test.go` пуст.