package scanner import ( "seanime/internal/api/anilist" "seanime/internal/api/metadata" "seanime/internal/library/anime" "seanime/internal/platforms/anilist_platform" "seanime/internal/test_utils" "seanime/internal/util" "seanime/internal/util/limiter" "testing" "github.com/samber/lo" "github.com/stretchr/testify/assert" ) func TestNewMediaFetcher(t *testing.T) { test_utils.InitTestProvider(t, test_utils.Anilist()) anilistClient := anilist.TestGetMockAnilistClient() logger := util.NewLogger() anilistPlatform := anilist_platform.NewAnilistPlatform(anilistClient, logger) metadataProvider := metadata.GetMockProvider(t) completeAnimeCache := anilist.NewCompleteAnimeCache() anilistRateLimiter := limiter.NewAnilistLimiter() dir := "E:/Anime" tests := []struct { name string paths []string enhanced bool disableAnimeCollection bool }{ { name: "86 - Eighty Six Part 1 & 2", paths: []string{ "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 20v2 (1080p) [30072859].mkv", "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 21v2 (1080p) [4B1616A5].mkv", "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 22v2 (1080p) [58BF43B4].mkv", "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 23v2 (1080p) [D94B4894].mkv", }, enhanced: false, disableAnimeCollection: false, }, { name: "86 - Eighty Six Part 1 & 2", paths: []string{ "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 20v2 (1080p) [30072859].mkv", "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 21v2 (1080p) [4B1616A5].mkv", "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 22v2 (1080p) [58BF43B4].mkv", "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 23v2 (1080p) [D94B4894].mkv", }, enhanced: true, disableAnimeCollection: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { scanLogger, err := NewConsoleScanLogger() if err != nil { t.Fatal("expected result, got error:", err.Error()) } // +---------------------+ // | Local Files | // +---------------------+ var lfs []*anime.LocalFile for _, path := range tt.paths { lf := anime.NewLocalFile(path, dir) lfs = append(lfs, lf) } // +---------------------+ // | MediaFetcher | // +---------------------+ mf, err := NewMediaFetcher(t.Context(), &MediaFetcherOptions{ Enhanced: tt.enhanced, Platform: anilistPlatform, LocalFiles: lfs, CompleteAnimeCache: completeAnimeCache, MetadataProvider: metadataProvider, Logger: util.NewLogger(), AnilistRateLimiter: anilistRateLimiter, ScanLogger: scanLogger, DisableAnimeCollection: tt.disableAnimeCollection, }) if err != nil { t.Fatal("expected result, got error:", err.Error()) } mc := NewMediaContainer(&MediaContainerOptions{ AllMedia: mf.AllMedia, ScanLogger: scanLogger, }) for _, m := range mc.NormalizedMedia { t.Log(m.GetTitleSafe()) } }) } } func TestNewEnhancedMediaFetcher(t *testing.T) { anilistClient := anilist.TestGetMockAnilistClient() logger := util.NewLogger() anilistPlatform := anilist_platform.NewAnilistPlatform(anilistClient, logger) metaProvider := metadata.GetMockProvider(t) completeAnimeCache := anilist.NewCompleteAnimeCache() anilistRateLimiter := limiter.NewAnilistLimiter() dir := "E:/Anime" tests := []struct { name string paths []string enhanced bool }{ { name: "86 - Eighty Six Part 1 & 2", paths: []string{ "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 20v2 (1080p) [30072859].mkv", "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 21v2 (1080p) [4B1616A5].mkv", "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 22v2 (1080p) [58BF43B4].mkv", "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 23v2 (1080p) [D94B4894].mkv", }, enhanced: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { scanLogger, err := NewScanLogger("./logs") if err != nil { t.Fatal("expected result, got error:", err.Error()) } // +---------------------+ // | Local Files | // +---------------------+ var lfs []*anime.LocalFile for _, path := range tt.paths { lf := anime.NewLocalFile(path, dir) lfs = append(lfs, lf) } // +---------------------+ // | MediaFetcher | // +---------------------+ mf, err := NewMediaFetcher(t.Context(), &MediaFetcherOptions{ Enhanced: tt.enhanced, Platform: anilistPlatform, LocalFiles: lfs, CompleteAnimeCache: completeAnimeCache, MetadataProvider: metaProvider, Logger: util.NewLogger(), AnilistRateLimiter: anilistRateLimiter, ScanLogger: scanLogger, }) if err != nil { t.Fatal("expected result, got error:", err.Error()) } mc := NewMediaContainer(&MediaContainerOptions{ AllMedia: mf.AllMedia, ScanLogger: scanLogger, }) for _, m := range mc.NormalizedMedia { t.Log(m.GetTitleSafe()) } }) } } func TestFetchMediaFromLocalFiles(t *testing.T) { anilistClient := anilist.TestGetMockAnilistClient() logger := util.NewLogger() anilistPlatform := anilist_platform.NewAnilistPlatform(anilistClient, logger) metaProvider := metadata.GetMockProvider(t) completeAnimeCache := anilist.NewCompleteAnimeCache() anilistRateLimiter := limiter.NewAnilistLimiter() tests := []struct { name string paths []string expectedMediaId []int }{ { name: "86 - Eighty Six Part 1 & 2", paths: []string{ "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 20v2 (1080p) [30072859].mkv", "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 21v2 (1080p) [4B1616A5].mkv", "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 22v2 (1080p) [58BF43B4].mkv", "E:/Anime/[SubsPlease] 86 - Eighty Six (01-23) (1080p) [Batch]/[SubsPlease] 86 - Eighty Six - 23v2 (1080p) [D94B4894].mkv", }, expectedMediaId: []int{116589, 131586}, // 86 - Eighty Six Part 1 & 2 }, } dir := "E:/Anime" for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { scanLogger, err := NewScanLogger("./logs") if err != nil { t.Fatal("expected result, got error:", err.Error()) } // +---------------------+ // | Local Files | // +---------------------+ var lfs []*anime.LocalFile for _, path := range tt.paths { lf := anime.NewLocalFile(path, dir) lfs = append(lfs, lf) } // +--------------------------+ // | FetchMediaFromLocalFiles | // +--------------------------+ media, ok := FetchMediaFromLocalFiles( t.Context(), anilistPlatform, lfs, completeAnimeCache, metaProvider, anilistRateLimiter, scanLogger, ) if !ok { t.Fatal("could not fetch media from local files") } ids := lo.Map(media, func(k *anilist.CompleteAnime, _ int) int { return k.ID }) // Test if all expected media IDs are present for _, id := range tt.expectedMediaId { assert.Contains(t, ids, id) } t.Log("Media IDs:") for _, m := range media { t.Log(m.GetTitleSafe()) } }) } }