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 }