Multiple scene URLs (#3852)

* Add URLs scene relationship
* Update unit tests
* Update scene edit and details pages
* Update scrapers to use urls
* Post-process scenes during query scrape
* Update UI for URLs
* Change urls label
This commit is contained in:
WithoutPants
2023-07-12 11:51:52 +10:00
committed by GitHub
parent 76a4bfa49a
commit 67d4f9729a
50 changed files with 978 additions and 205 deletions

View File

@@ -11,6 +11,7 @@ import (
"github.com/stashapp/stash/pkg/models/mocks"
"github.com/stashapp/stash/pkg/scraper"
"github.com/stashapp/stash/pkg/sliceutil/intslice"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)
@@ -108,8 +109,7 @@ func TestSceneIdentifier_Identify(t *testing.T) {
}
mockSceneReaderWriter := &mocks.SceneReaderWriter{}
mockTagFinderCreator := &mocks.TagReaderWriter{}
mockSceneReaderWriter.On("GetURLs", mock.Anything, mock.Anything).Return(nil, nil)
mockSceneReaderWriter.On("UpdatePartial", mock.Anything, mock.MatchedBy(func(id int) bool {
return id == errUpdateID
}), mock.Anything).Return(nil, errors.New("update error"))
@@ -117,6 +117,7 @@ func TestSceneIdentifier_Identify(t *testing.T) {
return id != errUpdateID
}), mock.Anything).Return(nil, nil)
mockTagFinderCreator := &mocks.TagReaderWriter{}
mockTagFinderCreator.On("Find", mock.Anything, skipMultipleTagID).Return(&models.Tag{
ID: skipMultipleTagID,
Name: skipMultipleTagIDStr,
@@ -236,6 +237,7 @@ func TestSceneIdentifier_modifyScene(t *testing.T) {
"empty update",
args{
&models.Scene{
URLs: models.NewRelatedStrings([]string{}),
PerformerIDs: models.NewRelatedIDs([]int{}),
TagIDs: models.NewRelatedIDs([]int{}),
StashIDs: models.NewRelatedStashIDs([]models.StashID{}),
@@ -351,33 +353,44 @@ func Test_getScenePartial(t *testing.T) {
Title: originalTitle,
Date: &originalDateObj,
Details: originalDetails,
URL: originalURL,
URLs: models.NewRelatedStrings([]string{originalURL}),
}
organisedScene := *originalScene
organisedScene.Organized = true
emptyScene := &models.Scene{}
emptyScene := &models.Scene{
URLs: models.NewRelatedStrings([]string{}),
}
postPartial := models.ScenePartial{
Title: models.NewOptionalString(scrapedTitle),
Date: models.NewOptionalDate(scrapedDateObj),
Details: models.NewOptionalString(scrapedDetails),
URL: models.NewOptionalString(scrapedURL),
URLs: &models.UpdateStrings{
Values: []string{scrapedURL},
Mode: models.RelationshipUpdateModeSet,
},
}
postPartialMerge := postPartial
postPartialMerge.URLs = &models.UpdateStrings{
Values: []string{scrapedURL},
Mode: models.RelationshipUpdateModeSet,
}
scrapedScene := &scraper.ScrapedScene{
Title: &scrapedTitle,
Date: &scrapedDate,
Details: &scrapedDetails,
URL: &scrapedURL,
URLs: []string{scrapedURL},
}
scrapedUnchangedScene := &scraper.ScrapedScene{
Title: &originalTitle,
Date: &originalDate,
Details: &originalDetails,
URL: &originalURL,
URLs: []string{originalURL},
}
makeFieldOptions := func(input *FieldOptions) map[string]*FieldOptions {
@@ -440,7 +453,12 @@ func Test_getScenePartial(t *testing.T) {
mergeAll,
false,
},
models.ScenePartial{},
models.ScenePartial{
URLs: &models.UpdateStrings{
Values: []string{originalURL, scrapedURL},
Mode: models.RelationshipUpdateModeSet,
},
},
},
{
"merge (empty values)",
@@ -450,7 +468,7 @@ func Test_getScenePartial(t *testing.T) {
mergeAll,
false,
},
postPartial,
postPartialMerge,
},
{
"unchanged",
@@ -487,9 +505,9 @@ func Test_getScenePartial(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := getScenePartial(tt.args.scene, tt.args.scraped, tt.args.fieldOptions, tt.args.setOrganized); !reflect.DeepEqual(got, tt.want) {
t.Errorf("getScenePartial() = %v, want %v", got, tt.want)
}
got := getScenePartial(tt.args.scene, tt.args.scraped, tt.args.fieldOptions, tt.args.setOrganized)
assert.Equal(t, tt.want, got)
})
}
}