внутренняя модель перестроена вокруг аудиозаписи
- audiorecords вместо transcribe_jobs: приложения (texts, structures, recognitions, record_events, topics) живут своими коллекциями, ссылки на исходник и на приведённую копию перестали переставляться - рубеж называет достигнутое, отказ стал признаком остановки с причиной, а сторожей стало двое: число отказов и время в рубеже - воркеры потеряли специализацию, их число задаётся [pipeline] workers, шаг выбирается по рубежу, а захват отдаёт идентификатор и признак захвата
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Проверка входа — единственная страховка от того, чтобы сервис поднялся с
|
||||
@@ -274,3 +275,71 @@ func TestLoadConfigMalformedBeforeAnyKeyHidesValue(t *testing.T) {
|
||||
t.Fatalf("место отказа не названо, чинить нечего: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Числа конвейера приезжают из файла, а не выдумываются кодом.
|
||||
func TestLoadConfigReadsPipelineSettings(t *testing.T) {
|
||||
path := writeConfig(t, `
|
||||
[pipeline]
|
||||
workers = 7
|
||||
own_work_limit_minutes = 90
|
||||
foreign_work_limit_minutes = 720
|
||||
|
||||
[telegram]
|
||||
enabled = false
|
||||
`)
|
||||
|
||||
cfg, err := LoadConfig(path)
|
||||
if err != nil {
|
||||
t.Fatalf("конфиг не прочитан: %v", err)
|
||||
}
|
||||
|
||||
if cfg.Pipeline.Workers != 7 {
|
||||
t.Errorf("число воркеров не прочитано: %d", cfg.Pipeline.Workers)
|
||||
}
|
||||
|
||||
limits := cfg.Pipeline.StuckLimits()
|
||||
if limits.Own != 90*time.Minute {
|
||||
t.Errorf("предел своей работы не прочитан: %v", limits.Own)
|
||||
}
|
||||
if limits.Foreign != 720*time.Minute {
|
||||
t.Errorf("предел чужой работы не прочитан: %v", limits.Foreign)
|
||||
}
|
||||
}
|
||||
|
||||
// Умолчания есть у всех трёх чисел: файл без секции конвейера годен, и сервис
|
||||
// поднимается с рабочими значениями.
|
||||
func TestPipelineSettingsHaveDefaults(t *testing.T) {
|
||||
path := writeConfig(t, "[telegram]\nenabled = false\n")
|
||||
|
||||
cfg, err := LoadConfig(path)
|
||||
if err != nil {
|
||||
t.Fatalf("конфиг не прочитан: %v", err)
|
||||
}
|
||||
|
||||
if cfg.Pipeline.Workers <= 0 {
|
||||
t.Errorf("умолчание числа воркеров негодно: %d", cfg.Pipeline.Workers)
|
||||
}
|
||||
if err := cfg.Pipeline.Validate(); err != nil {
|
||||
t.Errorf("умолчания не проходят собственную проверку: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Ноль воркеров — объявленный режим, а отрицательное число и нулевой предел —
|
||||
// опечатка: подниматься с ней значит остановить всякую запись первым же
|
||||
// захватом.
|
||||
func TestPipelineValidateSeparatesModeFromTypo(t *testing.T) {
|
||||
valid := PipelineConfig{Workers: 0, OwnWorkLimitMinutes: 60, ForeignWorkLimitMinutes: 1440}
|
||||
if err := valid.Validate(); err != nil {
|
||||
t.Errorf("ноль воркеров объявлен законным значением: %v", err)
|
||||
}
|
||||
|
||||
for name, cfg := range map[string]PipelineConfig{
|
||||
"отрицательное число воркеров": {Workers: -1, OwnWorkLimitMinutes: 60, ForeignWorkLimitMinutes: 1440},
|
||||
"нулевой предел своей работы": {Workers: 1, OwnWorkLimitMinutes: 0, ForeignWorkLimitMinutes: 1440},
|
||||
"нулевой предел чужой работы": {Workers: 1, OwnWorkLimitMinutes: 60, ForeignWorkLimitMinutes: 0},
|
||||
} {
|
||||
if err := cfg.Validate(); err == nil {
|
||||
t.Errorf("%s принято за режим", name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user