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

3.6 KiB
Raw Blame History

🐞 Починить тесты 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 на негодный файл — неверный ответ, это отдельная задача про трансляцию доменной ошибки.