Секции «Ядро» и «Инфра» слиты в одну «Очередь»: полок домена у проекта нет, а две секции держали два независимых порядка вместо одного. Порядок: красный гейт, потом долги, задевающие интерфейсы, потом хранилище, вход, разграничение, приложение. Разведка потолков SpeechKit последней — она обслуживает направление, а не очередь.
58 lines
3.6 KiB
Markdown
58 lines
3.6 KiB
Markdown
# 🐞 Починить тесты 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` на негодный файл — неверный ответ, это отдельная задача про трансляцию
|
||
доменной ошибки.
|