github.com/vnforks/kid@v5.11.1+incompatible/app/syncables_test.go (about)

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