package store import ( "context" "testing" "time" "github.com/jmoiron/sqlx" _ "github.com/mattn/go-sqlite3" "github.com/kandev/kandev/internal/user/models" ) type settingsScanner struct { raw string } func (s settingsScanner) Scan(dest ...any) error { *(dest[0].(*string)) = s.raw *(dest[1].(*time.Time)) = time.Time{} return nil } func TestScanUserSettingsChangesPanelLayoutDefault(t *testing.T) { t.Run("empty settings default to tree", func(t *testing.T) { settings, err := scanUserSettings(settingsScanner{raw: "{}"}, DefaultUserID) if err != nil { t.Fatalf("unexpected error: %v", err) } if settings.ChangesPanelLayout != "tree" { t.Fatalf("expected ChangesPanelLayout=tree, got %q", settings.ChangesPanelLayout) } }) t.Run("missing layout defaults to tree", func(t *testing.T) { settings, err := scanUserSettings(settingsScanner{raw: `{"chat_submit_key":"cmd_enter"}`}, DefaultUserID) if err != nil { t.Fatalf("unexpected error: %v", err) } if settings.ChangesPanelLayout != "tree" { t.Fatalf("expected ChangesPanelLayout=tree, got %q", settings.ChangesPanelLayout) } }) t.Run("explicit flat is preserved", func(t *testing.T) { settings, err := scanUserSettings(settingsScanner{raw: `{"changes_panel_layout":"flat"}`}, DefaultUserID) if err != nil { t.Fatalf("unexpected error: %v", err) } if settings.ChangesPanelLayout != "flat" { t.Fatalf("expected ChangesPanelLayout=flat, got %q", settings.ChangesPanelLayout) } }) } func TestScanUserSettingsSystemMetricsDisplayDefault(t *testing.T) { settings, err := scanUserSettings(settingsScanner{raw: "{}"}, DefaultUserID) if err != nil { t.Fatalf("unexpected error: %v", err) } if settings.SystemMetricsDisplay.ShowInTopbar { t.Fatal("system metrics display should default to disabled") } settings, err = scanUserSettings(settingsScanner{raw: `{"system_metrics_display":{"show_in_topbar":true}}`}, DefaultUserID) if err != nil { t.Fatalf("unexpected error: %v", err) } if !settings.SystemMetricsDisplay.ShowInTopbar { t.Fatal("expected stored system metrics display preference") } } func TestSQLiteRepositorySystemMetricsDisplayRoundTrip(t *testing.T) { conn, err := sqlx.Open("sqlite3", ":memory:") if err != nil { t.Fatalf("open sqlite: %v", err) } conn.SetMaxOpenConns(1) t.Cleanup(func() { _ = conn.Close() }) repo, err := newSQLiteRepositoryWithDB(conn, conn) if err != nil { t.Fatalf("new repo: %v", err) } ctx := context.Background() settings, err := repo.GetUserSettings(ctx, DefaultUserID) if err != nil { t.Fatalf("get defaults: %v", err) } settings.SystemMetricsDisplay = models.SystemMetricsDisplaySettings{ShowInTopbar: true} if err := repo.UpsertUserSettings(ctx, settings); err != nil { t.Fatalf("upsert settings: %v", err) } got, err := repo.GetUserSettings(ctx, DefaultUserID) if err != nil { t.Fatalf("get settings: %v", err) } if !got.SystemMetricsDisplay.ShowInTopbar { t.Fatal("expected system metrics display preference to round-trip") } }