107 lines
2.7 KiB
Go
107 lines
2.7 KiB
Go
package resolvers
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/photoview/photoview/api/graphql/auth"
|
|
"github.com/photoview/photoview/api/graphql/models"
|
|
"github.com/photoview/photoview/api/scanner/face_detection"
|
|
"github.com/photoview/photoview/api/test_utils"
|
|
)
|
|
|
|
func TestCombineFaceGroups(t *testing.T) {
|
|
test_utils.FilesystemTest(t)
|
|
db := test_utils.DatabaseTest(t)
|
|
face_detection.InitializeFaceDetector(db)
|
|
pass := "1234"
|
|
user, err := models.RegisterUser(db, "test_user", &pass, true)
|
|
if err != nil {
|
|
t.Fatal("register user error:", err)
|
|
}
|
|
db.AutoMigrate(&models.ImageFace{}, &models.FaceGroup{}, &models.Media{}, &models.Album{})
|
|
tests := []struct {
|
|
name string
|
|
dest int
|
|
src []int
|
|
}{
|
|
{
|
|
name: "merge multiple combinations with duplicates",
|
|
dest: 1,
|
|
src: []int{2, 3},
|
|
},
|
|
{
|
|
name: "merge two combinations with duplicates",
|
|
dest: 1,
|
|
src: []int{2},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
db.Exec("DELETE FROM image_faces")
|
|
db.Exec("DELETE FROM face_groups")
|
|
db.Exec("DELETE FROM media")
|
|
db.Exec("DELETE FROM albums")
|
|
|
|
testAlbum := models.Album{Title: "Test Album"}
|
|
if err := db.Create(&testAlbum).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
testMedia := []models.Media{
|
|
{Model: models.Model{ID: 1}, Path: "test1", AlbumID: testAlbum.ID},
|
|
{Model: models.Model{ID: 2}, Path: "test2", AlbumID: testAlbum.ID},
|
|
{Model: models.Model{ID: 3}, Path: "test3", AlbumID: testAlbum.ID},
|
|
{Model: models.Model{ID: 4}, Path: "test4", AlbumID: testAlbum.ID},
|
|
}
|
|
if err := db.Create(&testMedia).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
testFaceGroup := []models.FaceGroup{
|
|
{Model: models.Model{ID: 1}},
|
|
{Model: models.Model{ID: 2}},
|
|
{Model: models.Model{ID: 3}},
|
|
{Model: models.Model{ID: 4}},
|
|
}
|
|
if err := db.Create(&testFaceGroup).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
testDataList := []models.ImageFace{
|
|
{FaceGroupID: 1, MediaID: 1},
|
|
{FaceGroupID: 1, MediaID: 2},
|
|
{FaceGroupID: 1, MediaID: 3},
|
|
{FaceGroupID: 2, MediaID: 3},
|
|
{FaceGroupID: 2, MediaID: 4},
|
|
{FaceGroupID: 3, MediaID: 4},
|
|
{FaceGroupID: 3, MediaID: 1},
|
|
}
|
|
if err := db.Create(&testDataList).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
r := &mutationResolver{
|
|
Resolver: &Resolver{
|
|
database: db,
|
|
},
|
|
}
|
|
ctx := auth.AddUserToContext(context.Background(), user)
|
|
|
|
combineFace, err := r.CombineFaceGroups(ctx, tt.dest, tt.src)
|
|
if err != nil {
|
|
t.Fatal("test CombineFaceGroups err:", err)
|
|
}
|
|
|
|
m := make(map[int]struct{})
|
|
for _, imageface := range combineFace.ImageFaces {
|
|
if _, ok := m[imageface.MediaID]; ok {
|
|
t.Fatal("filtering failed at", imageface.MediaID)
|
|
}
|
|
m[imageface.MediaID] = struct{}{}
|
|
}
|
|
})
|
|
}
|
|
}
|