github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/app/syncables_test.go (about)

     1  package app
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/xzl8028/xenia-server/model"
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func TestCreateDefaultMemberships(t *testing.T) {
    11  	th := Setup(t).InitBasic()
    12  	defer th.TearDown()
    13  
    14  	singersTeam, err := th.App.CreateTeam(&model.Team{
    15  		DisplayName: "Singers",
    16  		Name:        model.NewId(),
    17  		Email:       "singers@test.com",
    18  		Type:        model.TEAM_OPEN,
    19  	})
    20  	if err != nil {
    21  		t.Errorf("test team not created: %s", err.Error())
    22  	}
    23  
    24  	nerdsTeam, err := th.App.CreateTeam(&model.Team{
    25  		DisplayName: "Nerds",
    26  		Name:        model.NewId(),
    27  		Email:       "nerds@test.com",
    28  		Type:        model.TEAM_INVITE,
    29  	})
    30  	if err != nil {
    31  		t.Errorf("test team not created: %s", err.Error())
    32  	}
    33  
    34  	practiceChannel, err := th.App.CreateChannel(&model.Channel{
    35  		TeamId:      singersTeam.Id,
    36  		DisplayName: "Practices",
    37  		Name:        model.NewId(),
    38  		Type:        model.CHANNEL_OPEN,
    39  	}, false)
    40  	if err != nil {
    41  		t.Errorf("test channel not created: %s", err.Error())
    42  	}
    43  
    44  	experimentsChannel, err := th.App.CreateChannel(&model.Channel{
    45  		TeamId:      singersTeam.Id,
    46  		DisplayName: "Experiments",
    47  		Name:        model.NewId(),
    48  		Type:        model.CHANNEL_PRIVATE,
    49  	}, false)
    50  	if err != nil {
    51  		t.Errorf("test channel not created: %s", err.Error())
    52  	}
    53  
    54  	gleeGroup, err := th.App.CreateGroup(&model.Group{
    55  		Name:        model.NewId(),
    56  		DisplayName: "Glee Club",
    57  		RemoteId:    model.NewId(),
    58  		Source:      model.GroupSourceLdap,
    59  	})
    60  	if err != nil {
    61  		t.Errorf("test group not created: %s", err.Error())
    62  	}
    63  
    64  	scienceGroup, err := th.App.CreateGroup(&model.Group{
    65  		Name:        model.NewId(),
    66  		DisplayName: "Science Club",
    67  		RemoteId:    model.NewId(),
    68  		Source:      model.GroupSourceLdap,
    69  	})
    70  	if err != nil {
    71  		t.Errorf("test group not created: %s", err.Error())
    72  	}
    73  
    74  	_, err = th.App.CreateGroupSyncable(model.NewGroupChannel(gleeGroup.Id, practiceChannel.Id, true))
    75  	if err != nil {
    76  		t.Errorf("test groupchannel not created: %s", err.Error())
    77  	}
    78  
    79  	scienceTeamGroupSyncable, err := th.App.CreateGroupSyncable(model.NewGroupTeam(scienceGroup.Id, nerdsTeam.Id, false))
    80  	if err != nil {
    81  		t.Errorf("test groupteam not created: %s", err.Error())
    82  	}
    83  
    84  	scienceChannelGroupSyncable, err := th.App.CreateGroupSyncable(model.NewGroupChannel(scienceGroup.Id, experimentsChannel.Id, false))
    85  	if err != nil {
    86  		t.Errorf("test groupchannel not created: %s", err.Error())
    87  	}
    88  
    89  	singer1 := th.BasicUser
    90  	scientist1 := th.BasicUser2
    91  
    92  	_, err = th.App.UpsertGroupMember(gleeGroup.Id, singer1.Id)
    93  	if err != nil {
    94  		t.Errorf("test groupmember not created: %s", err.Error())
    95  	}
    96  
    97  	scientistGroupMember, err := th.App.UpsertGroupMember(scienceGroup.Id, scientist1.Id)
    98  	if err != nil {
    99  		t.Errorf("test groupmember not created: %s", err.Error())
   100  	}
   101  
   102  	pErr := th.App.CreateDefaultMemberships(0)
   103  	if pErr != nil {
   104  		t.Errorf("faild to populate syncables: %s", pErr.Error())
   105  	}
   106  
   107  	// Singer should be in team and channel
   108  	_, err = th.App.GetTeamMember(singersTeam.Id, singer1.Id)
   109  	if err != nil {
   110  		t.Errorf("error retrieving team member: %s", err.Error())
   111  	}
   112  	_, err = th.App.GetChannelMember(practiceChannel.Id, singer1.Id)
   113  	if err != nil {
   114  		t.Errorf("error retrieving channel member: %s", err.Error())
   115  	}
   116  
   117  	tMembers, err := th.App.GetTeamMembers(singersTeam.Id, 0, 999, nil)
   118  	if err != nil {
   119  		t.Errorf("error retrieving team members: %s", err.Error())
   120  	}
   121  	expected := 1
   122  	actual := len(tMembers)
   123  	if actual != expected {
   124  		t.Errorf("expected %d team members but got %d", expected, actual)
   125  	}
   126  
   127  	cMembersCount, err := th.App.GetChannelMemberCount(practiceChannel.Id)
   128  	if err != nil {
   129  		t.Errorf("error retrieving team members: %s", err.Error())
   130  	}
   131  	if cMembersCount != int64(expected) {
   132  		t.Errorf("expected %d team member but got %d", expected, cMembersCount)
   133  	}
   134  
   135  	// Scientist should not be in team or channel
   136  	_, err = th.App.GetTeamMember(nerdsTeam.Id, scientist1.Id)
   137  	if err.Id != "store.sql_team.get_member.missing.app_error" {
   138  		t.Errorf("wrong error: %s", err.Id)
   139  	}
   140  
   141  	_, err = th.App.GetChannelMember(experimentsChannel.Id, scientist1.Id)
   142  	if err.Id != "store.sql_channel.get_member.missing.app_error" {
   143  		t.Errorf("wrong error: %s", err.Id)
   144  	}
   145  
   146  	tMembers, err = th.App.GetTeamMembers(nerdsTeam.Id, 0, 999, nil)
   147  	if err != nil {
   148  		t.Errorf("error retrieving team members: %s", err.Error())
   149  	}
   150  	expected = 0
   151  	actual = len(tMembers)
   152  	if actual != expected {
   153  		t.Errorf("expected %d team members but got %d", expected, actual)
   154  	}
   155  
   156  	cMembersCount, err = th.App.GetChannelMemberCount(experimentsChannel.Id)
   157  	if err != nil {
   158  		t.Errorf("error retrieving team members: %s", err.Error())
   159  	}
   160  	if cMembersCount != int64(expected) {
   161  		t.Errorf("expected %d team members but got %d", expected, cMembersCount)
   162  	}
   163  
   164  	// update AutoAdd to true
   165  	scienceTeamGroupSyncable.AutoAdd = true
   166  	scienceTeamGroupSyncable, err = th.App.UpdateGroupSyncable(scienceTeamGroupSyncable)
   167  	if err != nil {
   168  		t.Errorf("error updating group syncable: %s", err.Error())
   169  	}
   170  
   171  	// Sync everything after syncable was created (proving that team updates trigger re-sync)
   172  	pErr = th.App.CreateDefaultMemberships(scientistGroupMember.CreateAt + 1)
   173  	if pErr != nil {
   174  		t.Errorf("faild to populate syncables: %s", pErr.Error())
   175  	}
   176  
   177  	// Scientist should be in team but not the channel
   178  	_, err = th.App.GetTeamMember(nerdsTeam.Id, scientist1.Id)
   179  	if err != nil {
   180  		t.Errorf("error retrieving team member: %s", err.Error())
   181  	}
   182  
   183  	_, err = th.App.GetChannelMember(experimentsChannel.Id, scientist1.Id)
   184  	if err.Id != "store.sql_channel.get_member.missing.app_error" {
   185  		t.Errorf("wrong error: %s", err.Id)
   186  	}
   187  
   188  	tMembers, err = th.App.GetTeamMembers(nerdsTeam.Id, 0, 999, nil)
   189  	if err != nil {
   190  		t.Errorf("error retrieving team members: %s", err.Error())
   191  	}
   192  	expected = 1
   193  	actual = len(tMembers)
   194  	if actual != expected {
   195  		t.Errorf("expected %d team members but got %d", expected, actual)
   196  	}
   197  
   198  	expected = 0
   199  	cMembersCount, err = th.App.GetChannelMemberCount(experimentsChannel.Id)
   200  	if err != nil {
   201  		t.Errorf("error retrieving team members: %s", err.Error())
   202  	}
   203  	if cMembersCount != int64(expected) {
   204  		t.Errorf("expected %d team members but got %d", expected, cMembersCount)
   205  	}
   206  
   207  	// Update the channel syncable
   208  	scienceChannelGroupSyncable.AutoAdd = true
   209  	scienceChannelGroupSyncable, err = th.App.UpdateGroupSyncable(scienceChannelGroupSyncable)
   210  	if err != nil {
   211  		t.Errorf("error updating group syncable: %s", err.Error())
   212  	}
   213  
   214  	// Sync everything after syncable was created (proving that channel updates trigger re-sync)
   215  	pErr = th.App.CreateDefaultMemberships(scientistGroupMember.CreateAt + 1)
   216  	if pErr != nil {
   217  		t.Errorf("faild to populate syncables: %s", pErr.Error())
   218  	}
   219  
   220  	expected = 1
   221  	cMembersCount, err = th.App.GetChannelMemberCount(experimentsChannel.Id)
   222  	if err != nil {
   223  		t.Errorf("error retrieving team members: %s", err.Error())
   224  	}
   225  	if cMembersCount != int64(expected) {
   226  		t.Errorf("expected %d team members but got %d", expected, cMembersCount)
   227  	}
   228  
   229  	// singer leaves team and channel
   230  	err = th.App.LeaveChannel(practiceChannel.Id, singer1.Id)
   231  	if err != nil {
   232  		t.Errorf("error leaving channel: %s", err.Error())
   233  	}
   234  	err = th.App.LeaveTeam(singersTeam, singer1, "")
   235  	if err != nil {
   236  		t.Errorf("error leaving team: %s", err.Error())
   237  	}
   238  
   239  	// Even re-syncing from the beginning doesn't re-add to channel or team
   240  	pErr = th.App.CreateDefaultMemberships(0)
   241  	if pErr != nil {
   242  		t.Errorf("faild to populate syncables: %s", pErr.Error())
   243  	}
   244  
   245  	// Singer should not be in team or channel
   246  	tMember, err := th.App.GetTeamMember(singersTeam.Id, singer1.Id)
   247  	if err != nil {
   248  		t.Errorf("error retrieving team member: %s", err.Error())
   249  	}
   250  	if tMember.DeleteAt == 0 {
   251  		t.Error("expected team member to remain deleted")
   252  	}
   253  
   254  	_, err = th.App.GetChannelMember(practiceChannel.Id, singer1.Id)
   255  	if err == nil {
   256  		t.Error("Expected channel member to remain deleted")
   257  	}
   258  
   259  	// Ensure members are in channel
   260  	_, err = th.App.AddChannelMember(scientist1.Id, experimentsChannel, "", "")
   261  	if err != nil {
   262  		t.Errorf("unable to add user to channel: %s", err.Error())
   263  	}
   264  
   265  	// Add other user so that user can leave channel
   266  	_, err = th.App.AddTeamMember(singersTeam.Id, singer1.Id)
   267  	if err != nil {
   268  		t.Errorf("unable to add user to team: %s", err.Error())
   269  	}
   270  	_, err = th.App.AddChannelMember(singer1.Id, experimentsChannel, "", "")
   271  	if err != nil {
   272  		t.Errorf("unable to add user to channel: %s", err.Error())
   273  	}
   274  
   275  	// the channel syncable is updated
   276  	scienceChannelGroupSyncable, err = th.App.UpdateGroupSyncable(scienceChannelGroupSyncable)
   277  	if err != nil {
   278  		t.Errorf("error updating group syncable: %s", err.Error())
   279  	}
   280  
   281  	pErr = th.App.CreateDefaultMemberships(0)
   282  	if pErr != nil {
   283  		t.Errorf("faild to populate syncables: %s", pErr.Error())
   284  	}
   285  
   286  	timeBeforeLeaving := model.GetMillis()
   287  
   288  	// User leaves channel
   289  	err = th.App.LeaveChannel(experimentsChannel.Id, scientist1.Id)
   290  	if err != nil {
   291  		t.Errorf("unable to add user to channel: %s", err.Error())
   292  	}
   293  
   294  	timeAfterLeaving := model.GetMillis()
   295  
   296  	// Purging channelmemberhistory doesn't re-add user to channel
   297  	_, err = th.App.Srv.Store.ChannelMemberHistory().PermanentDeleteBatch(timeBeforeLeaving, 1000)
   298  	if err != nil {
   299  		t.Errorf("error permanently deleting channelmemberhistory: %s", err.Error())
   300  	}
   301  
   302  	pErr = th.App.CreateDefaultMemberships(scienceChannelGroupSyncable.UpdateAt)
   303  	if pErr != nil {
   304  		t.Errorf("failed to populate syncables: %s", pErr.Error())
   305  	}
   306  
   307  	_, err = th.App.GetChannelMember(experimentsChannel.Id, scientist1.Id)
   308  	if err == nil {
   309  		t.Error("Expected channel member to remain deleted")
   310  	}
   311  
   312  	// Purging channelmemberhistory doesn't re-add user to channel
   313  	_, err = th.App.Srv.Jobs.Store.ChannelMemberHistory().PermanentDeleteBatch(timeAfterLeaving, 1000)
   314  	if err != nil {
   315  		t.Errorf("error permanently deleting channelmemberhistory: %s", err.Error())
   316  	}
   317  
   318  	pErr = th.App.CreateDefaultMemberships(scienceChannelGroupSyncable.UpdateAt)
   319  	if pErr != nil {
   320  		t.Errorf("failed to populate syncables: %s", pErr.Error())
   321  	}
   322  
   323  	// Channel member is re-added.
   324  	_, err = th.App.GetChannelMember(experimentsChannel.Id, scientist1.Id)
   325  	if err != nil {
   326  		t.Errorf("expected channel member: %s", err.Error())
   327  	}
   328  }
   329  
   330  func TestDeleteGroupMemberships(t *testing.T) {
   331  	th := Setup(t).InitBasic()
   332  	defer th.TearDown()
   333  
   334  	group := th.CreateGroup()
   335  
   336  	userIDs := []string{th.BasicUser.Id, th.BasicUser2.Id, th.SystemAdminUser.Id}
   337  
   338  	var err *model.AppError
   339  	// add users to teams and channels
   340  	for _, userID := range userIDs {
   341  		_, err = th.App.AddTeamMember(th.BasicTeam.Id, userID)
   342  		require.Nil(t, err)
   343  
   344  		_, err = th.App.AddChannelMember(userID, th.BasicChannel, "", "")
   345  		require.Nil(t, err)
   346  	}
   347  
   348  	// make team group-constrained
   349  	team := th.BasicTeam
   350  	team.GroupConstrained = model.NewBool(true)
   351  	team, err = th.App.UpdateTeam(team)
   352  	require.Nil(t, err)
   353  	require.True(t, *team.GroupConstrained)
   354  
   355  	// make channel group-constrained
   356  	channel := th.BasicChannel
   357  	channel.GroupConstrained = model.NewBool(true)
   358  	channel, err = th.App.UpdateChannel(channel)
   359  	require.Nil(t, err)
   360  	require.True(t, *channel.GroupConstrained)
   361  
   362  	// create groupteam and groupchannel
   363  	_, err = th.App.CreateGroupSyncable(model.NewGroupTeam(group.Id, team.Id, true))
   364  	require.Nil(t, err)
   365  	_, err = th.App.CreateGroupSyncable(model.NewGroupChannel(group.Id, channel.Id, true))
   366  	require.Nil(t, err)
   367  
   368  	// verify the member count
   369  	tmembers, err := th.App.GetTeamMembers(th.BasicTeam.Id, 0, 100, nil)
   370  	require.Nil(t, err)
   371  	require.Len(t, tmembers, 3)
   372  
   373  	cmemberCount, err := th.App.GetChannelMemberCount(th.BasicChannel.Id)
   374  	require.Nil(t, err)
   375  	require.Equal(t, 3, int(cmemberCount))
   376  
   377  	// add a user to the group
   378  	_, err = th.App.UpsertGroupMember(group.Id, th.SystemAdminUser.Id)
   379  	require.Nil(t, err)
   380  
   381  	// run the delete
   382  	appErr := th.App.DeleteGroupConstrainedMemberships()
   383  	require.Nil(t, appErr)
   384  
   385  	// verify the new member counts
   386  	tmembers, err = th.App.GetTeamMembers(th.BasicTeam.Id, 0, 100, nil)
   387  	require.Nil(t, err)
   388  	require.Len(t, tmembers, 1)
   389  	require.Equal(t, th.SystemAdminUser.Id, tmembers[0].UserId)
   390  
   391  	cmembers, err := th.App.GetChannelMembersPage(channel.Id, 0, 99)
   392  	require.Nil(t, err)
   393  	require.Len(t, (*cmembers), 1)
   394  	require.Equal(t, th.SystemAdminUser.Id, (*cmembers)[0].UserId)
   395  }