2021-04-23 15:10:23 +02:00
|
|
|
package models_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
2021-04-23 23:07:18 +02:00
|
|
|
"time"
|
2021-04-23 15:10:23 +02:00
|
|
|
|
2021-09-27 21:20:47 +02:00
|
|
|
"github.com/photoview/photoview/api/dataloader"
|
2021-04-23 15:10:23 +02:00
|
|
|
"github.com/photoview/photoview/api/graphql/models"
|
|
|
|
"github.com/photoview/photoview/api/test_utils"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestUserRegistrationAuthorization(t *testing.T) {
|
|
|
|
db := test_utils.DatabaseTest(t)
|
|
|
|
|
2021-04-26 21:22:28 +02:00
|
|
|
t.Run("Register user", func(t *testing.T) {
|
|
|
|
password := "1234"
|
|
|
|
user, err := models.RegisterUser(db, "admin", &password, true)
|
|
|
|
if !assert.NoError(t, err) {
|
|
|
|
return
|
|
|
|
}
|
2021-04-23 15:10:23 +02:00
|
|
|
|
2021-04-26 21:22:28 +02:00
|
|
|
assert.NotNil(t, user)
|
|
|
|
assert.EqualValues(t, "admin", user.Username)
|
|
|
|
assert.NotNil(t, user.Password)
|
|
|
|
assert.NotEqualValues(t, "1234", user.Password) // should be hashed
|
|
|
|
assert.True(t, user.Admin)
|
|
|
|
})
|
2021-04-23 23:07:18 +02:00
|
|
|
|
2021-04-26 21:22:28 +02:00
|
|
|
t.Run("Authorize user", func(t *testing.T) {
|
|
|
|
user, err := models.AuthorizeUser(db, "admin", "1234")
|
|
|
|
if !assert.NoError(t, err) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.NotNil(t, user)
|
|
|
|
assert.EqualValues(t, "admin", user.Username)
|
|
|
|
})
|
2021-04-23 23:07:18 +02:00
|
|
|
|
2021-04-26 21:22:28 +02:00
|
|
|
t.Run("Authorize invalid credentials", func(t *testing.T) {
|
|
|
|
user, err := models.AuthorizeUser(db, "invalid_username", "1234")
|
|
|
|
assert.ErrorIs(t, err, models.ErrorInvalidUserCredentials)
|
|
|
|
assert.Nil(t, user)
|
2021-04-23 23:07:18 +02:00
|
|
|
|
2021-04-26 21:22:28 +02:00
|
|
|
user, err = models.AuthorizeUser(db, "admin", "invalid_password")
|
|
|
|
assert.ErrorIs(t, err, models.ErrorInvalidUserCredentials)
|
|
|
|
assert.Nil(t, user)
|
|
|
|
})
|
2021-04-23 23:07:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestAccessToken(t *testing.T) {
|
|
|
|
db := test_utils.DatabaseTest(t)
|
|
|
|
|
|
|
|
pass := "<hashed_password>"
|
|
|
|
user := models.User{
|
|
|
|
Username: "user1",
|
|
|
|
Password: &pass,
|
|
|
|
Admin: false,
|
|
|
|
}
|
|
|
|
|
|
|
|
if !assert.NoError(t, db.Save(&user).Error) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
access_token, err := user.GenerateAccessToken(db)
|
|
|
|
if !assert.NoError(t, err) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.NotNil(t, access_token)
|
|
|
|
assert.Equal(t, user.ID, access_token.UserID)
|
|
|
|
assert.NotEmpty(t, access_token.Value)
|
|
|
|
assert.True(t, access_token.Expire.After(time.Now()))
|
2021-04-23 15:10:23 +02:00
|
|
|
}
|
2021-04-26 21:22:28 +02:00
|
|
|
|
|
|
|
func TestUserFillAlbums(t *testing.T) {
|
|
|
|
db := test_utils.DatabaseTest(t)
|
|
|
|
|
|
|
|
user := models.User{
|
|
|
|
Username: "user",
|
|
|
|
}
|
|
|
|
|
|
|
|
if !assert.NoError(t, db.Save(&user).Error) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
err := user.FillAlbums(db)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Empty(t, user.Albums)
|
|
|
|
|
|
|
|
albums := []models.Album{
|
|
|
|
{
|
|
|
|
Title: "album1",
|
|
|
|
Path: "/photos/album1",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Title: "album2",
|
|
|
|
Path: "/photos/album2",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
if !assert.NoError(t, db.Model(&user).Association("Albums").Append(&albums)) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
user.Albums = make([]models.Album, 0)
|
|
|
|
|
|
|
|
err = user.FillAlbums(db)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Len(t, user.Albums, 2)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestUserOwnsAlbum(t *testing.T) {
|
|
|
|
db := test_utils.DatabaseTest(t)
|
|
|
|
|
|
|
|
user := models.User{
|
|
|
|
Username: "user",
|
|
|
|
}
|
|
|
|
|
|
|
|
if !assert.NoError(t, db.Save(&user).Error) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
albums := []models.Album{
|
|
|
|
{
|
|
|
|
Title: "album1",
|
|
|
|
Path: "/photos/album1",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Title: "album2",
|
|
|
|
Path: "/photos/album2",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
if !assert.NoError(t, db.Model(&user).Association("Albums").Append(&albums)) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
sub_albums := []models.Album{
|
|
|
|
{
|
|
|
|
Title: "subalbum1",
|
|
|
|
Path: "/photos/album2/subalbum1",
|
|
|
|
ParentAlbumID: &albums[1].ID,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Title: "another_sub",
|
|
|
|
Path: "/photos/album2/another_sub",
|
|
|
|
ParentAlbumID: &albums[1].ID,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Title: "subalbum2",
|
|
|
|
Path: "/photos/album1/subalbum2",
|
|
|
|
ParentAlbumID: &albums[0].ID,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
if !assert.NoError(t, db.Model(&user).Association("Albums").Append(&sub_albums)) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, album := range albums {
|
|
|
|
owns, err := user.OwnsAlbum(db, &album)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.True(t, owns)
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, album := range sub_albums {
|
|
|
|
owns, err := user.OwnsAlbum(db, &album)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.True(t, owns)
|
|
|
|
}
|
|
|
|
|
|
|
|
separate_album := models.Album{
|
|
|
|
Title: "separate_album",
|
|
|
|
Path: "/my_media/album123",
|
|
|
|
}
|
|
|
|
|
|
|
|
if !assert.NoError(t, db.Save(&separate_album).Error) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
owns, err := user.OwnsAlbum(db, &separate_album)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.False(t, owns)
|
|
|
|
}
|
2021-09-27 21:20:47 +02:00
|
|
|
|
|
|
|
func TestUserFavoriteMedia(t *testing.T) {
|
|
|
|
db := test_utils.DatabaseTest(t)
|
|
|
|
|
|
|
|
user, err := models.RegisterUser(db, "user1", nil, false)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
rootAlbum := models.Album{
|
|
|
|
Title: "root",
|
|
|
|
Path: "/photos",
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.NoError(t, db.Save(&rootAlbum).Error)
|
|
|
|
assert.NoError(t, db.Model(&user).Association("Albums").Append(&rootAlbum))
|
|
|
|
|
|
|
|
media := models.Media{
|
|
|
|
Title: "pic1",
|
|
|
|
Path: "/photos/pic1",
|
|
|
|
AlbumID: rootAlbum.ID,
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.NoError(t, db.Save(&media).Error)
|
|
|
|
|
|
|
|
// test that it starts out being false
|
|
|
|
favourite, err := dataloader.NewUserFavoriteLoader(db).Load(&models.UserMediaData{
|
|
|
|
UserID: user.ID,
|
|
|
|
MediaID: media.ID,
|
|
|
|
})
|
|
|
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.False(t, favourite)
|
|
|
|
|
|
|
|
favMedia, err := user.FavoriteMedia(db, media.ID, true)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, favMedia)
|
|
|
|
|
|
|
|
// test that it is now true
|
|
|
|
favourite, err = dataloader.NewUserFavoriteLoader(db).Load(&models.UserMediaData{
|
|
|
|
UserID: user.ID,
|
|
|
|
MediaID: media.ID,
|
|
|
|
})
|
|
|
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.True(t, favourite)
|
|
|
|
}
|