1
1

Добавить тесты репозитория файловой системы и реализовать функциональность журналирования файлов.

- Реализовать тесты для поиска MP3-файлов и переименования/организации папок книг в репозитории файловой системы.
- Создать FileLogger для записи сообщений в файл с поддержкой различных уровней журналирования и управления размером файлов.
- Разработать репозиторий RuTracker для обработки поиска торрентов, получения метаданных и загрузки торрент-файлов.
- Добавить тесты для нормализации URL в репозиторий RuTracker.
- Реализовать адаптер логгера TUI для отображения логов в терминальном интерфейсе и, при необходимости, для записи логов в базовый логгер.
- Создать менеджер TUI для управления пользовательским интерфейсом приложения, включая главное меню, экран обработки, настройки и отображение результатов.
This commit is contained in:
Dmitriy Fofanov
2025-09-29 20:40:05 +03:00
parent 49bea780aa
commit 72a66f1664
32 changed files with 4073 additions and 22 deletions

View 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)
}
}