stash/pkg/models/querybuilder_movies_test.go

276 lines
7.0 KiB
Go

// +build integration
package models_test
import (
"context"
"database/sql"
"strconv"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stashapp/stash/pkg/database"
"github.com/stashapp/stash/pkg/models"
"github.com/stashapp/stash/pkg/utils"
)
func TestMovieFindBySceneID(t *testing.T) {
mqb := models.NewMovieQueryBuilder()
sceneID := sceneIDs[sceneIdxWithMovie]
movies, err := mqb.FindBySceneID(sceneID, nil)
if err != nil {
t.Fatalf("Error finding movie: %s", err.Error())
}
assert.Equal(t, 1, len(movies), "expect 1 movie")
movie := movies[0]
assert.Equal(t, getMovieStringValue(movieIdxWithScene, "Name"), movie.Name.String)
movies, err = mqb.FindBySceneID(0, nil)
if err != nil {
t.Fatalf("Error finding movie: %s", err.Error())
}
assert.Equal(t, 0, len(movies))
}
func TestMovieFindByName(t *testing.T) {
mqb := models.NewMovieQueryBuilder()
name := movieNames[movieIdxWithScene] // find a movie by name
movie, err := mqb.FindByName(name, nil, false)
if err != nil {
t.Fatalf("Error finding movies: %s", err.Error())
}
assert.Equal(t, movieNames[movieIdxWithScene], movie.Name.String)
name = movieNames[movieIdxWithDupName] // find a movie by name nocase
movie, err = mqb.FindByName(name, nil, true)
if err != nil {
t.Fatalf("Error finding movies: %s", err.Error())
}
// movieIdxWithDupName and movieIdxWithScene should have similar names ( only diff should be Name vs NaMe)
//movie.Name should match with movieIdxWithScene since its ID is before moveIdxWithDupName
assert.Equal(t, movieNames[movieIdxWithScene], movie.Name.String)
//movie.Name should match with movieIdxWithDupName if the check is not case sensitive
assert.Equal(t, strings.ToLower(movieNames[movieIdxWithDupName]), strings.ToLower(movie.Name.String))
}
func TestMovieFindByNames(t *testing.T) {
var names []string
mqb := models.NewMovieQueryBuilder()
names = append(names, movieNames[movieIdxWithScene]) // find movies by names
movies, err := mqb.FindByNames(names, nil, false)
if err != nil {
t.Fatalf("Error finding movies: %s", err.Error())
}
assert.Len(t, movies, 1)
assert.Equal(t, movieNames[movieIdxWithScene], movies[0].Name.String)
movies, err = mqb.FindByNames(names, nil, true) // find movies by names nocase
if err != nil {
t.Fatalf("Error finding movies: %s", err.Error())
}
assert.Len(t, movies, 2) // movieIdxWithScene and movieIdxWithDupName
assert.Equal(t, strings.ToLower(movieNames[movieIdxWithScene]), strings.ToLower(movies[0].Name.String))
assert.Equal(t, strings.ToLower(movieNames[movieIdxWithScene]), strings.ToLower(movies[1].Name.String))
}
func TestMovieQueryStudio(t *testing.T) {
mqb := models.NewMovieQueryBuilder()
studioCriterion := models.MultiCriterionInput{
Value: []string{
strconv.Itoa(studioIDs[studioIdxWithMovie]),
},
Modifier: models.CriterionModifierIncludes,
}
movieFilter := models.MovieFilterType{
Studios: &studioCriterion,
}
movies, _ := mqb.Query(&movieFilter, nil)
assert.Len(t, movies, 1)
// ensure id is correct
assert.Equal(t, movieIDs[movieIdxWithStudio], movies[0].ID)
studioCriterion = models.MultiCriterionInput{
Value: []string{
strconv.Itoa(studioIDs[studioIdxWithMovie]),
},
Modifier: models.CriterionModifierExcludes,
}
q := getMovieStringValue(movieIdxWithStudio, titleField)
findFilter := models.FindFilterType{
Q: &q,
}
movies, _ = mqb.Query(&movieFilter, &findFilter)
assert.Len(t, movies, 0)
}
func TestMovieUpdateMovieImages(t *testing.T) {
mqb := models.NewMovieQueryBuilder()
// create movie to test against
ctx := context.TODO()
tx := database.DB.MustBeginTx(ctx, nil)
const name = "TestMovieUpdateMovieImages"
movie := models.Movie{
Name: sql.NullString{String: name, Valid: true},
Checksum: utils.MD5FromString(name),
}
created, err := mqb.Create(movie, tx)
if err != nil {
tx.Rollback()
t.Fatalf("Error creating movie: %s", err.Error())
}
frontImage := []byte("frontImage")
backImage := []byte("backImage")
err = mqb.UpdateMovieImages(created.ID, frontImage, backImage, tx)
if err != nil {
tx.Rollback()
t.Fatalf("Error updating movie images: %s", err.Error())
}
if err := tx.Commit(); err != nil {
tx.Rollback()
t.Fatalf("Error committing: %s", err.Error())
}
// ensure images are set
storedFront, err := mqb.GetFrontImage(created.ID, nil)
if err != nil {
t.Fatalf("Error getting front image: %s", err.Error())
}
assert.Equal(t, storedFront, frontImage)
storedBack, err := mqb.GetBackImage(created.ID, nil)
if err != nil {
t.Fatalf("Error getting back image: %s", err.Error())
}
assert.Equal(t, storedBack, backImage)
// set front image only
newImage := []byte("newImage")
tx = database.DB.MustBeginTx(ctx, nil)
err = mqb.UpdateMovieImages(created.ID, newImage, nil, tx)
if err != nil {
tx.Rollback()
t.Fatalf("Error updating movie images: %s", err.Error())
}
storedFront, err = mqb.GetFrontImage(created.ID, tx)
if err != nil {
tx.Rollback()
t.Fatalf("Error getting front image: %s", err.Error())
}
assert.Equal(t, storedFront, newImage)
// back image should be nil
storedBack, err = mqb.GetBackImage(created.ID, tx)
if err != nil {
tx.Rollback()
t.Fatalf("Error getting back image: %s", err.Error())
}
assert.Nil(t, nil)
// set back image only
err = mqb.UpdateMovieImages(created.ID, nil, newImage, tx)
if err == nil {
tx.Rollback()
t.Fatalf("Expected error setting nil front image")
}
if err := tx.Commit(); err != nil {
tx.Rollback()
t.Fatalf("Error committing: %s", err.Error())
}
}
func TestMovieDestroyMovieImages(t *testing.T) {
mqb := models.NewMovieQueryBuilder()
// create movie to test against
ctx := context.TODO()
tx := database.DB.MustBeginTx(ctx, nil)
const name = "TestMovieDestroyMovieImages"
movie := models.Movie{
Name: sql.NullString{String: name, Valid: true},
Checksum: utils.MD5FromString(name),
}
created, err := mqb.Create(movie, tx)
if err != nil {
tx.Rollback()
t.Fatalf("Error creating movie: %s", err.Error())
}
frontImage := []byte("frontImage")
backImage := []byte("backImage")
err = mqb.UpdateMovieImages(created.ID, frontImage, backImage, tx)
if err != nil {
tx.Rollback()
t.Fatalf("Error updating movie images: %s", err.Error())
}
if err := tx.Commit(); err != nil {
tx.Rollback()
t.Fatalf("Error committing: %s", err.Error())
}
tx = database.DB.MustBeginTx(ctx, nil)
err = mqb.DestroyMovieImages(created.ID, tx)
if err != nil {
tx.Rollback()
t.Fatalf("Error destroying movie images: %s", err.Error())
}
if err := tx.Commit(); err != nil {
tx.Rollback()
t.Fatalf("Error committing: %s", err.Error())
}
// front image should be nil
storedFront, err := mqb.GetFrontImage(created.ID, nil)
if err != nil {
t.Fatalf("Error getting front image: %s", err.Error())
}
assert.Nil(t, storedFront)
// back image should be nil
storedBack, err := mqb.GetBackImage(created.ID, nil)
if err != nil {
t.Fatalf("Error getting back image: %s", err.Error())
}
assert.Nil(t, storedBack)
}
// TODO Update
// TODO Destroy
// TODO Find
// TODO Count
// TODO All
// TODO Query