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