store_test.go

  1package config
  2
  3import (
  4	"errors"
  5	"os"
  6	"path/filepath"
  7	"testing"
  8
  9	"github.com/stretchr/testify/require"
 10)
 11
 12func TestConfigStore_ConfigPath_GlobalAlwaysWorks(t *testing.T) {
 13	t.Parallel()
 14
 15	store := &ConfigStore{
 16		globalDataPath: "/some/global/crush.json",
 17	}
 18
 19	path, err := store.configPath(ScopeGlobal)
 20	require.NoError(t, err)
 21	require.Equal(t, "/some/global/crush.json", path)
 22}
 23
 24func TestConfigStore_ConfigPath_WorkspaceReturnsPath(t *testing.T) {
 25	t.Parallel()
 26
 27	store := &ConfigStore{
 28		workspacePath: "/some/workspace/.crush/crush.json",
 29	}
 30
 31	path, err := store.configPath(ScopeWorkspace)
 32	require.NoError(t, err)
 33	require.Equal(t, "/some/workspace/.crush/crush.json", path)
 34}
 35
 36func TestConfigStore_ConfigPath_WorkspaceErrorsWhenEmpty(t *testing.T) {
 37	t.Parallel()
 38
 39	store := &ConfigStore{
 40		globalDataPath: "/some/global/crush.json",
 41		workspacePath:  "",
 42	}
 43
 44	_, err := store.configPath(ScopeWorkspace)
 45	require.Error(t, err)
 46	require.True(t, errors.Is(err, ErrNoWorkspaceConfig))
 47}
 48
 49func TestConfigStore_SetConfigField_WorkspaceScopeGuard(t *testing.T) {
 50	t.Parallel()
 51
 52	store := &ConfigStore{
 53		config:         &Config{},
 54		globalDataPath: filepath.Join(t.TempDir(), "global.json"),
 55		workspacePath:  "",
 56	}
 57
 58	err := store.SetConfigField(ScopeWorkspace, "foo", "bar")
 59	require.Error(t, err)
 60	require.True(t, errors.Is(err, ErrNoWorkspaceConfig))
 61}
 62
 63func TestConfigStore_SetConfigField_GlobalScopeAlwaysWorks(t *testing.T) {
 64	t.Parallel()
 65
 66	dir := t.TempDir()
 67	globalPath := filepath.Join(dir, "crush.json")
 68	store := &ConfigStore{
 69		config:         &Config{},
 70		globalDataPath: globalPath,
 71	}
 72
 73	err := store.SetConfigField(ScopeGlobal, "foo", "bar")
 74	require.NoError(t, err)
 75
 76	data, err := os.ReadFile(globalPath)
 77	require.NoError(t, err)
 78	require.Contains(t, string(data), `"foo"`)
 79}
 80
 81func TestConfigStore_RemoveConfigField_WorkspaceScopeGuard(t *testing.T) {
 82	t.Parallel()
 83
 84	store := &ConfigStore{
 85		config:         &Config{},
 86		globalDataPath: filepath.Join(t.TempDir(), "global.json"),
 87		workspacePath:  "",
 88	}
 89
 90	err := store.RemoveConfigField(ScopeWorkspace, "foo")
 91	require.Error(t, err)
 92	require.True(t, errors.Is(err, ErrNoWorkspaceConfig))
 93}
 94
 95func TestConfigStore_HasConfigField_WorkspaceScopeGuard(t *testing.T) {
 96	t.Parallel()
 97
 98	store := &ConfigStore{
 99		config:         &Config{},
100		globalDataPath: filepath.Join(t.TempDir(), "global.json"),
101		workspacePath:  "",
102	}
103
104	has := store.HasConfigField(ScopeWorkspace, "foo")
105	require.False(t, has)
106}
107
108func TestConfigStore_RuntimeOverrides_Independent(t *testing.T) {
109	t.Parallel()
110
111	store1 := &ConfigStore{config: &Config{}}
112	store2 := &ConfigStore{config: &Config{}}
113
114	require.False(t, store1.Overrides().SkipPermissionRequests)
115	require.False(t, store2.Overrides().SkipPermissionRequests)
116
117	store1.Overrides().SkipPermissionRequests = true
118
119	require.True(t, store1.Overrides().SkipPermissionRequests)
120	require.False(t, store2.Overrides().SkipPermissionRequests)
121}
122
123func TestConfigStore_RuntimeOverrides_MutableViaPointer(t *testing.T) {
124	t.Parallel()
125
126	store := &ConfigStore{config: &Config{}}
127	overrides := store.Overrides()
128
129	require.False(t, overrides.SkipPermissionRequests)
130
131	overrides.SkipPermissionRequests = true
132	require.True(t, store.Overrides().SkipPermissionRequests)
133}
134
135func TestGlobalWorkspaceDir(t *testing.T) {
136	dir := t.TempDir()
137	t.Setenv("CRUSH_GLOBAL_DATA", dir)
138
139	wsDir := GlobalWorkspaceDir()
140	globalData := GlobalConfigData()
141
142	require.Equal(t, filepath.Dir(globalData), wsDir)
143	require.Equal(t, dir, wsDir)
144}
145
146func TestScope_String(t *testing.T) {
147	t.Parallel()
148
149	require.Equal(t, "global", ScopeGlobal.String())
150	require.Equal(t, "workspace", ScopeWorkspace.String())
151	require.Contains(t, Scope(99).String(), "Scope(99)")
152}