package services import ( "os" "path/filepath" "testing" ) func TestCreateChaptersAndDurations(t *testing.T) { dir := t.TempDir() files := []string{"02.mp3", "01.mp3"} var paths []string // создаём разные размеры для разной длительности for i, f := range files { p := filepath.Join(dir, f) data := make([]byte, (i+1)*1024*1024) // 1MB, 2MB if err := os.WriteFile(p, data, 0644); err != nil { t.Fatalf("write: %v", err) } paths = append(paths, p) } svc := NewAudioBookService() chapters := svc.CreateChapters(paths) if len(chapters) != 2 { t.Fatalf("ожидалось 2 главы, получено %d", len(chapters)) } // порядок по имени: 01.mp3, 02.mp3 if chapters[0].Title != "01" || chapters[1].Title != "02" { t.Errorf("неверные названия глав: %+v", chapters) } if !(chapters[0].Duration > 40 && chapters[1].Duration > chapters[0].Duration) { t.Errorf("неверные длительности: %+v", chapters) } if !(chapters[0].Start == 0 && chapters[0].End < chapters[1].Start) { t.Errorf("неверные интервалы: %+v", chapters) } } func TestExtractChapterTitlePatterns(t *testing.T) { svc := NewAudioBookService() cases := map[string]string{ "01 - Введение": "01 - Введение", "001_Первая_глава": "001 - Первая_глава", "Chapter 05 - Название": "05 - Название", "Глава 3 - Важная информация": "3 - Важная информация", "Часть 10": "10", "простое_название": "простое_название", "15": "15", } for in, exp := range cases { got := svc.extractChapterTitle(in) if got != exp { t.Errorf("%q => %q, ожидалось %q", in, got, exp) } } } func TestCleanTitle(t *testing.T) { svc := NewAudioBookService() in := "Автор - Книга [MP3, 96 kbps] (2025)" got := svc.CleanTitle(in) if got != "Автор - Книга" { t.Errorf("получено %q", got) } }