mirror of
https://github.com/stashapp/stash.git
synced 2025-12-18 04:44:37 +03:00
Identify: Options to skip multiple results and single name performers (#3707)
Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"testing"
|
||||
|
||||
"github.com/stashapp/stash/pkg/models"
|
||||
@@ -17,10 +18,10 @@ var testCtx = context.Background()
|
||||
|
||||
type mockSceneScraper struct {
|
||||
errIDs []int
|
||||
results map[int]*scraper.ScrapedScene
|
||||
results map[int][]*scraper.ScrapedScene
|
||||
}
|
||||
|
||||
func (s mockSceneScraper) ScrapeScene(ctx context.Context, sceneID int) (*scraper.ScrapedScene, error) {
|
||||
func (s mockSceneScraper) ScrapeScenes(ctx context.Context, sceneID int) ([]*scraper.ScrapedScene, error) {
|
||||
if intslice.IntInclude(s.errIDs, sceneID) {
|
||||
return nil, errors.New("scrape scene error")
|
||||
}
|
||||
@@ -40,32 +41,66 @@ func TestSceneIdentifier_Identify(t *testing.T) {
|
||||
missingID
|
||||
found1ID
|
||||
found2ID
|
||||
multiFoundID
|
||||
multiFound2ID
|
||||
errUpdateID
|
||||
)
|
||||
|
||||
var scrapedTitle = "scrapedTitle"
|
||||
var (
|
||||
skipMultipleTagID = 1
|
||||
skipMultipleTagIDStr = strconv.Itoa(skipMultipleTagID)
|
||||
)
|
||||
|
||||
defaultOptions := &MetadataOptions{}
|
||||
var (
|
||||
scrapedTitle = "scrapedTitle"
|
||||
scrapedTitle2 = "scrapedTitle2"
|
||||
|
||||
boolFalse = false
|
||||
boolTrue = true
|
||||
)
|
||||
|
||||
defaultOptions := &MetadataOptions{
|
||||
SetOrganized: &boolFalse,
|
||||
SetCoverImage: &boolFalse,
|
||||
IncludeMalePerformers: &boolFalse,
|
||||
SkipSingleNamePerformers: &boolFalse,
|
||||
}
|
||||
sources := []ScraperSource{
|
||||
{
|
||||
Scraper: mockSceneScraper{
|
||||
errIDs: []int{errID1},
|
||||
results: map[int]*scraper.ScrapedScene{
|
||||
found1ID: {
|
||||
results: map[int][]*scraper.ScrapedScene{
|
||||
found1ID: {{
|
||||
Title: &scrapedTitle,
|
||||
},
|
||||
}},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Scraper: mockSceneScraper{
|
||||
errIDs: []int{errID2},
|
||||
results: map[int]*scraper.ScrapedScene{
|
||||
found2ID: {
|
||||
results: map[int][]*scraper.ScrapedScene{
|
||||
found2ID: {{
|
||||
Title: &scrapedTitle,
|
||||
}},
|
||||
errUpdateID: {{
|
||||
Title: &scrapedTitle,
|
||||
}},
|
||||
multiFoundID: {
|
||||
{
|
||||
Title: &scrapedTitle,
|
||||
},
|
||||
{
|
||||
Title: &scrapedTitle2,
|
||||
},
|
||||
},
|
||||
errUpdateID: {
|
||||
Title: &scrapedTitle,
|
||||
multiFound2ID: {
|
||||
{
|
||||
Title: &scrapedTitle,
|
||||
},
|
||||
{
|
||||
Title: &scrapedTitle2,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -73,6 +108,7 @@ func TestSceneIdentifier_Identify(t *testing.T) {
|
||||
}
|
||||
|
||||
mockSceneReaderWriter := &mocks.SceneReaderWriter{}
|
||||
mockTagFinderCreator := &mocks.TagReaderWriter{}
|
||||
|
||||
mockSceneReaderWriter.On("UpdatePartial", mock.Anything, mock.MatchedBy(func(id int) bool {
|
||||
return id == errUpdateID
|
||||
@@ -81,52 +117,84 @@ func TestSceneIdentifier_Identify(t *testing.T) {
|
||||
return id != errUpdateID
|
||||
}), mock.Anything).Return(nil, nil)
|
||||
|
||||
mockTagFinderCreator.On("Find", mock.Anything, skipMultipleTagID).Return(&models.Tag{
|
||||
ID: skipMultipleTagID,
|
||||
Name: skipMultipleTagIDStr,
|
||||
}, nil)
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
sceneID int
|
||||
options *MetadataOptions
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
"error scraping",
|
||||
errID1,
|
||||
nil,
|
||||
false,
|
||||
},
|
||||
{
|
||||
"error scraping from second",
|
||||
errID2,
|
||||
nil,
|
||||
false,
|
||||
},
|
||||
{
|
||||
"found in first scraper",
|
||||
found1ID,
|
||||
nil,
|
||||
false,
|
||||
},
|
||||
{
|
||||
"found in second scraper",
|
||||
found2ID,
|
||||
nil,
|
||||
false,
|
||||
},
|
||||
{
|
||||
"not found",
|
||||
missingID,
|
||||
nil,
|
||||
false,
|
||||
},
|
||||
{
|
||||
"error modifying",
|
||||
errUpdateID,
|
||||
nil,
|
||||
true,
|
||||
},
|
||||
}
|
||||
|
||||
identifier := SceneIdentifier{
|
||||
SceneReaderUpdater: mockSceneReaderWriter,
|
||||
DefaultOptions: defaultOptions,
|
||||
Sources: sources,
|
||||
SceneUpdatePostHookExecutor: mockHookExecutor{},
|
||||
{
|
||||
"multiple found",
|
||||
multiFoundID,
|
||||
nil,
|
||||
false,
|
||||
},
|
||||
{
|
||||
"multiple found - set tag",
|
||||
multiFound2ID,
|
||||
&MetadataOptions{
|
||||
SkipMultipleMatches: &boolTrue,
|
||||
SkipMultipleMatchTag: &skipMultipleTagIDStr,
|
||||
},
|
||||
false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
identifier := SceneIdentifier{
|
||||
SceneReaderUpdater: mockSceneReaderWriter,
|
||||
TagCreatorFinder: mockTagFinderCreator,
|
||||
DefaultOptions: defaultOptions,
|
||||
Sources: sources,
|
||||
SceneUpdatePostHookExecutor: mockHookExecutor{},
|
||||
}
|
||||
|
||||
if tt.options != nil {
|
||||
identifier.DefaultOptions = tt.options
|
||||
}
|
||||
|
||||
scene := &models.Scene{
|
||||
ID: tt.sceneID,
|
||||
PerformerIDs: models.NewRelatedIDs([]int{}),
|
||||
@@ -144,7 +212,16 @@ func TestSceneIdentifier_modifyScene(t *testing.T) {
|
||||
repo := models.Repository{
|
||||
TxnManager: &mocks.TxnManager{},
|
||||
}
|
||||
tr := &SceneIdentifier{}
|
||||
boolFalse := false
|
||||
defaultOptions := &MetadataOptions{
|
||||
SetOrganized: &boolFalse,
|
||||
SetCoverImage: &boolFalse,
|
||||
IncludeMalePerformers: &boolFalse,
|
||||
SkipSingleNamePerformers: &boolFalse,
|
||||
}
|
||||
tr := &SceneIdentifier{
|
||||
DefaultOptions: defaultOptions,
|
||||
}
|
||||
|
||||
type args struct {
|
||||
scene *models.Scene
|
||||
@@ -165,6 +242,9 @@ func TestSceneIdentifier_modifyScene(t *testing.T) {
|
||||
},
|
||||
&scrapeResult{
|
||||
result: &scraper.ScrapedScene{},
|
||||
source: ScraperSource{
|
||||
Options: defaultOptions,
|
||||
},
|
||||
},
|
||||
},
|
||||
false,
|
||||
|
||||
Reference in New Issue
Block a user