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  }