- Реализовать тесты для поиска MP3-файлов и переименования/организации папок книг в репозитории файловой системы. - Создать FileLogger для записи сообщений в файл с поддержкой различных уровней журналирования и управления размером файлов. - Разработать репозиторий RuTracker для обработки поиска торрентов, получения метаданных и загрузки торрент-файлов. - Добавить тесты для нормализации URL в репозиторий RuTracker. - Реализовать адаптер логгера TUI для отображения логов в терминальном интерфейсе и, при необходимости, для записи логов в базовый логгер. - Создать менеджер TUI для управления пользовательским интерфейсом приложения, включая главное меню, экран обработки, настройки и отображение результатов.
67 lines
2.1 KiB
Go
67 lines
2.1 KiB
Go
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)
|
||
}
|
||
}
|