github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/store/storetest/compliance_store.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package storetest 5 6 import ( 7 "encoding/json" 8 "testing" 9 "time" 10 11 "github.com/mattermost/mattermost-server/v5/model" 12 "github.com/mattermost/mattermost-server/v5/store" 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func cleanupStoreState(t *testing.T, ss store.Store) { 18 //remove existing users 19 allUsers, err := ss.User().GetAll() 20 require.Nilf(t, err, "error cleaning all test users: %v", err) 21 for _, u := range allUsers { 22 err = ss.User().PermanentDelete(u.Id) 23 require.Nil(t, err, "failed cleaning up test user %s", u.Username) 24 25 //remove all posts by this user 26 err = ss.Post().PermanentDeleteByUser(u.Id) 27 require.Nil(t, err, "failed cleaning all posts of test user %s", u.Username) 28 } 29 30 //remove existing channels 31 allChannels, nErr := ss.Channel().GetAllChannels(0, 100000, store.ChannelSearchOpts{IncludeDeleted: true}) 32 require.Nilf(t, nErr, "error cleaning all test channels: %v", nErr) 33 for _, channel := range *allChannels { 34 nErr := ss.Channel().PermanentDelete(channel.Id) 35 require.Nil(t, nErr, "failed cleaning up test channel %s", channel.Id) 36 } 37 38 //remove existing teams 39 allTeams, err := ss.Team().GetAll() 40 require.Nilf(t, err, "error cleaning all test teams: %v", err) 41 for _, team := range allTeams { 42 err := ss.Team().PermanentDelete(team.Id) 43 require.Nil(t, err, "failed cleaning up test team %s", team.Id) 44 } 45 } 46 47 func TestComplianceStore(t *testing.T, ss store.Store) { 48 t.Run("", func(t *testing.T) { testComplianceStore(t, ss) }) 49 t.Run("ComplianceExport", func(t *testing.T) { testComplianceExport(t, ss) }) 50 t.Run("ComplianceExportDirectMessages", func(t *testing.T) { testComplianceExportDirectMessages(t, ss) }) 51 t.Run("MessageExportPublicChannel", func(t *testing.T) { testMessageExportPublicChannel(t, ss) }) 52 t.Run("MessageExportPrivateChannel", func(t *testing.T) { testMessageExportPrivateChannel(t, ss) }) 53 t.Run("MessageExportDirectMessageChannel", func(t *testing.T) { testMessageExportDirectMessageChannel(t, ss) }) 54 t.Run("MessageExportGroupMessageChannel", func(t *testing.T) { testMessageExportGroupMessageChannel(t, ss) }) 55 t.Run("MessageEditExportMessage", func(t *testing.T) { testEditExportMessage(t, ss) }) 56 t.Run("MessageEditAfterExportMessage", func(t *testing.T) { testEditAfterExportMessage(t, ss) }) 57 t.Run("MessageDeleteExportMessage", func(t *testing.T) { testDeleteExportMessage(t, ss) }) 58 t.Run("MessageDeleteAfterExportMessage", func(t *testing.T) { testDeleteAfterExportMessage(t, ss) }) 59 } 60 61 func testComplianceStore(t *testing.T, ss store.Store) { 62 compliance1 := &model.Compliance{Desc: "Audit for federal subpoena case #22443", UserId: model.NewId(), Status: model.COMPLIANCE_STATUS_FAILED, StartAt: model.GetMillis() - 1, EndAt: model.GetMillis() + 1, Type: model.COMPLIANCE_TYPE_ADHOC} 63 _, err := ss.Compliance().Save(compliance1) 64 require.Nil(t, err) 65 time.Sleep(100 * time.Millisecond) 66 67 compliance2 := &model.Compliance{Desc: "Audit for federal subpoena case #11458", UserId: model.NewId(), Status: model.COMPLIANCE_STATUS_RUNNING, StartAt: model.GetMillis() - 1, EndAt: model.GetMillis() + 1, Type: model.COMPLIANCE_TYPE_ADHOC} 68 _, err = ss.Compliance().Save(compliance2) 69 require.Nil(t, err) 70 time.Sleep(100 * time.Millisecond) 71 72 compliances, _ := ss.Compliance().GetAll(0, 1000) 73 74 require.Equal(t, model.COMPLIANCE_STATUS_RUNNING, compliances[0].Status) 75 require.Equal(t, compliance2.Id, compliances[0].Id) 76 77 compliance2.Status = model.COMPLIANCE_STATUS_FAILED 78 _, err = ss.Compliance().Update(compliance2) 79 require.Nil(t, err) 80 81 compliances, _ = ss.Compliance().GetAll(0, 1000) 82 83 require.Equal(t, model.COMPLIANCE_STATUS_FAILED, compliances[0].Status) 84 require.Equal(t, compliance2.Id, compliances[0].Id) 85 86 compliances, _ = ss.Compliance().GetAll(0, 1) 87 88 require.Len(t, compliances, 1) 89 90 compliances, _ = ss.Compliance().GetAll(1, 1) 91 92 require.Len(t, compliances, 1) 93 94 rc2, _ := ss.Compliance().Get(compliance2.Id) 95 require.Equal(t, compliance2.Status, rc2.Status) 96 } 97 98 func testComplianceExport(t *testing.T, ss store.Store) { 99 time.Sleep(100 * time.Millisecond) 100 101 t1 := &model.Team{} 102 t1.DisplayName = "DisplayName" 103 t1.Name = "zz" + model.NewId() + "b" 104 t1.Email = MakeEmail() 105 t1.Type = model.TEAM_OPEN 106 t1, err := ss.Team().Save(t1) 107 require.Nil(t, err) 108 109 u1 := &model.User{} 110 u1.Email = MakeEmail() 111 u1.Username = model.NewId() 112 u1, err = ss.User().Save(u1) 113 require.Nil(t, err) 114 _, err = ss.Team().SaveMember(&model.TeamMember{TeamId: t1.Id, UserId: u1.Id}, -1) 115 require.Nil(t, err) 116 117 u2 := &model.User{} 118 u2.Email = MakeEmail() 119 u2.Username = model.NewId() 120 u2, err = ss.User().Save(u2) 121 require.Nil(t, err) 122 _, err = ss.Team().SaveMember(&model.TeamMember{TeamId: t1.Id, UserId: u2.Id}, -1) 123 require.Nil(t, err) 124 125 c1 := &model.Channel{} 126 c1.TeamId = t1.Id 127 c1.DisplayName = "Channel2" 128 c1.Name = "zz" + model.NewId() + "b" 129 c1.Type = model.CHANNEL_OPEN 130 c1, nErr := ss.Channel().Save(c1, -1) 131 require.Nil(t, nErr) 132 133 o1 := &model.Post{} 134 o1.ChannelId = c1.Id 135 o1.UserId = u1.Id 136 o1.CreateAt = model.GetMillis() 137 o1.Message = "zz" + model.NewId() + "b" 138 o1, err = ss.Post().Save(o1) 139 require.Nil(t, err) 140 141 o1a := &model.Post{} 142 o1a.ChannelId = c1.Id 143 o1a.UserId = u1.Id 144 o1a.CreateAt = o1.CreateAt + 10 145 o1a.Message = "zz" + model.NewId() + "b" 146 _, err = ss.Post().Save(o1a) 147 require.Nil(t, err) 148 149 o2 := &model.Post{} 150 o2.ChannelId = c1.Id 151 o2.UserId = u1.Id 152 o2.CreateAt = o1.CreateAt + 20 153 o2.Message = "zz" + model.NewId() + "b" 154 _, err = ss.Post().Save(o2) 155 require.Nil(t, err) 156 157 o2a := &model.Post{} 158 o2a.ChannelId = c1.Id 159 o2a.UserId = u2.Id 160 o2a.CreateAt = o1.CreateAt + 30 161 o2a.Message = "zz" + model.NewId() + "b" 162 o2a, err = ss.Post().Save(o2a) 163 require.Nil(t, err) 164 165 time.Sleep(100 * time.Millisecond) 166 167 cr1 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1} 168 cposts, nErr := ss.Compliance().ComplianceExport(cr1) 169 require.Nil(t, nErr) 170 assert.Len(t, cposts, 4) 171 assert.Equal(t, cposts[0].PostId, o1.Id) 172 assert.Equal(t, cposts[3].PostId, o2a.Id) 173 174 cr2 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1, Emails: u2.Email} 175 cposts, nErr = ss.Compliance().ComplianceExport(cr2) 176 require.Nil(t, nErr) 177 assert.Len(t, cposts, 1) 178 assert.Equal(t, cposts[0].PostId, o2a.Id) 179 180 cr3 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1, Emails: u2.Email + ", " + u1.Email} 181 cposts, nErr = ss.Compliance().ComplianceExport(cr3) 182 require.Nil(t, nErr) 183 assert.Len(t, cposts, 4) 184 assert.Equal(t, cposts[0].PostId, o1.Id) 185 assert.Equal(t, cposts[3].PostId, o2a.Id) 186 187 cr4 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1, Keywords: o2a.Message} 188 cposts, nErr = ss.Compliance().ComplianceExport(cr4) 189 require.Nil(t, nErr) 190 assert.Len(t, cposts, 1) 191 assert.Equal(t, cposts[0].PostId, o2a.Id) 192 193 cr5 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1, Keywords: o2a.Message + " " + o1.Message} 194 cposts, nErr = ss.Compliance().ComplianceExport(cr5) 195 require.Nil(t, nErr) 196 assert.Len(t, cposts, 2) 197 assert.Equal(t, cposts[0].PostId, o1.Id) 198 199 cr6 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1, Emails: u2.Email + ", " + u1.Email, Keywords: o2a.Message + " " + o1.Message} 200 cposts, nErr = ss.Compliance().ComplianceExport(cr6) 201 require.Nil(t, nErr) 202 assert.Len(t, cposts, 2) 203 assert.Equal(t, cposts[0].PostId, o1.Id) 204 assert.Equal(t, cposts[1].PostId, o2a.Id) 205 } 206 207 func testComplianceExportDirectMessages(t *testing.T, ss store.Store) { 208 time.Sleep(100 * time.Millisecond) 209 210 t1 := &model.Team{} 211 t1.DisplayName = "DisplayName" 212 t1.Name = "zz" + model.NewId() + "b" 213 t1.Email = MakeEmail() 214 t1.Type = model.TEAM_OPEN 215 t1, err := ss.Team().Save(t1) 216 require.Nil(t, err) 217 218 u1 := &model.User{} 219 u1.Email = MakeEmail() 220 u1.Username = model.NewId() 221 u1, err = ss.User().Save(u1) 222 require.Nil(t, err) 223 _, err = ss.Team().SaveMember(&model.TeamMember{TeamId: t1.Id, UserId: u1.Id}, -1) 224 require.Nil(t, err) 225 226 u2 := &model.User{} 227 u2.Email = MakeEmail() 228 u2.Username = model.NewId() 229 u2, err = ss.User().Save(u2) 230 require.Nil(t, err) 231 _, err = ss.Team().SaveMember(&model.TeamMember{TeamId: t1.Id, UserId: u2.Id}, -1) 232 require.Nil(t, err) 233 234 c1 := &model.Channel{} 235 c1.TeamId = t1.Id 236 c1.DisplayName = "Channel2" 237 c1.Name = "zz" + model.NewId() + "b" 238 c1.Type = model.CHANNEL_OPEN 239 c1, nErr := ss.Channel().Save(c1, -1) 240 require.Nil(t, nErr) 241 242 cDM, nErr := ss.Channel().CreateDirectChannel(u1, u2) 243 require.Nil(t, nErr) 244 o1 := &model.Post{} 245 o1.ChannelId = c1.Id 246 o1.UserId = u1.Id 247 o1.CreateAt = model.GetMillis() 248 o1.Message = "zz" + model.NewId() + "b" 249 o1, err = ss.Post().Save(o1) 250 require.Nil(t, err) 251 252 o1a := &model.Post{} 253 o1a.ChannelId = c1.Id 254 o1a.UserId = u1.Id 255 o1a.CreateAt = o1.CreateAt + 10 256 o1a.Message = "zz" + model.NewId() + "b" 257 _, err = ss.Post().Save(o1a) 258 require.Nil(t, err) 259 260 o2 := &model.Post{} 261 o2.ChannelId = c1.Id 262 o2.UserId = u1.Id 263 o2.CreateAt = o1.CreateAt + 20 264 o2.Message = "zz" + model.NewId() + "b" 265 _, err = ss.Post().Save(o2) 266 require.Nil(t, err) 267 268 o2a := &model.Post{} 269 o2a.ChannelId = c1.Id 270 o2a.UserId = u2.Id 271 o2a.CreateAt = o1.CreateAt + 30 272 o2a.Message = "zz" + model.NewId() + "b" 273 _, err = ss.Post().Save(o2a) 274 require.Nil(t, err) 275 276 o3 := &model.Post{} 277 o3.ChannelId = cDM.Id 278 o3.UserId = u1.Id 279 o3.CreateAt = o1.CreateAt + 40 280 o3.Message = "zz" + model.NewId() + "b" 281 o3, err = ss.Post().Save(o3) 282 require.Nil(t, err) 283 284 time.Sleep(100 * time.Millisecond) 285 286 cr1 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o3.CreateAt + 1, Emails: u1.Email} 287 cposts, nErr := ss.Compliance().ComplianceExport(cr1) 288 require.Nil(t, nErr) 289 assert.Len(t, cposts, 4) 290 assert.Equal(t, cposts[0].PostId, o1.Id) 291 assert.Equal(t, cposts[len(cposts)-1].PostId, o3.Id) 292 } 293 294 func testMessageExportPublicChannel(t *testing.T, ss store.Store) { 295 defer cleanupStoreState(t, ss) 296 297 // get the starting number of message export entries 298 startTime := model.GetMillis() 299 messages, err := ss.Compliance().MessageExport(startTime-10, 10) 300 require.Nil(t, err) 301 assert.Equal(t, 0, len(messages)) 302 303 // need a team 304 team := &model.Team{ 305 DisplayName: "DisplayName", 306 Name: "zz" + model.NewId() + "b", 307 Email: MakeEmail(), 308 Type: model.TEAM_OPEN, 309 } 310 team, err = ss.Team().Save(team) 311 require.Nil(t, err) 312 313 // and two users that are a part of that team 314 user1 := &model.User{ 315 Email: MakeEmail(), 316 Username: model.NewId(), 317 } 318 user1, err = ss.User().Save(user1) 319 require.Nil(t, err) 320 _, err = ss.Team().SaveMember(&model.TeamMember{ 321 TeamId: team.Id, 322 UserId: user1.Id, 323 }, -1) 324 require.Nil(t, err) 325 326 user2 := &model.User{ 327 Email: MakeEmail(), 328 Username: model.NewId(), 329 } 330 user2, err = ss.User().Save(user2) 331 require.Nil(t, err) 332 _, err = ss.Team().SaveMember(&model.TeamMember{ 333 TeamId: team.Id, 334 UserId: user2.Id, 335 }, -1) 336 require.Nil(t, err) 337 338 // need a public channel 339 channel := &model.Channel{ 340 TeamId: team.Id, 341 Name: model.NewId(), 342 DisplayName: "Public Channel", 343 Type: model.CHANNEL_OPEN, 344 } 345 channel, nErr := ss.Channel().Save(channel, -1) 346 require.Nil(t, nErr) 347 348 // user1 posts twice in the public channel 349 post1 := &model.Post{ 350 ChannelId: channel.Id, 351 UserId: user1.Id, 352 CreateAt: startTime, 353 Message: "zz" + model.NewId() + "a", 354 } 355 post1, err = ss.Post().Save(post1) 356 require.Nil(t, err) 357 358 post2 := &model.Post{ 359 ChannelId: channel.Id, 360 UserId: user1.Id, 361 CreateAt: startTime + 10, 362 Message: "zz" + model.NewId() + "b", 363 } 364 post2, err = ss.Post().Save(post2) 365 require.Nil(t, err) 366 367 // fetch the message exports for both posts that user1 sent 368 messageExportMap := map[string]model.MessageExport{} 369 messages, err = ss.Compliance().MessageExport(startTime-10, 10) 370 require.Nil(t, err) 371 assert.Equal(t, 2, len(messages)) 372 373 for _, v := range messages { 374 messageExportMap[*v.PostId] = *v 375 } 376 377 // post1 was made by user1 in channel1 and team1 378 assert.Equal(t, post1.Id, *messageExportMap[post1.Id].PostId) 379 assert.Equal(t, post1.CreateAt, *messageExportMap[post1.Id].PostCreateAt) 380 assert.Equal(t, post1.Message, *messageExportMap[post1.Id].PostMessage) 381 assert.Equal(t, channel.Id, *messageExportMap[post1.Id].ChannelId) 382 assert.Equal(t, channel.DisplayName, *messageExportMap[post1.Id].ChannelDisplayName) 383 assert.Equal(t, user1.Id, *messageExportMap[post1.Id].UserId) 384 assert.Equal(t, user1.Email, *messageExportMap[post1.Id].UserEmail) 385 assert.Equal(t, user1.Username, *messageExportMap[post1.Id].Username) 386 387 // post2 was made by user1 in channel1 and team1 388 assert.Equal(t, post2.Id, *messageExportMap[post2.Id].PostId) 389 assert.Equal(t, post2.CreateAt, *messageExportMap[post2.Id].PostCreateAt) 390 assert.Equal(t, post2.Message, *messageExportMap[post2.Id].PostMessage) 391 assert.Equal(t, channel.Id, *messageExportMap[post2.Id].ChannelId) 392 assert.Equal(t, channel.DisplayName, *messageExportMap[post2.Id].ChannelDisplayName) 393 assert.Equal(t, user1.Id, *messageExportMap[post2.Id].UserId) 394 assert.Equal(t, user1.Email, *messageExportMap[post2.Id].UserEmail) 395 assert.Equal(t, user1.Username, *messageExportMap[post2.Id].Username) 396 } 397 398 func testMessageExportPrivateChannel(t *testing.T, ss store.Store) { 399 defer cleanupStoreState(t, ss) 400 401 // get the starting number of message export entries 402 startTime := model.GetMillis() 403 messages, err := ss.Compliance().MessageExport(startTime-10, 10) 404 require.Nil(t, err) 405 assert.Equal(t, 0, len(messages)) 406 407 // need a team 408 team := &model.Team{ 409 DisplayName: "DisplayName", 410 Name: "zz" + model.NewId() + "b", 411 Email: MakeEmail(), 412 Type: model.TEAM_OPEN, 413 } 414 team, err = ss.Team().Save(team) 415 require.Nil(t, err) 416 417 // and two users that are a part of that team 418 user1 := &model.User{ 419 Email: MakeEmail(), 420 Username: model.NewId(), 421 } 422 user1, err = ss.User().Save(user1) 423 require.Nil(t, err) 424 _, err = ss.Team().SaveMember(&model.TeamMember{ 425 TeamId: team.Id, 426 UserId: user1.Id, 427 }, -1) 428 require.Nil(t, err) 429 430 user2 := &model.User{ 431 Email: MakeEmail(), 432 Username: model.NewId(), 433 } 434 user2, err = ss.User().Save(user2) 435 require.Nil(t, err) 436 _, err = ss.Team().SaveMember(&model.TeamMember{ 437 TeamId: team.Id, 438 UserId: user2.Id, 439 }, -1) 440 require.Nil(t, err) 441 442 // need a private channel 443 channel := &model.Channel{ 444 TeamId: team.Id, 445 Name: model.NewId(), 446 DisplayName: "Private Channel", 447 Type: model.CHANNEL_PRIVATE, 448 } 449 channel, nErr := ss.Channel().Save(channel, -1) 450 require.Nil(t, nErr) 451 452 // user1 posts twice in the private channel 453 post1 := &model.Post{ 454 ChannelId: channel.Id, 455 UserId: user1.Id, 456 CreateAt: startTime, 457 Message: "zz" + model.NewId() + "a", 458 } 459 post1, err = ss.Post().Save(post1) 460 require.Nil(t, err) 461 462 post2 := &model.Post{ 463 ChannelId: channel.Id, 464 UserId: user1.Id, 465 CreateAt: startTime + 10, 466 Message: "zz" + model.NewId() + "b", 467 } 468 post2, err = ss.Post().Save(post2) 469 require.Nil(t, err) 470 471 // fetch the message exports for both posts that user1 sent 472 messageExportMap := map[string]model.MessageExport{} 473 messages, err = ss.Compliance().MessageExport(startTime-10, 10) 474 require.Nil(t, err) 475 assert.Equal(t, 2, len(messages)) 476 477 for _, v := range messages { 478 messageExportMap[*v.PostId] = *v 479 } 480 481 // post1 was made by user1 in channel1 and team1 482 assert.Equal(t, post1.Id, *messageExportMap[post1.Id].PostId) 483 assert.Equal(t, post1.CreateAt, *messageExportMap[post1.Id].PostCreateAt) 484 assert.Equal(t, post1.Message, *messageExportMap[post1.Id].PostMessage) 485 assert.Equal(t, channel.Id, *messageExportMap[post1.Id].ChannelId) 486 assert.Equal(t, channel.DisplayName, *messageExportMap[post1.Id].ChannelDisplayName) 487 assert.Equal(t, channel.Type, *messageExportMap[post1.Id].ChannelType) 488 assert.Equal(t, user1.Id, *messageExportMap[post1.Id].UserId) 489 assert.Equal(t, user1.Email, *messageExportMap[post1.Id].UserEmail) 490 assert.Equal(t, user1.Username, *messageExportMap[post1.Id].Username) 491 492 // post2 was made by user1 in channel1 and team1 493 assert.Equal(t, post2.Id, *messageExportMap[post2.Id].PostId) 494 assert.Equal(t, post2.CreateAt, *messageExportMap[post2.Id].PostCreateAt) 495 assert.Equal(t, post2.Message, *messageExportMap[post2.Id].PostMessage) 496 assert.Equal(t, channel.Id, *messageExportMap[post2.Id].ChannelId) 497 assert.Equal(t, channel.DisplayName, *messageExportMap[post2.Id].ChannelDisplayName) 498 assert.Equal(t, channel.Type, *messageExportMap[post2.Id].ChannelType) 499 assert.Equal(t, user1.Id, *messageExportMap[post2.Id].UserId) 500 assert.Equal(t, user1.Email, *messageExportMap[post2.Id].UserEmail) 501 assert.Equal(t, user1.Username, *messageExportMap[post2.Id].Username) 502 } 503 504 func testMessageExportDirectMessageChannel(t *testing.T, ss store.Store) { 505 defer cleanupStoreState(t, ss) 506 507 // get the starting number of message export entries 508 startTime := model.GetMillis() 509 messages, err := ss.Compliance().MessageExport(startTime-10, 10) 510 require.Nil(t, err) 511 assert.Equal(t, 0, len(messages)) 512 513 // need a team 514 team := &model.Team{ 515 DisplayName: "DisplayName", 516 Name: "zz" + model.NewId() + "b", 517 Email: MakeEmail(), 518 Type: model.TEAM_OPEN, 519 } 520 team, err = ss.Team().Save(team) 521 require.Nil(t, err) 522 523 // and two users that are a part of that team 524 user1 := &model.User{ 525 Email: MakeEmail(), 526 Username: model.NewId(), 527 } 528 user1, err = ss.User().Save(user1) 529 require.Nil(t, err) 530 _, err = ss.Team().SaveMember(&model.TeamMember{ 531 TeamId: team.Id, 532 UserId: user1.Id, 533 }, -1) 534 require.Nil(t, err) 535 536 user2 := &model.User{ 537 Email: MakeEmail(), 538 Username: model.NewId(), 539 } 540 user2, err = ss.User().Save(user2) 541 require.Nil(t, err) 542 _, err = ss.Team().SaveMember(&model.TeamMember{ 543 TeamId: team.Id, 544 UserId: user2.Id, 545 }, -1) 546 require.Nil(t, err) 547 548 // as well as a DM channel between those users 549 directMessageChannel, nErr := ss.Channel().CreateDirectChannel(user1, user2) 550 require.Nil(t, nErr) 551 552 // user1 also sends a DM to user2 553 post := &model.Post{ 554 ChannelId: directMessageChannel.Id, 555 UserId: user1.Id, 556 CreateAt: startTime + 20, 557 Message: "zz" + model.NewId() + "c", 558 } 559 post, err = ss.Post().Save(post) 560 require.Nil(t, err) 561 562 // fetch the message export for the post that user1 sent 563 messageExportMap := map[string]model.MessageExport{} 564 messages, err = ss.Compliance().MessageExport(startTime-10, 10) 565 require.Nil(t, err) 566 567 assert.Equal(t, 1, len(messages)) 568 569 for _, v := range messages { 570 messageExportMap[*v.PostId] = *v 571 } 572 573 // post is a DM between user1 and user2 574 // there is no channel display name for direct messages, so we sub in the string "Direct Message" instead 575 assert.Equal(t, post.Id, *messageExportMap[post.Id].PostId) 576 assert.Equal(t, post.CreateAt, *messageExportMap[post.Id].PostCreateAt) 577 assert.Equal(t, post.Message, *messageExportMap[post.Id].PostMessage) 578 assert.Equal(t, directMessageChannel.Id, *messageExportMap[post.Id].ChannelId) 579 assert.Equal(t, "Direct Message", *messageExportMap[post.Id].ChannelDisplayName) 580 assert.Equal(t, user1.Id, *messageExportMap[post.Id].UserId) 581 assert.Equal(t, user1.Email, *messageExportMap[post.Id].UserEmail) 582 assert.Equal(t, user1.Username, *messageExportMap[post.Id].Username) 583 } 584 585 func testMessageExportGroupMessageChannel(t *testing.T, ss store.Store) { 586 defer cleanupStoreState(t, ss) 587 588 // get the starting number of message export entries 589 startTime := model.GetMillis() 590 messages, err := ss.Compliance().MessageExport(startTime-10, 10) 591 require.Nil(t, err) 592 assert.Equal(t, 0, len(messages)) 593 594 // need a team 595 team := &model.Team{ 596 DisplayName: "DisplayName", 597 Name: "zz" + model.NewId() + "b", 598 Email: MakeEmail(), 599 Type: model.TEAM_OPEN, 600 } 601 team, err = ss.Team().Save(team) 602 require.Nil(t, err) 603 604 // and three users that are a part of that team 605 user1 := &model.User{ 606 Email: MakeEmail(), 607 Username: model.NewId(), 608 } 609 user1, err = ss.User().Save(user1) 610 require.Nil(t, err) 611 _, err = ss.Team().SaveMember(&model.TeamMember{ 612 TeamId: team.Id, 613 UserId: user1.Id, 614 }, -1) 615 require.Nil(t, err) 616 617 user2 := &model.User{ 618 Email: MakeEmail(), 619 Username: model.NewId(), 620 } 621 user2, err = ss.User().Save(user2) 622 require.Nil(t, err) 623 _, err = ss.Team().SaveMember(&model.TeamMember{ 624 TeamId: team.Id, 625 UserId: user2.Id, 626 }, -1) 627 require.Nil(t, err) 628 629 user3 := &model.User{ 630 Email: MakeEmail(), 631 Username: model.NewId(), 632 } 633 user3, err = ss.User().Save(user3) 634 require.Nil(t, err) 635 _, err = ss.Team().SaveMember(&model.TeamMember{ 636 TeamId: team.Id, 637 UserId: user3.Id, 638 }, -1) 639 require.Nil(t, err) 640 641 // can't create a group channel directly, because importing app creates an import cycle, so we have to fake it 642 groupMessageChannel := &model.Channel{ 643 TeamId: team.Id, 644 Name: model.NewId(), 645 Type: model.CHANNEL_GROUP, 646 } 647 groupMessageChannel, nErr := ss.Channel().Save(groupMessageChannel, -1) 648 require.Nil(t, nErr) 649 650 // user1 posts in the GM 651 post := &model.Post{ 652 ChannelId: groupMessageChannel.Id, 653 UserId: user1.Id, 654 CreateAt: startTime + 20, 655 Message: "zz" + model.NewId() + "c", 656 } 657 post, err = ss.Post().Save(post) 658 require.Nil(t, err) 659 660 // fetch the message export for the post that user1 sent 661 messageExportMap := map[string]model.MessageExport{} 662 messages, err = ss.Compliance().MessageExport(startTime-10, 10) 663 require.Nil(t, err) 664 assert.Equal(t, 1, len(messages)) 665 666 for _, v := range messages { 667 messageExportMap[*v.PostId] = *v 668 } 669 670 // post is a DM between user1 and user2 671 // there is no channel display name for direct messages, so we sub in the string "Direct Message" instead 672 assert.Equal(t, post.Id, *messageExportMap[post.Id].PostId) 673 assert.Equal(t, post.CreateAt, *messageExportMap[post.Id].PostCreateAt) 674 assert.Equal(t, post.Message, *messageExportMap[post.Id].PostMessage) 675 assert.Equal(t, groupMessageChannel.Id, *messageExportMap[post.Id].ChannelId) 676 assert.Equal(t, "Group Message", *messageExportMap[post.Id].ChannelDisplayName) 677 assert.Equal(t, user1.Id, *messageExportMap[post.Id].UserId) 678 assert.Equal(t, user1.Email, *messageExportMap[post.Id].UserEmail) 679 assert.Equal(t, user1.Username, *messageExportMap[post.Id].Username) 680 } 681 682 //post,edit,export 683 func testEditExportMessage(t *testing.T, ss store.Store) { 684 defer cleanupStoreState(t, ss) 685 // get the starting number of message export entries 686 startTime := model.GetMillis() 687 messages, err := ss.Compliance().MessageExport(startTime-1, 10) 688 require.Nil(t, err) 689 assert.Equal(t, 0, len(messages)) 690 691 // need a team 692 team := &model.Team{ 693 DisplayName: "DisplayName", 694 Name: "zz" + model.NewId() + "b", 695 Email: MakeEmail(), 696 Type: model.TEAM_OPEN, 697 } 698 team, err = ss.Team().Save(team) 699 require.Nil(t, err) 700 701 // need a user part of that team 702 user1 := &model.User{ 703 Email: MakeEmail(), 704 Username: model.NewId(), 705 } 706 user1, err = ss.User().Save(user1) 707 require.Nil(t, err) 708 _, err = ss.Team().SaveMember(&model.TeamMember{ 709 TeamId: team.Id, 710 UserId: user1.Id, 711 }, -1) 712 require.Nil(t, err) 713 714 // need a public channel 715 channel := &model.Channel{ 716 TeamId: team.Id, 717 Name: model.NewId(), 718 DisplayName: "Public Channel", 719 Type: model.CHANNEL_OPEN, 720 } 721 channel, nErr := ss.Channel().Save(channel, -1) 722 require.Nil(t, nErr) 723 724 // user1 posts in the public channel 725 post1 := &model.Post{ 726 ChannelId: channel.Id, 727 UserId: user1.Id, 728 CreateAt: startTime, 729 Message: "zz" + model.NewId() + "a", 730 } 731 post1, err = ss.Post().Save(post1) 732 require.Nil(t, err) 733 734 //user 1 edits the previous post 735 post1e := &model.Post{} 736 post1e = post1.Clone() 737 post1e.Message = "edit " + post1.Message 738 739 post1e, err = ss.Post().Update(post1e, post1) 740 require.Nil(t, err) 741 742 // fetch the message exports from the start 743 messages, err = ss.Compliance().MessageExport(startTime-1, 10) 744 require.Nil(t, err) 745 assert.Equal(t, 2, len(messages)) 746 747 for _, v := range messages { 748 if *v.PostDeleteAt > 0 { 749 // post1 was made by user1 in channel1 and team1 750 assert.Equal(t, post1.Id, *v.PostId) 751 assert.Equal(t, post1.OriginalId, *v.PostOriginalId) 752 assert.Equal(t, post1.CreateAt, *v.PostCreateAt) 753 assert.Equal(t, post1.UpdateAt, *v.PostUpdateAt) 754 assert.Equal(t, post1.Message, *v.PostMessage) 755 assert.Equal(t, channel.Id, *v.ChannelId) 756 assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName) 757 assert.Equal(t, user1.Id, *v.UserId) 758 assert.Equal(t, user1.Email, *v.UserEmail) 759 assert.Equal(t, user1.Username, *v.Username) 760 } else { 761 // post1e was made by user1 in channel1 and team1 762 assert.Equal(t, post1e.Id, *v.PostId) 763 assert.Equal(t, post1e.CreateAt, *v.PostCreateAt) 764 assert.Equal(t, post1e.UpdateAt, *v.PostUpdateAt) 765 assert.Equal(t, post1e.Message, *v.PostMessage) 766 assert.Equal(t, channel.Id, *v.ChannelId) 767 assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName) 768 assert.Equal(t, user1.Id, *v.UserId) 769 assert.Equal(t, user1.Email, *v.UserEmail) 770 assert.Equal(t, user1.Username, *v.Username) 771 } 772 } 773 } 774 775 //post, export, edit, export 776 func testEditAfterExportMessage(t *testing.T, ss store.Store) { 777 defer cleanupStoreState(t, ss) 778 // get the starting number of message export entries 779 startTime := model.GetMillis() 780 messages, err := ss.Compliance().MessageExport(startTime-1, 10) 781 require.Nil(t, err) 782 assert.Equal(t, 0, len(messages)) 783 784 // need a team 785 team := &model.Team{ 786 DisplayName: "DisplayName", 787 Name: "zz" + model.NewId() + "b", 788 Email: MakeEmail(), 789 Type: model.TEAM_OPEN, 790 } 791 team, err = ss.Team().Save(team) 792 require.Nil(t, err) 793 794 // need a user part of that team 795 user1 := &model.User{ 796 Email: MakeEmail(), 797 Username: model.NewId(), 798 } 799 user1, err = ss.User().Save(user1) 800 require.Nil(t, err) 801 _, err = ss.Team().SaveMember(&model.TeamMember{ 802 TeamId: team.Id, 803 UserId: user1.Id, 804 }, -1) 805 require.Nil(t, err) 806 807 // need a public channel 808 channel := &model.Channel{ 809 TeamId: team.Id, 810 Name: model.NewId(), 811 DisplayName: "Public Channel", 812 Type: model.CHANNEL_OPEN, 813 } 814 channel, nErr := ss.Channel().Save(channel, -1) 815 require.Nil(t, nErr) 816 817 // user1 posts in the public channel 818 post1 := &model.Post{ 819 ChannelId: channel.Id, 820 UserId: user1.Id, 821 CreateAt: startTime, 822 Message: "zz" + model.NewId() + "a", 823 } 824 post1, err = ss.Post().Save(post1) 825 require.Nil(t, err) 826 827 // fetch the message exports from the start 828 messages, err = ss.Compliance().MessageExport(startTime-1, 10) 829 require.Nil(t, err) 830 assert.Equal(t, 1, len(messages)) 831 832 v := messages[0] 833 // post1 was made by user1 in channel1 and team1 834 assert.Equal(t, post1.Id, *v.PostId) 835 assert.Equal(t, post1.OriginalId, *v.PostOriginalId) 836 assert.Equal(t, post1.CreateAt, *v.PostCreateAt) 837 assert.Equal(t, post1.UpdateAt, *v.PostUpdateAt) 838 assert.Equal(t, post1.Message, *v.PostMessage) 839 assert.Equal(t, channel.Id, *v.ChannelId) 840 assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName) 841 assert.Equal(t, user1.Id, *v.UserId) 842 assert.Equal(t, user1.Email, *v.UserEmail) 843 assert.Equal(t, user1.Username, *v.Username) 844 845 postEditTime := post1.UpdateAt + 1 846 //user 1 edits the previous post 847 post1e := &model.Post{} 848 post1e = post1.Clone() 849 post1e.EditAt = postEditTime 850 post1e.Message = "edit " + post1.Message 851 post1e, err = ss.Post().Update(post1e, post1) 852 require.Nil(t, err) 853 854 // fetch the message exports after edit 855 messages, err = ss.Compliance().MessageExport(postEditTime-1, 10) 856 require.Nil(t, err) 857 assert.Equal(t, 2, len(messages)) 858 859 for _, v := range messages { 860 if *v.PostDeleteAt > 0 { 861 // post1 was made by user1 in channel1 and team1 862 assert.Equal(t, post1.Id, *v.PostId) 863 assert.Equal(t, post1.OriginalId, *v.PostOriginalId) 864 assert.Equal(t, post1.CreateAt, *v.PostCreateAt) 865 assert.Equal(t, post1.UpdateAt, *v.PostUpdateAt) 866 assert.Equal(t, post1.Message, *v.PostMessage) 867 assert.Equal(t, channel.Id, *v.ChannelId) 868 assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName) 869 assert.Equal(t, user1.Id, *v.UserId) 870 assert.Equal(t, user1.Email, *v.UserEmail) 871 assert.Equal(t, user1.Username, *v.Username) 872 } else { 873 // post1e was made by user1 in channel1 and team1 874 assert.Equal(t, post1e.Id, *v.PostId) 875 assert.Equal(t, post1e.CreateAt, *v.PostCreateAt) 876 assert.Equal(t, post1e.UpdateAt, *v.PostUpdateAt) 877 assert.Equal(t, post1e.Message, *v.PostMessage) 878 assert.Equal(t, channel.Id, *v.ChannelId) 879 assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName) 880 assert.Equal(t, user1.Id, *v.UserId) 881 assert.Equal(t, user1.Email, *v.UserEmail) 882 assert.Equal(t, user1.Username, *v.Username) 883 } 884 } 885 } 886 887 //post, delete, export 888 func testDeleteExportMessage(t *testing.T, ss store.Store) { 889 defer cleanupStoreState(t, ss) 890 // get the starting number of message export entries 891 startTime := model.GetMillis() 892 messages, err := ss.Compliance().MessageExport(startTime-1, 10) 893 require.Nil(t, err) 894 assert.Equal(t, 0, len(messages)) 895 896 // need a team 897 team := &model.Team{ 898 DisplayName: "DisplayName", 899 Name: "zz" + model.NewId() + "b", 900 Email: MakeEmail(), 901 Type: model.TEAM_OPEN, 902 } 903 team, err = ss.Team().Save(team) 904 require.Nil(t, err) 905 906 // need a user part of that team 907 user1 := &model.User{ 908 Email: MakeEmail(), 909 Username: model.NewId(), 910 } 911 user1, err = ss.User().Save(user1) 912 require.Nil(t, err) 913 _, err = ss.Team().SaveMember(&model.TeamMember{ 914 TeamId: team.Id, 915 UserId: user1.Id, 916 }, -1) 917 require.Nil(t, err) 918 919 // need a public channel 920 channel := &model.Channel{ 921 TeamId: team.Id, 922 Name: model.NewId(), 923 DisplayName: "Public Channel", 924 Type: model.CHANNEL_OPEN, 925 } 926 channel, nErr := ss.Channel().Save(channel, -1) 927 require.Nil(t, nErr) 928 929 // user1 posts in the public channel 930 post1 := &model.Post{ 931 ChannelId: channel.Id, 932 UserId: user1.Id, 933 CreateAt: startTime, 934 Message: "zz" + model.NewId() + "a", 935 } 936 post1, err = ss.Post().Save(post1) 937 require.Nil(t, err) 938 939 //user 1 deletes the previous post 940 postDeleteTime := post1.UpdateAt + 1 941 err = ss.Post().Delete(post1.Id, postDeleteTime, user1.Id) 942 require.Nil(t, err) 943 944 // fetch the message exports from the start 945 messages, err = ss.Compliance().MessageExport(startTime-1, 10) 946 require.Nil(t, err) 947 assert.Equal(t, 1, len(messages)) 948 949 v := messages[0] 950 // post1 was made and deleted by user1 in channel1 and team1 951 assert.Equal(t, post1.Id, *v.PostId) 952 assert.Equal(t, post1.OriginalId, *v.PostOriginalId) 953 assert.Equal(t, post1.CreateAt, *v.PostCreateAt) 954 assert.Equal(t, postDeleteTime, *v.PostUpdateAt) 955 assert.NotNil(t, v.PostProps) 956 957 props := map[string]interface{}{} 958 e := json.Unmarshal([]byte(*v.PostProps), &props) 959 require.Nil(t, e) 960 961 _, ok := props[model.POST_PROPS_DELETE_BY] 962 assert.True(t, ok) 963 964 assert.Equal(t, post1.Message, *v.PostMessage) 965 assert.Equal(t, channel.Id, *v.ChannelId) 966 assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName) 967 assert.Equal(t, user1.Id, *v.UserId) 968 assert.Equal(t, user1.Email, *v.UserEmail) 969 assert.Equal(t, user1.Username, *v.Username) 970 } 971 972 //post,export,delete,export 973 func testDeleteAfterExportMessage(t *testing.T, ss store.Store) { 974 defer cleanupStoreState(t, ss) 975 // get the starting number of message export entries 976 startTime := model.GetMillis() 977 messages, err := ss.Compliance().MessageExport(startTime-1, 10) 978 require.Nil(t, err) 979 assert.Equal(t, 0, len(messages)) 980 981 // need a team 982 team := &model.Team{ 983 DisplayName: "DisplayName", 984 Name: "zz" + model.NewId() + "b", 985 Email: MakeEmail(), 986 Type: model.TEAM_OPEN, 987 } 988 team, err = ss.Team().Save(team) 989 require.Nil(t, err) 990 991 // need a user part of that team 992 user1 := &model.User{ 993 Email: MakeEmail(), 994 Username: model.NewId(), 995 } 996 user1, err = ss.User().Save(user1) 997 require.Nil(t, err) 998 _, err = ss.Team().SaveMember(&model.TeamMember{ 999 TeamId: team.Id, 1000 UserId: user1.Id, 1001 }, -1) 1002 require.Nil(t, err) 1003 1004 // need a public channel 1005 channel := &model.Channel{ 1006 TeamId: team.Id, 1007 Name: model.NewId(), 1008 DisplayName: "Public Channel", 1009 Type: model.CHANNEL_OPEN, 1010 } 1011 channel, nErr := ss.Channel().Save(channel, -1) 1012 require.Nil(t, nErr) 1013 1014 // user1 posts in the public channel 1015 post1 := &model.Post{ 1016 ChannelId: channel.Id, 1017 UserId: user1.Id, 1018 CreateAt: startTime, 1019 Message: "zz" + model.NewId() + "a", 1020 } 1021 post1, err = ss.Post().Save(post1) 1022 require.Nil(t, err) 1023 1024 // fetch the message exports from the start 1025 messages, err = ss.Compliance().MessageExport(startTime-1, 10) 1026 require.Nil(t, err) 1027 assert.Equal(t, 1, len(messages)) 1028 1029 v := messages[0] 1030 // post1 was created by user1 in channel1 and team1 1031 assert.Equal(t, post1.Id, *v.PostId) 1032 assert.Equal(t, post1.OriginalId, *v.PostOriginalId) 1033 assert.Equal(t, post1.CreateAt, *v.PostCreateAt) 1034 assert.Equal(t, post1.UpdateAt, *v.PostUpdateAt) 1035 assert.Equal(t, post1.Message, *v.PostMessage) 1036 assert.Equal(t, channel.Id, *v.ChannelId) 1037 assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName) 1038 assert.Equal(t, user1.Id, *v.UserId) 1039 assert.Equal(t, user1.Email, *v.UserEmail) 1040 assert.Equal(t, user1.Username, *v.Username) 1041 1042 //user 1 deletes the previous post 1043 postDeleteTime := post1.UpdateAt + 1 1044 err = ss.Post().Delete(post1.Id, postDeleteTime, user1.Id) 1045 require.Nil(t, err) 1046 1047 // fetch the message exports after delete 1048 messages, err = ss.Compliance().MessageExport(postDeleteTime-1, 10) 1049 require.Nil(t, err) 1050 assert.Equal(t, 1, len(messages)) 1051 1052 v = messages[0] 1053 // post1 was created and deleted by user1 in channel1 and team1 1054 assert.Equal(t, post1.Id, *v.PostId) 1055 assert.Equal(t, post1.OriginalId, *v.PostOriginalId) 1056 assert.Equal(t, post1.CreateAt, *v.PostCreateAt) 1057 assert.Equal(t, postDeleteTime, *v.PostUpdateAt) 1058 assert.NotNil(t, v.PostProps) 1059 1060 props := map[string]interface{}{} 1061 e := json.Unmarshal([]byte(*v.PostProps), &props) 1062 require.Nil(t, e) 1063 1064 _, ok := props[model.POST_PROPS_DELETE_BY] 1065 assert.True(t, ok) 1066 1067 assert.Equal(t, post1.Message, *v.PostMessage) 1068 assert.Equal(t, channel.Id, *v.ChannelId) 1069 assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName) 1070 assert.Equal(t, user1.Id, *v.UserId) 1071 assert.Equal(t, user1.Email, *v.UserEmail) 1072 assert.Equal(t, user1.Username, *v.Username) 1073 }