Data layer restructuring (#997)

* Move query builders to sqlite package
* Add transaction system
* Wrap model resolvers in transaction
* Add error return value for StringSliceToIntSlice
* Update/refactor mutation resolvers
* Convert query builders
* Remove unused join types
* Add stash id unit tests
* Use WAL journal mode
This commit is contained in:
WithoutPants
2021-01-18 12:23:20 +11:00
committed by GitHub
parent 7bae990c67
commit 1e04deb3d4
168 changed files with 12683 additions and 10863 deletions

View File

@@ -7,7 +7,6 @@ import (
"github.com/stashapp/stash/pkg/manager/jsonschema"
"github.com/stashapp/stash/pkg/models"
"github.com/stashapp/stash/pkg/models/mocks"
"github.com/stashapp/stash/pkg/models/modelstest"
"github.com/stretchr/testify/assert"
"testing"
@@ -92,33 +91,33 @@ var updateTime time.Time = time.Date(2002, 01, 01, 0, 0, 0, 0, time.UTC)
func createFullScene(id int) models.Scene {
return models.Scene{
ID: id,
Title: modelstest.NullString(title),
AudioCodec: modelstest.NullString(audioCodec),
Bitrate: modelstest.NullInt64(bitrate),
Checksum: modelstest.NullString(checksum),
Title: models.NullString(title),
AudioCodec: models.NullString(audioCodec),
Bitrate: models.NullInt64(bitrate),
Checksum: models.NullString(checksum),
Date: models.SQLiteDate{
String: date,
Valid: true,
},
Details: modelstest.NullString(details),
Details: models.NullString(details),
Duration: sql.NullFloat64{
Float64: duration,
Valid: true,
},
Format: modelstest.NullString(format),
Format: models.NullString(format),
Framerate: sql.NullFloat64{
Float64: framerate,
Valid: true,
},
Height: modelstest.NullInt64(height),
Height: models.NullInt64(height),
OCounter: ocounter,
OSHash: modelstest.NullString(oshash),
Rating: modelstest.NullInt64(rating),
OSHash: models.NullString(oshash),
Rating: models.NullInt64(rating),
Organized: organized,
Size: modelstest.NullString(size),
VideoCodec: modelstest.NullString(videoCodec),
Width: modelstest.NullInt64(width),
URL: modelstest.NullString(url),
Size: models.NullString(size),
VideoCodec: models.NullString(videoCodec),
Width: models.NullInt64(width),
URL: models.NullString(url),
CreatedAt: models.SQLiteTimestamp{
Timestamp: createTime,
},
@@ -213,9 +212,9 @@ func TestToJSON(t *testing.T) {
imageErr := errors.New("error getting image")
mockSceneReader.On("GetSceneCover", sceneID).Return(imageBytes, nil).Once()
mockSceneReader.On("GetSceneCover", noImageID).Return(nil, nil).Once()
mockSceneReader.On("GetSceneCover", errImageID).Return(nil, imageErr).Once()
mockSceneReader.On("GetCover", sceneID).Return(imageBytes, nil).Once()
mockSceneReader.On("GetCover", noImageID).Return(nil, nil).Once()
mockSceneReader.On("GetCover", errImageID).Return(nil, imageErr).Once()
for i, s := range scenarios {
scene := s.input
@@ -235,7 +234,7 @@ func TestToJSON(t *testing.T) {
func createStudioScene(studioID int) models.Scene {
return models.Scene{
StudioID: modelstest.NullInt64(int64(studioID)),
StudioID: models.NullInt64(int64(studioID)),
}
}
@@ -269,7 +268,7 @@ func TestGetStudioName(t *testing.T) {
studioErr := errors.New("error getting image")
mockStudioReader.On("Find", studioID).Return(&models.Studio{
Name: modelstest.NullString(studioName),
Name: models.NullString(studioName),
}, nil).Once()
mockStudioReader.On("Find", missingStudioID).Return(nil, nil).Once()
mockStudioReader.On("Find", errStudioID).Return(nil, studioErr).Once()
@@ -436,44 +435,44 @@ var getSceneMoviesJSONScenarios = []sceneMoviesTestScenario{
var validMovies = []models.MoviesScenes{
{
MovieID: validMovie1,
SceneIndex: modelstest.NullInt64(movie1Scene),
SceneIndex: models.NullInt64(movie1Scene),
},
{
MovieID: validMovie2,
SceneIndex: modelstest.NullInt64(movie2Scene),
SceneIndex: models.NullInt64(movie2Scene),
},
}
var invalidMovies = []models.MoviesScenes{
{
MovieID: invalidMovie,
SceneIndex: modelstest.NullInt64(movie1Scene),
SceneIndex: models.NullInt64(movie1Scene),
},
}
func TestGetSceneMoviesJSON(t *testing.T) {
mockMovieReader := &mocks.MovieReaderWriter{}
mockJoinReader := &mocks.JoinReaderWriter{}
mockSceneReader := &mocks.SceneReaderWriter{}
joinErr := errors.New("error getting scene movies")
movieErr := errors.New("error getting movie")
mockJoinReader.On("GetSceneMovies", sceneID).Return(validMovies, nil).Once()
mockJoinReader.On("GetSceneMovies", noMoviesID).Return(nil, nil).Once()
mockJoinReader.On("GetSceneMovies", errMoviesID).Return(nil, joinErr).Once()
mockJoinReader.On("GetSceneMovies", errFindMovieID).Return(invalidMovies, nil).Once()
mockSceneReader.On("GetMovies", sceneID).Return(validMovies, nil).Once()
mockSceneReader.On("GetMovies", noMoviesID).Return(nil, nil).Once()
mockSceneReader.On("GetMovies", errMoviesID).Return(nil, joinErr).Once()
mockSceneReader.On("GetMovies", errFindMovieID).Return(invalidMovies, nil).Once()
mockMovieReader.On("Find", validMovie1).Return(&models.Movie{
Name: modelstest.NullString(movie1Name),
Name: models.NullString(movie1Name),
}, nil).Once()
mockMovieReader.On("Find", validMovie2).Return(&models.Movie{
Name: modelstest.NullString(movie2Name),
Name: models.NullString(movie2Name),
}, nil).Once()
mockMovieReader.On("Find", invalidMovie).Return(nil, movieErr).Once()
for i, s := range getSceneMoviesJSONScenarios {
scene := s.input
json, err := GetSceneMoviesJSON(mockMovieReader, mockJoinReader, &scene)
json, err := GetSceneMoviesJSON(mockMovieReader, mockSceneReader, &scene)
if !s.err && err != nil {
t.Errorf("[%d] unexpected error: %s", i, err.Error())