Files
seanime-docker/seanime-2.9.10/internal/torrents/analyzer/analyzer_test.go
2025-09-20 14:08:38 +01:00

111 lines
4.2 KiB
Go

package torrent_analyzer
import (
"seanime/internal/api/anilist"
"seanime/internal/api/metadata"
"seanime/internal/platforms/anilist_platform"
"seanime/internal/test_utils"
"seanime/internal/util"
"testing"
"github.com/stretchr/testify/assert"
)
// TestSelectFilesFromSeason tests the selection of the accurate season files from a list of files from all seasons.
func TestSelectFilesFromSeason(t *testing.T) {
test_utils.InitTestProvider(t, test_utils.Anilist())
logger := util.NewLogger()
anilistClient := anilist.TestGetMockAnilistClient()
anilistPlatform := anilist_platform.NewAnilistPlatform(anilistClient, logger)
metadataProvider := metadata.GetMockProvider(t)
tests := []struct {
name string
mediaId int // The media ID of the season
filepaths []string // All filepaths from all seasons
expectedIndices []int // The indices of the selected files
}{
{
name: "Kakegurui xx",
filepaths: []string{
"Kakegurui [BD][1080p][HEVC 10bit x265][Dual Audio][Tenrai-Sensei]/Season 1/Kakegurui - S01E01 - The Woman Called Yumeko Jabami.mkv", // should be selected
"Kakegurui [BD][1080p][HEVC 10bit x265][Dual Audio][Tenrai-Sensei]/Season 2/Kakegurui xx - S02E01 - The Woman Called Yumeko Jabami.mkv",
},
mediaId: 98314,
expectedIndices: []int{0},
},
{
name: "Kimi ni Todoke Season 2",
filepaths: []string{
"[Judas] Kimi ni Todoke (Seasons 1-2) [BD 1080p][HEVC x265 10bit][Eng-Subs]/[Judas] Kimi ni Todoke S1/[Judas] Kimi ni Todoke - S01E01.mkv",
"[Judas] Kimi ni Todoke (Seasons 1-2) [BD 1080p][HEVC x265 10bit][Eng-Subs]/[Judas] Kimi ni Todoke S1/[Judas] Kimi ni Todoke - S01E02.mkv",
"[Judas] Kimi ni Todoke (Seasons 1-2) [BD 1080p][HEVC x265 10bit][Eng-Subs]/[Judas] Kimi ni Todoke S2/[Judas] Kimi ni Todoke - S02E01.mkv", // should be selected
"[Judas] Kimi ni Todoke (Seasons 1-2) [BD 1080p][HEVC x265 10bit][Eng-Subs]/[Judas] Kimi ni Todoke S2/[Judas] Kimi ni Todoke - S02E02.mkv", // should be selected
},
mediaId: 9656,
expectedIndices: []int{2, 3},
},
{
name: "Spy x Family Part 2",
filepaths: []string{
"[SubsPlease] Spy x Family (01-25) (1080p) [Batch]/[SubsPlease] Spy x Family - 10v2 (1080p) [F9F5C62B].mkv",
"[SubsPlease] Spy x Family (01-25) (1080p) [Batch]/[SubsPlease] Spy x Family - 11v2 (1080p) [F9F5C62B].mkv",
"[SubsPlease] Spy x Family (01-25) (1080p) [Batch]/[SubsPlease] Spy x Family - 12v2 (1080p) [F9F5C62B].mkv",
"[SubsPlease] Spy x Family (01-25) (1080p) [Batch]/[SubsPlease] Spy x Family - 13v2 (1080p) [F9F5C62B].mkv", // should be selected
"[SubsPlease] Spy x Family (01-25) (1080p) [Batch]/[SubsPlease] Spy x Family - 14v2 (1080p) [F9F5C62B].mkv", // should be selected
"[SubsPlease] Spy x Family (01-25) (1080p) [Batch]/[SubsPlease] Spy x Family - 15v2 (1080p) [F9F5C62B].mkv", // should be selected
},
mediaId: 142838,
expectedIndices: []int{3, 4, 5},
},
{
name: "Mushoku Tensei: Jobless Reincarnation Season 2 Part 2",
filepaths: []string{
"[EMBER] Mushoku Tensei S2 - 13.mkv", // should be selected
"[EMBER] Mushoku Tensei S2 - 14.mkv", // should be selected
"[EMBER] Mushoku Tensei S2 - 15.mkv", // should be selected
"[EMBER] Mushoku Tensei S2 - 16.mkv", // should be selected
},
mediaId: 166873,
expectedIndices: []int{0, 1, 2, 3},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Get media
media, err := anilistPlatform.GetAnimeWithRelations(t.Context(), tt.mediaId)
if err != nil {
t.Fatal("expected result, got error:", err.Error())
}
analyzer := NewAnalyzer(&NewAnalyzerOptions{
Logger: logger,
Filepaths: tt.filepaths,
Media: media,
Platform: anilistPlatform,
MetadataProvider: metadataProvider,
ForceMatch: false,
})
// AnalyzeTorrentFiles
analysis, err := analyzer.AnalyzeTorrentFiles()
if assert.NoError(t, err) {
selectedFilesMap := analysis.GetCorrespondingMainFiles()
selectedIndices := analysis.GetIndices(selectedFilesMap)
// Check selected files
assert.ElementsMatch(t, tt.expectedIndices, selectedIndices)
}
})
}
}