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  }