github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/config/common_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package config 5 6 import ( 7 "os" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 13 "github.com/masterhung0112/hk_server/v5/config" 14 ) 15 16 var emptyConfig, readOnlyConfig, minimalConfig, minimalConfigNoFF, invalidConfig, fixesRequiredConfig, ldapConfig, testConfig, customConfigDefaults *model.Config 17 18 func init() { 19 emptyConfig = &model.Config{} 20 readOnlyConfig = &model.Config{ 21 ClusterSettings: model.ClusterSettings{ 22 Enable: model.NewBool(true), 23 ReadOnlyConfig: model.NewBool(true), 24 }, 25 } 26 minimalConfig = &model.Config{ 27 ServiceSettings: model.ServiceSettings{ 28 SiteURL: model.NewString("http://minimal"), 29 }, 30 SqlSettings: model.SqlSettings{ 31 AtRestEncryptKey: model.NewString("abcdefghijklmnopqrstuvwxyz0123456789"), 32 }, 33 FileSettings: model.FileSettings{ 34 PublicLinkSalt: model.NewString("abcdefghijklmnopqrstuvwxyz0123456789"), 35 }, 36 LocalizationSettings: model.LocalizationSettings{ 37 DefaultServerLocale: model.NewString("en"), 38 DefaultClientLocale: model.NewString("en"), 39 }, 40 } 41 42 minimalConfig.SetDefaults() 43 44 minimalConfigNoFF = minimalConfig.Clone() 45 minimalConfigNoFF.FeatureFlags = nil 46 47 invalidConfig = &model.Config{ 48 ServiceSettings: model.ServiceSettings{ 49 SiteURL: model.NewString("invalid"), 50 }, 51 } 52 fixesRequiredConfig = &model.Config{ 53 ServiceSettings: model.ServiceSettings{ 54 SiteURL: model.NewString("http://trailingslash/"), 55 }, 56 SqlSettings: model.SqlSettings{ 57 AtRestEncryptKey: model.NewString("abcdefghijklmnopqrstuvwxyz0123456789"), 58 }, 59 FileSettings: model.FileSettings{ 60 DriverName: model.NewString(model.IMAGE_DRIVER_LOCAL), 61 Directory: model.NewString("/path/to/directory"), 62 PublicLinkSalt: model.NewString("abcdefghijklmnopqrstuvwxyz0123456789"), 63 }, 64 LocalizationSettings: model.LocalizationSettings{ 65 DefaultServerLocale: model.NewString("garbage"), 66 DefaultClientLocale: model.NewString("garbage"), 67 }, 68 } 69 ldapConfig = &model.Config{ 70 LdapSettings: model.LdapSettings{ 71 BindPassword: model.NewString("password"), 72 }, 73 } 74 testConfig = &model.Config{ 75 ServiceSettings: model.ServiceSettings{ 76 SiteURL: model.NewString("http://TestStoreNew"), 77 }, 78 } 79 customConfigDefaults = &model.Config{ 80 ServiceSettings: model.ServiceSettings{ 81 SiteURL: model.NewString("http://custom.com"), 82 }, 83 DisplaySettings: model.DisplaySettings{ 84 ExperimentalTimezone: model.NewBool(false), 85 }, 86 } 87 } 88 89 func TestMergeConfigs(t *testing.T) { 90 t.Run("merge two default configs with different salts/keys", func(t *testing.T) { 91 base := &model.Config{} 92 base.SetDefaults() 93 patch := &model.Config{} 94 patch.SetDefaults() 95 96 merged, err := Merge(base, patch, nil) 97 require.NoError(t, err) 98 99 assert.Equal(t, patch, merged) 100 }) 101 t.Run("merge identical configs", func(t *testing.T) { 102 base := &model.Config{} 103 base.SetDefaults() 104 patch := base.Clone() 105 106 merged, err := Merge(base, patch, nil) 107 require.NoError(t, err) 108 109 assert.Equal(t, base, merged) 110 assert.Equal(t, patch, merged) 111 }) 112 t.Run("merge configs with a different setting", func(t *testing.T) { 113 base := &model.Config{} 114 base.SetDefaults() 115 patch := base.Clone() 116 patch.ServiceSettings.SiteURL = model.NewString("http://newhost.ca") 117 118 merged, err := Merge(base, patch, nil) 119 require.NoError(t, err) 120 121 assert.NotEqual(t, base, merged) 122 assert.Equal(t, patch, merged) 123 }) 124 t.Run("merge default config with changes from a mostly nil patch", func(t *testing.T) { 125 base := &model.Config{} 126 base.SetDefaults() 127 patch := &model.Config{} 128 patch.ServiceSettings.SiteURL = model.NewString("http://newhost.ca") 129 patch.GoogleSettings.Enable = model.NewBool(true) 130 131 expected := base.Clone() 132 expected.ServiceSettings.SiteURL = model.NewString("http://newhost.ca") 133 expected.GoogleSettings.Enable = model.NewBool(true) 134 135 merged, err := Merge(base, patch, nil) 136 require.NoError(t, err) 137 138 assert.NotEqual(t, base, merged) 139 assert.NotEqual(t, patch, merged) 140 assert.Equal(t, expected, merged) 141 }) 142 } 143 144 func TestConfigEnvironmentOverrides(t *testing.T) { 145 memstore, err := NewMemoryStore() 146 require.NoError(t, err) 147 base, err := NewStoreFromBacking(memstore, nil, false) 148 require.NoError(t, err) 149 originalConfig := &model.Config{} 150 originalConfig.ServiceSettings.SiteURL = model.NewString("http://notoverriden.ca") 151 152 os.Setenv("MM_SERVICESETTINGS_SITEURL", "http://overridden.ca") 153 defer os.Unsetenv("MM_SERVICESETTINGS_SITEURL") 154 155 t.Run("loading config should respect environment variable overrides", func(t *testing.T) { 156 err := base.Load() 157 require.NoError(t, err) 158 159 assert.Equal(t, "http://overridden.ca", *base.Get().ServiceSettings.SiteURL) 160 }) 161 162 t.Run("setting config should respect environment variable overrides", func(t *testing.T) { 163 _, _, err := base.Set(originalConfig) 164 require.NoError(t, err) 165 166 assert.Equal(t, "http://overridden.ca", *base.Get().ServiceSettings.SiteURL) 167 }) 168 } 169 170 func TestRemoveEnvironmentOverrides(t *testing.T) { 171 os.Setenv("MM_SERVICESETTINGS_SITEURL", "http://overridden.ca") 172 defer os.Unsetenv("MM_SERVICESETTINGS_SITEURL") 173 174 memstore, err := NewMemoryStore() 175 require.NoError(t, err) 176 base, err := NewStoreFromBacking(memstore, nil, false) 177 require.NoError(t, err) 178 oldCfg := base.Get() 179 assert.Equal(t, "http://overridden.ca", *oldCfg.ServiceSettings.SiteURL) 180 newCfg := base.RemoveEnvironmentOverrides(oldCfg) 181 assert.Equal(t, "", *newCfg.ServiceSettings.SiteURL) 182 }