mirror of
https://github.com/pocketbase/pocketbase.git
synced 2025-03-19 22:19:23 +02:00
160 lines
4.7 KiB
Go
160 lines
4.7 KiB
Go
|
package core_test
|
||
|
|
||
|
import (
|
||
|
"os"
|
||
|
"strings"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/pocketbase/pocketbase/core"
|
||
|
"github.com/pocketbase/pocketbase/tests"
|
||
|
"github.com/pocketbase/pocketbase/tools/types"
|
||
|
)
|
||
|
|
||
|
func TestReloadSettings(t *testing.T) {
|
||
|
app, _ := tests.NewTestApp()
|
||
|
defer app.Cleanup()
|
||
|
|
||
|
// cleanup all stored settings
|
||
|
// ---
|
||
|
if _, err := app.DB().NewQuery("DELETE from _params;").Execute(); err != nil {
|
||
|
t.Fatalf("Failed to delete all test settings: %v", err)
|
||
|
}
|
||
|
|
||
|
// check if the new settings are saved in the db
|
||
|
// ---
|
||
|
app.Settings().Meta.AppName = "test_name_after_delete"
|
||
|
|
||
|
app.ResetEventCalls()
|
||
|
if err := app.ReloadSettings(); err != nil {
|
||
|
t.Fatalf("Failed to reload the settings after delete: %v", err)
|
||
|
}
|
||
|
testEventCalls(t, app, map[string]int{
|
||
|
"OnModelCreate": 1,
|
||
|
"OnModelCreateExecute": 1,
|
||
|
"OnModelAfterCreateSuccess": 1,
|
||
|
"OnModelValidate": 1,
|
||
|
"OnSettingsReload": 1,
|
||
|
})
|
||
|
|
||
|
param := &core.Param{}
|
||
|
err := app.ModelQuery(param).Model("settings", param)
|
||
|
if err != nil {
|
||
|
t.Fatalf("Expected new settings to be persisted, got %v", err)
|
||
|
}
|
||
|
|
||
|
if !strings.Contains(param.Value.String(), "test_name_after_delete") {
|
||
|
t.Fatalf("Expected to find AppName test_name_after_delete in\n%s", param.Value.String())
|
||
|
}
|
||
|
|
||
|
// change the db entry and reload the app settings (ensure that there was no db update)
|
||
|
// ---
|
||
|
param.Value = types.JSONRaw([]byte(`{"meta": {"appName":"test_name_after_update"}}`))
|
||
|
if err := app.Save(param); err != nil {
|
||
|
t.Fatalf("Failed to update the test settings: %v", err)
|
||
|
}
|
||
|
|
||
|
app.ResetEventCalls()
|
||
|
if err := app.ReloadSettings(); err != nil {
|
||
|
t.Fatalf("Failed to reload app settings: %v", err)
|
||
|
}
|
||
|
testEventCalls(t, app, map[string]int{
|
||
|
"OnSettingsReload": 1,
|
||
|
})
|
||
|
|
||
|
// try to reload again without doing any changes
|
||
|
// ---
|
||
|
app.ResetEventCalls()
|
||
|
if err := app.ReloadSettings(); err != nil {
|
||
|
t.Fatalf("Failed to reload app settings without change: %v", err)
|
||
|
}
|
||
|
testEventCalls(t, app, map[string]int{
|
||
|
"OnSettingsReload": 1,
|
||
|
})
|
||
|
|
||
|
if app.Settings().Meta.AppName != "test_name_after_update" {
|
||
|
t.Fatalf("Expected AppName %q, got %q", "test_name_after_update", app.Settings().Meta.AppName)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestReloadSettingsWithEncryption(t *testing.T) {
|
||
|
app, _ := tests.NewTestApp()
|
||
|
defer app.Cleanup()
|
||
|
|
||
|
os.Setenv("pb_test_env", strings.Repeat("a", 32))
|
||
|
|
||
|
// cleanup all stored settings
|
||
|
// ---
|
||
|
if _, err := app.DB().NewQuery("DELETE from _params;").Execute(); err != nil {
|
||
|
t.Fatalf("Failed to delete all test settings: %v", err)
|
||
|
}
|
||
|
|
||
|
// check if the new settings are saved in the db
|
||
|
// ---
|
||
|
app.Settings().Meta.AppName = "test_name_after_delete"
|
||
|
|
||
|
app.ResetEventCalls()
|
||
|
if err := app.ReloadSettings(); err != nil {
|
||
|
t.Fatalf("Failed to reload the settings after delete: %v", err)
|
||
|
}
|
||
|
testEventCalls(t, app, map[string]int{
|
||
|
"OnModelCreate": 1,
|
||
|
"OnModelCreateExecute": 1,
|
||
|
"OnModelAfterCreateSuccess": 1,
|
||
|
"OnModelValidate": 1,
|
||
|
"OnSettingsReload": 1,
|
||
|
})
|
||
|
|
||
|
param := &core.Param{}
|
||
|
err := app.ModelQuery(param).Model("settings", param)
|
||
|
if err != nil {
|
||
|
t.Fatalf("Expected new settings to be persisted, got %v", err)
|
||
|
}
|
||
|
rawValue := param.Value.String()
|
||
|
if rawValue == "" || strings.Contains(rawValue, "test_name") {
|
||
|
t.Fatalf("Expected inserted settings to be encrypted, found\n%s", rawValue)
|
||
|
}
|
||
|
|
||
|
// change and reload the app settings (ensure that there was no db update)
|
||
|
// ---
|
||
|
app.Settings().Meta.AppName = "test_name_after_update"
|
||
|
if err := app.Save(app.Settings()); err != nil {
|
||
|
t.Fatalf("Failed to update app settings: %v", err)
|
||
|
}
|
||
|
|
||
|
// try to reload again without doing any changes
|
||
|
// ---
|
||
|
app.ResetEventCalls()
|
||
|
if err := app.ReloadSettings(); err != nil {
|
||
|
t.Fatalf("Failed to reload app settings: %v", err)
|
||
|
}
|
||
|
testEventCalls(t, app, map[string]int{
|
||
|
"OnSettingsReload": 1,
|
||
|
})
|
||
|
|
||
|
// refetch the settings param to ensure that the new value was stored encrypted
|
||
|
err = app.ModelQuery(param).Model("settings", param)
|
||
|
if err != nil {
|
||
|
t.Fatalf("Expected new settings to be persisted, got %v", err)
|
||
|
}
|
||
|
rawValue = param.Value.String()
|
||
|
if rawValue == "" || strings.Contains(rawValue, "test_name") {
|
||
|
t.Fatalf("Expected updated settings to be encrypted, found\n%s", rawValue)
|
||
|
}
|
||
|
|
||
|
if app.Settings().Meta.AppName != "test_name_after_update" {
|
||
|
t.Fatalf("Expected AppName %q, got %q", "test_name_after_update", app.Settings().Meta.AppName)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func testEventCalls(t *testing.T, app *tests.TestApp, events map[string]int) {
|
||
|
if len(events) != len(app.EventCalls) {
|
||
|
t.Fatalf("Expected events doesn't match:\n%v\ngot\n%v", events, app.EventCalls)
|
||
|
}
|
||
|
|
||
|
for name, total := range events {
|
||
|
if v, ok := app.EventCalls[name]; !ok || v != total {
|
||
|
t.Fatalf("Expected events doesn't exist or match:\n%v\ngot\n%v", events, app.EventCalls)
|
||
|
}
|
||
|
}
|
||
|
}
|