mirror of
https://github.com/truewhile/MeBox.git
synced 2026-09-30 03:36:37 +08:00
143 lines
3.9 KiB
Go
143 lines
3.9 KiB
Go
package service
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"github.com/ShukeBta/MediaStationGo/internal/config"
|
|
"github.com/ShukeBta/MediaStationGo/internal/model"
|
|
"github.com/ShukeBta/MediaStationGo/internal/repository"
|
|
)
|
|
|
|
func newFileManagerTestServiceWithRepo(t *testing.T, root string) (*FileManagerService, *repository.Container) {
|
|
t.Helper()
|
|
db := newServiceTestDB(t, &model.Library{}, &model.Media{}, &model.Setting{})
|
|
repos := repository.New(db)
|
|
lib := model.Library{Name: "downloads", Path: root, Type: "movie", Enabled: true}
|
|
if err := repos.Library.Create(t.Context(), &lib); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
cfg := &config.Config{}
|
|
cfg.App.DataDir = root
|
|
cfg.Cache.CacheDir = root
|
|
return NewFileManagerService(cfg, zap.NewNop(), repos), repos
|
|
}
|
|
|
|
func newFileManagerTestService(t *testing.T, root string) *FileManagerService {
|
|
t.Helper()
|
|
svc, _ := newFileManagerTestServiceWithRepo(t, root)
|
|
return svc
|
|
}
|
|
|
|
func TestFileManagerRecursiveListAndMutations(t *testing.T) {
|
|
root := t.TempDir()
|
|
nested := filepath.Join(root, "downloads", "国产剧")
|
|
if err := os.MkdirAll(nested, 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
mediaPath := filepath.Join(nested, "狂飙.S01E01.mkv")
|
|
if err := os.WriteFile(mediaPath, []byte("video"), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
svc := newFileManagerTestService(t, root)
|
|
|
|
listing, err := svc.List(root, 100, true)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
found := false
|
|
for _, entry := range listing.Entries {
|
|
if entry.Path == mediaPath {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
t.Fatalf("recursive listing did not include %s", mediaPath)
|
|
}
|
|
|
|
created, err := svc.CreateFolder(root, "整理目标")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
emptyListing, err := svc.List(created.Path, 100, false)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if emptyListing.Entries == nil || len(emptyListing.Entries) != 0 {
|
|
t.Fatalf("empty directory entries = %#v, want empty slice", emptyListing.Entries)
|
|
}
|
|
copied, err := svc.Transfer(mediaPath, created.Path, TransferCopy)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := os.Stat(copied.Path); err != nil {
|
|
t.Fatalf("copied file missing: %v", err)
|
|
}
|
|
renamed, err := svc.Rename(copied.Path, "狂飙 - S01E01.mkv")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := os.Stat(renamed.Path); err != nil {
|
|
t.Fatalf("renamed file missing: %v", err)
|
|
}
|
|
if err := svc.Delete(renamed.Path); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := os.Stat(renamed.Path); !os.IsNotExist(err) {
|
|
t.Fatalf("expected file deleted, stat err=%v", err)
|
|
}
|
|
}
|
|
|
|
func TestFileManagerRefusesRootMutation(t *testing.T) {
|
|
root := t.TempDir()
|
|
svc := newFileManagerTestService(t, root)
|
|
if err := svc.Delete(root); !errors.Is(err, ErrRootMutation) {
|
|
t.Fatalf("Delete(root) err = %v, want ErrRootMutation", err)
|
|
}
|
|
}
|
|
|
|
func TestFileManagerIncludesConfiguredOrganizeRoots(t *testing.T) {
|
|
root := t.TempDir()
|
|
sourceDir := filepath.Join(root, "downloads")
|
|
targetDir := filepath.Join(root, "media")
|
|
qbDir := filepath.Join(root, "qb-save")
|
|
for _, dir := range []string{sourceDir, targetDir, qbDir} {
|
|
if err := os.MkdirAll(dir, 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
svc, repos := newFileManagerTestServiceWithRepo(t, root)
|
|
if err := repos.Setting.Set(t.Context(), "organize.source_dir", sourceDir); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := repos.Setting.Set(t.Context(), "organize.target_dir", targetDir); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := repos.Setting.Set(t.Context(), "qbittorrent.savepath", qbDir); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
listing, err := svc.List("", 100)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
got := map[string]string{}
|
|
for _, root := range listing.Roots {
|
|
got[root.Label] = root.Path
|
|
}
|
|
for label, want := range map[string]string{
|
|
"organize-source": filepath.Clean(sourceDir),
|
|
"organize-target": filepath.Clean(targetDir),
|
|
"qb-savepath": filepath.Clean(qbDir),
|
|
} {
|
|
if got[label] != want {
|
|
t.Fatalf("root %s = %q, want %q; roots=%#v", label, got[label], want, listing.Roots)
|
|
}
|
|
}
|
|
}
|