Files
transcriber/tasks/items/http-handler-tests-never-green.md
T
av 4d1c2bf44c Канон документов, каталог задач и OpenSpec
docs/ по канону 12: паспорт с целью проекта, архитектура сегодняшнего
устройства, схема хранилища, модель угроз, конвенции кода, журнал ревью.
Конвенции перенесены из jellybit; места, где код им не следует, помечены
строкой «Расхождение» как объявленный долг.

tasks/ с роадмапом: две достигнутые цели, две запланированные (веб и
многопользовательский режим), два направления (все форматы, долгие
записи) и пять задач в беклоге.

openspec/config.yaml — маршрутизатор с адресами документов, спек пока нет.

CLAUDE.md переписан по форме канона: инварианты с severity, семантика
гейта, запреты с путями. Taskfile получил task gate.
2026-08-10 21:19:07 +03:00

58 lines
3.6 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.
# 🐞 Починить тесты http-обработчика, ни разу не бывшие зелёными
- **Тип:** fix
- **Категория:** Ядро
- **Зачем:** go test ./... падает на master: тесты требуют файла, которого нет в репозитории, и ждут 201 от ffprobe, которому скормили строку.
Тесты заведены коммитом `87d8b05` и с тех пор ни разу не проходили: файл
`internal/controller/http/testdata/sample.m4a` в git не попадал никогда, а
`.gitignore` строкой `*.m4a` и не даст его закоммитить. Остальные случаи
записывают в файл строку `test audio content` и ждут `201`, тогда как обработчик
зовёт настоящий `ffprobe`, который такой вход отвергает, — получается `500`.
Отсюда следствие важнее самих тестов: **красный `go test` перестал что-либо
значить**, и любой настоящий отказ в этом пакете теперь неотличим от привычного
шума.
Заодно тесты зовут `os.Chdir`, то есть меняют состояние всего процесса: гонять
их параллельно нельзя, а `errcheck` на этих вызовах молчит только потому, что
`_test.go` вынесен в исключения `.golangci.yml`.
## Воспроизведение
```
go test ./internal/controller/http/
```
Отказов четыре: `TestCreateTranscribeJob_Success` не находит
`testdata/sample.m4a`; `TestCreateTranscribeJob_EmptyFile` и три случая
`TestCreateTranscribeJob_DifferentFileExtensions` получают `500` вместо `201` с
`ffprobe execution failed: exit status 1` в логе.
## Затрагивает
- `internal/controller/http/transcribe_test.go` целиком;
- `.gitignore`, строка `*.m4a` — она же мешает положить настоящую запись в
`testdata`;
- `internal/contract`, `AudioMetaViewer` — подставной вместо настоящего
`ffprobe` в тестах;
- `.golangci.yml`, исключение `errcheck` для `_test.go`, если `os.Chdir` уйдёт.
## Критерии приёмки
- `go test ./...` зелёный на чистом клоне без ручной подготовки файлов. Оракул —
`git clone` во временный каталог и `go test ./...`.
- Тест приёма не зависит от установленного `ffprobe`: метаданные даёт подставной
`AudioMetaViewer`. Оракул — прогон с временно переименованным `ffprobe` в
`PATH`.
- Отказ разбора метаданных проверяется отдельным случаем и ожидает `500`, а не
`201`. Оракул — тот же тест на подставном, возвращающем ошибку.
- Тесты не меняют рабочий каталог процесса. Оракул — `grep -n 'os.Chdir'
internal/controller/http/transcribe_test.go` пуст.
## Рамки
Поведение обработчика не меняем: задача про тесты. Если по ходу выяснится, что
`500` на негодный файл — неверный ответ, это отдельная задача про трансляцию
доменной ошибки.