- проверки больше не зовут ffprobe и не меняют рабочий каталог процесса; добавлены случаи на отказ чтения метаданных и на отсутствие поля audio - заведена спека intake на приём по HTTP, ADR о подставных адаптерах, запись в журнал ревью о проверке, которая не могла упасть - go test снят из объявленных долгов CLAUDE.md, послабление errcheck для _test.go в .golangci.yml убрано
61 lines
4.1 KiB
Markdown
61 lines
4.1 KiB
Markdown
## 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` пуст.
|