github.com/mattermost/mattermost-server/v5@v5.39.3/store/storetest/scheme_store.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package storetest
     5  
     6  import (
     7  	"context"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/mattermost/mattermost-server/v5/model"
    14  	"github.com/mattermost/mattermost-server/v5/store"
    15  )
    16  
    17  func TestSchemeStore(t *testing.T, ss store.Store) {
    18  	createDefaultRoles(ss)
    19  
    20  	t.Run("Save", func(t *testing.T) { testSchemeStoreSave(t, ss) })
    21  	t.Run("Get", func(t *testing.T) { testSchemeStoreGet(t, ss) })
    22  	t.Run("GetAllPage", func(t *testing.T) { testSchemeStoreGetAllPage(t, ss) })
    23  	t.Run("Delete", func(t *testing.T) { testSchemeStoreDelete(t, ss) })
    24  	t.Run("PermanentDeleteAll", func(t *testing.T) { testSchemeStorePermanentDeleteAll(t, ss) })
    25  	t.Run("GetByName", func(t *testing.T) { testSchemeStoreGetByName(t, ss) })
    26  	t.Run("CountByScope", func(t *testing.T) { testSchemeStoreCountByScope(t, ss) })
    27  	t.Run("CountWithoutPermission", func(t *testing.T) { testCountWithoutPermission(t, ss) })
    28  }
    29  
    30  func createDefaultRoles(ss store.Store) {
    31  	ss.Role().Save(&model.Role{
    32  		Name:        model.TEAM_ADMIN_ROLE_ID,
    33  		DisplayName: model.TEAM_ADMIN_ROLE_ID,
    34  		Permissions: []string{
    35  			model.PERMISSION_DELETE_OTHERS_POSTS.Id,
    36  		},
    37  	})
    38  
    39  	ss.Role().Save(&model.Role{
    40  		Name:        model.TEAM_USER_ROLE_ID,
    41  		DisplayName: model.TEAM_USER_ROLE_ID,
    42  		Permissions: []string{
    43  			model.PERMISSION_VIEW_TEAM.Id,
    44  			model.PERMISSION_ADD_USER_TO_TEAM.Id,
    45  		},
    46  	})
    47  
    48  	ss.Role().Save(&model.Role{
    49  		Name:        model.TEAM_GUEST_ROLE_ID,
    50  		DisplayName: model.TEAM_GUEST_ROLE_ID,
    51  		Permissions: []string{
    52  			model.PERMISSION_VIEW_TEAM.Id,
    53  		},
    54  	})
    55  
    56  	ss.Role().Save(&model.Role{
    57  		Name:        model.CHANNEL_ADMIN_ROLE_ID,
    58  		DisplayName: model.CHANNEL_ADMIN_ROLE_ID,
    59  		Permissions: []string{
    60  			model.PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id,
    61  			model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id,
    62  		},
    63  	})
    64  
    65  	ss.Role().Save(&model.Role{
    66  		Name:        model.CHANNEL_USER_ROLE_ID,
    67  		DisplayName: model.CHANNEL_USER_ROLE_ID,
    68  		Permissions: []string{
    69  			model.PERMISSION_READ_CHANNEL.Id,
    70  			model.PERMISSION_CREATE_POST.Id,
    71  		},
    72  	})
    73  
    74  	ss.Role().Save(&model.Role{
    75  		Name:        model.CHANNEL_GUEST_ROLE_ID,
    76  		DisplayName: model.CHANNEL_GUEST_ROLE_ID,
    77  		Permissions: []string{
    78  			model.PERMISSION_READ_CHANNEL.Id,
    79  			model.PERMISSION_CREATE_POST.Id,
    80  		},
    81  	})
    82  }
    83  
    84  func testSchemeStoreSave(t *testing.T, ss store.Store) {
    85  	// Save a new scheme.
    86  	s1 := &model.Scheme{
    87  		DisplayName: model.NewId(),
    88  		Name:        model.NewId(),
    89  		Description: model.NewId(),
    90  		Scope:       model.SCHEME_SCOPE_TEAM,
    91  	}
    92  
    93  	// Check all fields saved correctly.
    94  	d1, err := ss.Scheme().Save(s1)
    95  	assert.NoError(t, err)
    96  	assert.Len(t, d1.Id, 26)
    97  	assert.Equal(t, s1.DisplayName, d1.DisplayName)
    98  	assert.Equal(t, s1.Name, d1.Name)
    99  	assert.Equal(t, s1.Description, d1.Description)
   100  	assert.NotZero(t, d1.CreateAt)
   101  	assert.NotZero(t, d1.UpdateAt)
   102  	assert.Zero(t, d1.DeleteAt)
   103  	assert.Equal(t, s1.Scope, d1.Scope)
   104  	assert.Len(t, d1.DefaultTeamAdminRole, 26)
   105  	assert.Len(t, d1.DefaultTeamUserRole, 26)
   106  	assert.Len(t, d1.DefaultTeamGuestRole, 26)
   107  	assert.Len(t, d1.DefaultChannelAdminRole, 26)
   108  	assert.Len(t, d1.DefaultChannelUserRole, 26)
   109  	assert.Len(t, d1.DefaultChannelGuestRole, 26)
   110  
   111  	// Check the default roles were created correctly.
   112  	role1, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamAdminRole)
   113  	assert.NoError(t, err)
   114  	assert.Equal(t, role1.Permissions, []string{"delete_others_posts"})
   115  	assert.True(t, role1.SchemeManaged)
   116  
   117  	role2, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamUserRole)
   118  	assert.NoError(t, err)
   119  	assert.Equal(t, role2.Permissions, []string{"view_team", "add_user_to_team"})
   120  	assert.True(t, role2.SchemeManaged)
   121  
   122  	role3, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelAdminRole)
   123  	assert.NoError(t, err)
   124  	assert.Equal(t, role3.Permissions, []string{"manage_public_channel_members", "manage_private_channel_members"})
   125  	assert.True(t, role3.SchemeManaged)
   126  
   127  	role4, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelUserRole)
   128  	assert.NoError(t, err)
   129  	assert.Equal(t, role4.Permissions, []string{"read_channel", "create_post"})
   130  	assert.True(t, role4.SchemeManaged)
   131  
   132  	role5, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamGuestRole)
   133  	assert.NoError(t, err)
   134  	assert.Equal(t, role5.Permissions, []string{"view_team"})
   135  	assert.True(t, role5.SchemeManaged)
   136  
   137  	role6, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelGuestRole)
   138  	assert.NoError(t, err)
   139  	assert.Equal(t, role6.Permissions, []string{"read_channel", "create_post"})
   140  	assert.True(t, role6.SchemeManaged)
   141  
   142  	// Change the scheme description and update.
   143  	d1.Description = model.NewId()
   144  
   145  	d2, err := ss.Scheme().Save(d1)
   146  	assert.NoError(t, err)
   147  	assert.Equal(t, d1.Id, d2.Id)
   148  	assert.Equal(t, s1.DisplayName, d2.DisplayName)
   149  	assert.Equal(t, s1.Name, d2.Name)
   150  	assert.Equal(t, d1.Description, d2.Description)
   151  	assert.NotZero(t, d2.CreateAt)
   152  	assert.NotZero(t, d2.UpdateAt)
   153  	assert.Zero(t, d2.DeleteAt)
   154  	assert.Equal(t, s1.Scope, d2.Scope)
   155  	assert.Equal(t, d1.DefaultTeamAdminRole, d2.DefaultTeamAdminRole)
   156  	assert.Equal(t, d1.DefaultTeamUserRole, d2.DefaultTeamUserRole)
   157  	assert.Equal(t, d1.DefaultTeamGuestRole, d2.DefaultTeamGuestRole)
   158  	assert.Equal(t, d1.DefaultChannelAdminRole, d2.DefaultChannelAdminRole)
   159  	assert.Equal(t, d1.DefaultChannelUserRole, d2.DefaultChannelUserRole)
   160  	assert.Equal(t, d1.DefaultChannelGuestRole, d2.DefaultChannelGuestRole)
   161  
   162  	// Try saving one with an invalid ID set.
   163  	s3 := &model.Scheme{
   164  		Id:          model.NewId(),
   165  		DisplayName: model.NewId(),
   166  		Name:        model.NewId(),
   167  		Description: model.NewId(),
   168  		Scope:       model.SCHEME_SCOPE_TEAM,
   169  	}
   170  
   171  	_, err = ss.Scheme().Save(s3)
   172  	assert.Error(t, err)
   173  }
   174  
   175  func testSchemeStoreGet(t *testing.T, ss store.Store) {
   176  	// Save a scheme to test with.
   177  	s1 := &model.Scheme{
   178  		DisplayName: model.NewId(),
   179  		Name:        model.NewId(),
   180  		Description: model.NewId(),
   181  		Scope:       model.SCHEME_SCOPE_TEAM,
   182  	}
   183  
   184  	d1, err := ss.Scheme().Save(s1)
   185  	assert.NoError(t, err)
   186  	assert.Len(t, d1.Id, 26)
   187  
   188  	// Get a valid scheme
   189  	d2, err := ss.Scheme().Get(d1.Id)
   190  	assert.NoError(t, err)
   191  	assert.Equal(t, d1.Id, d2.Id)
   192  	assert.Equal(t, s1.DisplayName, d2.DisplayName)
   193  	assert.Equal(t, s1.Name, d2.Name)
   194  	assert.Equal(t, d1.Description, d2.Description)
   195  	assert.NotZero(t, d2.CreateAt)
   196  	assert.NotZero(t, d2.UpdateAt)
   197  	assert.Zero(t, d2.DeleteAt)
   198  	assert.Equal(t, s1.Scope, d2.Scope)
   199  	assert.Equal(t, d1.DefaultTeamAdminRole, d2.DefaultTeamAdminRole)
   200  	assert.Equal(t, d1.DefaultTeamUserRole, d2.DefaultTeamUserRole)
   201  	assert.Equal(t, d1.DefaultTeamGuestRole, d2.DefaultTeamGuestRole)
   202  	assert.Equal(t, d1.DefaultChannelAdminRole, d2.DefaultChannelAdminRole)
   203  	assert.Equal(t, d1.DefaultChannelUserRole, d2.DefaultChannelUserRole)
   204  	assert.Equal(t, d1.DefaultChannelGuestRole, d2.DefaultChannelGuestRole)
   205  
   206  	// Get an invalid scheme
   207  	_, err = ss.Scheme().Get(model.NewId())
   208  	assert.Error(t, err)
   209  }
   210  
   211  func testSchemeStoreGetByName(t *testing.T, ss store.Store) {
   212  	// Save a scheme to test with.
   213  	s1 := &model.Scheme{
   214  		DisplayName: model.NewId(),
   215  		Name:        model.NewId(),
   216  		Description: model.NewId(),
   217  		Scope:       model.SCHEME_SCOPE_TEAM,
   218  	}
   219  
   220  	d1, err := ss.Scheme().Save(s1)
   221  	assert.NoError(t, err)
   222  	assert.Len(t, d1.Id, 26)
   223  
   224  	// Get a valid scheme
   225  	d2, err := ss.Scheme().GetByName(d1.Name)
   226  	assert.NoError(t, err)
   227  	assert.Equal(t, d1.Id, d2.Id)
   228  	assert.Equal(t, s1.DisplayName, d2.DisplayName)
   229  	assert.Equal(t, s1.Name, d2.Name)
   230  	assert.Equal(t, d1.Description, d2.Description)
   231  	assert.NotZero(t, d2.CreateAt)
   232  	assert.NotZero(t, d2.UpdateAt)
   233  	assert.Zero(t, d2.DeleteAt)
   234  	assert.Equal(t, s1.Scope, d2.Scope)
   235  	assert.Equal(t, d1.DefaultTeamAdminRole, d2.DefaultTeamAdminRole)
   236  	assert.Equal(t, d1.DefaultTeamUserRole, d2.DefaultTeamUserRole)
   237  	assert.Equal(t, d1.DefaultTeamGuestRole, d2.DefaultTeamGuestRole)
   238  	assert.Equal(t, d1.DefaultChannelAdminRole, d2.DefaultChannelAdminRole)
   239  	assert.Equal(t, d1.DefaultChannelUserRole, d2.DefaultChannelUserRole)
   240  	assert.Equal(t, d1.DefaultChannelGuestRole, d2.DefaultChannelGuestRole)
   241  
   242  	// Get an invalid scheme
   243  	_, err = ss.Scheme().GetByName(model.NewId())
   244  	assert.Error(t, err)
   245  }
   246  
   247  func testSchemeStoreGetAllPage(t *testing.T, ss store.Store) {
   248  	// Save a scheme to test with.
   249  	schemes := []*model.Scheme{
   250  		{
   251  			DisplayName: model.NewId(),
   252  			Name:        model.NewId(),
   253  			Description: model.NewId(),
   254  			Scope:       model.SCHEME_SCOPE_TEAM,
   255  		},
   256  		{
   257  			DisplayName: model.NewId(),
   258  			Name:        model.NewId(),
   259  			Description: model.NewId(),
   260  			Scope:       model.SCHEME_SCOPE_CHANNEL,
   261  		},
   262  		{
   263  			DisplayName: model.NewId(),
   264  			Name:        model.NewId(),
   265  			Description: model.NewId(),
   266  			Scope:       model.SCHEME_SCOPE_TEAM,
   267  		},
   268  		{
   269  			DisplayName: model.NewId(),
   270  			Name:        model.NewId(),
   271  			Description: model.NewId(),
   272  			Scope:       model.SCHEME_SCOPE_CHANNEL,
   273  		},
   274  	}
   275  
   276  	for _, scheme := range schemes {
   277  		_, err := ss.Scheme().Save(scheme)
   278  		require.NoError(t, err)
   279  	}
   280  
   281  	s1, err := ss.Scheme().GetAllPage("", 0, 2)
   282  	assert.NoError(t, err)
   283  	assert.Len(t, s1, 2)
   284  
   285  	s2, err := ss.Scheme().GetAllPage("", 2, 2)
   286  	assert.NoError(t, err)
   287  	assert.Len(t, s2, 2)
   288  	assert.NotEqual(t, s1[0].DisplayName, s2[0].DisplayName)
   289  	assert.NotEqual(t, s1[0].DisplayName, s2[1].DisplayName)
   290  	assert.NotEqual(t, s1[1].DisplayName, s2[0].DisplayName)
   291  	assert.NotEqual(t, s1[1].DisplayName, s2[1].DisplayName)
   292  	assert.NotEqual(t, s1[0].Name, s2[0].Name)
   293  	assert.NotEqual(t, s1[0].Name, s2[1].Name)
   294  	assert.NotEqual(t, s1[1].Name, s2[0].Name)
   295  	assert.NotEqual(t, s1[1].Name, s2[1].Name)
   296  
   297  	s3, err := ss.Scheme().GetAllPage("team", 0, 1000)
   298  	assert.NoError(t, err)
   299  	assert.NotZero(t, len(s3))
   300  	for _, s := range s3 {
   301  		assert.Equal(t, "team", s.Scope)
   302  	}
   303  
   304  	s4, err := ss.Scheme().GetAllPage("channel", 0, 1000)
   305  	assert.NoError(t, err)
   306  	assert.NotZero(t, len(s4))
   307  	for _, s := range s4 {
   308  		assert.Equal(t, "channel", s.Scope)
   309  	}
   310  }
   311  
   312  func testSchemeStoreDelete(t *testing.T, ss store.Store) {
   313  	// Save a new scheme.
   314  	s1 := &model.Scheme{
   315  		DisplayName: model.NewId(),
   316  		Name:        model.NewId(),
   317  		Description: model.NewId(),
   318  		Scope:       model.SCHEME_SCOPE_TEAM,
   319  	}
   320  
   321  	// Check all fields saved correctly.
   322  	d1, err := ss.Scheme().Save(s1)
   323  	assert.NoError(t, err)
   324  	assert.Len(t, d1.Id, 26)
   325  	assert.Equal(t, s1.DisplayName, d1.DisplayName)
   326  	assert.Equal(t, s1.Name, d1.Name)
   327  	assert.Equal(t, s1.Description, d1.Description)
   328  	assert.NotZero(t, d1.CreateAt)
   329  	assert.NotZero(t, d1.UpdateAt)
   330  	assert.Zero(t, d1.DeleteAt)
   331  	assert.Equal(t, s1.Scope, d1.Scope)
   332  	assert.Len(t, d1.DefaultTeamAdminRole, 26)
   333  	assert.Len(t, d1.DefaultTeamUserRole, 26)
   334  	assert.Len(t, d1.DefaultTeamGuestRole, 26)
   335  	assert.Len(t, d1.DefaultChannelAdminRole, 26)
   336  	assert.Len(t, d1.DefaultChannelUserRole, 26)
   337  	assert.Len(t, d1.DefaultChannelGuestRole, 26)
   338  
   339  	// Check the default roles were created correctly.
   340  	role1, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamAdminRole)
   341  	assert.NoError(t, err)
   342  	assert.Equal(t, role1.Permissions, []string{"delete_others_posts"})
   343  	assert.True(t, role1.SchemeManaged)
   344  
   345  	role2, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamUserRole)
   346  	assert.NoError(t, err)
   347  	assert.Equal(t, role2.Permissions, []string{"view_team", "add_user_to_team"})
   348  	assert.True(t, role2.SchemeManaged)
   349  
   350  	role3, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelAdminRole)
   351  	assert.NoError(t, err)
   352  	assert.Equal(t, role3.Permissions, []string{"manage_public_channel_members", "manage_private_channel_members"})
   353  	assert.True(t, role3.SchemeManaged)
   354  
   355  	role4, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelUserRole)
   356  	assert.NoError(t, err)
   357  	assert.Equal(t, role4.Permissions, []string{"read_channel", "create_post"})
   358  	assert.True(t, role4.SchemeManaged)
   359  
   360  	role5, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamGuestRole)
   361  	assert.NoError(t, err)
   362  	assert.Equal(t, role5.Permissions, []string{"view_team"})
   363  	assert.True(t, role5.SchemeManaged)
   364  
   365  	role6, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelGuestRole)
   366  	assert.NoError(t, err)
   367  	assert.Equal(t, role6.Permissions, []string{"read_channel", "create_post"})
   368  	assert.True(t, role6.SchemeManaged)
   369  
   370  	// Delete the scheme.
   371  	d2, err := ss.Scheme().Delete(d1.Id)
   372  	require.NoError(t, err)
   373  	assert.NotZero(t, d2.DeleteAt)
   374  
   375  	// Check that the roles are deleted too.
   376  	role7, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamAdminRole)
   377  	assert.NoError(t, err)
   378  	assert.NotZero(t, role7.DeleteAt)
   379  
   380  	role8, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamUserRole)
   381  	assert.NoError(t, err)
   382  	assert.NotZero(t, role8.DeleteAt)
   383  
   384  	role9, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelAdminRole)
   385  	assert.NoError(t, err)
   386  	assert.NotZero(t, role9.DeleteAt)
   387  
   388  	role10, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelUserRole)
   389  	assert.NoError(t, err)
   390  	assert.NotZero(t, role10.DeleteAt)
   391  
   392  	role11, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamGuestRole)
   393  	assert.NoError(t, err)
   394  	assert.NotZero(t, role11.DeleteAt)
   395  
   396  	role12, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelGuestRole)
   397  	assert.NoError(t, err)
   398  	assert.NotZero(t, role12.DeleteAt)
   399  
   400  	// Try deleting a scheme that does not exist.
   401  	_, err = ss.Scheme().Delete(model.NewId())
   402  	assert.Error(t, err)
   403  
   404  	// Try deleting a team scheme that's in use.
   405  	s4 := &model.Scheme{
   406  		DisplayName: model.NewId(),
   407  		Name:        model.NewId(),
   408  		Description: model.NewId(),
   409  		Scope:       model.SCHEME_SCOPE_TEAM,
   410  	}
   411  	d4, err := ss.Scheme().Save(s4)
   412  	assert.NoError(t, err)
   413  
   414  	t4 := &model.Team{
   415  		Name:        "xx" + model.NewId(),
   416  		DisplayName: model.NewId(),
   417  		Email:       MakeEmail(),
   418  		Type:        model.TEAM_OPEN,
   419  		SchemeId:    &d4.Id,
   420  	}
   421  	t4, err = ss.Team().Save(t4)
   422  	require.NoError(t, err)
   423  
   424  	_, err = ss.Scheme().Delete(d4.Id)
   425  	assert.NoError(t, err)
   426  
   427  	t5, err := ss.Team().Get(t4.Id)
   428  	require.NoError(t, err)
   429  	assert.Equal(t, "", *t5.SchemeId)
   430  
   431  	// Try deleting a channel scheme that's in use.
   432  	s5 := &model.Scheme{
   433  		DisplayName: model.NewId(),
   434  		Name:        model.NewId(),
   435  		Description: model.NewId(),
   436  		Scope:       model.SCHEME_SCOPE_CHANNEL,
   437  	}
   438  	d5, err := ss.Scheme().Save(s5)
   439  	assert.NoError(t, err)
   440  
   441  	c5 := &model.Channel{
   442  		TeamId:      model.NewId(),
   443  		DisplayName: model.NewId(),
   444  		Name:        model.NewId(),
   445  		Type:        model.CHANNEL_OPEN,
   446  		SchemeId:    &d5.Id,
   447  	}
   448  	c5, nErr := ss.Channel().Save(c5, -1)
   449  	assert.NoError(t, nErr)
   450  
   451  	_, err = ss.Scheme().Delete(d5.Id)
   452  	assert.NoError(t, err)
   453  
   454  	c6, nErr := ss.Channel().Get(c5.Id, true)
   455  	assert.NoError(t, nErr)
   456  	assert.Equal(t, "", *c6.SchemeId)
   457  }
   458  
   459  func testSchemeStorePermanentDeleteAll(t *testing.T, ss store.Store) {
   460  	s1 := &model.Scheme{
   461  		Name:        model.NewId(),
   462  		DisplayName: model.NewId(),
   463  		Description: model.NewId(),
   464  		Scope:       model.SCHEME_SCOPE_TEAM,
   465  	}
   466  
   467  	s2 := &model.Scheme{
   468  		Name:        model.NewId(),
   469  		DisplayName: model.NewId(),
   470  		Description: model.NewId(),
   471  		Scope:       model.SCHEME_SCOPE_CHANNEL,
   472  	}
   473  
   474  	s1, err := ss.Scheme().Save(s1)
   475  	require.NoError(t, err)
   476  	s2, err = ss.Scheme().Save(s2)
   477  	require.NoError(t, err)
   478  
   479  	err = ss.Scheme().PermanentDeleteAll()
   480  	assert.NoError(t, err)
   481  
   482  	_, err = ss.Scheme().Get(s1.Id)
   483  	assert.Error(t, err)
   484  
   485  	_, err = ss.Scheme().Get(s2.Id)
   486  	assert.Error(t, err)
   487  
   488  	schemes, err := ss.Scheme().GetAllPage("", 0, 100000)
   489  	assert.NoError(t, err)
   490  	assert.Empty(t, schemes)
   491  }
   492  
   493  func testSchemeStoreCountByScope(t *testing.T, ss store.Store) {
   494  	testCounts := func(expectedTeamCount, expectedChannelCount int) {
   495  		actualCount, err := ss.Scheme().CountByScope(model.SCHEME_SCOPE_TEAM)
   496  		require.NoError(t, err)
   497  		require.Equal(t, int64(expectedTeamCount), actualCount)
   498  
   499  		actualCount, err = ss.Scheme().CountByScope(model.SCHEME_SCOPE_CHANNEL)
   500  		require.NoError(t, err)
   501  		require.Equal(t, int64(expectedChannelCount), actualCount)
   502  	}
   503  
   504  	createScheme := func(scope string) {
   505  		_, err := ss.Scheme().Save(&model.Scheme{
   506  			Name:        model.NewId(),
   507  			DisplayName: model.NewId(),
   508  			Description: model.NewId(),
   509  			Scope:       scope,
   510  		})
   511  		require.NoError(t, err)
   512  	}
   513  
   514  	err := ss.Scheme().PermanentDeleteAll()
   515  	require.NoError(t, err)
   516  
   517  	createScheme(model.SCHEME_SCOPE_CHANNEL)
   518  	createScheme(model.SCHEME_SCOPE_TEAM)
   519  	testCounts(1, 1)
   520  	createScheme(model.SCHEME_SCOPE_TEAM)
   521  	testCounts(2, 1)
   522  	createScheme(model.SCHEME_SCOPE_CHANNEL)
   523  	testCounts(2, 2)
   524  }
   525  
   526  func testCountWithoutPermission(t *testing.T, ss store.Store) {
   527  	perm := model.PERMISSION_CREATE_POST.Id
   528  
   529  	createScheme := func(scope string) *model.Scheme {
   530  		scheme, err := ss.Scheme().Save(&model.Scheme{
   531  			Name:        model.NewId(),
   532  			DisplayName: model.NewId(),
   533  			Description: model.NewId(),
   534  			Scope:       scope,
   535  		})
   536  		require.NoError(t, err)
   537  		return scheme
   538  	}
   539  
   540  	getRoles := func(scheme *model.Scheme) (channelUser, channelGuest *model.Role) {
   541  		var err error
   542  		channelUser, err = ss.Role().GetByName(context.Background(), scheme.DefaultChannelUserRole)
   543  		require.NoError(t, err)
   544  		require.NotNil(t, channelUser)
   545  		channelGuest, err = ss.Role().GetByName(context.Background(), scheme.DefaultChannelGuestRole)
   546  		require.NoError(t, err)
   547  		require.NotNil(t, channelGuest)
   548  		return
   549  	}
   550  
   551  	teamScheme1 := createScheme(model.SCHEME_SCOPE_TEAM)
   552  	defer ss.Scheme().Delete(teamScheme1.Id)
   553  	teamScheme2 := createScheme(model.SCHEME_SCOPE_TEAM)
   554  	defer ss.Scheme().Delete(teamScheme2.Id)
   555  	channelScheme1 := createScheme(model.SCHEME_SCOPE_CHANNEL)
   556  	defer ss.Scheme().Delete(channelScheme1.Id)
   557  	channelScheme2 := createScheme(model.SCHEME_SCOPE_CHANNEL)
   558  	defer ss.Scheme().Delete(channelScheme2.Id)
   559  
   560  	ts1User, ts1Guest := getRoles(teamScheme1)
   561  	ts2User, ts2Guest := getRoles(teamScheme2)
   562  	cs1User, cs1Guest := getRoles(channelScheme1)
   563  	cs2User, cs2Guest := getRoles(channelScheme2)
   564  
   565  	allRoles := []*model.Role{
   566  		ts1User,
   567  		ts1Guest,
   568  		ts2User,
   569  		ts2Guest,
   570  		cs1User,
   571  		cs1Guest,
   572  		cs2User,
   573  		cs2Guest,
   574  	}
   575  
   576  	teamUserCount, err := ss.Scheme().CountWithoutPermission(model.SCHEME_SCOPE_TEAM, perm, model.RoleScopeChannel, model.RoleTypeUser)
   577  	require.NoError(t, err)
   578  	require.Equal(t, int64(0), teamUserCount)
   579  
   580  	teamGuestCount, err := ss.Scheme().CountWithoutPermission(model.SCHEME_SCOPE_TEAM, perm, model.RoleScopeChannel, model.RoleTypeGuest)
   581  	require.NoError(t, err)
   582  	require.Equal(t, int64(0), teamGuestCount)
   583  
   584  	var tests = []struct {
   585  		removePermissionFromRole             *model.Role
   586  		expectTeamSchemeChannelUserCount     int
   587  		expectTeamSchemeChannelGuestCount    int
   588  		expectChannelSchemeChannelUserCount  int
   589  		expectChannelSchemeChannelGuestCount int
   590  	}{
   591  		{ts1User, 1, 0, 0, 0},
   592  		{ts1Guest, 1, 1, 0, 0},
   593  		{ts2User, 2, 1, 0, 0},
   594  		{ts2Guest, 2, 2, 0, 0},
   595  		{cs1User, 2, 2, 1, 0},
   596  		{cs1Guest, 2, 2, 1, 1},
   597  		{cs2User, 2, 2, 2, 1},
   598  		{cs2Guest, 2, 2, 2, 2},
   599  	}
   600  
   601  	removePermission := func(targetRole *model.Role) {
   602  		roleMatched := false
   603  		for _, role := range allRoles {
   604  			if targetRole == role {
   605  				roleMatched = true
   606  				role.Permissions = []string{}
   607  				_, err = ss.Role().Save(role)
   608  				require.NoError(t, err)
   609  			}
   610  		}
   611  		require.True(t, roleMatched)
   612  	}
   613  
   614  	for _, test := range tests {
   615  		removePermission(test.removePermissionFromRole)
   616  
   617  		count, err := ss.Scheme().CountWithoutPermission(model.SCHEME_SCOPE_TEAM, perm, model.RoleScopeChannel, model.RoleTypeUser)
   618  		require.NoError(t, err)
   619  		require.Equal(t, int64(test.expectTeamSchemeChannelUserCount), count)
   620  
   621  		count, err = ss.Scheme().CountWithoutPermission(model.SCHEME_SCOPE_TEAM, perm, model.RoleScopeChannel, model.RoleTypeGuest)
   622  		require.NoError(t, err)
   623  		require.Equal(t, int64(test.expectTeamSchemeChannelGuestCount), count)
   624  
   625  		count, err = ss.Scheme().CountWithoutPermission(model.SCHEME_SCOPE_CHANNEL, perm, model.RoleScopeChannel, model.RoleTypeUser)
   626  		require.NoError(t, err)
   627  		require.Equal(t, int64(test.expectChannelSchemeChannelUserCount), count)
   628  
   629  		count, err = ss.Scheme().CountWithoutPermission(model.SCHEME_SCOPE_CHANNEL, perm, model.RoleScopeChannel, model.RoleTypeGuest)
   630  		require.NoError(t, err)
   631  		require.Equal(t, int64(test.expectChannelSchemeChannelGuestCount), count)
   632  	}
   633  }