1package config
2
3import (
4 "os"
5 "strings"
6 "testing"
7
8 "github.com/stretchr/testify/require"
9)
10
11// setLegendDelayInFile rewrites the mode_legend_delay_ms line of the manager's
12// config file, simulating an external edit.
13func setLegendDelayInFile(t *testing.T, mgr *Manager, delayMs string) {
14 t.Helper()
15
16 path := mgr.GetConfigFile()
17 require.NotEmpty(t, path)
18 data, err := os.ReadFile(path)
19 require.NoError(t, err)
20
21 lines := strings.Split(string(data), "\n")
22 replaced := false
23 for i, line := range lines {
24 if strings.HasPrefix(strings.TrimSpace(line), "mode_legend_delay_ms") {
25 lines[i] = "mode_legend_delay_ms = " + delayMs
26 replaced = true
27 }
28 }
29 require.True(t, replaced, "mode_legend_delay_ms not found in written config")
30 require.NoError(t, os.WriteFile(path, []byte(strings.Join(lines, "\n")), 0o600))
31}
32
33func TestManagerReload_KeepsSavedValue(t *testing.T) {
34 mgr := newTestOmniboxPreferencesGatewayManager(t, t.TempDir())
35 require.Equal(t, 500, mgr.Get().Workspace.Styling.ModeLegendDelayMs)
36
37 require.NoError(t, mgr.Update(func(cfg *Config) { cfg.Workspace.Styling.ModeLegendDelayMs = 700 }))
38 require.Equal(t, 700, mgr.Get().Workspace.Styling.ModeLegendDelayMs)
39
40 mgr.mu.Lock()
41 err := mgr.reload()
42 mgr.mu.Unlock()
43 require.NoError(t, err)
44 require.Equal(t, 700, mgr.Get().Workspace.Styling.ModeLegendDelayMs)
45}
46
47func TestManagerReload_PicksUpExternalEditAfterSave(t *testing.T) {
48 mgr := newTestOmniboxPreferencesGatewayManager(t, t.TempDir())
49 require.NoError(t, mgr.Update(func(cfg *Config) { cfg.Workspace.Styling.ModeLegendDelayMs = 700 }))
50
51 setLegendDelayInFile(t, mgr, "900")
52
53 mgr.mu.Lock()
54 err := mgr.reload()
55 mgr.mu.Unlock()
56 require.NoError(t, err)
57 require.Equal(t, 900, mgr.Get().Workspace.Styling.ModeLegendDelayMs)
58}
59
60func TestManagerReload_PicksUpExternalEditWithoutPriorSave(t *testing.T) {
61 mgr := newTestOmniboxPreferencesGatewayManager(t, t.TempDir())
62 require.Equal(t, 500, mgr.Get().Workspace.Styling.ModeLegendDelayMs)
63
64 setLegendDelayInFile(t, mgr, "900")
65
66 mgr.mu.Lock()
67 err := mgr.reload()
68 mgr.mu.Unlock()
69 require.NoError(t, err)
70 require.Equal(t, 900, mgr.Get().Workspace.Styling.ModeLegendDelayMs)
71
72 setLegendDelayInFile(t, mgr, "300")
73 mgr.mu.Lock()
74 err = mgr.reload()
75 mgr.mu.Unlock()
76 require.NoError(t, err)
77 require.Equal(t, 300, mgr.Get().Workspace.Styling.ModeLegendDelayMs)
78}
79
80func TestManagerUpdate_ConsecutiveUpdatesEachPersist(t *testing.T) {
81 configHome := t.TempDir()
82 mgr := newTestOmniboxPreferencesGatewayManager(t, configHome)
83
84 require.NoError(t, mgr.Update(func(cfg *Config) { cfg.Workspace.Styling.ModeLegendCollapsed = true }))
85 require.NoError(t, mgr.Update(func(cfg *Config) { cfg.Workspace.Styling.ModeLegendDelayMs = 700 }))
86 require.NoError(t, mgr.Update(func(cfg *Config) { cfg.Workspace.Styling.ModeLegendDelayMs = 800 }))
87 require.NoError(t, mgr.Update(func(cfg *Config) { cfg.Workspace.Styling.ModeLegendCollapsed = false }))
88
89 for name, got := range map[string]*Config{
90 "in-memory": mgr.Get(),
91 "on-disk": newTestOmniboxPreferencesGatewayManager(t, configHome).Get(),
92 } {
93 require.False(t, got.Workspace.Styling.ModeLegendCollapsed, name)
94 require.Equal(t, 800, got.Workspace.Styling.ModeLegendDelayMs, name)
95 }
96}