github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/model/role_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package model
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  )
    11  
    12  func TestChannelModeratedPermissionsChangedByPatch(t *testing.T) {
    13  	testCases := []struct {
    14  		Name             string
    15  		Permissions      []string
    16  		PatchPermissions []string
    17  		Expected         []string
    18  	}{
    19  		{
    20  			"Empty patch returns empty slice",
    21  			[]string{},
    22  			[]string{},
    23  			[]string{},
    24  		},
    25  		{
    26  			"Adds permissions to empty initial permissions list",
    27  			[]string{},
    28  			[]string{PERMISSION_CREATE_POST.Id, PERMISSION_ADD_REACTION.Id},
    29  			[]string{CHANNEL_MODERATED_PERMISSIONS[0], CHANNEL_MODERATED_PERMISSIONS[1]},
    30  		},
    31  		{
    32  			"Ignores non moderated permissions in initial permissions list",
    33  			[]string{PERMISSION_ASSIGN_BOT.Id},
    34  			[]string{PERMISSION_CREATE_POST.Id, PERMISSION_REMOVE_REACTION.Id},
    35  			[]string{CHANNEL_MODERATED_PERMISSIONS[0], CHANNEL_MODERATED_PERMISSIONS[1]},
    36  		},
    37  		{
    38  			"Adds removed moderated permissions from initial permissions list",
    39  			[]string{PERMISSION_CREATE_POST.Id},
    40  			[]string{},
    41  			[]string{PERMISSION_CREATE_POST.Id},
    42  		},
    43  		{
    44  			"No changes returns empty slice",
    45  			[]string{PERMISSION_CREATE_POST.Id, PERMISSION_ASSIGN_BOT.Id},
    46  			[]string{PERMISSION_CREATE_POST.Id},
    47  			[]string{},
    48  		},
    49  	}
    50  	for _, tc := range testCases {
    51  		t.Run(tc.Name, func(t *testing.T) {
    52  			baseRole := &Role{Permissions: tc.Permissions}
    53  			rolePatch := &RolePatch{Permissions: &tc.PatchPermissions}
    54  			result := ChannelModeratedPermissionsChangedByPatch(baseRole, rolePatch)
    55  			assert.ElementsMatch(t, tc.Expected, result)
    56  		})
    57  	}
    58  }
    59  
    60  func TestRolePatchFromChannelModerationsPatch(t *testing.T) {
    61  	createPosts := CHANNEL_MODERATED_PERMISSIONS[0]
    62  	createReactions := CHANNEL_MODERATED_PERMISSIONS[1]
    63  	manageMembers := CHANNEL_MODERATED_PERMISSIONS[2]
    64  	channelMentions := CHANNEL_MODERATED_PERMISSIONS[3]
    65  
    66  	basePermissions := []string{
    67  		PERMISSION_ADD_REACTION.Id,
    68  		PERMISSION_REMOVE_REACTION.Id,
    69  		PERMISSION_CREATE_POST.Id,
    70  		PERMISSION_USE_CHANNEL_MENTIONS.Id,
    71  		PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id,
    72  		PERMISSION_UPLOAD_FILE.Id,
    73  		PERMISSION_GET_PUBLIC_LINK.Id,
    74  		PERMISSION_USE_SLASH_COMMANDS.Id,
    75  	}
    76  
    77  	baseModeratedPermissions := []string{
    78  		PERMISSION_ADD_REACTION.Id,
    79  		PERMISSION_REMOVE_REACTION.Id,
    80  		PERMISSION_CREATE_POST.Id,
    81  		PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id,
    82  		PERMISSION_USE_CHANNEL_MENTIONS.Id,
    83  	}
    84  
    85  	testCases := []struct {
    86  		Name                     string
    87  		Permissions              []string
    88  		ChannelModerationsPatch  []*ChannelModerationPatch
    89  		RoleName                 string
    90  		ExpectedPatchPermissions []string
    91  	}{
    92  		{
    93  			"Patch to member role adding a permission that already exists",
    94  			basePermissions,
    95  			[]*ChannelModerationPatch{
    96  				{
    97  					Name:  &createReactions,
    98  					Roles: &ChannelModeratedRolesPatch{Members: NewBool(true)},
    99  				},
   100  			},
   101  			"members",
   102  			baseModeratedPermissions,
   103  		},
   104  		{
   105  			"Patch to member role with moderation patch for guest role",
   106  			basePermissions,
   107  			[]*ChannelModerationPatch{
   108  				{
   109  					Name:  &createReactions,
   110  					Roles: &ChannelModeratedRolesPatch{Guests: NewBool(true)},
   111  				},
   112  			},
   113  			"members",
   114  			baseModeratedPermissions,
   115  		},
   116  		{
   117  			"Patch to guest role with moderation patch for member role",
   118  			basePermissions,
   119  			[]*ChannelModerationPatch{
   120  				{
   121  					Name:  &createReactions,
   122  					Roles: &ChannelModeratedRolesPatch{Members: NewBool(true)},
   123  				},
   124  			},
   125  			"guests",
   126  			baseModeratedPermissions,
   127  		},
   128  		{
   129  			"Patch to member role removing multiple channel moderated permissions",
   130  			basePermissions,
   131  			[]*ChannelModerationPatch{
   132  				{
   133  					Name:  &createReactions,
   134  					Roles: &ChannelModeratedRolesPatch{Members: NewBool(false)},
   135  				},
   136  				{
   137  					Name:  &manageMembers,
   138  					Roles: &ChannelModeratedRolesPatch{Members: NewBool(false)},
   139  				},
   140  				{
   141  					Name:  &channelMentions,
   142  					Roles: &ChannelModeratedRolesPatch{Members: NewBool(false)},
   143  				},
   144  			},
   145  			"members",
   146  			[]string{PERMISSION_CREATE_POST.Id},
   147  		},
   148  		{
   149  			"Patch to guest role removing multiple channel moderated permissions",
   150  			basePermissions,
   151  			[]*ChannelModerationPatch{
   152  				{
   153  					Name:  &createReactions,
   154  					Roles: &ChannelModeratedRolesPatch{Guests: NewBool(false)},
   155  				},
   156  				{
   157  					Name:  &manageMembers,
   158  					Roles: &ChannelModeratedRolesPatch{Guests: NewBool(false)},
   159  				},
   160  				{
   161  					Name:  &channelMentions,
   162  					Roles: &ChannelModeratedRolesPatch{Guests: NewBool(false)},
   163  				},
   164  			},
   165  			"guests",
   166  			[]string{PERMISSION_CREATE_POST.Id},
   167  		},
   168  		{
   169  			"Patch enabling and removing multiple channel moderated permissions ",
   170  			[]string{PERMISSION_ADD_REACTION.Id, PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id},
   171  			[]*ChannelModerationPatch{
   172  				{
   173  					Name:  &createReactions,
   174  					Roles: &ChannelModeratedRolesPatch{Members: NewBool(false)},
   175  				},
   176  				{
   177  					Name:  &manageMembers,
   178  					Roles: &ChannelModeratedRolesPatch{Members: NewBool(false)},
   179  				},
   180  				{
   181  					Name:  &channelMentions,
   182  					Roles: &ChannelModeratedRolesPatch{Members: NewBool(true)},
   183  				},
   184  				{
   185  					Name:  &createPosts,
   186  					Roles: &ChannelModeratedRolesPatch{Members: NewBool(true)},
   187  				},
   188  			},
   189  			"members",
   190  			[]string{PERMISSION_CREATE_POST.Id, PERMISSION_USE_CHANNEL_MENTIONS.Id},
   191  		},
   192  		{
   193  			"Patch enabling a partially enabled permission",
   194  			[]string{PERMISSION_ADD_REACTION.Id},
   195  			[]*ChannelModerationPatch{
   196  				{
   197  					Name:  &createReactions,
   198  					Roles: &ChannelModeratedRolesPatch{Members: NewBool(true)},
   199  				},
   200  			},
   201  			"members",
   202  			[]string{PERMISSION_ADD_REACTION.Id, PERMISSION_REMOVE_REACTION.Id},
   203  		},
   204  		{
   205  			"Patch disabling a partially disabled permission",
   206  			[]string{PERMISSION_ADD_REACTION.Id},
   207  			[]*ChannelModerationPatch{
   208  				{
   209  					Name:  &createReactions,
   210  					Roles: &ChannelModeratedRolesPatch{Members: NewBool(false)},
   211  				},
   212  				{
   213  					Name:  &createPosts,
   214  					Roles: &ChannelModeratedRolesPatch{Members: NewBool(true)},
   215  				},
   216  			},
   217  			"members",
   218  			[]string{PERMISSION_CREATE_POST.Id},
   219  		},
   220  	}
   221  	for _, tc := range testCases {
   222  		t.Run(tc.Name, func(t *testing.T) {
   223  			baseRole := &Role{Permissions: tc.Permissions}
   224  			rolePatch := baseRole.RolePatchFromChannelModerationsPatch(tc.ChannelModerationsPatch, tc.RoleName)
   225  			assert.ElementsMatch(t, tc.ExpectedPatchPermissions, *rolePatch.Permissions)
   226  		})
   227  	}
   228  }
   229  
   230  func TestGetChannelModeratedPermissions(t *testing.T) {
   231  	tests := []struct {
   232  		Name        string
   233  		Permissions []string
   234  		ChannelType string
   235  		Expected    map[string]bool
   236  	}{
   237  		{
   238  			"Filters non moderated permissions",
   239  			[]string{PERMISSION_CREATE_BOT.Id},
   240  			CHANNEL_OPEN,
   241  			map[string]bool{},
   242  		},
   243  		{
   244  			"Returns a map of moderated permissions",
   245  			[]string{PERMISSION_CREATE_POST.Id, PERMISSION_ADD_REACTION.Id, PERMISSION_REMOVE_REACTION.Id, PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id, PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, PERMISSION_USE_CHANNEL_MENTIONS.Id},
   246  			CHANNEL_OPEN,
   247  			map[string]bool{
   248  				CHANNEL_MODERATED_PERMISSIONS[0]: true,
   249  				CHANNEL_MODERATED_PERMISSIONS[1]: true,
   250  				CHANNEL_MODERATED_PERMISSIONS[2]: true,
   251  				CHANNEL_MODERATED_PERMISSIONS[3]: true,
   252  			},
   253  		},
   254  		{
   255  			"Returns a map of moderated permissions when non moderated present",
   256  			[]string{PERMISSION_CREATE_POST.Id, PERMISSION_CREATE_DIRECT_CHANNEL.Id},
   257  			CHANNEL_OPEN,
   258  			map[string]bool{
   259  				CHANNEL_MODERATED_PERMISSIONS[0]: true,
   260  			},
   261  		},
   262  		{
   263  			"Returns a nothing when no permissions present",
   264  			[]string{},
   265  			CHANNEL_OPEN,
   266  			map[string]bool{},
   267  		},
   268  	}
   269  	for _, tc := range tests {
   270  		t.Run(tc.Name, func(t *testing.T) {
   271  			role := &Role{Permissions: tc.Permissions}
   272  			moderatedPermissions := role.GetChannelModeratedPermissions(tc.ChannelType)
   273  			for permission := range moderatedPermissions {
   274  				assert.Equal(t, moderatedPermissions[permission], tc.Expected[permission])
   275  			}
   276  		})
   277  	}
   278  }