mirror of
https://github.com/go-shiori/shiori.git
synced 2025-09-08 14:05:54 +08:00
* create needed field in sqlite database * update account model * update Account struct for save Account options * update sqlite database return account settings * save configure in sqlite as text and return that * read configure from user account and defualt configure for shiori * add api/ui for update settings in database user can save settings in database (in sqlite database) * check configures be in json format before save in database * support MariaDB * fix wrong comment * support PostgreSQL * revert unneeded change in new logic * change configures to config * change SaveAccount to SaveAccountSettings * add migrate database scripts * change default in migration scrtipts * update model * read config field as json from database * fix parse value config value & update config update * update default value for new user * update settings variable name to reflect database value in UI * fix typo * not panic if user not exist and update worng comment * visitor user can update there settings now * remove unneeded loading dialog * fix typo * update function for pg and mysql * remove IsJson * move scan method to model * simplify jsonify * simplify assignees value to account.Config * missing part of function * fix some typo and unneeded field in struct * add down migrate script for all database * change createEbook to CreateEbook * use json instead of text in mysql and postgres * implement * remove unneeded part * remove unneeded jsonify in code * return SelectContext and GetContext * remove defualt config in reques for new user it will be set in backend * New API * remove legacy API * remove validateSessionWithoutOwnerStatus * remove Jsonify function don't need that anymore * add unit test for database * update migrate script name * change put to patch * return PUT * fix Patch problem and now use PATCH instead of PUT * remove unneeded retuen * more cleaner code for request new settings * fix bug to handle string in Scan method thanks to fmartingr * fix Authorization & use GetAccount & remove username from request * shiori-settings remove and it read from shiori-account * add swagger documentation * API unit test * fix typo * remove unneeded coment Co-authored-by: Felipe Martin <812088+fmartingr@users.noreply.github.com> * better Documentation Co-authored-by: Felipe Martin <812088+fmartingr@users.noreply.github.com> * shiori-toke remove on logout * fix typo * add unit test check update config in database * update swag documentation * fix swag formaing error --------- Co-authored-by: Felipe Martin <812088+fmartingr@users.noreply.github.com>
156 lines
4.1 KiB
Go
156 lines
4.1 KiB
Go
package database
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/go-shiori/shiori/internal/model"
|
|
"github.com/golang-migrate/migrate/v4"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func init() {
|
|
connString := os.Getenv("SHIORI_TEST_PG_URL")
|
|
if connString == "" {
|
|
log.Fatal("psql tests can't run without a PSQL database, set SHIORI_TEST_PG_URL environment variable")
|
|
}
|
|
}
|
|
|
|
func postgresqlTestDatabaseFactory(ctx context.Context) (DB, error) {
|
|
db, err := OpenPGDatabase(ctx, os.Getenv("SHIORI_TEST_PG_URL"))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
_, err = db.Exec("DROP SCHEMA public CASCADE; CREATE SCHEMA public;")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := db.Migrate(); err != nil && !errors.Is(migrate.ErrNoChange, err) {
|
|
return nil, err
|
|
}
|
|
|
|
return db, nil
|
|
}
|
|
|
|
func TestPostgresDatabase(t *testing.T) {
|
|
testDatabase(t, postgresqlTestDatabaseFactory)
|
|
}
|
|
|
|
func TestSaveAccountSettingsPg(t *testing.T) {
|
|
ctx := context.TODO()
|
|
|
|
db, err := postgresqlTestDatabaseFactory(ctx)
|
|
assert.NoError(t, err)
|
|
|
|
// Mock data
|
|
account := model.Account{
|
|
Username: "testuser",
|
|
Config: model.UserConfig{},
|
|
}
|
|
|
|
// Successful case
|
|
err = db.SaveAccountSettings(ctx, account)
|
|
assert.NoError(t, err)
|
|
|
|
// Initialize not correct database
|
|
ctx = context.TODO()
|
|
factory := func(ctx context.Context) (DB, error) {
|
|
return OpenSQLiteDatabase(ctx, filepath.Join(os.TempDir(), "shiori_test.db"))
|
|
}
|
|
db, err = factory(ctx)
|
|
assert.Nil(t, err)
|
|
account = model.Account{
|
|
Username: "testuser",
|
|
Config: model.UserConfig{},
|
|
}
|
|
err = db.SaveAccountSettings(ctx, account)
|
|
assert.NotNil(t, err)
|
|
assert.Contains(t, err.Error(), "SQL logic error: no such table: account (1)")
|
|
}
|
|
func TestGetAccountsPg(t *testing.T) {
|
|
ctx := context.TODO()
|
|
|
|
db, err := postgresqlTestDatabaseFactory(ctx)
|
|
assert.NoError(t, err)
|
|
|
|
// Insert test accounts
|
|
testAccounts := []model.Account{
|
|
{Username: "foo", Password: "bar", Owner: false},
|
|
{Username: "hello", Password: "world", Owner: false},
|
|
{Username: "foo_bar", Password: "foobar", Owner: true},
|
|
}
|
|
for _, acc := range testAccounts {
|
|
err := db.SaveAccount(ctx, acc)
|
|
assert.Nil(t, err)
|
|
}
|
|
|
|
// Successful case
|
|
// without opt
|
|
accounts, err := db.GetAccounts(ctx, GetAccountsOptions{})
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 3, len(accounts))
|
|
// with owner
|
|
accounts, err = db.GetAccounts(ctx, GetAccountsOptions{Owner: true})
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 1, len(accounts))
|
|
// with opt
|
|
accounts, err = db.GetAccounts(ctx, GetAccountsOptions{Keyword: "foo"})
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 2, len(accounts))
|
|
// with opt and owner
|
|
accounts, err = db.GetAccounts(ctx, GetAccountsOptions{Keyword: "hello", Owner: false})
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 1, len(accounts))
|
|
// with not result
|
|
accounts, err = db.GetAccounts(ctx, GetAccountsOptions{Keyword: "shiori"})
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 0, len(accounts))
|
|
|
|
// Initialize not correct database
|
|
ctx = context.TODO()
|
|
factory := func(ctx context.Context) (DB, error) {
|
|
return OpenSQLiteDatabase(ctx, filepath.Join(os.TempDir(), "shiori_test.db"))
|
|
}
|
|
db, err = factory(ctx)
|
|
assert.Nil(t, err)
|
|
// with invalid query
|
|
opts := GetAccountsOptions{Keyword: "foo", Owner: true}
|
|
_, err = db.GetAccounts(ctx, opts)
|
|
assert.NotNil(t, err)
|
|
assert.Contains(t, err.Error(), "SQL logic error: no such table: account (1)")
|
|
}
|
|
|
|
func TestGetAccountPg(t *testing.T) {
|
|
ctx := context.TODO()
|
|
|
|
db, err := postgresqlTestDatabaseFactory(ctx)
|
|
assert.NoError(t, err)
|
|
|
|
// Insert test accounts
|
|
testAccounts := []model.Account{
|
|
{Username: "foo", Password: "bar", Owner: false},
|
|
{Username: "hello", Password: "world", Owner: false},
|
|
{Username: "foo_bar", Password: "foobar", Owner: true},
|
|
}
|
|
for _, acc := range testAccounts {
|
|
err := db.SaveAccount(ctx, acc)
|
|
assert.Nil(t, err)
|
|
|
|
// Successful case
|
|
account, exists, err := db.GetAccount(ctx, acc.Username)
|
|
assert.Nil(t, err)
|
|
assert.True(t, exists, "Expected account to exist")
|
|
assert.Equal(t, acc.Username, account.Username)
|
|
}
|
|
// Falid case
|
|
account, exists, err := db.GetAccount(ctx, "foobar")
|
|
assert.NotNil(t, err)
|
|
assert.False(t, exists, "Expected account to exist")
|
|
assert.Empty(t, account.Username)
|
|
}
|