Добавить тесты репозитория файловой системы и реализовать функциональность журналирования файлов.
- Реализовать тесты для поиска MP3-файлов и переименования/организации папок книг в репозитории файловой системы. - Создать FileLogger для записи сообщений в файл с поддержкой различных уровней журналирования и управления размером файлов. - Разработать репозиторий RuTracker для обработки поиска торрентов, получения метаданных и загрузки торрент-файлов. - Добавить тесты для нормализации URL в репозиторий RuTracker. - Реализовать адаптер логгера TUI для отображения логов в терминальном интерфейсе и, при необходимости, для записи логов в базовый логгер. - Создать менеджер TUI для управления пользовательским интерфейсом приложения, включая главное меню, экран обработки, настройки и отображение результатов.
This commit is contained in:
66
internal/domain/services/audiobook_service_test.go
Normal file
66
internal/domain/services/audiobook_service_test.go
Normal file
@@ -0,0 +1,66 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user