mirror of
https://github.com/idanoo/autobrr
synced 2025-07-22 08:19:12 +00:00

* chore: update copyright year in license headers * Revert "chore: update copyright year in license headers" This reverts commit 3e58129c431b9a491089ce36b908f9bb6ba38ed3. * chore: update copyright year in license headers * fix: sort go imports * fix: add missing license headers
481 lines
13 KiB
Go
481 lines
13 KiB
Go
// Copyright (c) 2021 - 2025, Ludvig Lundgren and the autobrr contributors.
|
||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||
|
||
package domain
|
||
|
||
import (
|
||
"testing"
|
||
|
||
"github.com/stretchr/testify/assert"
|
||
)
|
||
|
||
func TestIndexerIRCParseMatch_ParseUrls(t *testing.T) {
|
||
t.Parallel()
|
||
type fields struct {
|
||
TorrentURL string
|
||
TorrentName string
|
||
InfoURL string
|
||
Encode []string
|
||
}
|
||
type args struct {
|
||
baseURL string
|
||
vars map[string]string
|
||
rls *Release
|
||
}
|
||
tests := []struct {
|
||
name string
|
||
fields fields
|
||
args args
|
||
want *Release
|
||
}{
|
||
{
|
||
name: "",
|
||
fields: fields{
|
||
TorrentURL: "rss/download/{{ .torrentId }}/{{ .rsskey }}/{{ .torrentName }}.torrent",
|
||
Encode: []string{"torrentName"},
|
||
},
|
||
args: args{
|
||
baseURL: "https://mock.local/",
|
||
vars: map[string]string{
|
||
"category": "TV :: Episodes HD",
|
||
"torrentName": "The Show 2019 S03E08 2160p DV WEBRip 6CH x265 HEVC-GROUP",
|
||
"uploader": "Anonymous",
|
||
"freeleech": "",
|
||
"baseUrl": "https://mock.local/",
|
||
"torrentId": "240860011",
|
||
"rsskey": "00000000000000000000",
|
||
},
|
||
rls: &Release{},
|
||
},
|
||
want: &Release{
|
||
DownloadURL: "https://mock.local/rss/download/240860011/00000000000000000000/The+Show+2019+S03E08+2160p+DV+WEBRip+6CH+x265+HEVC-GROUP.torrent",
|
||
},
|
||
},
|
||
{
|
||
name: "",
|
||
fields: fields{
|
||
TorrentURL: "/torrent/{{ .torrentId }}/download/{{ .passkey }}",
|
||
Encode: nil,
|
||
},
|
||
args: args{
|
||
baseURL: "https://mock.local/",
|
||
vars: map[string]string{
|
||
"torrentName": "Great BluRay SoftSubbed Anime",
|
||
"category": "TV Series",
|
||
"year": "2020",
|
||
"releaseTags": "Blu-ray / MKV / h264 10-bit / 1080p / FLAC 2.0 / Dual Audio / Softsubs (Sub Group) / Freeleech",
|
||
"releaseGroup": "Softsubs",
|
||
"releaseEpisode": "",
|
||
"freeleech": "freeleech",
|
||
"baseUrl": "https://mock.local",
|
||
"torrentId": "240860011",
|
||
"tags": "comedy, drama, school.life, sports",
|
||
"uploader": "Uploader",
|
||
"passkey": "00000000000000000000",
|
||
},
|
||
rls: &Release{},
|
||
},
|
||
want: &Release{
|
||
DownloadURL: "https://mock.local/torrent/240860011/download/00000000000000000000",
|
||
},
|
||
},
|
||
{
|
||
name: "",
|
||
fields: fields{
|
||
TorrentURL: "{{ .baseUrl }}rss/download/{{ .torrentId }}/{{ .rsskey }}/{{ .torrentName }}.torrent",
|
||
Encode: []string{"torrentName"},
|
||
},
|
||
args: args{
|
||
baseURL: "https://mock.local/",
|
||
vars: map[string]string{
|
||
"category": "TV :: Episodes HD",
|
||
"torrentName": "The Show 2019 S03E08 2160p DV WEBRip 6CH x265 HEVC-GROUP",
|
||
"uploader": "Anonymous",
|
||
"freeleech": "",
|
||
"baseUrl": "https://mock.local/",
|
||
"torrentId": "240860011",
|
||
"rsskey": "00000000000000000000",
|
||
},
|
||
rls: &Release{},
|
||
},
|
||
want: &Release{
|
||
DownloadURL: "https://mock.local/rss/download/240860011/00000000000000000000/The+Show+2019+S03E08+2160p+DV+WEBRip+6CH+x265+HEVC-GROUP.torrent",
|
||
},
|
||
},
|
||
{
|
||
name: "",
|
||
fields: fields{
|
||
TorrentURL: "https://mock.local/rss/download/{{ .torrentId }}/{{ .rsskey }}/{{ .torrentName }}.torrent",
|
||
Encode: []string{"torrentName"},
|
||
},
|
||
args: args{
|
||
baseURL: "https://mock.local/",
|
||
vars: map[string]string{
|
||
"category": "TV :: Episodes HD",
|
||
"torrentName": "The Show 2019 S03E08 2160p DV WEBRip 6CH x265 HEVC-GROUP",
|
||
"uploader": "Anonymous",
|
||
"freeleech": "",
|
||
"baseUrl": "https://mock.local/",
|
||
"torrentId": "240860011",
|
||
"rsskey": "00000000000000000000",
|
||
},
|
||
rls: &Release{},
|
||
},
|
||
want: &Release{
|
||
DownloadURL: "https://mock.local/rss/download/240860011/00000000000000000000/The+Show+2019+S03E08+2160p+DV+WEBRip+6CH+x265+HEVC-GROUP.torrent",
|
||
},
|
||
},
|
||
{
|
||
name: "",
|
||
fields: fields{
|
||
TorrentURL: "/rss/?action=download&key={{ .key }}&token={{ .token }}&hash={{ .torrentId }}&title={{ .torrentName }}",
|
||
Encode: []string{"torrentName"},
|
||
},
|
||
args: args{
|
||
baseURL: "https://mock.local/",
|
||
vars: map[string]string{
|
||
"category": "Movies/Remux",
|
||
"torrentName": "The Show 2019 S03E08 2160p DV WEBRip 6CH x265 HEVC-GROUP",
|
||
"uploader": "Anonymous",
|
||
"torrentSize": "",
|
||
"baseUrl": "https://mock.local/",
|
||
"torrentId": "240860011",
|
||
"key": "KEY",
|
||
"token": "TOKEN",
|
||
"rsskey": "00000000000000000000",
|
||
},
|
||
rls: &Release{},
|
||
},
|
||
want: &Release{
|
||
DownloadURL: "https://mock.local/rss/?action=download&key=KEY&token=TOKEN&hash=240860011&title=The+Show+2019+S03E08+2160p+DV+WEBRip+6CH+x265+HEVC-GROUP",
|
||
},
|
||
},
|
||
}
|
||
for _, tt := range tests {
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
p := &IndexerIRCParseMatch{
|
||
TorrentURL: tt.fields.TorrentURL,
|
||
TorrentName: tt.fields.TorrentName,
|
||
InfoURL: tt.fields.InfoURL,
|
||
Encode: tt.fields.Encode,
|
||
}
|
||
p.ParseURLs(tt.args.baseURL, tt.args.vars, tt.args.rls)
|
||
assert.Equal(t, tt.want, tt.args.rls)
|
||
})
|
||
}
|
||
}
|
||
|
||
func TestIndexerIRCParseMatch_ParseTorrentName(t *testing.T) {
|
||
t.Parallel()
|
||
type fields struct {
|
||
TorrentURL string
|
||
TorrentName string
|
||
InfoURL string
|
||
Encode []string
|
||
}
|
||
type args struct {
|
||
vars map[string]string
|
||
rls *Release
|
||
}
|
||
tests := []struct {
|
||
name string
|
||
fields fields
|
||
args args
|
||
want *Release
|
||
}{
|
||
{
|
||
name: "",
|
||
fields: fields{
|
||
TorrentName: "",
|
||
},
|
||
args: args{
|
||
vars: map[string]string{
|
||
"torrentName": "The Show 2019 S03E08 2160p DV WEBRip 6CH x265 HEVC-GROUP",
|
||
},
|
||
rls: &Release{},
|
||
},
|
||
want: &Release{
|
||
TorrentName: "",
|
||
},
|
||
},
|
||
{
|
||
name: "",
|
||
fields: fields{
|
||
TorrentName: `{{ if .releaseGroup }}[{{ .releaseGroup }}] {{ end }}{{ .torrentName }} [{{ .year }}] {{ if .releaseEpisode }}{{ printf "- %02s " .releaseEpisode }}{{ end }}{{ print "[" .releaseTags "]" | replace " / " "][" }}`,
|
||
},
|
||
args: args{
|
||
vars: map[string]string{
|
||
"torrentName": "Great BluRay SoftSubbed Anime",
|
||
"category": "TV Series",
|
||
"year": "2020",
|
||
"releaseTags": "Blu-ray / MKV / h264 10-bit / 1080p / FLAC 2.0 / Dual Audio / Softsubs (Sub Group) / Freeleech",
|
||
"releaseGroup": "Softsubs",
|
||
"releaseEpisode": "",
|
||
"freeleech": "freeleech",
|
||
"baseUrl": "https://mock.local",
|
||
"torrentId": "240860011",
|
||
"tags": "comedy, drama, school.life, sports",
|
||
"uploader": "Uploader",
|
||
"passkey": "00000000000000000000",
|
||
},
|
||
rls: &Release{},
|
||
},
|
||
want: &Release{
|
||
TorrentName: "[Softsubs] Great BluRay SoftSubbed Anime [2020] [Blu-ray][MKV][h264 10-bit][1080p][FLAC 2.0][Dual Audio][Softsubs (Sub Group)][Freeleech]",
|
||
},
|
||
},
|
||
}
|
||
for _, tt := range tests {
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
p := &IndexerIRCParseMatch{
|
||
TorrentURL: tt.fields.TorrentURL,
|
||
TorrentName: tt.fields.TorrentName,
|
||
InfoURL: tt.fields.InfoURL,
|
||
Encode: tt.fields.Encode,
|
||
}
|
||
p.ParseTorrentName(tt.args.vars, tt.args.rls)
|
||
assert.Equal(t, tt.want, tt.args.rls)
|
||
})
|
||
}
|
||
}
|
||
|
||
func TestIRCParserGazelleGames_Parse(t *testing.T) {
|
||
t.Parallel()
|
||
type args struct {
|
||
rls *Release
|
||
vars map[string]string
|
||
}
|
||
type want struct {
|
||
title string
|
||
release string
|
||
}
|
||
tests := []struct {
|
||
name string
|
||
args args
|
||
want want
|
||
}{
|
||
{
|
||
name: "",
|
||
args: args{
|
||
rls: NewRelease(IndexerMinimal{0, "GazelleGames", "ggn", "GazelleGames"}),
|
||
vars: map[string]string{
|
||
"torrentName": "Trouble.in.Paradise-GROUP in Trouble in Paradise",
|
||
},
|
||
},
|
||
want: want{
|
||
title: "Trouble in Paradise",
|
||
release: "Trouble.in.Paradise-GROUP",
|
||
},
|
||
},
|
||
{
|
||
name: "",
|
||
args: args{
|
||
rls: NewRelease(IndexerMinimal{0, "GazelleGames", "ggn", "GazelleGames"}),
|
||
vars: map[string]string{
|
||
"torrentName": "F.I.L.F. Game Walkthrough v.0.18 in F.I.L.F.",
|
||
},
|
||
},
|
||
want: want{
|
||
title: "F.I.L.F.",
|
||
release: "F.I.L.F. Game Walkthrough v.0.18",
|
||
},
|
||
},
|
||
{
|
||
name: "",
|
||
args: args{
|
||
rls: NewRelease(IndexerMinimal{0, "GazelleGames", "ggn", "GazelleGames"}),
|
||
vars: map[string]string{
|
||
"torrentName": "Ni no Kuni: Dominion of the Dark Djinn in Ni no Kuni: Dominion of the Dark Djinn",
|
||
},
|
||
},
|
||
want: want{
|
||
title: "Ni no Kuni: Dominion of the Dark Djinn",
|
||
release: "Ni no Kuni: Dominion of the Dark Djinn",
|
||
},
|
||
},
|
||
{
|
||
name: "",
|
||
args: args{
|
||
rls: NewRelease(IndexerMinimal{0, "GazelleGames", "ggn", "GazelleGames"}),
|
||
vars: map[string]string{
|
||
"torrentName": "Year 2 Remastered by Insaneintherainmusic",
|
||
"category": "OST",
|
||
},
|
||
},
|
||
want: want{
|
||
title: "Year 2 Remastered by Insaneintherainmusic",
|
||
release: "Year 2 Remastered by Insaneintherainmusic",
|
||
},
|
||
},
|
||
}
|
||
for _, tt := range tests {
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
p := IRCParserGazelleGames{}
|
||
p.Parse(tt.args.rls, tt.args.vars)
|
||
assert.Equal(t, tt.want.release, tt.args.rls.TorrentName)
|
||
assert.Equal(t, tt.want.title, tt.args.rls.Title)
|
||
})
|
||
}
|
||
}
|
||
|
||
func TestIRCParserOrpheus_Parse(t *testing.T) {
|
||
t.Parallel()
|
||
type args struct {
|
||
rls *Release
|
||
vars map[string]string
|
||
}
|
||
type want struct {
|
||
title string
|
||
release string
|
||
}
|
||
tests := []struct {
|
||
name string
|
||
args args
|
||
want want
|
||
}{
|
||
{
|
||
name: "",
|
||
args: args{
|
||
rls: NewRelease(IndexerMinimal{0, "Orpheus", "ops", "Orpheus"}),
|
||
vars: map[string]string{
|
||
"torrentName": "Busta Rhymes – BEACH BALL (feat. BIA) – [2023] [Single] WEB/FLAC/24bit Lossless",
|
||
"title": "Busta Rhymes – BEACH BALL (feat. BIA)",
|
||
"year": "2023",
|
||
"releaseTags": "WEB/FLAC/24bit Lossless",
|
||
},
|
||
},
|
||
want: want{
|
||
title: "BEACH BALL",
|
||
release: "Busta Rhymes - BEACH BALL (feat. BIA) [2023] (WEB FLAC 24BIT Lossless)",
|
||
},
|
||
},
|
||
{
|
||
name: "",
|
||
args: args{
|
||
rls: NewRelease(IndexerMinimal{0, "Orpheus", "ops", "Orpheus"}),
|
||
vars: map[string]string{
|
||
"torrentName": "Busta Rhymes – BEACH BALL (feat. BIA) – [2023] [Single] CD/FLAC/Lossless",
|
||
"title": "Busta Rhymes – BEACH BALL (feat. BIA)",
|
||
"year": "2023",
|
||
"releaseTags": "CD/FLAC/Lossless",
|
||
},
|
||
},
|
||
want: want{
|
||
title: "BEACH BALL",
|
||
release: "Busta Rhymes - BEACH BALL (feat. BIA) [2023] (CD FLAC Lossless)",
|
||
},
|
||
},
|
||
}
|
||
for _, tt := range tests {
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
p := IRCParserOrpheus{}
|
||
p.Parse(tt.args.rls, tt.args.vars)
|
||
assert.Equal(t, tt.want.release, tt.args.rls.TorrentName)
|
||
assert.Equal(t, tt.want.title, tt.args.rls.Title)
|
||
})
|
||
}
|
||
}
|
||
|
||
func TestIndexerIRCParse_MapCustomVariables1(t *testing.T) {
|
||
type fields struct {
|
||
Type string
|
||
ForceSizeUnit string
|
||
Lines []IndexerIRCParseLine
|
||
Match IndexerIRCParseMatch
|
||
Mappings map[string]map[string]map[string]string
|
||
}
|
||
type args struct {
|
||
vars map[string]string
|
||
expectVars map[string]string
|
||
}
|
||
tests := []struct {
|
||
name string
|
||
fields fields
|
||
args args
|
||
wantErr bool
|
||
}{
|
||
{
|
||
name: "",
|
||
fields: fields{
|
||
Mappings: map[string]map[string]map[string]string{
|
||
"announceType": {
|
||
"0": map[string]string{
|
||
"announceType": "NEW",
|
||
},
|
||
"1": map[string]string{
|
||
"announceType": "PROMO",
|
||
},
|
||
},
|
||
"categoryEnum": {
|
||
"0": map[string]string{
|
||
"category": "Feature Film",
|
||
},
|
||
"1": map[string]string{
|
||
"category": "Short Film",
|
||
},
|
||
"2": map[string]string{
|
||
"category": "Miniseries",
|
||
},
|
||
"3": map[string]string{
|
||
"category": "Stand-up Comedy",
|
||
},
|
||
"4": map[string]string{
|
||
"category": "Live Performance",
|
||
},
|
||
"5": map[string]string{
|
||
"category": "Movie Collection",
|
||
},
|
||
},
|
||
"freeleechEnum": {
|
||
"0": map[string]string{
|
||
"downloadVolumeFactor": "1.0",
|
||
"uploadVolumeFactor": "1.0",
|
||
},
|
||
"1": map[string]string{
|
||
"downloadVolumeFactor": "0",
|
||
"uploadVolumeFactor": "1.0",
|
||
},
|
||
"2": map[string]string{
|
||
"downloadVolumeFactor": "0.5",
|
||
"uploadVolumeFactor": "1.0",
|
||
},
|
||
"3": map[string]string{
|
||
"downloadVolumeFactor": "0",
|
||
"uploadVolumeFactor": "0",
|
||
},
|
||
},
|
||
},
|
||
},
|
||
args: args{
|
||
vars: map[string]string{
|
||
"announceType": "1",
|
||
"categoryEnum": "0",
|
||
"freeleechEnum": "1",
|
||
},
|
||
expectVars: map[string]string{
|
||
"announceType": "PROMO",
|
||
"category": "Feature Film",
|
||
"categoryEnum": "0",
|
||
"freeleechEnum": "1",
|
||
"downloadVolumeFactor": "0",
|
||
"uploadVolumeFactor": "1.0",
|
||
},
|
||
},
|
||
wantErr: false,
|
||
},
|
||
}
|
||
for _, tt := range tests {
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
p := &IndexerIRCParse{
|
||
Type: tt.fields.Type,
|
||
ForceSizeUnit: tt.fields.ForceSizeUnit,
|
||
Lines: tt.fields.Lines,
|
||
Match: tt.fields.Match,
|
||
Mappings: tt.fields.Mappings,
|
||
}
|
||
err := p.MapCustomVariables(tt.args.vars)
|
||
assert.NoError(t, err)
|
||
assert.Equal(t, tt.args.expectVars, tt.args.vars)
|
||
})
|
||
}
|
||
}
|