github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/app/import_validators_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package app 5 6 import ( 7 "fmt" 8 "path/filepath" 9 "strings" 10 "testing" 11 12 "github.com/stretchr/testify/require" 13 14 "github.com/mattermost/mattermost-server/v5/model" 15 "github.com/mattermost/mattermost-server/v5/utils/fileutils" 16 "github.com/stretchr/testify/assert" 17 ) 18 19 func TestImportValidateSchemeImportData(t *testing.T) { 20 // Test with minimum required valid properties and team scope. 21 data := SchemeImportData{ 22 Name: ptrStr("name"), 23 DisplayName: ptrStr("display name"), 24 Scope: ptrStr("team"), 25 DefaultTeamAdminRole: &RoleImportData{ 26 Name: ptrStr("name"), 27 DisplayName: ptrStr("display name"), 28 Permissions: &[]string{"invite_user"}, 29 }, 30 DefaultTeamUserRole: &RoleImportData{ 31 Name: ptrStr("name"), 32 DisplayName: ptrStr("display name"), 33 Permissions: &[]string{"invite_user"}, 34 }, 35 DefaultTeamGuestRole: &RoleImportData{ 36 Name: ptrStr("name"), 37 DisplayName: ptrStr("display name"), 38 Permissions: &[]string{"invite_user"}, 39 }, 40 DefaultChannelAdminRole: &RoleImportData{ 41 Name: ptrStr("name"), 42 DisplayName: ptrStr("display name"), 43 Permissions: &[]string{"invite_user"}, 44 }, 45 DefaultChannelUserRole: &RoleImportData{ 46 Name: ptrStr("name"), 47 DisplayName: ptrStr("display name"), 48 Permissions: &[]string{"invite_user"}, 49 }, 50 DefaultChannelGuestRole: &RoleImportData{ 51 Name: ptrStr("name"), 52 DisplayName: ptrStr("display name"), 53 Permissions: &[]string{"invite_user"}, 54 }, 55 } 56 57 err := validateSchemeImportData(&data) 58 require.Nil(t, err, "Validation failed but should have been valid.") 59 60 // Test with various invalid names. 61 data.Name = nil 62 err = validateSchemeImportData(&data) 63 require.NotNil(t, err, "Should have failed due to invalid name.") 64 65 // Test with empty string 66 data.Name = ptrStr("") 67 err = validateSchemeImportData(&data) 68 require.NotNil(t, err, "Should have failed due to invalid name.") 69 70 // Test with numbers 71 data.Name = ptrStr(strings.Repeat("1234567890", 100)) 72 err = validateSchemeImportData(&data) 73 require.NotNil(t, err, "Should have failed due to invalid name.") 74 75 data.Name = ptrStr("name") 76 77 // Test with invalid display name. 78 data.DisplayName = nil 79 err = validateSchemeImportData(&data) 80 require.NotNil(t, err, "Should have failed due to invalid display name.") 81 82 // Test with display name. 83 data.DisplayName = ptrStr("") 84 err = validateSchemeImportData(&data) 85 require.NotNil(t, err, "Should have failed due to invalid display name.") 86 87 // Test display name with numbers 88 data.DisplayName = ptrStr(strings.Repeat("1234567890", 100)) 89 err = validateSchemeImportData(&data) 90 require.NotNil(t, err, "Should have failed due to invalid display name.") 91 92 data.DisplayName = ptrStr("display name") 93 94 // Test with various missing roles. 95 data.DefaultTeamAdminRole = nil 96 err = validateSchemeImportData(&data) 97 require.NotNil(t, err, "Should have failed due to missing role.") 98 99 data.DefaultTeamAdminRole = &RoleImportData{ 100 Name: ptrStr("name"), 101 DisplayName: ptrStr("display name"), 102 Permissions: &[]string{"invite_user"}, 103 } 104 105 data.DefaultTeamUserRole = nil 106 err = validateSchemeImportData(&data) 107 require.NotNil(t, err, "Should have failed due to missing role.") 108 109 data.DefaultTeamUserRole = &RoleImportData{ 110 Name: ptrStr("name"), 111 DisplayName: ptrStr("display name"), 112 Permissions: &[]string{"invite_user"}, 113 } 114 data.DefaultChannelAdminRole = nil 115 err = validateSchemeImportData(&data) 116 require.NotNil(t, err, "Should have failed due to missing role.") 117 118 data.DefaultChannelAdminRole = &RoleImportData{ 119 Name: ptrStr("name"), 120 DisplayName: ptrStr("display name"), 121 Permissions: &[]string{"invite_user"}, 122 } 123 data.DefaultChannelUserRole = nil 124 err = validateSchemeImportData(&data) 125 require.NotNil(t, err, "Should have failed due to missing role.") 126 127 data.DefaultChannelUserRole = &RoleImportData{ 128 Name: ptrStr("name"), 129 DisplayName: ptrStr("display name"), 130 Permissions: &[]string{"invite_user"}, 131 } 132 133 // Test with various invalid roles. 134 data.DefaultTeamAdminRole.Name = nil 135 err = validateSchemeImportData(&data) 136 require.NotNil(t, err, "Should have failed due to invalid role.") 137 138 data.DefaultTeamAdminRole.Name = ptrStr("name") 139 data.DefaultTeamUserRole.Name = nil 140 err = validateSchemeImportData(&data) 141 require.NotNil(t, err, "Should have failed due to invalid role.") 142 143 data.DefaultTeamUserRole.Name = ptrStr("name") 144 data.DefaultChannelAdminRole.Name = nil 145 err = validateSchemeImportData(&data) 146 require.NotNil(t, err, "Should have failed due to invalid role.") 147 148 data.DefaultChannelAdminRole.Name = ptrStr("name") 149 data.DefaultChannelUserRole.Name = nil 150 err = validateSchemeImportData(&data) 151 require.NotNil(t, err, "Should have failed due to invalid role.") 152 153 data.DefaultChannelUserRole.Name = ptrStr("name") 154 155 // Change to a Channel scope role, and check with missing or extra roles again. 156 data.Scope = ptrStr("channel") 157 data.DefaultTeamAdminRole = nil 158 err = validateSchemeImportData(&data) 159 require.NotNil(t, err, "Should have failed due to spurious role.") 160 161 data.DefaultTeamAdminRole = &RoleImportData{ 162 Name: ptrStr("name"), 163 DisplayName: ptrStr("display name"), 164 Permissions: &[]string{"invite_user"}, 165 } 166 data.DefaultTeamUserRole = nil 167 err = validateSchemeImportData(&data) 168 require.NotNil(t, err, "Should have failed due to spurious role.") 169 170 data.DefaultTeamUserRole = &RoleImportData{ 171 Name: ptrStr("name"), 172 DisplayName: ptrStr("display name"), 173 Permissions: &[]string{"invite_user"}, 174 } 175 data.DefaultTeamGuestRole = nil 176 err = validateSchemeImportData(&data) 177 require.NotNil(t, err, "Should have failed due to spurious role.") 178 179 data.DefaultTeamGuestRole = nil 180 data.DefaultTeamUserRole = nil 181 data.DefaultTeamAdminRole = nil 182 err = validateSchemeImportData(&data) 183 require.Nil(t, err, "Should have succeeded.") 184 185 // Test with all combinations of optional parameters. 186 data.Description = ptrStr(strings.Repeat("1234567890", 1024)) 187 err = validateSchemeImportData(&data) 188 require.NotNil(t, err, "Should have failed due to invalid description.") 189 190 data.Description = ptrStr("description") 191 err = validateSchemeImportData(&data) 192 require.Nil(t, err, "Should have succeeded.") 193 } 194 195 func TestImportValidateRoleImportData(t *testing.T) { 196 // Test with minimum required valid properties. 197 data := RoleImportData{ 198 Name: ptrStr("name"), 199 DisplayName: ptrStr("display name"), 200 } 201 err := validateRoleImportData(&data) 202 require.Nil(t, err, "Validation failed but should have been valid.") 203 204 // Test with various invalid names. 205 data.Name = nil 206 err = validateRoleImportData(&data) 207 require.NotNil(t, err, "Should have failed due to invalid name.") 208 209 data.Name = ptrStr("") 210 err = validateRoleImportData(&data) 211 require.NotNil(t, err, "Should have failed due to invalid name.") 212 213 data.Name = ptrStr(strings.Repeat("1234567890", 100)) 214 err = validateRoleImportData(&data) 215 require.NotNil(t, err, "Should have failed due to invalid name.") 216 217 data.Name = ptrStr("name") 218 219 // Test with invalid display name. 220 data.DisplayName = nil 221 err = validateRoleImportData(&data) 222 require.NotNil(t, err, "Should have failed due to invalid display name.") 223 224 data.DisplayName = ptrStr("") 225 err = validateRoleImportData(&data) 226 require.NotNil(t, err, "Should have failed due to invalid display name.") 227 228 data.DisplayName = ptrStr(strings.Repeat("1234567890", 100)) 229 err = validateRoleImportData(&data) 230 require.NotNil(t, err, "Should have failed due to invalid display name.") 231 232 data.DisplayName = ptrStr("display name") 233 234 // Test with various valid/invalid permissions. 235 data.Permissions = &[]string{} 236 err = validateRoleImportData(&data) 237 require.Nil(t, err, "Validation failed but should have been valid.") 238 239 data.Permissions = &[]string{"invite_user", "add_user_to_team"} 240 err = validateRoleImportData(&data) 241 require.Nil(t, err, "Validation failed but should have been valid.") 242 243 data.Permissions = &[]string{"invite_user", "add_user_to_team", "derp"} 244 err = validateRoleImportData(&data) 245 require.NotNil(t, err, "Validation should have failed due to invalid permission.") 246 247 data.Permissions = &[]string{"invite_user", "add_user_to_team"} 248 249 // Test with various valid/invalid descriptions. 250 data.Description = ptrStr(strings.Repeat("1234567890", 1024)) 251 err = validateRoleImportData(&data) 252 require.NotNil(t, err, "Validation should have failed due to invalid description.") 253 254 data.Description = ptrStr("description") 255 err = validateRoleImportData(&data) 256 require.Nil(t, err, "Validation failed but should have been valid.") 257 } 258 259 func TestImportValidateTeamImportData(t *testing.T) { 260 261 // Test with minimum required valid properties. 262 data := TeamImportData{ 263 Name: ptrStr("teamname"), 264 DisplayName: ptrStr("Display Name"), 265 Type: ptrStr("O"), 266 } 267 err := validateTeamImportData(&data) 268 require.Nil(t, err, "Validation failed but should have been valid.") 269 270 // Test with various invalid names. 271 data = TeamImportData{ 272 DisplayName: ptrStr("Display Name"), 273 Type: ptrStr("O"), 274 } 275 err = validateTeamImportData(&data) 276 require.NotNil(t, err, "Should have failed due to missing name.") 277 278 data.Name = ptrStr(strings.Repeat("abcdefghij", 7)) 279 err = validateTeamImportData(&data) 280 require.NotNil(t, err, "Should have failed due to too long name.") 281 282 data.Name = ptrStr("login") 283 err = validateTeamImportData(&data) 284 require.NotNil(t, err, "Should have failed due to reserved word in name.") 285 286 data.Name = ptrStr("Test::''ASD") 287 err = validateTeamImportData(&data) 288 require.NotNil(t, err, "Should have failed due to non alphanum characters in name.") 289 290 data.Name = ptrStr("A") 291 err = validateTeamImportData(&data) 292 require.NotNil(t, err, "Should have failed due to short name.") 293 294 // Test team various invalid display names. 295 data = TeamImportData{ 296 Name: ptrStr("teamname"), 297 Type: ptrStr("O"), 298 } 299 err = validateTeamImportData(&data) 300 require.NotNil(t, err, "Should have failed due to missing display_name.") 301 302 data.DisplayName = ptrStr("") 303 err = validateTeamImportData(&data) 304 require.NotNil(t, err, "Should have failed due to empty display_name.") 305 306 data.DisplayName = ptrStr(strings.Repeat("abcdefghij", 7)) 307 err = validateTeamImportData(&data) 308 require.NotNil(t, err, "Should have failed due to too long display_name.") 309 310 // Test with various valid and invalid types. 311 data = TeamImportData{ 312 Name: ptrStr("teamname"), 313 DisplayName: ptrStr("Display Name"), 314 } 315 err = validateTeamImportData(&data) 316 require.NotNil(t, err, "Should have failed due to missing type.") 317 318 data.Type = ptrStr("A") 319 err = validateTeamImportData(&data) 320 require.NotNil(t, err, "Should have failed due to invalid type.") 321 322 data.Type = ptrStr("I") 323 err = validateTeamImportData(&data) 324 require.Nil(t, err, "Should have succeeded with valid type.") 325 326 // Test with all the combinations of optional parameters. 327 data = TeamImportData{ 328 Name: ptrStr("teamname"), 329 DisplayName: ptrStr("Display Name"), 330 Type: ptrStr("O"), 331 Description: ptrStr("The team description."), 332 AllowOpenInvite: ptrBool(true), 333 } 334 err = validateTeamImportData(&data) 335 require.Nil(t, err, "Should have succeeded with valid optional properties.") 336 337 data.AllowOpenInvite = ptrBool(false) 338 err = validateTeamImportData(&data) 339 require.Nil(t, err, "Should have succeeded with allow open invites false.") 340 341 data.Description = ptrStr(strings.Repeat("abcdefghij ", 26)) 342 err = validateTeamImportData(&data) 343 require.NotNil(t, err, "Should have failed due to too long description.") 344 345 // Test with an empty scheme name. 346 data.Description = ptrStr("abcdefg") 347 data.Scheme = ptrStr("") 348 err = validateTeamImportData(&data) 349 require.NotNil(t, err, "Should have failed due to empty scheme name.") 350 351 // Test with a valid scheme name. 352 data.Scheme = ptrStr("abcdefg") 353 err = validateTeamImportData(&data) 354 require.Nil(t, err, "Should have succeeded with valid scheme name.") 355 } 356 357 func TestImportValidateChannelImportData(t *testing.T) { 358 359 // Test with minimum required valid properties. 360 data := ChannelImportData{ 361 Team: ptrStr("teamname"), 362 Name: ptrStr("channelname"), 363 DisplayName: ptrStr("Display Name"), 364 Type: ptrStr("O"), 365 } 366 err := validateChannelImportData(&data) 367 require.Nil(t, err, "Validation failed but should have been valid.") 368 369 // Test with missing team. 370 data = ChannelImportData{ 371 Name: ptrStr("channelname"), 372 DisplayName: ptrStr("Display Name"), 373 Type: ptrStr("O"), 374 } 375 err = validateChannelImportData(&data) 376 require.NotNil(t, err, "Should have failed due to missing team.") 377 378 // Test with various invalid names. 379 data = ChannelImportData{ 380 Team: ptrStr("teamname"), 381 DisplayName: ptrStr("Display Name"), 382 Type: ptrStr("O"), 383 } 384 err = validateChannelImportData(&data) 385 require.NotNil(t, err, "Should have failed due to missing name.") 386 387 data.Name = ptrStr(strings.Repeat("abcdefghij", 7)) 388 err = validateChannelImportData(&data) 389 require.NotNil(t, err, "Should have failed due to too long name.") 390 391 data.Name = ptrStr("Test::''ASD") 392 err = validateChannelImportData(&data) 393 require.NotNil(t, err, "Should have failed due to non alphanum characters in name.") 394 395 data.Name = ptrStr("A") 396 err = validateChannelImportData(&data) 397 require.NotNil(t, err, "Should have failed due to short name.") 398 399 // Test team various invalid display names. 400 data = ChannelImportData{ 401 Team: ptrStr("teamname"), 402 Name: ptrStr("channelname"), 403 Type: ptrStr("O"), 404 } 405 err = validateChannelImportData(&data) 406 require.NotNil(t, err, "Should have failed due to missing display_name.") 407 408 data.DisplayName = ptrStr("") 409 err = validateChannelImportData(&data) 410 require.NotNil(t, err, "Should have failed due to empty display_name.") 411 412 data.DisplayName = ptrStr(strings.Repeat("abcdefghij", 7)) 413 err = validateChannelImportData(&data) 414 require.NotNil(t, err, "Should have failed due to too long display_name.") 415 416 // Test with various valid and invalid types. 417 data = ChannelImportData{ 418 Team: ptrStr("teamname"), 419 Name: ptrStr("channelname"), 420 DisplayName: ptrStr("Display Name"), 421 } 422 err = validateChannelImportData(&data) 423 require.NotNil(t, err, "Should have failed due to missing type.") 424 425 data.Type = ptrStr("A") 426 err = validateChannelImportData(&data) 427 require.NotNil(t, err, "Should have failed due to invalid type.") 428 429 data.Type = ptrStr("P") 430 err = validateChannelImportData(&data) 431 require.Nil(t, err, "Should have succeeded with valid type.") 432 433 // Test with all the combinations of optional parameters. 434 data = ChannelImportData{ 435 Team: ptrStr("teamname"), 436 Name: ptrStr("channelname"), 437 DisplayName: ptrStr("Display Name"), 438 Type: ptrStr("O"), 439 Header: ptrStr("Channel Header Here"), 440 Purpose: ptrStr("Channel Purpose Here"), 441 } 442 err = validateChannelImportData(&data) 443 require.Nil(t, err, "Should have succeeded with valid optional properties.") 444 445 data.Header = ptrStr(strings.Repeat("abcdefghij ", 103)) 446 err = validateChannelImportData(&data) 447 require.NotNil(t, err, "Should have failed due to too long header.") 448 449 data.Header = ptrStr("Channel Header Here") 450 data.Purpose = ptrStr(strings.Repeat("abcdefghij ", 26)) 451 err = validateChannelImportData(&data) 452 require.NotNil(t, err, "Should have failed due to too long purpose.") 453 454 // Test with an empty scheme name. 455 data.Purpose = ptrStr("abcdefg") 456 data.Scheme = ptrStr("") 457 err = validateChannelImportData(&data) 458 require.NotNil(t, err, "Should have failed due to empty scheme name.") 459 460 // Test with a valid scheme name. 461 data.Scheme = ptrStr("abcdefg") 462 err = validateChannelImportData(&data) 463 require.Nil(t, err, "Should have succeeded with valid scheme name.") 464 } 465 466 func TestImportValidateUserImportData(t *testing.T) { 467 468 // Test with minimum required valid properties. 469 data := UserImportData{ 470 Username: ptrStr("bob"), 471 Email: ptrStr("bob@example.com"), 472 } 473 err := validateUserImportData(&data) 474 require.Nil(t, err, "Validation failed but should have been valid.") 475 476 // Invalid Usernames. 477 data.Username = nil 478 err = validateUserImportData(&data) 479 require.NotNil(t, err, "Validation should have failed due to nil Username.") 480 481 data.Username = ptrStr("") 482 err = validateUserImportData(&data) 483 require.NotNil(t, err, "Validation should have failed due to 0 length Username.") 484 485 data.Username = ptrStr(strings.Repeat("abcdefghij", 7)) 486 err = validateUserImportData(&data) 487 require.NotNil(t, err, "Validation should have failed due to too long Username.") 488 489 data.Username = ptrStr("i am a username with spaces and !!!") 490 err = validateUserImportData(&data) 491 require.NotNil(t, err, "Validation should have failed due to invalid characters in Username.") 492 493 data.Username = ptrStr("bob") 494 495 // Unexisting Picture Image 496 data.ProfileImage = ptrStr("not-existing-file") 497 err = validateUserImportData(&data) 498 require.NotNil(t, err, "Validation should have failed due to not existing profile image file.") 499 500 data.ProfileImage = nil 501 502 // Invalid Emails 503 data.Email = nil 504 err = validateUserImportData(&data) 505 require.NotNil(t, err, "Validation should have failed due to nil Email.") 506 507 data.Email = ptrStr("") 508 err = validateUserImportData(&data) 509 require.NotNil(t, err, "Validation should have failed due to 0 length Email.") 510 511 data.Email = ptrStr(strings.Repeat("abcdefghij", 13)) 512 err = validateUserImportData(&data) 513 require.NotNil(t, err, "Validation should have failed due to too long Email.") 514 515 data.Email = ptrStr("bob@example.com") 516 517 // Empty AuthService indicates user/password auth. 518 data.AuthService = ptrStr("") 519 checkNoError(t, validateUserImportData(&data)) 520 521 data.AuthService = ptrStr("saml") 522 data.AuthData = ptrStr(strings.Repeat("abcdefghij", 15)) 523 err = validateUserImportData(&data) 524 require.NotNil(t, err, "Validation should have failed due to too long auth data.") 525 526 data.AuthData = ptrStr("bobbytables") 527 err = validateUserImportData(&data) 528 require.Nil(t, err, "Validation should have succeeded with valid auth service and auth data.") 529 530 // Test a valid User with all fields populated. 531 testsDir, _ := fileutils.FindDir("tests") 532 data = UserImportData{ 533 ProfileImage: ptrStr(filepath.Join(testsDir, "test.png")), 534 Username: ptrStr("bob"), 535 Email: ptrStr("bob@example.com"), 536 AuthService: ptrStr("ldap"), 537 AuthData: ptrStr("bob"), 538 Nickname: ptrStr("BobNick"), 539 FirstName: ptrStr("Bob"), 540 LastName: ptrStr("Blob"), 541 Position: ptrStr("The Boss"), 542 Roles: ptrStr("system_user"), 543 Locale: ptrStr("en"), 544 } 545 err = validateUserImportData(&data) 546 require.Nil(t, err, "Validation failed but should have been valid.") 547 548 // Test various invalid optional field values. 549 data.Nickname = ptrStr(strings.Repeat("abcdefghij", 7)) 550 err = validateUserImportData(&data) 551 require.NotNil(t, err, "Validation should have failed due to too long Nickname.") 552 553 data.Nickname = ptrStr("BobNick") 554 555 data.FirstName = ptrStr(strings.Repeat("abcdefghij", 7)) 556 err = validateUserImportData(&data) 557 require.NotNil(t, err, "Validation should have failed due to too long First Name.") 558 559 data.FirstName = ptrStr("Bob") 560 561 data.LastName = ptrStr(strings.Repeat("abcdefghij", 7)) 562 err = validateUserImportData(&data) 563 require.NotNil(t, err, "Validation should have failed due to too long Last name.") 564 565 data.LastName = ptrStr("Blob") 566 567 data.Position = ptrStr(strings.Repeat("abcdefghij", 13)) 568 err = validateUserImportData(&data) 569 require.NotNil(t, err, "Validation should have failed due to too long Position.") 570 571 data.Position = ptrStr("The Boss") 572 573 data.Roles = nil 574 err = validateUserImportData(&data) 575 require.Nil(t, err, "Validation failed but should have been valid.") 576 577 data.Roles = ptrStr("") 578 err = validateUserImportData(&data) 579 require.Nil(t, err, "Validation failed but should have been valid.") 580 581 data.Roles = ptrStr("system_user") 582 583 // Try various valid/invalid notify props. 584 data.NotifyProps = &UserNotifyPropsImportData{} 585 586 data.NotifyProps.Desktop = ptrStr("invalid") 587 checkError(t, validateUserImportData(&data)) 588 589 data.NotifyProps.Desktop = ptrStr(model.USER_NOTIFY_ALL) 590 data.NotifyProps.DesktopSound = ptrStr("invalid") 591 checkError(t, validateUserImportData(&data)) 592 593 data.NotifyProps.DesktopSound = ptrStr("true") 594 data.NotifyProps.Email = ptrStr("invalid") 595 checkError(t, validateUserImportData(&data)) 596 597 data.NotifyProps.Email = ptrStr("true") 598 data.NotifyProps.Mobile = ptrStr("invalid") 599 checkError(t, validateUserImportData(&data)) 600 601 data.NotifyProps.Mobile = ptrStr(model.USER_NOTIFY_ALL) 602 data.NotifyProps.MobilePushStatus = ptrStr("invalid") 603 checkError(t, validateUserImportData(&data)) 604 605 data.NotifyProps.MobilePushStatus = ptrStr(model.STATUS_ONLINE) 606 data.NotifyProps.ChannelTrigger = ptrStr("invalid") 607 checkError(t, validateUserImportData(&data)) 608 609 data.NotifyProps.ChannelTrigger = ptrStr("true") 610 data.NotifyProps.CommentsTrigger = ptrStr("invalid") 611 checkError(t, validateUserImportData(&data)) 612 613 data.NotifyProps.CommentsTrigger = ptrStr(model.COMMENTS_NOTIFY_ROOT) 614 data.NotifyProps.MentionKeys = ptrStr("valid") 615 checkNoError(t, validateUserImportData(&data)) 616 617 //Test the emai batching interval validators 618 //Happy paths 619 data.EmailInterval = ptrStr("immediately") 620 checkNoError(t, validateUserImportData(&data)) 621 622 data.EmailInterval = ptrStr("fifteen") 623 checkNoError(t, validateUserImportData(&data)) 624 625 data.EmailInterval = ptrStr("hour") 626 checkNoError(t, validateUserImportData(&data)) 627 628 //Invalid values 629 data.EmailInterval = ptrStr("invalid") 630 checkError(t, validateUserImportData(&data)) 631 632 data.EmailInterval = ptrStr("") 633 checkError(t, validateUserImportData(&data)) 634 } 635 636 func TestImportValidateUserAuth(t *testing.T) { 637 tests := []struct { 638 authService *string 639 authData *string 640 isValid bool 641 }{ 642 {nil, nil, true}, 643 {ptrStr(""), ptrStr(""), true}, 644 {ptrStr("foo"), ptrStr("foo"), true}, 645 {nil, ptrStr(""), true}, 646 {ptrStr(""), nil, true}, 647 648 {ptrStr("foo"), nil, false}, 649 {ptrStr("foo"), ptrStr(""), false}, 650 {nil, ptrStr("foo"), false}, 651 {ptrStr(""), ptrStr("foo"), false}, 652 } 653 654 for _, test := range tests { 655 data := UserImportData{ 656 Username: ptrStr("bob"), 657 Email: ptrStr("bob@example.com"), 658 AuthService: test.authService, 659 AuthData: test.authData, 660 } 661 err := validateUserImportData(&data) 662 663 if test.isValid { 664 require.Nil(t, err, fmt.Sprintf("authService: %v, authData: %v", test.authService, test.authData)) 665 } else { 666 require.NotNil(t, err, fmt.Sprintf("authService: %v, authData: %v", test.authService, test.authData)) 667 require.Equal(t, "app.import.validate_user_import_data.auth_data_and_service_dependency.error", err.Id) 668 } 669 } 670 671 } 672 673 func TestImportValidateUserTeamsImportData(t *testing.T) { 674 675 // Invalid Name. 676 data := []UserTeamImportData{ 677 { 678 Roles: ptrStr("team_admin team_user"), 679 }, 680 } 681 err := validateUserTeamsImportData(&data) 682 require.NotNil(t, err, "Should have failed due to invalid name.") 683 684 data[0].Name = ptrStr("teamname") 685 686 // Valid (nil roles) 687 data[0].Roles = nil 688 err = validateUserTeamsImportData(&data) 689 require.Nil(t, err, "Should have succeeded with empty roles.") 690 691 // Valid (empty roles) 692 data[0].Roles = ptrStr("") 693 err = validateUserTeamsImportData(&data) 694 require.Nil(t, err, "Should have succeeded with empty roles.") 695 696 // Valid (with roles) 697 data[0].Roles = ptrStr("team_admin team_user") 698 err = validateUserTeamsImportData(&data) 699 require.Nil(t, err, "Should have succeeded with valid roles.") 700 701 // Valid (with JSON string of theme) 702 data[0].Theme = ptrStr(`{"awayIndicator":"#DBBD4E","buttonBg":"#23A1FF","buttonColor":"#FFFFFF","centerChannelBg":"#ffffff","centerChannelColor":"#333333","codeTheme":"github","image":"/static/files/a4a388b38b32678e83823ef1b3e17766.png","linkColor":"#2389d7","mentionBg":"#2389d7","mentionColor":"#ffffff","mentionHighlightBg":"#fff2bb","mentionHighlightLink":"#2f81b7","newMessageSeparator":"#FF8800","onlineIndicator":"#7DBE00","sidebarBg":"#fafafa","sidebarHeaderBg":"#3481B9","sidebarHeaderTextColor":"#ffffff","sidebarText":"#333333","sidebarTextActiveBorder":"#378FD2","sidebarTextActiveColor":"#111111","sidebarTextHoverBg":"#e6f2fa","sidebarUnreadText":"#333333","type":"Mattermost"}`) 703 err = validateUserTeamsImportData(&data) 704 require.Nil(t, err, "Should have succeeded with valid theme.") 705 706 // Invalid (invalid JSON string of theme) 707 data[0].Theme = ptrStr(`This is the invalid string which cannot be marshalled to JSON object :) + {"#DBBD4E","buttonBg", "#23A1FF", buttonColor`) 708 err = validateUserTeamsImportData(&data) 709 require.NotNil(t, err, "Should have fail with invalid JSON string of theme.") 710 711 // Invalid (valid JSON but invalid theme description) 712 data[0].Theme = ptrStr(`{"somekey": 25, "json_obj1": {"color": "#DBBD4E","buttonBg": "#23A1FF"}}`) 713 err = validateUserTeamsImportData(&data) 714 require.NotNil(t, err, "Should have fail with valid JSON which contains invalid string of theme description.") 715 716 data[0].Theme = nil 717 } 718 719 func TestImportValidateUserChannelsImportData(t *testing.T) { 720 721 // Invalid Name. 722 data := []UserChannelImportData{ 723 { 724 Roles: ptrStr("channel_admin channel_user"), 725 }, 726 } 727 err := validateUserChannelsImportData(&data) 728 require.NotNil(t, err, "Should have failed due to invalid name.") 729 data[0].Name = ptrStr("channelname") 730 731 // Valid (nil roles) 732 data[0].Roles = nil 733 err = validateUserChannelsImportData(&data) 734 require.Nil(t, err, "Should have succeeded with empty roles.") 735 736 // Valid (empty roles) 737 data[0].Roles = ptrStr("") 738 err = validateUserChannelsImportData(&data) 739 require.Nil(t, err, "Should have succeeded with empty roles.") 740 741 // Valid (with roles) 742 data[0].Roles = ptrStr("channel_admin channel_user") 743 err = validateUserChannelsImportData(&data) 744 require.Nil(t, err, "Should have succeeded with valid roles.") 745 746 // Empty notify props. 747 data[0].NotifyProps = &UserChannelNotifyPropsImportData{} 748 err = validateUserChannelsImportData(&data) 749 require.Nil(t, err, "Should have succeeded with empty notify props.") 750 751 // Invalid desktop notify props. 752 data[0].NotifyProps.Desktop = ptrStr("invalid") 753 err = validateUserChannelsImportData(&data) 754 require.NotNil(t, err, "Should have failed with invalid desktop notify props.") 755 756 // Invalid mobile notify props. 757 data[0].NotifyProps.Desktop = ptrStr("mention") 758 data[0].NotifyProps.Mobile = ptrStr("invalid") 759 err = validateUserChannelsImportData(&data) 760 require.NotNil(t, err, "Should have failed with invalid mobile notify props.") 761 762 // Invalid mark_unread notify props. 763 data[0].NotifyProps.Mobile = ptrStr("mention") 764 data[0].NotifyProps.MarkUnread = ptrStr("invalid") 765 err = validateUserChannelsImportData(&data) 766 require.NotNil(t, err, "Should have failed with invalid mark_unread notify props.") 767 768 // Valid notify props. 769 data[0].NotifyProps.MarkUnread = ptrStr("mention") 770 err = validateUserChannelsImportData(&data) 771 require.Nil(t, err, "Should have succeeded with valid notify props.") 772 } 773 774 func TestImportValidateReactionImportData(t *testing.T) { 775 // Test with minimum required valid properties. 776 parentCreateAt := model.GetMillis() - 100 777 data := ReactionImportData{ 778 User: ptrStr("username"), 779 EmojiName: ptrStr("emoji"), 780 CreateAt: ptrInt64(model.GetMillis()), 781 } 782 err := validateReactionImportData(&data, parentCreateAt) 783 require.Nil(t, err, "Validation failed but should have been valid.") 784 785 // Test with missing required properties. 786 data = ReactionImportData{ 787 EmojiName: ptrStr("emoji"), 788 CreateAt: ptrInt64(model.GetMillis()), 789 } 790 err = validateReactionImportData(&data, parentCreateAt) 791 require.NotNil(t, err, "Should have failed due to missing required property.") 792 793 data = ReactionImportData{ 794 User: ptrStr("username"), 795 CreateAt: ptrInt64(model.GetMillis()), 796 } 797 err = validateReactionImportData(&data, parentCreateAt) 798 require.NotNil(t, err, "Should have failed due to missing required property.") 799 800 data = ReactionImportData{ 801 User: ptrStr("username"), 802 EmojiName: ptrStr("emoji"), 803 } 804 err = validateReactionImportData(&data, parentCreateAt) 805 require.NotNil(t, err, "Should have failed due to missing required property.") 806 807 // Test with invalid emoji name. 808 data = ReactionImportData{ 809 User: ptrStr("username"), 810 EmojiName: ptrStr(strings.Repeat("1234567890", 500)), 811 CreateAt: ptrInt64(model.GetMillis()), 812 } 813 err = validateReactionImportData(&data, parentCreateAt) 814 require.NotNil(t, err, "Should have failed due to too long emoji name.") 815 816 // Test with invalid CreateAt 817 data = ReactionImportData{ 818 User: ptrStr("username"), 819 EmojiName: ptrStr("emoji"), 820 CreateAt: ptrInt64(0), 821 } 822 err = validateReactionImportData(&data, parentCreateAt) 823 require.NotNil(t, err, "Should have failed due to 0 create-at value.") 824 825 data = ReactionImportData{ 826 User: ptrStr("username"), 827 EmojiName: ptrStr("emoji"), 828 CreateAt: ptrInt64(parentCreateAt - 100), 829 } 830 err = validateReactionImportData(&data, parentCreateAt) 831 require.NotNil(t, err, "Should have failed due parent with newer create-at value.") 832 } 833 834 func TestImportValidateReplyImportData(t *testing.T) { 835 // Test with minimum required valid properties. 836 parentCreateAt := model.GetMillis() - 100 837 maxPostSize := 10000 838 data := ReplyImportData{ 839 User: ptrStr("username"), 840 Message: ptrStr("message"), 841 CreateAt: ptrInt64(model.GetMillis()), 842 } 843 err := validateReplyImportData(&data, parentCreateAt, maxPostSize) 844 require.Nil(t, err, "Validation failed but should have been valid.") 845 846 // Test with missing required properties. 847 data = ReplyImportData{ 848 Message: ptrStr("message"), 849 CreateAt: ptrInt64(model.GetMillis()), 850 } 851 err = validateReplyImportData(&data, parentCreateAt, maxPostSize) 852 require.NotNil(t, err, "Should have failed due to missing required property.") 853 854 data = ReplyImportData{ 855 User: ptrStr("username"), 856 CreateAt: ptrInt64(model.GetMillis()), 857 } 858 err = validateReplyImportData(&data, parentCreateAt, maxPostSize) 859 require.NotNil(t, err, "Should have failed due to missing required property.") 860 861 data = ReplyImportData{ 862 User: ptrStr("username"), 863 Message: ptrStr("message"), 864 } 865 err = validateReplyImportData(&data, parentCreateAt, maxPostSize) 866 require.NotNil(t, err, "Should have failed due to missing required property.") 867 868 // Test with invalid message. 869 data = ReplyImportData{ 870 User: ptrStr("username"), 871 Message: ptrStr(strings.Repeat("0", maxPostSize+1)), 872 CreateAt: ptrInt64(model.GetMillis()), 873 } 874 err = validateReplyImportData(&data, parentCreateAt, maxPostSize) 875 require.NotNil(t, err, "Should have failed due to too long message.") 876 877 // Test with invalid CreateAt 878 data = ReplyImportData{ 879 User: ptrStr("username"), 880 Message: ptrStr("message"), 881 CreateAt: ptrInt64(0), 882 } 883 err = validateReplyImportData(&data, parentCreateAt, maxPostSize) 884 require.NotNil(t, err, "Should have failed due to 0 create-at value.") 885 886 data = ReplyImportData{ 887 User: ptrStr("username"), 888 Message: ptrStr("message"), 889 CreateAt: ptrInt64(parentCreateAt - 100), 890 } 891 err = validateReplyImportData(&data, parentCreateAt, maxPostSize) 892 require.NotNil(t, err, "Should have failed due parent with newer create-at value.") 893 } 894 895 func TestImportValidatePostImportData(t *testing.T) { 896 maxPostSize := 10000 897 898 t.Run("Test with minimum required valid properties", func(t *testing.T) { 899 data := PostImportData{ 900 Team: ptrStr("teamname"), 901 Channel: ptrStr("channelname"), 902 User: ptrStr("username"), 903 Message: ptrStr("message"), 904 CreateAt: ptrInt64(model.GetMillis()), 905 } 906 err := validatePostImportData(&data, maxPostSize) 907 require.Nil(t, err, "Validation failed but should have been valid.") 908 }) 909 910 t.Run("Test with missing required properties", func(t *testing.T) { 911 data := PostImportData{ 912 Channel: ptrStr("channelname"), 913 User: ptrStr("username"), 914 Message: ptrStr("message"), 915 CreateAt: ptrInt64(model.GetMillis()), 916 } 917 err := validatePostImportData(&data, maxPostSize) 918 require.NotNil(t, err, "Should have failed due to missing required property.") 919 assert.Equal(t, err.Id, "app.import.validate_post_import_data.team_missing.error") 920 921 data = PostImportData{ 922 Team: ptrStr("teamname"), 923 User: ptrStr("username"), 924 Message: ptrStr("message"), 925 CreateAt: ptrInt64(model.GetMillis()), 926 } 927 err = validatePostImportData(&data, maxPostSize) 928 require.NotNil(t, err, "Should have failed due to missing required property.") 929 assert.Equal(t, err.Id, "app.import.validate_post_import_data.channel_missing.error") 930 931 data = PostImportData{ 932 Team: ptrStr("teamname"), 933 Channel: ptrStr("channelname"), 934 Message: ptrStr("message"), 935 CreateAt: ptrInt64(model.GetMillis()), 936 } 937 err = validatePostImportData(&data, maxPostSize) 938 require.NotNil(t, err, "Should have failed due to missing required property.") 939 assert.Equal(t, err.Id, "app.import.validate_post_import_data.user_missing.error") 940 941 data = PostImportData{ 942 Team: ptrStr("teamname"), 943 Channel: ptrStr("channelname"), 944 User: ptrStr("username"), 945 CreateAt: ptrInt64(model.GetMillis()), 946 } 947 err = validatePostImportData(&data, maxPostSize) 948 require.NotNil(t, err, "Should have failed due to missing required property.") 949 assert.Equal(t, err.Id, "app.import.validate_post_import_data.message_missing.error") 950 951 data = PostImportData{ 952 Team: ptrStr("teamname"), 953 Channel: ptrStr("channelname"), 954 User: ptrStr("username"), 955 Message: ptrStr("message"), 956 } 957 err = validatePostImportData(&data, maxPostSize) 958 require.NotNil(t, err, "Should have failed due to missing required property.") 959 assert.Equal(t, err.Id, "app.import.validate_post_import_data.create_at_missing.error") 960 }) 961 962 t.Run("Test with invalid message", func(t *testing.T) { 963 data := PostImportData{ 964 Team: ptrStr("teamname"), 965 Channel: ptrStr("channelname"), 966 User: ptrStr("username"), 967 Message: ptrStr(strings.Repeat("0", maxPostSize+1)), 968 CreateAt: ptrInt64(model.GetMillis()), 969 } 970 err := validatePostImportData(&data, maxPostSize) 971 require.NotNil(t, err, "Should have failed due to too long message.") 972 assert.Equal(t, err.Id, "app.import.validate_post_import_data.message_length.error") 973 }) 974 975 t.Run("Test with invalid CreateAt", func(t *testing.T) { 976 data := PostImportData{ 977 Team: ptrStr("teamname"), 978 Channel: ptrStr("channelname"), 979 User: ptrStr("username"), 980 Message: ptrStr("message"), 981 CreateAt: ptrInt64(0), 982 } 983 err := validatePostImportData(&data, maxPostSize) 984 require.NotNil(t, err, "Should have failed due to 0 create-at value.") 985 assert.Equal(t, err.Id, "app.import.validate_post_import_data.create_at_zero.error") 986 }) 987 988 t.Run("Test with valid all optional parameters", func(t *testing.T) { 989 reactions := []ReactionImportData{{ 990 User: ptrStr("username"), 991 EmojiName: ptrStr("emoji"), 992 CreateAt: ptrInt64(model.GetMillis()), 993 }} 994 995 replies := []ReplyImportData{{ 996 User: ptrStr("username"), 997 Message: ptrStr("message"), 998 CreateAt: ptrInt64(model.GetMillis()), 999 }} 1000 1001 data := PostImportData{ 1002 Team: ptrStr("teamname"), 1003 Channel: ptrStr("channelname"), 1004 User: ptrStr("username"), 1005 Message: ptrStr("message"), 1006 CreateAt: ptrInt64(model.GetMillis()), 1007 Reactions: &reactions, 1008 Replies: &replies, 1009 } 1010 err := validatePostImportData(&data, maxPostSize) 1011 require.Nil(t, err, "Should have succeeded.") 1012 }) 1013 1014 t.Run("Test with props too large", func(t *testing.T) { 1015 props := model.StringInterface{ 1016 "attachment": strings.Repeat("a", model.POST_PROPS_MAX_RUNES), 1017 } 1018 1019 data := PostImportData{ 1020 Team: ptrStr("teamname"), 1021 Channel: ptrStr("channelname"), 1022 User: ptrStr("username"), 1023 Message: ptrStr("message"), 1024 Props: &props, 1025 CreateAt: ptrInt64(model.GetMillis()), 1026 } 1027 err := validatePostImportData(&data, maxPostSize) 1028 require.NotNil(t, err, "Should have failed due to long props.") 1029 assert.Equal(t, err.Id, "app.import.validate_post_import_data.props_too_large.error") 1030 }) 1031 } 1032 1033 func TestImportValidateDirectChannelImportData(t *testing.T) { 1034 1035 // Test with valid number of members for direct message. 1036 data := DirectChannelImportData{ 1037 Members: &[]string{ 1038 model.NewId(), 1039 model.NewId(), 1040 }, 1041 } 1042 err := validateDirectChannelImportData(&data) 1043 require.Nil(t, err, "Validation failed but should have been valid.") 1044 1045 // Test with valid number of members for group message. 1046 data = DirectChannelImportData{ 1047 Members: &[]string{ 1048 model.NewId(), 1049 model.NewId(), 1050 model.NewId(), 1051 }, 1052 } 1053 err = validateDirectChannelImportData(&data) 1054 require.Nil(t, err, "Validation failed but should have been valid.") 1055 1056 // Test with all the combinations of optional parameters. 1057 data = DirectChannelImportData{ 1058 Members: &[]string{ 1059 model.NewId(), 1060 model.NewId(), 1061 }, 1062 Header: ptrStr("Channel Header Here"), 1063 } 1064 err = validateDirectChannelImportData(&data) 1065 require.Nil(t, err, "Should have succeeded with valid optional properties.") 1066 1067 // Test with invalid Header. 1068 data.Header = ptrStr(strings.Repeat("abcdefghij ", 103)) 1069 err = validateDirectChannelImportData(&data) 1070 require.NotNil(t, err, "Should have failed due to too long header.") 1071 1072 // Test with different combinations of invalid member counts. 1073 data = DirectChannelImportData{ 1074 Members: &[]string{}, 1075 } 1076 err = validateDirectChannelImportData(&data) 1077 require.NotNil(t, err, "Validation should have failed due to invalid number of members.") 1078 1079 data = DirectChannelImportData{ 1080 Members: &[]string{ 1081 model.NewId(), 1082 }, 1083 } 1084 err = validateDirectChannelImportData(&data) 1085 require.NotNil(t, err, "Validation should have failed due to invalid number of members.") 1086 1087 data = DirectChannelImportData{ 1088 Members: &[]string{ 1089 model.NewId(), 1090 model.NewId(), 1091 model.NewId(), 1092 model.NewId(), 1093 model.NewId(), 1094 model.NewId(), 1095 model.NewId(), 1096 model.NewId(), 1097 model.NewId(), 1098 }, 1099 } 1100 err = validateDirectChannelImportData(&data) 1101 require.NotNil(t, err, "Validation should have failed due to invalid number of members.") 1102 1103 // Test with invalid FavoritedBy 1104 member1 := model.NewId() 1105 member2 := model.NewId() 1106 data = DirectChannelImportData{ 1107 Members: &[]string{ 1108 member1, 1109 member2, 1110 }, 1111 FavoritedBy: &[]string{ 1112 member1, 1113 model.NewId(), 1114 }, 1115 } 1116 err = validateDirectChannelImportData(&data) 1117 require.NotNil(t, err, "Validation should have failed due to non-member favorited.") 1118 1119 // Test with valid FavoritedBy 1120 data = DirectChannelImportData{ 1121 Members: &[]string{ 1122 member1, 1123 member2, 1124 }, 1125 FavoritedBy: &[]string{ 1126 member1, 1127 member2, 1128 }, 1129 } 1130 err = validateDirectChannelImportData(&data) 1131 require.Nil(t, err, "Validation should succeed with valid favorited member") 1132 } 1133 1134 func TestImportValidateDirectPostImportData(t *testing.T) { 1135 maxPostSize := 10000 1136 1137 // Test with minimum required valid properties. 1138 data := DirectPostImportData{ 1139 ChannelMembers: &[]string{ 1140 model.NewId(), 1141 model.NewId(), 1142 }, 1143 User: ptrStr("username"), 1144 Message: ptrStr("message"), 1145 CreateAt: ptrInt64(model.GetMillis()), 1146 } 1147 err := validateDirectPostImportData(&data, maxPostSize) 1148 require.Nil(t, err, "Validation failed but should have been valid.") 1149 1150 // Test with missing required properties. 1151 data = DirectPostImportData{ 1152 User: ptrStr("username"), 1153 Message: ptrStr("message"), 1154 CreateAt: ptrInt64(model.GetMillis()), 1155 } 1156 err = validateDirectPostImportData(&data, maxPostSize) 1157 require.NotNil(t, err, "Should have failed due to missing required property.") 1158 1159 data = DirectPostImportData{ 1160 ChannelMembers: &[]string{ 1161 model.NewId(), 1162 model.NewId(), 1163 }, 1164 Message: ptrStr("message"), 1165 CreateAt: ptrInt64(model.GetMillis()), 1166 } 1167 err = validateDirectPostImportData(&data, maxPostSize) 1168 require.NotNil(t, err, "Should have failed due to missing required property.") 1169 1170 data = DirectPostImportData{ 1171 ChannelMembers: &[]string{ 1172 model.NewId(), 1173 model.NewId(), 1174 }, 1175 User: ptrStr("username"), 1176 CreateAt: ptrInt64(model.GetMillis()), 1177 } 1178 err = validateDirectPostImportData(&data, maxPostSize) 1179 require.NotNil(t, err, "Should have failed due to missing required property.") 1180 1181 data = DirectPostImportData{ 1182 ChannelMembers: &[]string{ 1183 model.NewId(), 1184 model.NewId(), 1185 }, 1186 User: ptrStr("username"), 1187 Message: ptrStr("message"), 1188 } 1189 err = validateDirectPostImportData(&data, maxPostSize) 1190 require.NotNil(t, err, "Should have failed due to missing required property.") 1191 1192 // Test with invalid numbers of channel members. 1193 data = DirectPostImportData{ 1194 ChannelMembers: &[]string{}, 1195 User: ptrStr("username"), 1196 Message: ptrStr("message"), 1197 CreateAt: ptrInt64(model.GetMillis()), 1198 } 1199 err = validateDirectPostImportData(&data, maxPostSize) 1200 require.NotNil(t, err, "Should have failed due to unsuitable number of members.") 1201 1202 data = DirectPostImportData{ 1203 ChannelMembers: &[]string{ 1204 model.NewId(), 1205 }, 1206 User: ptrStr("username"), 1207 Message: ptrStr("message"), 1208 CreateAt: ptrInt64(model.GetMillis()), 1209 } 1210 err = validateDirectPostImportData(&data, maxPostSize) 1211 require.NotNil(t, err, "Should have failed due to unsuitable number of members.") 1212 1213 data = DirectPostImportData{ 1214 ChannelMembers: &[]string{ 1215 model.NewId(), 1216 model.NewId(), 1217 model.NewId(), 1218 model.NewId(), 1219 model.NewId(), 1220 model.NewId(), 1221 model.NewId(), 1222 model.NewId(), 1223 model.NewId(), 1224 model.NewId(), 1225 }, 1226 User: ptrStr("username"), 1227 Message: ptrStr("message"), 1228 CreateAt: ptrInt64(model.GetMillis()), 1229 } 1230 err = validateDirectPostImportData(&data, maxPostSize) 1231 require.NotNil(t, err, "Should have failed due to unsuitable number of members.") 1232 1233 // Test with group message number of members. 1234 data = DirectPostImportData{ 1235 ChannelMembers: &[]string{ 1236 model.NewId(), 1237 model.NewId(), 1238 model.NewId(), 1239 }, 1240 User: ptrStr("username"), 1241 Message: ptrStr("message"), 1242 CreateAt: ptrInt64(model.GetMillis()), 1243 } 1244 err = validateDirectPostImportData(&data, maxPostSize) 1245 require.Nil(t, err, "Validation failed but should have been valid.") 1246 1247 // Test with invalid message. 1248 data = DirectPostImportData{ 1249 ChannelMembers: &[]string{ 1250 model.NewId(), 1251 model.NewId(), 1252 }, 1253 User: ptrStr("username"), 1254 Message: ptrStr(strings.Repeat("0", maxPostSize+1)), 1255 CreateAt: ptrInt64(model.GetMillis()), 1256 } 1257 err = validateDirectPostImportData(&data, maxPostSize) 1258 require.NotNil(t, err, "Should have failed due to too long message.") 1259 1260 // Test with invalid CreateAt 1261 data = DirectPostImportData{ 1262 ChannelMembers: &[]string{ 1263 model.NewId(), 1264 model.NewId(), 1265 }, 1266 User: ptrStr("username"), 1267 Message: ptrStr("message"), 1268 CreateAt: ptrInt64(0), 1269 } 1270 err = validateDirectPostImportData(&data, maxPostSize) 1271 require.NotNil(t, err, "Should have failed due to 0 create-at value.") 1272 1273 // Test with invalid FlaggedBy 1274 member1 := model.NewId() 1275 member2 := model.NewId() 1276 data = DirectPostImportData{ 1277 ChannelMembers: &[]string{ 1278 member1, 1279 member2, 1280 }, 1281 FlaggedBy: &[]string{ 1282 member1, 1283 model.NewId(), 1284 }, 1285 User: ptrStr("username"), 1286 Message: ptrStr("message"), 1287 CreateAt: ptrInt64(model.GetMillis()), 1288 } 1289 err = validateDirectPostImportData(&data, maxPostSize) 1290 require.NotNil(t, err, "Validation should have failed due to non-member flagged.") 1291 1292 // Test with valid FlaggedBy 1293 data = DirectPostImportData{ 1294 ChannelMembers: &[]string{ 1295 member1, 1296 member2, 1297 }, 1298 FlaggedBy: &[]string{ 1299 member1, 1300 member2, 1301 }, 1302 User: ptrStr("username"), 1303 Message: ptrStr("message"), 1304 CreateAt: ptrInt64(model.GetMillis()), 1305 } 1306 err = validateDirectPostImportData(&data, maxPostSize) 1307 require.Nil(t, err, "Validation should succeed with post flagged by members") 1308 1309 // Test with valid all optional parameters. 1310 reactions := []ReactionImportData{{ 1311 User: ptrStr("username"), 1312 EmojiName: ptrStr("emoji"), 1313 CreateAt: ptrInt64(model.GetMillis()), 1314 }} 1315 1316 replies := []ReplyImportData{{ 1317 User: ptrStr("username"), 1318 Message: ptrStr("message"), 1319 CreateAt: ptrInt64(model.GetMillis()), 1320 }} 1321 1322 data = DirectPostImportData{ 1323 ChannelMembers: &[]string{ 1324 member1, 1325 member2, 1326 }, 1327 FlaggedBy: &[]string{ 1328 member1, 1329 member2, 1330 }, 1331 User: ptrStr("username"), 1332 Message: ptrStr("message"), 1333 CreateAt: ptrInt64(model.GetMillis()), 1334 Reactions: &reactions, 1335 Replies: &replies, 1336 } 1337 1338 err = validateDirectPostImportData(&data, maxPostSize) 1339 require.Nil(t, err, "Validation should succeed with valid optional parameters") 1340 } 1341 1342 func TestImportValidateEmojiImportData(t *testing.T) { 1343 data := EmojiImportData{ 1344 Name: ptrStr("parrot"), 1345 Image: ptrStr("/path/to/image"), 1346 } 1347 1348 err := validateEmojiImportData(&data) 1349 assert.Nil(t, err, "Validation should succeed") 1350 1351 *data.Name = "smiley" 1352 err = validateEmojiImportData(&data) 1353 assert.NotNil(t, err) 1354 1355 *data.Name = "" 1356 err = validateEmojiImportData(&data) 1357 assert.NotNil(t, err) 1358 1359 *data.Name = "" 1360 *data.Image = "" 1361 err = validateEmojiImportData(&data) 1362 assert.NotNil(t, err) 1363 1364 *data.Image = "/path/to/image" 1365 data.Name = nil 1366 err = validateEmojiImportData(&data) 1367 assert.NotNil(t, err) 1368 1369 data.Name = ptrStr("parrot") 1370 data.Image = nil 1371 err = validateEmojiImportData(&data) 1372 assert.NotNil(t, err) 1373 }