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 }