github.com/gigforks/mattermost-server@v4.9.1-0.20180619094218-800d97fa55d0+incompatible/model/config_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package model 5 6 import ( 7 "fmt" 8 "reflect" 9 "testing" 10 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestConfigDefaults(t *testing.T) { 16 t.Parallel() 17 18 t.Run("somewhere nil when uninitialized", func(t *testing.T) { 19 c := Config{} 20 require.False(t, checkNowhereNil(t, "config", c)) 21 }) 22 23 t.Run("nowhere nil when initialized", func(t *testing.T) { 24 c := Config{} 25 c.SetDefaults() 26 require.True(t, checkNowhereNil(t, "config", c)) 27 }) 28 29 t.Run("nowhere nil when partially initialized", func(t *testing.T) { 30 var recursivelyUninitialize func(*Config, string, reflect.Value) 31 recursivelyUninitialize = func(config *Config, name string, v reflect.Value) { 32 if v.Type().Kind() == reflect.Ptr { 33 // Set every pointer we find in the tree to nil 34 v.Set(reflect.Zero(v.Type())) 35 require.True(t, v.IsNil()) 36 37 // SetDefaults on the root config should make it non-nil, otherwise 38 // it means that SetDefaults isn't being called recursively in 39 // all cases. 40 config.SetDefaults() 41 if assert.False(t, v.IsNil(), "%s should be non-nil after SetDefaults()", name) { 42 recursivelyUninitialize(config, fmt.Sprintf("(*%s)", name), v.Elem()) 43 } 44 45 } else if v.Type().Kind() == reflect.Struct { 46 for i := 0; i < v.NumField(); i++ { 47 recursivelyUninitialize(config, fmt.Sprintf("%s.%s", name, v.Type().Field(i).Name), v.Field(i)) 48 } 49 } 50 } 51 52 c := Config{} 53 c.SetDefaults() 54 recursivelyUninitialize(&c, "config", reflect.ValueOf(&c).Elem()) 55 }) 56 } 57 58 func TestConfigDefaultFileSettingsDirectory(t *testing.T) { 59 c1 := Config{} 60 c1.SetDefaults() 61 62 if c1.FileSettings.Directory != "./data/" { 63 t.Fatal("FileSettings.Directory should default to './data/'") 64 } 65 } 66 67 func TestConfigDefaultEmailNotificationContentsType(t *testing.T) { 68 c1 := Config{} 69 c1.SetDefaults() 70 71 if *c1.EmailSettings.EmailNotificationContentsType != EMAIL_NOTIFICATION_CONTENTS_FULL { 72 t.Fatal("EmailSettings.EmailNotificationContentsType should default to 'full'") 73 } 74 } 75 76 func TestConfigDefaultFileSettingsS3SSE(t *testing.T) { 77 c1 := Config{} 78 c1.SetDefaults() 79 80 if *c1.FileSettings.AmazonS3SSE { 81 t.Fatal("FileSettings.AmazonS3SSE should default to false") 82 } 83 } 84 85 func TestConfigDefaultServiceSettingsExperimentalGroupUnreadChannels(t *testing.T) { 86 c1 := Config{} 87 c1.SetDefaults() 88 89 if *c1.ServiceSettings.ExperimentalGroupUnreadChannels != GROUP_UNREAD_CHANNELS_DISABLED { 90 t.Fatal("ServiceSettings.ExperimentalGroupUnreadChannels should default to 'disabled'") 91 } 92 93 // This setting was briefly a boolean, so ensure that those values still work as expected 94 c1 = Config{ 95 ServiceSettings: ServiceSettings{ 96 ExperimentalGroupUnreadChannels: NewString("1"), 97 }, 98 } 99 c1.SetDefaults() 100 101 if *c1.ServiceSettings.ExperimentalGroupUnreadChannels != GROUP_UNREAD_CHANNELS_DEFAULT_ON { 102 t.Fatal("ServiceSettings.ExperimentalGroupUnreadChannels should set true to 'default on'") 103 } 104 105 c1 = Config{ 106 ServiceSettings: ServiceSettings{ 107 ExperimentalGroupUnreadChannels: NewString("0"), 108 }, 109 } 110 c1.SetDefaults() 111 112 if *c1.ServiceSettings.ExperimentalGroupUnreadChannels != GROUP_UNREAD_CHANNELS_DISABLED { 113 t.Fatal("ServiceSettings.ExperimentalGroupUnreadChannels should set false to 'disabled'") 114 } 115 } 116 117 func TestMessageExportSettingsIsValidEnableExportNotSet(t *testing.T) { 118 fs := &FileSettings{} 119 mes := &MessageExportSettings{} 120 121 // should fail fast because mes.EnableExport is not set 122 require.Error(t, mes.isValid(*fs)) 123 } 124 125 func TestMessageExportSettingsIsValidEnableExportFalse(t *testing.T) { 126 fs := &FileSettings{} 127 mes := &MessageExportSettings{ 128 EnableExport: NewBool(false), 129 } 130 131 // should fail fast because message export isn't enabled 132 require.Nil(t, mes.isValid(*fs)) 133 } 134 135 func TestMessageExportSettingsIsValidExportFromTimestampInvalid(t *testing.T) { 136 fs := &FileSettings{} 137 mes := &MessageExportSettings{ 138 EnableExport: NewBool(true), 139 } 140 141 // should fail fast because export from timestamp isn't set 142 require.Error(t, mes.isValid(*fs)) 143 144 mes.ExportFromTimestamp = NewInt64(-1) 145 146 // should fail fast because export from timestamp isn't valid 147 require.Error(t, mes.isValid(*fs)) 148 149 mes.ExportFromTimestamp = NewInt64(GetMillis() + 10000) 150 151 // should fail fast because export from timestamp is greater than current time 152 require.Error(t, mes.isValid(*fs)) 153 } 154 155 func TestMessageExportSettingsIsValidDailyRunTimeInvalid(t *testing.T) { 156 fs := &FileSettings{} 157 mes := &MessageExportSettings{ 158 EnableExport: NewBool(true), 159 ExportFromTimestamp: NewInt64(0), 160 } 161 162 // should fail fast because daily runtime isn't set 163 require.Error(t, mes.isValid(*fs)) 164 165 mes.DailyRunTime = NewString("33:33:33") 166 167 // should fail fast because daily runtime is invalid format 168 require.Error(t, mes.isValid(*fs)) 169 } 170 171 func TestMessageExportSettingsIsValidBatchSizeInvalid(t *testing.T) { 172 fs := &FileSettings{ 173 DriverName: NewString("foo"), // bypass file location check 174 } 175 mes := &MessageExportSettings{ 176 EnableExport: NewBool(true), 177 ExportFromTimestamp: NewInt64(0), 178 DailyRunTime: NewString("15:04"), 179 } 180 181 // should fail fast because batch size isn't set 182 require.Error(t, mes.isValid(*fs)) 183 } 184 185 func TestMessageExportSettingsIsValidExportFormatInvalid(t *testing.T) { 186 fs := &FileSettings{ 187 DriverName: NewString("foo"), // bypass file location check 188 } 189 mes := &MessageExportSettings{ 190 EnableExport: NewBool(true), 191 ExportFromTimestamp: NewInt64(0), 192 DailyRunTime: NewString("15:04"), 193 BatchSize: NewInt(100), 194 } 195 196 // should fail fast because export format isn't set 197 require.Error(t, mes.isValid(*fs)) 198 } 199 200 func TestMessageExportSettingsIsValidGlobalRelayEmailAddressInvalid(t *testing.T) { 201 fs := &FileSettings{ 202 DriverName: NewString("foo"), // bypass file location check 203 } 204 mes := &MessageExportSettings{ 205 EnableExport: NewBool(true), 206 ExportFormat: NewString(COMPLIANCE_EXPORT_TYPE_GLOBALRELAY), 207 ExportFromTimestamp: NewInt64(0), 208 DailyRunTime: NewString("15:04"), 209 BatchSize: NewInt(100), 210 } 211 212 // should fail fast because global relay email address isn't set 213 require.Error(t, mes.isValid(*fs)) 214 } 215 216 func TestMessageExportSettingsIsValidActiance(t *testing.T) { 217 fs := &FileSettings{ 218 DriverName: NewString("foo"), // bypass file location check 219 } 220 mes := &MessageExportSettings{ 221 EnableExport: NewBool(true), 222 ExportFormat: NewString(COMPLIANCE_EXPORT_TYPE_ACTIANCE), 223 ExportFromTimestamp: NewInt64(0), 224 DailyRunTime: NewString("15:04"), 225 BatchSize: NewInt(100), 226 } 227 228 // should pass because everything is valid 229 require.Nil(t, mes.isValid(*fs)) 230 } 231 232 func TestMessageExportSettingsIsValidGlobalRelaySettingsMissing(t *testing.T) { 233 fs := &FileSettings{ 234 DriverName: NewString("foo"), // bypass file location check 235 } 236 mes := &MessageExportSettings{ 237 EnableExport: NewBool(true), 238 ExportFormat: NewString(COMPLIANCE_EXPORT_TYPE_GLOBALRELAY), 239 ExportFromTimestamp: NewInt64(0), 240 DailyRunTime: NewString("15:04"), 241 BatchSize: NewInt(100), 242 } 243 244 // should fail because globalrelay settings are missing 245 require.Error(t, mes.isValid(*fs)) 246 } 247 248 func TestMessageExportSettingsIsValidGlobalRelaySettingsInvalidCustomerType(t *testing.T) { 249 fs := &FileSettings{ 250 DriverName: NewString("foo"), // bypass file location check 251 } 252 mes := &MessageExportSettings{ 253 EnableExport: NewBool(true), 254 ExportFormat: NewString(COMPLIANCE_EXPORT_TYPE_GLOBALRELAY), 255 ExportFromTimestamp: NewInt64(0), 256 DailyRunTime: NewString("15:04"), 257 BatchSize: NewInt(100), 258 GlobalRelaySettings: &GlobalRelayMessageExportSettings{ 259 CustomerType: NewString("Invalid"), 260 EmailAddress: NewString("valid@mattermost.com"), 261 SmtpUsername: NewString("SomeUsername"), 262 SmtpPassword: NewString("SomePassword"), 263 }, 264 } 265 266 // should fail because customer type is invalid 267 require.Error(t, mes.isValid(*fs)) 268 } 269 270 // func TestMessageExportSettingsIsValidGlobalRelaySettingsInvalidEmailAddress(t *testing.T) { 271 func TestMessageExportSettingsGlobalRelaySettings(t *testing.T) { 272 fs := &FileSettings{ 273 DriverName: NewString("foo"), // bypass file location check 274 } 275 tests := []struct { 276 name string 277 value *GlobalRelayMessageExportSettings 278 success bool 279 }{ 280 { 281 "Invalid email address", 282 &GlobalRelayMessageExportSettings{ 283 CustomerType: NewString(GLOBALRELAY_CUSTOMER_TYPE_A9), 284 EmailAddress: NewString("invalidEmailAddress"), 285 SmtpUsername: NewString("SomeUsername"), 286 SmtpPassword: NewString("SomePassword"), 287 }, 288 false, 289 }, 290 { 291 "Missing smtp username", 292 &GlobalRelayMessageExportSettings{ 293 CustomerType: NewString(GLOBALRELAY_CUSTOMER_TYPE_A10), 294 EmailAddress: NewString("valid@mattermost.com"), 295 SmtpPassword: NewString("SomePassword"), 296 }, 297 false, 298 }, 299 { 300 "Invalid smtp username", 301 &GlobalRelayMessageExportSettings{ 302 CustomerType: NewString(GLOBALRELAY_CUSTOMER_TYPE_A10), 303 EmailAddress: NewString("valid@mattermost.com"), 304 SmtpUsername: NewString(""), 305 SmtpPassword: NewString("SomePassword"), 306 }, 307 false, 308 }, 309 { 310 "Invalid smtp password", 311 &GlobalRelayMessageExportSettings{ 312 CustomerType: NewString(GLOBALRELAY_CUSTOMER_TYPE_A10), 313 EmailAddress: NewString("valid@mattermost.com"), 314 SmtpUsername: NewString("SomeUsername"), 315 SmtpPassword: NewString(""), 316 }, 317 false, 318 }, 319 { 320 "Valid data", 321 &GlobalRelayMessageExportSettings{ 322 CustomerType: NewString(GLOBALRELAY_CUSTOMER_TYPE_A9), 323 EmailAddress: NewString("valid@mattermost.com"), 324 SmtpUsername: NewString("SomeUsername"), 325 SmtpPassword: NewString("SomePassword"), 326 }, 327 true, 328 }, 329 } 330 331 for _, tt := range tests { 332 t.Run(tt.name, func(t *testing.T) { 333 mes := &MessageExportSettings{ 334 EnableExport: NewBool(true), 335 ExportFormat: NewString(COMPLIANCE_EXPORT_TYPE_GLOBALRELAY), 336 ExportFromTimestamp: NewInt64(0), 337 DailyRunTime: NewString("15:04"), 338 BatchSize: NewInt(100), 339 GlobalRelaySettings: tt.value, 340 } 341 342 if tt.success { 343 require.Nil(t, mes.isValid(*fs)) 344 } else { 345 require.Error(t, mes.isValid(*fs)) 346 } 347 }) 348 } 349 } 350 351 func TestMessageExportSetDefaults(t *testing.T) { 352 mes := &MessageExportSettings{} 353 mes.SetDefaults() 354 355 require.False(t, *mes.EnableExport) 356 require.Equal(t, "01:00", *mes.DailyRunTime) 357 require.Equal(t, int64(0), *mes.ExportFromTimestamp) 358 require.Equal(t, 10000, *mes.BatchSize) 359 require.Equal(t, COMPLIANCE_EXPORT_TYPE_ACTIANCE, *mes.ExportFormat) 360 } 361 362 func TestMessageExportSetDefaultsExportEnabledExportFromTimestampNil(t *testing.T) { 363 mes := &MessageExportSettings{ 364 EnableExport: NewBool(true), 365 } 366 mes.SetDefaults() 367 368 require.True(t, *mes.EnableExport) 369 require.Equal(t, "01:00", *mes.DailyRunTime) 370 require.NotEqual(t, int64(0), *mes.ExportFromTimestamp) 371 require.True(t, *mes.ExportFromTimestamp <= GetMillis()) 372 require.Equal(t, 10000, *mes.BatchSize) 373 } 374 375 func TestMessageExportSetDefaultsExportEnabledExportFromTimestampZero(t *testing.T) { 376 mes := &MessageExportSettings{ 377 EnableExport: NewBool(true), 378 ExportFromTimestamp: NewInt64(0), 379 } 380 mes.SetDefaults() 381 382 require.True(t, *mes.EnableExport) 383 require.Equal(t, "01:00", *mes.DailyRunTime) 384 require.NotEqual(t, int64(0), *mes.ExportFromTimestamp) 385 require.True(t, *mes.ExportFromTimestamp <= GetMillis()) 386 require.Equal(t, 10000, *mes.BatchSize) 387 } 388 389 func TestMessageExportSetDefaultsExportEnabledExportFromTimestampNonZero(t *testing.T) { 390 mes := &MessageExportSettings{ 391 EnableExport: NewBool(true), 392 ExportFromTimestamp: NewInt64(12345), 393 } 394 mes.SetDefaults() 395 396 require.True(t, *mes.EnableExport) 397 require.Equal(t, "01:00", *mes.DailyRunTime) 398 require.Equal(t, int64(12345), *mes.ExportFromTimestamp) 399 require.Equal(t, 10000, *mes.BatchSize) 400 } 401 402 func TestMessageExportSetDefaultsExportDisabledExportFromTimestampNil(t *testing.T) { 403 mes := &MessageExportSettings{ 404 EnableExport: NewBool(false), 405 } 406 mes.SetDefaults() 407 408 require.False(t, *mes.EnableExport) 409 require.Equal(t, "01:00", *mes.DailyRunTime) 410 require.Equal(t, int64(0), *mes.ExportFromTimestamp) 411 require.Equal(t, 10000, *mes.BatchSize) 412 } 413 414 func TestMessageExportSetDefaultsExportDisabledExportFromTimestampZero(t *testing.T) { 415 mes := &MessageExportSettings{ 416 EnableExport: NewBool(false), 417 ExportFromTimestamp: NewInt64(0), 418 } 419 mes.SetDefaults() 420 421 require.False(t, *mes.EnableExport) 422 require.Equal(t, "01:00", *mes.DailyRunTime) 423 require.Equal(t, int64(0), *mes.ExportFromTimestamp) 424 require.Equal(t, 10000, *mes.BatchSize) 425 } 426 427 func TestMessageExportSetDefaultsExportDisabledExportFromTimestampNonZero(t *testing.T) { 428 mes := &MessageExportSettings{ 429 EnableExport: NewBool(false), 430 ExportFromTimestamp: NewInt64(12345), 431 } 432 mes.SetDefaults() 433 434 require.False(t, *mes.EnableExport) 435 require.Equal(t, "01:00", *mes.DailyRunTime) 436 require.Equal(t, int64(0), *mes.ExportFromTimestamp) 437 require.Equal(t, 10000, *mes.BatchSize) 438 }