docs/ по канону 12: паспорт с целью проекта, архитектура сегодняшнего устройства, схема хранилища, модель угроз, конвенции кода, журнал ревью. Конвенции перенесены из jellybit; места, где код им не следует, помечены строкой «Расхождение» как объявленный долг. tasks/ с роадмапом: две достигнутые цели, две запланированные (веб и многопользовательский режим), два направления (все форматы, долгие записи) и пять задач в беклоге. openspec/config.yaml — маршрутизатор с адресами документов, спек пока нет. CLAUDE.md переписан по форме канона: инварианты с severity, семантика гейта, запреты с путями. Taskfile получил task gate.
3.6 KiB
🐞 Починить тесты 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 на негодный файл — неверный ответ, это отдельная задача про трансляцию
доменной ошибки.