feat: add settings schema
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"cmbone/internal/models"
|
||||
"database/sql"
|
||||
"errors"
|
||||
"testing"
|
||||
@@ -64,6 +65,91 @@ func TestAppConfigServiceLanguage(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestAppConfigServiceSettingsSchema(t *testing.T) {
|
||||
store := newTestStore(t)
|
||||
service := NewAppConfigService(store)
|
||||
|
||||
groups, err := service.GetSettingsSchema()
|
||||
if err != nil {
|
||||
t.Fatalf("get settings schema: %v", err)
|
||||
}
|
||||
|
||||
requiredKeys := map[string]string{
|
||||
"theme.mode": "light",
|
||||
"language": "zh",
|
||||
"window.start_state": "normal",
|
||||
"window.width": "1280",
|
||||
"window.height": "800",
|
||||
"window.remember_state": "false",
|
||||
"shortcut.open_second_window": "Alt+P",
|
||||
"shortcut.open_main_window": "Alt+M",
|
||||
"data.root_mode": "app_config_dir",
|
||||
"data.custom_directory": "",
|
||||
"logs.level": "info",
|
||||
"logs.audit_retention_days": "180",
|
||||
"logs.app_retention_days": "30",
|
||||
}
|
||||
|
||||
got := make(map[string]models.AppSettingDefinition)
|
||||
for _, group := range groups {
|
||||
for _, item := range group.Items {
|
||||
got[item.Key] = item
|
||||
}
|
||||
}
|
||||
|
||||
for key, wantDefault := range requiredKeys {
|
||||
item, ok := got[key]
|
||||
if !ok {
|
||||
t.Fatalf("setting %q missing from schema", key)
|
||||
}
|
||||
if item.DefaultValue != wantDefault {
|
||||
t.Fatalf("setting %q default = %q, want %q", key, item.DefaultValue, wantDefault)
|
||||
}
|
||||
if item.Value != wantDefault {
|
||||
t.Fatalf("setting %q value = %q, want %q", key, item.Value, wantDefault)
|
||||
}
|
||||
if item.Options == nil {
|
||||
t.Fatalf("setting %q options is nil, want empty slice", key)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestAppConfigServiceValidatesSchemaValues(t *testing.T) {
|
||||
store := newTestStore(t)
|
||||
service := NewAppConfigService(store)
|
||||
|
||||
if err := service.SetAppConfig("theme.mode", "dark"); err != nil {
|
||||
t.Fatalf("set valid theme: %v", err)
|
||||
}
|
||||
gotTheme, err := service.GetAppConfig("theme.mode")
|
||||
if err != nil {
|
||||
t.Fatalf("get theme: %v", err)
|
||||
}
|
||||
if gotTheme != "dark" {
|
||||
t.Fatalf("theme.mode = %q, want dark", gotTheme)
|
||||
}
|
||||
var gotType string
|
||||
if err := store.DB.QueryRow("SELECT type FROM appconfig WHERE key = 'theme.mode'").Scan(&gotType); err != nil {
|
||||
t.Fatalf("get theme type: %v", err)
|
||||
}
|
||||
if gotType != settingTypeSelect {
|
||||
t.Fatalf("theme.mode type = %q, want %q", gotType, settingTypeSelect)
|
||||
}
|
||||
|
||||
if err := service.SetAppConfig("theme.mode", "purple"); err == nil {
|
||||
t.Fatal("set invalid theme returned nil error")
|
||||
}
|
||||
if err := service.SetAppConfig("window.remember_state", "yes"); err == nil {
|
||||
t.Fatal("set invalid boolean returned nil error")
|
||||
}
|
||||
if err := service.SetAppConfig("window.width", "wide"); err == nil {
|
||||
t.Fatal("set invalid number returned nil error")
|
||||
}
|
||||
if err := service.SetAppConfig("shortcut.open_second_window", "Alt+O"); err == nil {
|
||||
t.Fatal("set readonly shortcut returned nil error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestAuthServiceLocalLoginLifecycle(t *testing.T) {
|
||||
store := newTestStore(t)
|
||||
service := NewAuthService(store)
|
||||
|
||||
Reference in New Issue
Block a user