// Copyright (c) 2026 Storm Dragon // Authors: Storm Dragon, Angus Kola // SPDX-License-Identifier: GPL-3.0-or-later package config import ( "os" "path/filepath" "strings" "testing" ) func TestProgressSettingsPersistenceAndInheritance(t *testing.T) { path := filepath.Join(t.TempDir(), "settings.toml") store, err := NewStore(path) if err != nil { t.Fatal(err) } global := DefaultSettings() global.ProgressBar.OutputMode = "both" global.ProgressBar.ReportBackground = true if err := store.Save(global); err != nil { t.Fatal(err) } application := global application.ProgressBar.OutputMode = "off" if err := store.SaveForApplication("Example Application", application); err != nil { t.Fatal(err) } loaded, err := store.Load() if err != nil || loaded.ProgressBar != global.ProgressBar { t.Fatalf("global progress: %+v, %v", loaded.ProgressBar, err) } app, found, err := store.LoadForApplication("Example Application") if err != nil || !found || app.ProgressBar != application.ProgressBar { t.Fatalf("application progress: %+v, %v", app.ProgressBar, err) } global.ProgressBar.ReportBackground = false global.ProgressBar.SpeechPercentageInterval = 5 if err := store.Save(global); err != nil { t.Fatal(err) } app, _, err = store.LoadForApplication("Example Application") if err != nil || app.ProgressBar.OutputMode != "off" || app.ProgressBar.ReportBackground || app.ProgressBar.SpeechPercentageInterval != 5 { t.Fatalf("inherited progress: %+v, %v", app.ProgressBar, err) } } func TestObsoleteProgressFieldsDoNotBreakExistingFiles(t *testing.T) { path := filepath.Join(t.TempDir(), "settings.toml") contents := "schema-version = 2\nactive-profile = 'default'\n[profiles.default.sound]\nbeep-progress-updates = false\nprogress-beep-interval = 7\nplay-for-value = true\n" if err := os.WriteFile(path, []byte(contents), 0600); err != nil { t.Fatal(err) } store, err := NewStore(path) if err != nil { t.Fatal(err) } settings, err := store.Load() if err != nil || settings.ProgressBar != DefaultProgressBarSettings() { t.Fatalf("existing settings: %+v, %v", settings.ProgressBar, err) } if err := store.Save(settings); err != nil { t.Fatal(err) } data, err := os.ReadFile(path) if err != nil { t.Fatal(err) } for _, key := range []string{"beep-progress-updates", "progress-beep-interval", "play-for-value"} { if strings.Contains(string(data), key) { t.Fatalf("obsolete field %s was saved", key) } } } func TestInvalidProgressSettingsRejected(t *testing.T) { for _, change := range []func(*ProgressBarSettings){ func(s *ProgressBarSettings) { s.OutputMode = "invalid" }, func(s *ProgressBarSettings) { s.BeepPercentageInterval = 0 }, func(s *ProgressBarSettings) { s.SpeechPercentageInterval = 101 }, } { settings := DefaultSettings() change(&settings.ProgressBar) if Validate(settings) == nil { t.Fatalf("invalid progress settings accepted: %+v", settings.ProgressBar) } } }