summaryrefslogtreecommitdiffstats
path: root/app/import_validators_test.go
diff options
context:
space:
mode:
authorJesús Espino <jespinog@gmail.com>2018-08-01 15:45:26 +0200
committerGitHub <noreply@github.com>2018-08-01 15:45:26 +0200
commit1f168263a2ff73ddee1193cccdeea533f6d501fe (patch)
tree61a59be015b121cee5df9b4c6cf809980814ff63 /app/import_validators_test.go
parentf4fdd7835b8eeb04106a9ff6a4f85b8593d9074b (diff)
downloadchat-1f168263a2ff73ddee1193cccdeea533f6d501fe.tar.gz
chat-1f168263a2ff73ddee1193cccdeea533f6d501fe.tar.bz2
chat-1f168263a2ff73ddee1193cccdeea533f6d501fe.zip
Split app/import.go in multiple files (#9179)
Diffstat (limited to 'app/import_validators_test.go')
-rw-r--r--app/import_validators_test.go1372
1 files changed, 1372 insertions, 0 deletions
diff --git a/app/import_validators_test.go b/app/import_validators_test.go
new file mode 100644
index 000000000..5fb0518f7
--- /dev/null
+++ b/app/import_validators_test.go
@@ -0,0 +1,1372 @@
+// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+package app
+
+import (
+ "path/filepath"
+ "strings"
+ "testing"
+
+ "github.com/mattermost/mattermost-server/model"
+ "github.com/mattermost/mattermost-server/utils"
+ "github.com/stretchr/testify/assert"
+)
+
+func TestImportValidateSchemeImportData(t *testing.T) {
+ // Test with minimum required valid properties and team scope.
+ data := SchemeImportData{
+ Name: ptrStr("name"),
+ DisplayName: ptrStr("display name"),
+ Scope: ptrStr("team"),
+ DefaultTeamAdminRole: &RoleImportData{
+ Name: ptrStr("name"),
+ DisplayName: ptrStr("display name"),
+ Permissions: &[]string{"invite_user"},
+ },
+ DefaultTeamUserRole: &RoleImportData{
+ Name: ptrStr("name"),
+ DisplayName: ptrStr("display name"),
+ Permissions: &[]string{"invite_user"},
+ },
+ DefaultChannelAdminRole: &RoleImportData{
+ Name: ptrStr("name"),
+ DisplayName: ptrStr("display name"),
+ Permissions: &[]string{"invite_user"},
+ },
+ DefaultChannelUserRole: &RoleImportData{
+ Name: ptrStr("name"),
+ DisplayName: ptrStr("display name"),
+ Permissions: &[]string{"invite_user"},
+ },
+ }
+ if err := validateSchemeImportData(&data); err != nil {
+ t.Fatal("Validation failed but should have been valid.", err)
+ }
+
+ // Test with various invalid names.
+ data.Name = nil
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid name.")
+ }
+
+ data.Name = ptrStr("")
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid name.")
+ }
+
+ data.Name = ptrStr(strings.Repeat("1234567890", 100))
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid name.")
+ }
+
+ data.Name = ptrStr("name")
+ // Test with invalid display name.
+ data.DisplayName = nil
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid display name.")
+ }
+
+ data.DisplayName = ptrStr("")
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid display name.")
+ }
+
+ data.DisplayName = ptrStr(strings.Repeat("1234567890", 100))
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid display name.")
+ }
+
+ data.DisplayName = ptrStr("display name")
+
+ // Test with various missing roles.
+ data.DefaultTeamAdminRole = nil
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to missing role.")
+ }
+
+ data.DefaultTeamAdminRole = &RoleImportData{
+ Name: ptrStr("name"),
+ DisplayName: ptrStr("display name"),
+ Permissions: &[]string{"invite_user"},
+ }
+ data.DefaultTeamUserRole = nil
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to missing role.")
+ }
+
+ data.DefaultTeamUserRole = &RoleImportData{
+ Name: ptrStr("name"),
+ DisplayName: ptrStr("display name"),
+ Permissions: &[]string{"invite_user"},
+ }
+ data.DefaultChannelAdminRole = nil
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to missing role.")
+ }
+
+ data.DefaultChannelAdminRole = &RoleImportData{
+ Name: ptrStr("name"),
+ DisplayName: ptrStr("display name"),
+ Permissions: &[]string{"invite_user"},
+ }
+ data.DefaultChannelUserRole = nil
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to missing role.")
+ }
+
+ data.DefaultChannelUserRole = &RoleImportData{
+ Name: ptrStr("name"),
+ DisplayName: ptrStr("display name"),
+ Permissions: &[]string{"invite_user"},
+ }
+
+ // Test with various invalid roles.
+ data.DefaultTeamAdminRole.Name = nil
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid role.")
+ }
+
+ data.DefaultTeamAdminRole.Name = ptrStr("name")
+ data.DefaultTeamUserRole.Name = nil
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid role.")
+ }
+
+ data.DefaultTeamUserRole.Name = ptrStr("name")
+ data.DefaultChannelAdminRole.Name = nil
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid role.")
+ }
+
+ data.DefaultChannelAdminRole.Name = ptrStr("name")
+ data.DefaultChannelUserRole.Name = nil
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid role.")
+ }
+
+ data.DefaultChannelUserRole.Name = ptrStr("name")
+
+ // Change to a Channel scope role, and check with missing or extra roles again.
+ data.Scope = ptrStr("channel")
+ data.DefaultTeamAdminRole = nil
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to spurious role.")
+ }
+
+ data.DefaultTeamAdminRole = &RoleImportData{
+ Name: ptrStr("name"),
+ DisplayName: ptrStr("display name"),
+ Permissions: &[]string{"invite_user"},
+ }
+ data.DefaultTeamUserRole = nil
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to spurious role.")
+ }
+
+ data.DefaultTeamAdminRole = nil
+ if err := validateSchemeImportData(&data); err != nil {
+ t.Fatal("Should have succeeded.")
+ }
+
+ // Test with all combinations of optional parameters.
+ data.Description = ptrStr(strings.Repeat("1234567890", 1024))
+ if err := validateSchemeImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid description.")
+ }
+
+ data.Description = ptrStr("description")
+ if err := validateSchemeImportData(&data); err != nil {
+ t.Fatal("Should have succeeded.")
+ }
+}
+
+func TestImportValidateRoleImportData(t *testing.T) {
+ // Test with minimum required valid properties.
+ data := RoleImportData{
+ Name: ptrStr("name"),
+ DisplayName: ptrStr("display name"),
+ }
+ if err := validateRoleImportData(&data); err != nil {
+ t.Fatal("Validation failed but should have been valid.", err)
+ }
+
+ // Test with various invalid names.
+ data.Name = nil
+ if err := validateRoleImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid name.")
+ }
+
+ data.Name = ptrStr("")
+ if err := validateRoleImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid name.")
+ }
+
+ data.Name = ptrStr(strings.Repeat("1234567890", 100))
+ if err := validateRoleImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid name.")
+ }
+
+ data.Name = ptrStr("name")
+ // Test with invalid display name.
+ data.DisplayName = nil
+ if err := validateRoleImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid display name.")
+ }
+
+ data.DisplayName = ptrStr("")
+ if err := validateRoleImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid display name.")
+ }
+
+ data.DisplayName = ptrStr(strings.Repeat("1234567890", 100))
+ if err := validateRoleImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid display name.")
+ }
+
+ data.DisplayName = ptrStr("display name")
+
+ // Test with various valid/invalid permissions.
+ data.Permissions = &[]string{}
+ if err := validateRoleImportData(&data); err != nil {
+ t.Fatal("Validation failed but should have been valid.", err)
+ }
+
+ data.Permissions = &[]string{"invite_user", "add_user_to_team"}
+ if err := validateRoleImportData(&data); err != nil {
+ t.Fatal("Validation failed but should have been valid.", err)
+ }
+
+ data.Permissions = &[]string{"invite_user", "add_user_to_team", "derp"}
+ if err := validateRoleImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to invalid permission.", err)
+ }
+
+ data.Permissions = &[]string{"invite_user", "add_user_to_team"}
+
+ // Test with various valid/invalid descriptions.
+ data.Description = ptrStr(strings.Repeat("1234567890", 1024))
+ if err := validateRoleImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to invalid description.", err)
+ }
+
+ data.Description = ptrStr("description")
+ if err := validateRoleImportData(&data); err != nil {
+ t.Fatal("Validation failed but should have been valid.", err)
+ }
+}
+
+func TestImportValidateTeamImportData(t *testing.T) {
+
+ // Test with minimum required valid properties.
+ data := TeamImportData{
+ Name: ptrStr("teamname"),
+ DisplayName: ptrStr("Display Name"),
+ Type: ptrStr("O"),
+ }
+ if err := validateTeamImportData(&data); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+
+ // Test with various invalid names.
+ data = TeamImportData{
+ DisplayName: ptrStr("Display Name"),
+ Type: ptrStr("O"),
+ }
+ if err := validateTeamImportData(&data); err == nil {
+ t.Fatal("Should have failed due to missing name.")
+ }
+
+ data.Name = ptrStr(strings.Repeat("abcdefghij", 7))
+ if err := validateTeamImportData(&data); err == nil {
+ t.Fatal("Should have failed due to too long name.")
+ }
+
+ data.Name = ptrStr("login")
+ if err := validateTeamImportData(&data); err == nil {
+ t.Fatal("Should have failed due to reserved word in name.")
+ }
+
+ data.Name = ptrStr("Test::''ASD")
+ if err := validateTeamImportData(&data); err == nil {
+ t.Fatal("Should have failed due to non alphanum characters in name.")
+ }
+
+ data.Name = ptrStr("A")
+ if err := validateTeamImportData(&data); err == nil {
+ t.Fatal("Should have failed due to short name.")
+ }
+
+ // Test team various invalid display names.
+ data = TeamImportData{
+ Name: ptrStr("teamname"),
+ Type: ptrStr("O"),
+ }
+ if err := validateTeamImportData(&data); err == nil {
+ t.Fatal("Should have failed due to missing display_name.")
+ }
+
+ data.DisplayName = ptrStr("")
+ if err := validateTeamImportData(&data); err == nil {
+ t.Fatal("Should have failed due to empty display_name.")
+ }
+
+ data.DisplayName = ptrStr(strings.Repeat("abcdefghij", 7))
+ if err := validateTeamImportData(&data); err == nil {
+ t.Fatal("Should have failed due to too long display_name.")
+ }
+
+ // Test with various valid and invalid types.
+ data = TeamImportData{
+ Name: ptrStr("teamname"),
+ DisplayName: ptrStr("Display Name"),
+ }
+ if err := validateTeamImportData(&data); err == nil {
+ t.Fatal("Should have failed due to missing type.")
+ }
+
+ data.Type = ptrStr("A")
+ if err := validateTeamImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid type.")
+ }
+
+ data.Type = ptrStr("I")
+ if err := validateTeamImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with valid type.")
+ }
+
+ // Test with all the combinations of optional parameters.
+ data = TeamImportData{
+ Name: ptrStr("teamname"),
+ DisplayName: ptrStr("Display Name"),
+ Type: ptrStr("O"),
+ Description: ptrStr("The team description."),
+ AllowOpenInvite: ptrBool(true),
+ }
+ if err := validateTeamImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with valid optional properties.")
+ }
+
+ data.AllowOpenInvite = ptrBool(false)
+ if err := validateTeamImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with allow open invites false.")
+ }
+
+ data.Description = ptrStr(strings.Repeat("abcdefghij ", 26))
+ if err := validateTeamImportData(&data); err == nil {
+ t.Fatal("Should have failed due to too long description.")
+ }
+
+ // Test with an empty scheme name.
+ data.Description = ptrStr("abcdefg")
+ data.Scheme = ptrStr("")
+ if err := validateTeamImportData(&data); err == nil {
+ t.Fatal("Should have failed due to empty scheme name.")
+ }
+
+ // Test with a valid scheme name.
+ data.Scheme = ptrStr("abcdefg")
+ if err := validateTeamImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with valid scheme name.")
+ }
+}
+
+func TestImportValidateChannelImportData(t *testing.T) {
+
+ // Test with minimum required valid properties.
+ data := ChannelImportData{
+ Team: ptrStr("teamname"),
+ Name: ptrStr("channelname"),
+ DisplayName: ptrStr("Display Name"),
+ Type: ptrStr("O"),
+ }
+ if err := validateChannelImportData(&data); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+
+ // Test with missing team.
+ data = ChannelImportData{
+ Name: ptrStr("channelname"),
+ DisplayName: ptrStr("Display Name"),
+ Type: ptrStr("O"),
+ }
+ if err := validateChannelImportData(&data); err == nil {
+ t.Fatal("Should have failed due to missing team.")
+ }
+
+ // Test with various invalid names.
+ data = ChannelImportData{
+ Team: ptrStr("teamname"),
+ DisplayName: ptrStr("Display Name"),
+ Type: ptrStr("O"),
+ }
+ if err := validateChannelImportData(&data); err == nil {
+ t.Fatal("Should have failed due to missing name.")
+ }
+
+ data.Name = ptrStr(strings.Repeat("abcdefghij", 7))
+ if err := validateChannelImportData(&data); err == nil {
+ t.Fatal("Should have failed due to too long name.")
+ }
+
+ data.Name = ptrStr("Test::''ASD")
+ if err := validateChannelImportData(&data); err == nil {
+ t.Fatal("Should have failed due to non alphanum characters in name.")
+ }
+
+ data.Name = ptrStr("A")
+ if err := validateChannelImportData(&data); err == nil {
+ t.Fatal("Should have failed due to short name.")
+ }
+
+ // Test team various invalid display names.
+ data = ChannelImportData{
+ Team: ptrStr("teamname"),
+ Name: ptrStr("channelname"),
+ Type: ptrStr("O"),
+ }
+ if err := validateChannelImportData(&data); err == nil {
+ t.Fatal("Should have failed due to missing display_name.")
+ }
+
+ data.DisplayName = ptrStr("")
+ if err := validateChannelImportData(&data); err == nil {
+ t.Fatal("Should have failed due to empty display_name.")
+ }
+
+ data.DisplayName = ptrStr(strings.Repeat("abcdefghij", 7))
+ if err := validateChannelImportData(&data); err == nil {
+ t.Fatal("Should have failed due to too long display_name.")
+ }
+
+ // Test with various valid and invalid types.
+ data = ChannelImportData{
+ Team: ptrStr("teamname"),
+ Name: ptrStr("channelname"),
+ DisplayName: ptrStr("Display Name"),
+ }
+ if err := validateChannelImportData(&data); err == nil {
+ t.Fatal("Should have failed due to missing type.")
+ }
+
+ data.Type = ptrStr("A")
+ if err := validateChannelImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid type.")
+ }
+
+ data.Type = ptrStr("P")
+ if err := validateChannelImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with valid type.")
+ }
+
+ // Test with all the combinations of optional parameters.
+ data = ChannelImportData{
+ Team: ptrStr("teamname"),
+ Name: ptrStr("channelname"),
+ DisplayName: ptrStr("Display Name"),
+ Type: ptrStr("O"),
+ Header: ptrStr("Channel Header Here"),
+ Purpose: ptrStr("Channel Purpose Here"),
+ }
+ if err := validateChannelImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with valid optional properties.")
+ }
+
+ data.Header = ptrStr(strings.Repeat("abcdefghij ", 103))
+ if err := validateChannelImportData(&data); err == nil {
+ t.Fatal("Should have failed due to too long header.")
+ }
+
+ data.Header = ptrStr("Channel Header Here")
+ data.Purpose = ptrStr(strings.Repeat("abcdefghij ", 26))
+ if err := validateChannelImportData(&data); err == nil {
+ t.Fatal("Should have failed due to too long purpose.")
+ }
+
+ // Test with an empty scheme name.
+ data.Purpose = ptrStr("abcdefg")
+ data.Scheme = ptrStr("")
+ if err := validateChannelImportData(&data); err == nil {
+ t.Fatal("Should have failed due to empty scheme name.")
+ }
+
+ // Test with a valid scheme name.
+ data.Scheme = ptrStr("abcdefg")
+ if err := validateChannelImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with valid scheme name.")
+ }
+}
+
+func TestImportValidateUserImportData(t *testing.T) {
+
+ // Test with minimum required valid properties.
+ data := UserImportData{
+ Username: ptrStr("bob"),
+ Email: ptrStr("bob@example.com"),
+ }
+ if err := validateUserImportData(&data); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+
+ // Invalid Usernames.
+ data.Username = nil
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to nil Username.")
+ }
+
+ data.Username = ptrStr("")
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to 0 length Username.")
+ }
+
+ data.Username = ptrStr(strings.Repeat("abcdefghij", 7))
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to too long Username.")
+ }
+
+ data.Username = ptrStr("i am a username with spaces and !!!")
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to invalid characters in Username.")
+ }
+
+ data.Username = ptrStr("bob")
+
+ // Unexisting Picture Image
+ data.ProfileImage = ptrStr("not-existing-file")
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to not existing profile image file.")
+ }
+ data.ProfileImage = nil
+
+ // Invalid Emails
+ data.Email = nil
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to nil Email.")
+ }
+
+ data.Email = ptrStr("")
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to 0 length Email.")
+ }
+
+ data.Email = ptrStr(strings.Repeat("abcdefghij", 13))
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to too long Email.")
+ }
+
+ data.Email = ptrStr("bob@example.com")
+
+ data.AuthService = ptrStr("")
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to 0-length auth service.")
+ }
+
+ data.AuthService = ptrStr("saml")
+ data.AuthData = ptrStr(strings.Repeat("abcdefghij", 15))
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to too long auth data.")
+ }
+
+ data.AuthData = ptrStr("bobbytables")
+ if err := validateUserImportData(&data); err != nil {
+ t.Fatal("Validation should have succeeded with valid auth service and auth data.")
+ }
+
+ // Test a valid User with all fields populated.
+ testsDir, _ := utils.FindDir("tests")
+ data = UserImportData{
+ ProfileImage: ptrStr(filepath.Join(testsDir, "test.png")),
+ Username: ptrStr("bob"),
+ Email: ptrStr("bob@example.com"),
+ AuthService: ptrStr("ldap"),
+ AuthData: ptrStr("bob"),
+ Nickname: ptrStr("BobNick"),
+ FirstName: ptrStr("Bob"),
+ LastName: ptrStr("Blob"),
+ Position: ptrStr("The Boss"),
+ Roles: ptrStr("system_user"),
+ Locale: ptrStr("en"),
+ }
+ if err := validateUserImportData(&data); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+
+ // Test various invalid optional field values.
+ data.Nickname = ptrStr(strings.Repeat("abcdefghij", 7))
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to too long Nickname.")
+ }
+ data.Nickname = ptrStr("BobNick")
+
+ data.FirstName = ptrStr(strings.Repeat("abcdefghij", 7))
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to too long First Name.")
+ }
+ data.FirstName = ptrStr("Bob")
+
+ data.LastName = ptrStr(strings.Repeat("abcdefghij", 7))
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to too long Last name.")
+ }
+ data.LastName = ptrStr("Blob")
+
+ data.Position = ptrStr(strings.Repeat("abcdefghij", 13))
+ if err := validateUserImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to too long Position.")
+ }
+ data.Position = ptrStr("The Boss")
+
+ data.Roles = nil
+ if err := validateUserImportData(&data); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+
+ data.Roles = ptrStr("")
+ if err := validateUserImportData(&data); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+ data.Roles = ptrStr("system_user")
+
+ // Try various valid/invalid notify props.
+ data.NotifyProps = &UserNotifyPropsImportData{}
+
+ data.NotifyProps.Desktop = ptrStr("invalid")
+ checkError(t, validateUserImportData(&data))
+
+ data.NotifyProps.Desktop = ptrStr(model.USER_NOTIFY_ALL)
+ data.NotifyProps.DesktopSound = ptrStr("invalid")
+ checkError(t, validateUserImportData(&data))
+
+ data.NotifyProps.DesktopSound = ptrStr("true")
+ data.NotifyProps.Email = ptrStr("invalid")
+ checkError(t, validateUserImportData(&data))
+
+ data.NotifyProps.Email = ptrStr("true")
+ data.NotifyProps.Mobile = ptrStr("invalid")
+ checkError(t, validateUserImportData(&data))
+
+ data.NotifyProps.Mobile = ptrStr(model.USER_NOTIFY_ALL)
+ data.NotifyProps.MobilePushStatus = ptrStr("invalid")
+ checkError(t, validateUserImportData(&data))
+
+ data.NotifyProps.MobilePushStatus = ptrStr(model.STATUS_ONLINE)
+ data.NotifyProps.ChannelTrigger = ptrStr("invalid")
+ checkError(t, validateUserImportData(&data))
+
+ data.NotifyProps.ChannelTrigger = ptrStr("true")
+ data.NotifyProps.CommentsTrigger = ptrStr("invalid")
+ checkError(t, validateUserImportData(&data))
+
+ data.NotifyProps.CommentsTrigger = ptrStr(model.COMMENTS_NOTIFY_ROOT)
+ data.NotifyProps.MentionKeys = ptrStr("valid")
+ checkNoError(t, validateUserImportData(&data))
+}
+
+func TestImportValidateUserTeamsImportData(t *testing.T) {
+
+ // Invalid Name.
+ data := []UserTeamImportData{
+ {
+ Roles: ptrStr("team_admin team_user"),
+ },
+ }
+ if err := validateUserTeamsImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid name.")
+ }
+ data[0].Name = ptrStr("teamname")
+
+ // Valid (nil roles)
+ data[0].Roles = nil
+ if err := validateUserTeamsImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with empty roles.")
+ }
+
+ // Valid (empty roles)
+ data[0].Roles = ptrStr("")
+ if err := validateUserTeamsImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with empty roles.")
+ }
+
+ // Valid (with roles)
+ data[0].Roles = ptrStr("team_admin team_user")
+ if err := validateUserTeamsImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with valid roles.")
+ }
+}
+
+func TestImportValidateUserChannelsImportData(t *testing.T) {
+
+ // Invalid Name.
+ data := []UserChannelImportData{
+ {
+ Roles: ptrStr("channel_admin channel_user"),
+ },
+ }
+ if err := validateUserChannelsImportData(&data); err == nil {
+ t.Fatal("Should have failed due to invalid name.")
+ }
+ data[0].Name = ptrStr("channelname")
+
+ // Valid (nil roles)
+ data[0].Roles = nil
+ if err := validateUserChannelsImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with empty roles.")
+ }
+
+ // Valid (empty roles)
+ data[0].Roles = ptrStr("")
+ if err := validateUserChannelsImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with empty roles.")
+ }
+
+ // Valid (with roles)
+ data[0].Roles = ptrStr("channel_admin channel_user")
+ if err := validateUserChannelsImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with valid roles.")
+ }
+
+ // Empty notify props.
+ data[0].NotifyProps = &UserChannelNotifyPropsImportData{}
+ if err := validateUserChannelsImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with empty notify props.")
+ }
+
+ // Invalid desktop notify props.
+ data[0].NotifyProps.Desktop = ptrStr("invalid")
+ if err := validateUserChannelsImportData(&data); err == nil {
+ t.Fatal("Should have failed with invalid desktop notify props.")
+ }
+
+ // Invalid mobile notify props.
+ data[0].NotifyProps.Desktop = ptrStr("mention")
+ data[0].NotifyProps.Mobile = ptrStr("invalid")
+ if err := validateUserChannelsImportData(&data); err == nil {
+ t.Fatal("Should have failed with invalid mobile notify props.")
+ }
+
+ // Invalid mark_unread notify props.
+ data[0].NotifyProps.Mobile = ptrStr("mention")
+ data[0].NotifyProps.MarkUnread = ptrStr("invalid")
+ if err := validateUserChannelsImportData(&data); err == nil {
+ t.Fatal("Should have failed with invalid mark_unread notify props.")
+ }
+
+ // Valid notify props.
+ data[0].NotifyProps.MarkUnread = ptrStr("mention")
+ if err := validateUserChannelsImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with valid notify props.")
+ }
+}
+
+func TestImportValidateReactionImportData(t *testing.T) {
+ // Test with minimum required valid properties.
+ parentCreateAt := model.GetMillis() - 100
+ data := ReactionImportData{
+ User: ptrStr("username"),
+ EmojiName: ptrStr("emoji"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReactionImportData(&data, parentCreateAt); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+
+ // Test with missing required properties.
+ data = ReactionImportData{
+ EmojiName: ptrStr("emoji"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReactionImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = ReactionImportData{
+ User: ptrStr("username"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReactionImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = ReactionImportData{
+ User: ptrStr("username"),
+ EmojiName: ptrStr("emoji"),
+ }
+ if err := validateReactionImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ // Test with invalid emoji name.
+ data = ReactionImportData{
+ User: ptrStr("username"),
+ EmojiName: ptrStr(strings.Repeat("1234567890", 500)),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReactionImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to too long emoji name.")
+ }
+
+ // Test with invalid CreateAt
+ data = ReactionImportData{
+ User: ptrStr("username"),
+ EmojiName: ptrStr("emoji"),
+ CreateAt: ptrInt64(0),
+ }
+ if err := validateReactionImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due to 0 create-at value.")
+ }
+
+ data = ReactionImportData{
+ User: ptrStr("username"),
+ EmojiName: ptrStr("emoji"),
+ CreateAt: ptrInt64(parentCreateAt - 100),
+ }
+ if err := validateReactionImportData(&data, parentCreateAt); err == nil {
+ t.Fatal("Should have failed due parent with newer create-at value.")
+ }
+}
+
+func TestImportValidateReplyImportData(t *testing.T) {
+ // Test with minimum required valid properties.
+ parentCreateAt := model.GetMillis() - 100
+ maxPostSize := 10000
+ data := ReplyImportData{
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReplyImportData(&data, parentCreateAt, maxPostSize); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+
+ // Test with missing required properties.
+ data = ReplyImportData{
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReplyImportData(&data, parentCreateAt, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = ReplyImportData{
+ User: ptrStr("username"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReplyImportData(&data, parentCreateAt, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = ReplyImportData{
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ }
+ if err := validateReplyImportData(&data, parentCreateAt, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ // Test with invalid message.
+ data = ReplyImportData{
+ User: ptrStr("username"),
+ Message: ptrStr(strings.Repeat("0", maxPostSize+1)),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateReplyImportData(&data, parentCreateAt, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to too long message.")
+ }
+
+ // Test with invalid CreateAt
+ data = ReplyImportData{
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(0),
+ }
+ if err := validateReplyImportData(&data, parentCreateAt, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to 0 create-at value.")
+ }
+
+ data = ReplyImportData{
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(parentCreateAt - 100),
+ }
+ if err := validateReplyImportData(&data, parentCreateAt, maxPostSize); err == nil {
+ t.Fatal("Should have failed due parent with newer create-at value.")
+ }
+}
+
+func TestImportValidatePostImportData(t *testing.T) {
+ maxPostSize := 10000
+
+ // Test with minimum required valid properties.
+ data := PostImportData{
+ Team: ptrStr("teamname"),
+ Channel: ptrStr("channelname"),
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validatePostImportData(&data, maxPostSize); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+
+ // Test with missing required properties.
+ data = PostImportData{
+ Channel: ptrStr("channelname"),
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validatePostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = PostImportData{
+ Team: ptrStr("teamname"),
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validatePostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = PostImportData{
+ Team: ptrStr("teamname"),
+ Channel: ptrStr("channelname"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validatePostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = PostImportData{
+ Team: ptrStr("teamname"),
+ Channel: ptrStr("channelname"),
+ User: ptrStr("username"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validatePostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = PostImportData{
+ Team: ptrStr("teamname"),
+ Channel: ptrStr("channelname"),
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ }
+ if err := validatePostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ // Test with invalid message.
+ data = PostImportData{
+ Team: ptrStr("teamname"),
+ Channel: ptrStr("channelname"),
+ User: ptrStr("username"),
+ Message: ptrStr(strings.Repeat("0", maxPostSize+1)),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validatePostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to too long message.")
+ }
+
+ // Test with invalid CreateAt
+ data = PostImportData{
+ Team: ptrStr("teamname"),
+ Channel: ptrStr("channelname"),
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(0),
+ }
+ if err := validatePostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to 0 create-at value.")
+ }
+
+ // Test with valid all optional parameters.
+ reactions := []ReactionImportData{ReactionImportData{
+ User: ptrStr("username"),
+ EmojiName: ptrStr("emoji"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }}
+ replies := []ReplyImportData{ReplyImportData{
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }}
+ data = PostImportData{
+ Team: ptrStr("teamname"),
+ Channel: ptrStr("channelname"),
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ Reactions: &reactions,
+ Replies: &replies,
+ }
+ if err := validatePostImportData(&data, maxPostSize); err != nil {
+ t.Fatal("Should have succeeded.")
+ }
+}
+
+func TestImportValidateDirectChannelImportData(t *testing.T) {
+
+ // Test with valid number of members for direct message.
+ data := DirectChannelImportData{
+ Members: &[]string{
+ model.NewId(),
+ model.NewId(),
+ },
+ }
+ if err := validateDirectChannelImportData(&data); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+
+ // Test with valid number of members for group message.
+ data = DirectChannelImportData{
+ Members: &[]string{
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ },
+ }
+ if err := validateDirectChannelImportData(&data); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+
+ // Test with all the combinations of optional parameters.
+ data = DirectChannelImportData{
+ Members: &[]string{
+ model.NewId(),
+ model.NewId(),
+ },
+ Header: ptrStr("Channel Header Here"),
+ }
+ if err := validateDirectChannelImportData(&data); err != nil {
+ t.Fatal("Should have succeeded with valid optional properties.")
+ }
+
+ // Test with invalid Header.
+ data.Header = ptrStr(strings.Repeat("abcdefghij ", 103))
+ if err := validateDirectChannelImportData(&data); err == nil {
+ t.Fatal("Should have failed due to too long header.")
+ }
+
+ // Test with different combinations of invalid member counts.
+ data = DirectChannelImportData{
+ Members: &[]string{},
+ }
+ if err := validateDirectChannelImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to invalid number of members.")
+ }
+
+ data = DirectChannelImportData{
+ Members: &[]string{
+ model.NewId(),
+ },
+ }
+ if err := validateDirectChannelImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to invalid number of members.")
+ }
+
+ data = DirectChannelImportData{
+ Members: &[]string{
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ },
+ }
+ if err := validateDirectChannelImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to invalid number of members.")
+ }
+
+ // Test with invalid FavoritedBy
+ member1 := model.NewId()
+ member2 := model.NewId()
+ data = DirectChannelImportData{
+ Members: &[]string{
+ member1,
+ member2,
+ },
+ FavoritedBy: &[]string{
+ member1,
+ model.NewId(),
+ },
+ }
+ if err := validateDirectChannelImportData(&data); err == nil {
+ t.Fatal("Validation should have failed due to non-member favorited.")
+ }
+
+ // Test with valid FavoritedBy
+ data = DirectChannelImportData{
+ Members: &[]string{
+ member1,
+ member2,
+ },
+ FavoritedBy: &[]string{
+ member1,
+ member2,
+ },
+ }
+ if err := validateDirectChannelImportData(&data); err != nil {
+ t.Fatal(err)
+ }
+}
+
+func TestImportValidateDirectPostImportData(t *testing.T) {
+ maxPostSize := 10000
+
+ // Test with minimum required valid properties.
+ data := DirectPostImportData{
+ ChannelMembers: &[]string{
+ model.NewId(),
+ model.NewId(),
+ },
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateDirectPostImportData(&data, maxPostSize); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+
+ // Test with missing required properties.
+ data = DirectPostImportData{
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateDirectPostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = DirectPostImportData{
+ ChannelMembers: &[]string{
+ model.NewId(),
+ model.NewId(),
+ },
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateDirectPostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = DirectPostImportData{
+ ChannelMembers: &[]string{
+ model.NewId(),
+ model.NewId(),
+ },
+ User: ptrStr("username"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateDirectPostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ data = DirectPostImportData{
+ ChannelMembers: &[]string{
+ model.NewId(),
+ model.NewId(),
+ },
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ }
+ if err := validateDirectPostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to missing required property.")
+ }
+
+ // Test with invalid numbers of channel members.
+ data = DirectPostImportData{
+ ChannelMembers: &[]string{},
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateDirectPostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to unsuitable number of members.")
+ }
+
+ data = DirectPostImportData{
+ ChannelMembers: &[]string{
+ model.NewId(),
+ },
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateDirectPostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to unsuitable number of members.")
+ }
+
+ data = DirectPostImportData{
+ ChannelMembers: &[]string{
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ },
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateDirectPostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to unsuitable number of members.")
+ }
+
+ // Test with group message number of members.
+ data = DirectPostImportData{
+ ChannelMembers: &[]string{
+ model.NewId(),
+ model.NewId(),
+ model.NewId(),
+ },
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateDirectPostImportData(&data, maxPostSize); err != nil {
+ t.Fatal("Validation failed but should have been valid.")
+ }
+
+ // Test with invalid message.
+ data = DirectPostImportData{
+ ChannelMembers: &[]string{
+ model.NewId(),
+ model.NewId(),
+ },
+ User: ptrStr("username"),
+ Message: ptrStr(strings.Repeat("0", maxPostSize+1)),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateDirectPostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to too long message.")
+ }
+
+ // Test with invalid CreateAt
+ data = DirectPostImportData{
+ ChannelMembers: &[]string{
+ model.NewId(),
+ model.NewId(),
+ },
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(0),
+ }
+ if err := validateDirectPostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Should have failed due to 0 create-at value.")
+ }
+
+ // Test with invalid FlaggedBy
+ member1 := model.NewId()
+ member2 := model.NewId()
+ data = DirectPostImportData{
+ ChannelMembers: &[]string{
+ member1,
+ member2,
+ },
+ FlaggedBy: &[]string{
+ member1,
+ model.NewId(),
+ },
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateDirectPostImportData(&data, maxPostSize); err == nil {
+ t.Fatal("Validation should have failed due to non-member flagged.")
+ }
+
+ // Test with valid FlaggedBy
+ data = DirectPostImportData{
+ ChannelMembers: &[]string{
+ member1,
+ member2,
+ },
+ FlaggedBy: &[]string{
+ member1,
+ member2,
+ },
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }
+ if err := validateDirectPostImportData(&data, maxPostSize); err != nil {
+ t.Fatal(err)
+ }
+
+ // Test with valid all optional parameters.
+ reactions := []ReactionImportData{ReactionImportData{
+ User: ptrStr("username"),
+ EmojiName: ptrStr("emoji"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }}
+ replies := []ReplyImportData{ReplyImportData{
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ }}
+ data = DirectPostImportData{
+ ChannelMembers: &[]string{
+ member1,
+ member2,
+ },
+ FlaggedBy: &[]string{
+ member1,
+ member2,
+ },
+ User: ptrStr("username"),
+ Message: ptrStr("message"),
+ CreateAt: ptrInt64(model.GetMillis()),
+ Reactions: &reactions,
+ Replies: &replies,
+ }
+
+ if err := validateDirectPostImportData(&data, maxPostSize); err != nil {
+ t.Fatal(err)
+ }
+}
+
+func TestImportValidateEmojiImportData(t *testing.T) {
+ data := EmojiImportData{
+ Name: ptrStr("parrot"),
+ Image: ptrStr("/path/to/image"),
+ }
+
+ err := validateEmojiImportData(&data)
+ assert.Nil(t, err, "Validation should succeed")
+
+ *data.Name = "smiley"
+ err = validateEmojiImportData(&data)
+ assert.NotNil(t, err)
+
+ *data.Name = ""
+ err = validateEmojiImportData(&data)
+ assert.NotNil(t, err)
+
+ *data.Name = ""
+ *data.Image = ""
+ err = validateEmojiImportData(&data)
+ assert.NotNil(t, err)
+
+ *data.Image = "/path/to/image"
+ data.Name = nil
+ err = validateEmojiImportData(&data)
+ assert.NotNil(t, err)
+
+ data.Name = ptrStr("parrot")
+ data.Image = nil
+ err = validateEmojiImportData(&data)
+ assert.NotNil(t, err)
+}