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 }