- new internal/sysadmin package (overview/kb/features/settings) with small
port interfaces; business packages stay unaware of sysadmin
- new routes /api/v1/admin/system/{overview,kb,features,settings} guarded
by requireSystemAdmin
- goose 00049: system_settings table (key/jsonb value, updated_by/at)
- SettingSpec whitelist registry with DB > env > default precedence
- register sysadmin in module-boundaries.yaml (archtest rules)
58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
package sysadmin
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"chat-agent-system/internal/db"
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
)
|
|
|
|
func TestPGSettingsStore_RoundTrip(t *testing.T) {
|
|
dsn := db.SkipIfNoTestDatabaseURL(t)
|
|
db.RefuseSharedEnvDSN(t, dsn)
|
|
ctx := context.Background()
|
|
pool, err := pgxpool.New(ctx, dsn)
|
|
if err != nil {
|
|
t.Fatalf("connect: %v", err)
|
|
}
|
|
defer pool.Close()
|
|
if err := db.RunMigrationsOnceForTest(ctx, pool, dsn); err != nil {
|
|
t.Fatalf("migrate: %v", err)
|
|
}
|
|
|
|
store := newPGSettingsStore(pool)
|
|
key := "ui.maintenance_notice"
|
|
if _, _, _, err := store.Get(ctx, key); err != ErrSettingNotFound {
|
|
t.Fatalf("expected ErrSettingNotFound, got %v", err)
|
|
}
|
|
if _, err := store.Upsert(ctx, key, json.RawMessage(`"维护中"`), 1); err != nil {
|
|
t.Fatalf("upsert: %v", err)
|
|
}
|
|
raw, updatedBy, updatedAt, err := store.Get(ctx, key)
|
|
if err != nil {
|
|
t.Fatalf("get: %v", err)
|
|
}
|
|
if string(raw) != `"维护中"` {
|
|
t.Fatalf("unexpected value: %s", raw)
|
|
}
|
|
if updatedBy == nil || *updatedBy != 1 {
|
|
t.Fatalf("expected updatedBy=1, got %+v", updatedBy)
|
|
}
|
|
if updatedAt == nil {
|
|
t.Fatal("expected updatedAt")
|
|
}
|
|
if _, err := store.Upsert(ctx, key, json.RawMessage(`"恢复"`), 2); err != nil {
|
|
t.Fatalf("second upsert: %v", err)
|
|
}
|
|
raw, updatedBy, _, err = store.Get(ctx, key)
|
|
if err != nil {
|
|
t.Fatalf("get after overwrite: %v", err)
|
|
}
|
|
if string(raw) != `"恢复"` || updatedBy == nil || *updatedBy != 2 {
|
|
t.Fatalf("expected overwrite, got %s by %+v", raw, updatedBy)
|
|
}
|
|
}
|