feat: add settings schema

This commit is contained in:
QiuSW
2026-07-09 00:12:30 +08:00
parent 5aaac0b166
commit 91debb9ad6
24 changed files with 867 additions and 53 deletions
+86
View File
@@ -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)