github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/store/storetest/scheme_store_test.go (about)

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