github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/store/storetest/post_store.go (about) 1 // Copyright (c) 2015-present Xenia, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package storetest 5 6 import ( 7 "fmt" 8 "sort" 9 "strings" 10 "testing" 11 "time" 12 13 "github.com/xzl8028/xenia-server/model" 14 "github.com/xzl8028/xenia-server/store" 15 "github.com/xzl8028/xenia-server/utils" 16 "github.com/stretchr/testify/assert" 17 "github.com/stretchr/testify/require" 18 ) 19 20 func TestPostStore(t *testing.T, ss store.Store, s SqlSupplier) { 21 t.Run("Save", func(t *testing.T) { testPostStoreSave(t, ss) }) 22 t.Run("SaveAndUpdateChannelMsgCounts", func(t *testing.T) { testPostStoreSaveChannelMsgCounts(t, ss) }) 23 t.Run("Get", func(t *testing.T) { testPostStoreGet(t, ss) }) 24 t.Run("GetSingle", func(t *testing.T) { testPostStoreGetSingle(t, ss) }) 25 t.Run("GetEtagCache", func(t *testing.T) { testGetEtagCache(t, ss) }) 26 t.Run("Update", func(t *testing.T) { testPostStoreUpdate(t, ss) }) 27 t.Run("Delete", func(t *testing.T) { testPostStoreDelete(t, ss) }) 28 t.Run("Delete1Level", func(t *testing.T) { testPostStoreDelete1Level(t, ss) }) 29 t.Run("Delete2Level", func(t *testing.T) { testPostStoreDelete2Level(t, ss) }) 30 t.Run("PermDelete1Level", func(t *testing.T) { testPostStorePermDelete1Level(t, ss) }) 31 t.Run("PermDelete1Level2", func(t *testing.T) { testPostStorePermDelete1Level2(t, ss) }) 32 t.Run("GetWithChildren", func(t *testing.T) { testPostStoreGetWithChildren(t, ss) }) 33 t.Run("GetPostsWithDetails", func(t *testing.T) { testPostStoreGetPostsWithDetails(t, ss) }) 34 t.Run("GetPostsBeforeAfter", func(t *testing.T) { testPostStoreGetPostsBeforeAfter(t, ss) }) 35 t.Run("GetPostsSince", func(t *testing.T) { testPostStoreGetPostsSince(t, ss) }) 36 t.Run("Search", func(t *testing.T) { testPostStoreSearch(t, ss) }) 37 t.Run("UserCountsWithPostsByDay", func(t *testing.T) { testUserCountsWithPostsByDay(t, ss) }) 38 t.Run("PostCountsByDay", func(t *testing.T) { testPostCountsByDay(t, ss) }) 39 t.Run("GetFlaggedPostsForTeam", func(t *testing.T) { testPostStoreGetFlaggedPostsForTeam(t, ss, s) }) 40 t.Run("GetFlaggedPosts", func(t *testing.T) { testPostStoreGetFlaggedPosts(t, ss) }) 41 t.Run("GetFlaggedPostsForChannel", func(t *testing.T) { testPostStoreGetFlaggedPostsForChannel(t, ss) }) 42 t.Run("GetPostsCreatedAt", func(t *testing.T) { testPostStoreGetPostsCreatedAt(t, ss) }) 43 t.Run("Overwrite", func(t *testing.T) { testPostStoreOverwrite(t, ss) }) 44 t.Run("GetPostsByIds", func(t *testing.T) { testPostStoreGetPostsByIds(t, ss) }) 45 t.Run("GetPostsBatchForIndexing", func(t *testing.T) { testPostStoreGetPostsBatchForIndexing(t, ss) }) 46 t.Run("PermanentDeleteBatch", func(t *testing.T) { testPostStorePermanentDeleteBatch(t, ss) }) 47 t.Run("GetOldest", func(t *testing.T) { testPostStoreGetOldest(t, ss) }) 48 t.Run("TestGetMaxPostSize", func(t *testing.T) { testGetMaxPostSize(t, ss) }) 49 t.Run("GetParentsForExportAfter", func(t *testing.T) { testPostStoreGetParentsForExportAfter(t, ss) }) 50 t.Run("GetRepliesForExport", func(t *testing.T) { testPostStoreGetRepliesForExport(t, ss) }) 51 t.Run("GetDirectPostParentsForExportAfter", func(t *testing.T) { testPostStoreGetDirectPostParentsForExportAfter(t, ss, s) }) 52 t.Run("GetDirectPostParentsForExportAfterDeleted", func(t *testing.T) { testPostStoreGetDirectPostParentsForExportAfterDeleted(t, ss, s) }) 53 t.Run("GetDirectPostParentsForExportAfterBatched", func(t *testing.T) { testPostStoreGetDirectPostParentsForExportAfterBatched(t, ss, s) }) 54 } 55 56 func testPostStoreSave(t *testing.T, ss store.Store) { 57 o1 := model.Post{} 58 o1.ChannelId = model.NewId() 59 o1.UserId = model.NewId() 60 o1.Message = "zz" + model.NewId() + "b" 61 62 if _, err := ss.Post().Save(&o1); err != nil { 63 t.Fatal("couldn't save item", err) 64 } 65 66 if _, err := ss.Post().Save(&o1); err == nil { 67 t.Fatal("shouldn't be able to update from save") 68 } 69 } 70 71 func testPostStoreSaveChannelMsgCounts(t *testing.T, ss store.Store) { 72 c1 := &model.Channel{Name: model.NewId(), DisplayName: "posttestchannel", Type: model.CHANNEL_OPEN} 73 _, err := ss.Channel().Save(c1, 1000000) 74 require.Nil(t, err) 75 76 o1 := model.Post{} 77 o1.ChannelId = c1.Id 78 o1.UserId = model.NewId() 79 o1.Message = "zz" + model.NewId() + "b" 80 81 _, err = ss.Post().Save(&o1) 82 require.Nil(t, err) 83 84 c1, err = ss.Channel().Get(c1.Id, false) 85 require.Nil(t, err) 86 assert.Equal(t, int64(1), c1.TotalMsgCount, "Message count should update by 1") 87 88 o1.Id = "" 89 o1.Type = model.POST_ADD_TO_TEAM 90 _, err = ss.Post().Save(&o1) 91 require.Nil(t, err) 92 93 o1.Id = "" 94 o1.Type = model.POST_REMOVE_FROM_TEAM 95 _, err = ss.Post().Save(&o1) 96 require.Nil(t, err) 97 98 c1, err = ss.Channel().Get(c1.Id, false) 99 require.Nil(t, err) 100 assert.Equal(t, int64(1), c1.TotalMsgCount, "Message count should not update for team add/removed message") 101 102 oldLastPostAt := c1.LastPostAt 103 104 o2 := model.Post{} 105 o2.ChannelId = c1.Id 106 o2.UserId = model.NewId() 107 o2.Message = "zz" + model.NewId() + "b" 108 o2.CreateAt = int64(7) 109 _, err = ss.Post().Save(&o2) 110 require.Nil(t, err) 111 112 c1, err = ss.Channel().Get(c1.Id, false) 113 require.Nil(t, err) 114 assert.Equal(t, oldLastPostAt, c1.LastPostAt, "LastPostAt should not update for old message save") 115 } 116 117 func testPostStoreGet(t *testing.T, ss store.Store) { 118 o1 := &model.Post{} 119 o1.ChannelId = model.NewId() 120 o1.UserId = model.NewId() 121 o1.Message = "zz" + model.NewId() + "b" 122 123 etag1 := ss.Post().GetEtag(o1.ChannelId, false) 124 if strings.Index(etag1, model.CurrentVersion+".") != 0 { 125 t.Fatal("Invalid Etag") 126 } 127 128 o1, err := ss.Post().Save(o1) 129 require.Nil(t, err) 130 131 etag2 := ss.Post().GetEtag(o1.ChannelId, false) 132 if strings.Index(etag2, fmt.Sprintf("%v.%v", model.CurrentVersion, o1.UpdateAt)) != 0 { 133 t.Fatal("Invalid Etag") 134 } 135 136 r1, err := ss.Post().Get(o1.Id) 137 if err != nil { 138 t.Fatal(err) 139 } 140 if r1.Posts[o1.Id].CreateAt != o1.CreateAt { 141 t.Fatal("invalid returned post") 142 } 143 144 if _, err = ss.Post().Get("123"); err == nil { 145 t.Fatal("Missing id should have failed") 146 } 147 148 if _, err = ss.Post().Get(""); err == nil { 149 t.Fatal("should fail for blank post ids") 150 } 151 } 152 153 func testPostStoreGetSingle(t *testing.T, ss store.Store) { 154 o1 := &model.Post{} 155 o1.ChannelId = model.NewId() 156 o1.UserId = model.NewId() 157 o1.Message = "zz" + model.NewId() + "b" 158 159 o1, err := ss.Post().Save(o1) 160 require.Nil(t, err) 161 162 if post, err := ss.Post().GetSingle(o1.Id); err != nil { 163 t.Fatal(err) 164 } else { 165 if post.CreateAt != o1.CreateAt { 166 t.Fatal("invalid returned post") 167 } 168 } 169 170 if _, err := ss.Post().GetSingle("123"); err == nil { 171 t.Fatal("Missing id should have failed") 172 } 173 } 174 175 func testGetEtagCache(t *testing.T, ss store.Store) { 176 o1 := &model.Post{} 177 o1.ChannelId = model.NewId() 178 o1.UserId = model.NewId() 179 o1.Message = "zz" + model.NewId() + "b" 180 181 etag1 := ss.Post().GetEtag(o1.ChannelId, true) 182 if strings.Index(etag1, model.CurrentVersion+".") != 0 { 183 t.Fatal("Invalid Etag") 184 } 185 186 // This one should come from the cache 187 etag2 := ss.Post().GetEtag(o1.ChannelId, true) 188 if strings.Index(etag2, model.CurrentVersion+".") != 0 { 189 t.Fatal("Invalid Etag") 190 } 191 192 o1, err := ss.Post().Save(o1) 193 require.Nil(t, err) 194 195 // We have not invalidated the cache so this should be the same as above 196 etag3 := ss.Post().GetEtag(o1.ChannelId, true) 197 if strings.Index(etag3, etag2) != 0 { 198 t.Fatal("Invalid Etag") 199 } 200 201 ss.Post().InvalidateLastPostTimeCache(o1.ChannelId) 202 203 // Invalidated cache so we should get a good result 204 etag4 := ss.Post().GetEtag(o1.ChannelId, true) 205 if strings.Index(etag4, fmt.Sprintf("%v.%v", model.CurrentVersion, o1.UpdateAt)) != 0 { 206 t.Fatal("Invalid Etag") 207 } 208 } 209 210 func testPostStoreUpdate(t *testing.T, ss store.Store) { 211 o1 := &model.Post{} 212 o1.ChannelId = model.NewId() 213 o1.UserId = model.NewId() 214 o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 215 o1, err := ss.Post().Save(o1) 216 require.Nil(t, err) 217 218 o2 := &model.Post{} 219 o2.ChannelId = o1.ChannelId 220 o2.UserId = model.NewId() 221 o2.Message = "zz" + model.NewId() + "CCCCCCCCC" 222 o2.ParentId = o1.Id 223 o2.RootId = o1.Id 224 o2, err = ss.Post().Save(o2) 225 require.Nil(t, err) 226 227 o3 := &model.Post{} 228 o3.ChannelId = o1.ChannelId 229 o3.UserId = model.NewId() 230 o3.Message = "zz" + model.NewId() + "QQQQQQQQQQ" 231 o3, err = ss.Post().Save(o3) 232 require.Nil(t, err) 233 234 r1, err := ss.Post().Get(o1.Id) 235 if err != nil { 236 t.Fatal(err) 237 } 238 ro1 := r1.Posts[o1.Id] 239 r2, err := ss.Post().Get(o1.Id) 240 if err != nil { 241 t.Fatal(err) 242 } 243 ro2 := r2.Posts[o2.Id] 244 r3, err := ss.Post().Get(o3.Id) 245 if err != nil { 246 t.Fatal(err) 247 } 248 ro3 := r3.Posts[o3.Id] 249 250 if ro1.Message != o1.Message { 251 t.Fatal("Failed to save/get") 252 } 253 254 o1a := &model.Post{} 255 *o1a = *ro1 256 o1a.Message = ro1.Message + "BBBBBBBBBB" 257 if _, err = ss.Post().Update(o1a, ro1); err != nil { 258 t.Fatal(err) 259 } 260 261 r1, err = ss.Post().Get(o1.Id) 262 if err != nil { 263 t.Fatal(err) 264 } 265 266 ro1a := r1.Posts[o1.Id] 267 if ro1a.Message != o1a.Message { 268 t.Fatal("Failed to update/get") 269 } 270 271 o2a := &model.Post{} 272 *o2a = *ro2 273 o2a.Message = ro2.Message + "DDDDDDD" 274 if _, err = ss.Post().Update(o2a, ro2); err != nil { 275 t.Fatal(err) 276 } 277 278 r2, err = ss.Post().Get(o1.Id) 279 if err != nil { 280 t.Fatal(err) 281 } 282 ro2a := r2.Posts[o2.Id] 283 284 if ro2a.Message != o2a.Message { 285 t.Fatal("Failed to update/get") 286 } 287 288 o3a := &model.Post{} 289 *o3a = *ro3 290 o3a.Message = ro3.Message + "WWWWWWW" 291 if _, err = ss.Post().Update(o3a, ro3); err != nil { 292 t.Fatal(err) 293 } 294 295 r3, err = ss.Post().Get(o3.Id) 296 if err != nil { 297 t.Fatal(err) 298 } 299 ro3a := r3.Posts[o3.Id] 300 301 if ro3a.Message != o3a.Message && ro3a.Hashtags != o3a.Hashtags { 302 t.Fatal("Failed to update/get") 303 } 304 305 o4, err := ss.Post().Save(&model.Post{ 306 ChannelId: model.NewId(), 307 UserId: model.NewId(), 308 Message: model.NewId(), 309 Filenames: []string{"test"}, 310 }) 311 require.Nil(t, err) 312 313 r4, err := ss.Post().Get(o4.Id) 314 if err != nil { 315 t.Fatal(err) 316 } 317 ro4 := r4.Posts[o4.Id] 318 319 o4a := &model.Post{} 320 *o4a = *ro4 321 o4a.Filenames = []string{} 322 o4a.FileIds = []string{model.NewId()} 323 if _, err = ss.Post().Update(o4a, ro4); err != nil { 324 t.Fatal(err) 325 } 326 327 r4, err = ss.Post().Get(o4.Id) 328 if err != nil { 329 t.Fatal(err) 330 } 331 332 if ro4a := r4.Posts[o4.Id]; len(ro4a.Filenames) != 0 { 333 t.Fatal("Failed to clear Filenames") 334 } else if len(ro4a.FileIds) != 1 { 335 t.Fatal("Failed to set FileIds") 336 } 337 } 338 339 func testPostStoreDelete(t *testing.T, ss store.Store) { 340 o1 := &model.Post{} 341 o1.ChannelId = model.NewId() 342 o1.UserId = model.NewId() 343 o1.Message = "zz" + model.NewId() + "b" 344 deleteByID := model.NewId() 345 346 etag1 := ss.Post().GetEtag(o1.ChannelId, false) 347 if strings.Index(etag1, model.CurrentVersion+".") != 0 { 348 t.Fatal("Invalid Etag") 349 } 350 351 o1, err := ss.Post().Save(o1) 352 require.Nil(t, err) 353 354 if r1, err := ss.Post().Get(o1.Id); err != nil { 355 t.Fatal(err) 356 } else { 357 if r1.Posts[o1.Id].CreateAt != o1.CreateAt { 358 t.Fatal("invalid returned post") 359 } 360 } 361 362 if err := ss.Post().Delete(o1.Id, model.GetMillis(), deleteByID); err != nil { 363 t.Fatal(err) 364 } 365 366 posts, _ := ss.Post().GetPostsCreatedAt(o1.ChannelId, o1.CreateAt) 367 post := posts[0] 368 actual := post.Props[model.POST_PROPS_DELETE_BY] 369 if actual != deleteByID { 370 t.Errorf("Expected (*Post).Props[model.POST_PROPS_DELETE_BY] to be %v but got %v.", deleteByID, actual) 371 } 372 373 if r3, err := ss.Post().Get(o1.Id); err == nil { 374 t.Log(r3) 375 t.Fatal("Missing id should have failed") 376 } 377 378 etag2 := ss.Post().GetEtag(o1.ChannelId, false) 379 if strings.Index(etag2, model.CurrentVersion+".") != 0 { 380 t.Fatal("Invalid Etag") 381 } 382 } 383 384 func testPostStoreDelete1Level(t *testing.T, ss store.Store) { 385 o1 := &model.Post{} 386 o1.ChannelId = model.NewId() 387 o1.UserId = model.NewId() 388 o1.Message = "zz" + model.NewId() + "b" 389 o1, err := ss.Post().Save(o1) 390 require.Nil(t, err) 391 392 o2 := &model.Post{} 393 o2.ChannelId = o1.ChannelId 394 o2.UserId = model.NewId() 395 o2.Message = "zz" + model.NewId() + "b" 396 o2.ParentId = o1.Id 397 o2.RootId = o1.Id 398 o2, err = ss.Post().Save(o2) 399 require.Nil(t, err) 400 401 if err := ss.Post().Delete(o1.Id, model.GetMillis(), ""); err != nil { 402 t.Fatal(err) 403 } 404 405 if _, err := ss.Post().Get(o1.Id); err == nil { 406 t.Fatal("Deleted id should have failed") 407 } 408 409 if _, err := ss.Post().Get(o2.Id); err == nil { 410 t.Fatal("Deleted id should have failed") 411 } 412 } 413 414 func testPostStoreDelete2Level(t *testing.T, ss store.Store) { 415 o1 := &model.Post{} 416 o1.ChannelId = model.NewId() 417 o1.UserId = model.NewId() 418 o1.Message = "zz" + model.NewId() + "b" 419 o1, err := ss.Post().Save(o1) 420 require.Nil(t, err) 421 422 o2 := &model.Post{} 423 o2.ChannelId = o1.ChannelId 424 o2.UserId = model.NewId() 425 o2.Message = "zz" + model.NewId() + "b" 426 o2.ParentId = o1.Id 427 o2.RootId = o1.Id 428 o2, err = ss.Post().Save(o2) 429 require.Nil(t, err) 430 431 o3 := &model.Post{} 432 o3.ChannelId = o1.ChannelId 433 o3.UserId = model.NewId() 434 o3.Message = "zz" + model.NewId() + "b" 435 o3.ParentId = o2.Id 436 o3.RootId = o1.Id 437 o3, err = ss.Post().Save(o3) 438 require.Nil(t, err) 439 440 o4 := &model.Post{} 441 o4.ChannelId = model.NewId() 442 o4.UserId = model.NewId() 443 o4.Message = "zz" + model.NewId() + "b" 444 o4, err = ss.Post().Save(o4) 445 require.Nil(t, err) 446 447 if err := ss.Post().Delete(o1.Id, model.GetMillis(), ""); err != nil { 448 t.Fatal(err) 449 } 450 451 if _, err := ss.Post().Get(o1.Id); err == nil { 452 t.Fatal("Deleted id should have failed") 453 } 454 455 if _, err := ss.Post().Get(o2.Id); err == nil { 456 t.Fatal("Deleted id should have failed") 457 } 458 459 if _, err := ss.Post().Get(o3.Id); err == nil { 460 t.Fatal("Deleted id should have failed") 461 } 462 463 if _, err := ss.Post().Get(o4.Id); err != nil { 464 t.Fatal(err) 465 } 466 } 467 468 func testPostStorePermDelete1Level(t *testing.T, ss store.Store) { 469 o1 := &model.Post{} 470 o1.ChannelId = model.NewId() 471 o1.UserId = model.NewId() 472 o1.Message = "zz" + model.NewId() + "b" 473 o1, err := ss.Post().Save(o1) 474 require.Nil(t, err) 475 476 o2 := &model.Post{} 477 o2.ChannelId = o1.ChannelId 478 o2.UserId = model.NewId() 479 o2.Message = "zz" + model.NewId() + "b" 480 o2.ParentId = o1.Id 481 o2.RootId = o1.Id 482 o2, err = ss.Post().Save(o2) 483 require.Nil(t, err) 484 485 o3 := &model.Post{} 486 o3.ChannelId = model.NewId() 487 o3.UserId = model.NewId() 488 o3.Message = "zz" + model.NewId() + "b" 489 o3, err = ss.Post().Save(o3) 490 require.Nil(t, err) 491 492 if err2 := ss.Post().PermanentDeleteByUser(o2.UserId); err2 != nil { 493 t.Fatal(err2) 494 } 495 496 if _, err := ss.Post().Get(o1.Id); err != nil { 497 t.Fatal("Deleted id shouldn't have failed") 498 } 499 500 if _, err := ss.Post().Get(o2.Id); err == nil { 501 t.Fatal("Deleted id should have failed") 502 } 503 504 if err := ss.Post().PermanentDeleteByChannel(o3.ChannelId); err != nil { 505 t.Fatal(err) 506 } 507 508 if _, err := ss.Post().Get(o3.Id); err == nil { 509 t.Fatal("Deleted id should have failed") 510 } 511 } 512 513 func testPostStorePermDelete1Level2(t *testing.T, ss store.Store) { 514 o1 := &model.Post{} 515 o1.ChannelId = model.NewId() 516 o1.UserId = model.NewId() 517 o1.Message = "zz" + model.NewId() + "b" 518 o1, err := ss.Post().Save(o1) 519 require.Nil(t, err) 520 521 o2 := &model.Post{} 522 o2.ChannelId = o1.ChannelId 523 o2.UserId = model.NewId() 524 o2.Message = "zz" + model.NewId() + "b" 525 o2.ParentId = o1.Id 526 o2.RootId = o1.Id 527 o2, err = ss.Post().Save(o2) 528 require.Nil(t, err) 529 530 o3 := &model.Post{} 531 o3.ChannelId = model.NewId() 532 o3.UserId = model.NewId() 533 o3.Message = "zz" + model.NewId() + "b" 534 o3, err = ss.Post().Save(o3) 535 require.Nil(t, err) 536 537 if err2 := ss.Post().PermanentDeleteByUser(o1.UserId); err2 != nil { 538 t.Fatal(err2) 539 } 540 541 if _, err := ss.Post().Get(o1.Id); err == nil { 542 t.Fatal("Deleted id should have failed") 543 } 544 545 if _, err := ss.Post().Get(o2.Id); err == nil { 546 t.Fatal("Deleted id should have failed") 547 } 548 549 if _, err := ss.Post().Get(o3.Id); err != nil { 550 t.Fatal("Deleted id shouldn't have failed") 551 } 552 } 553 554 func testPostStoreGetWithChildren(t *testing.T, ss store.Store) { 555 o1 := &model.Post{} 556 o1.ChannelId = model.NewId() 557 o1.UserId = model.NewId() 558 o1.Message = "zz" + model.NewId() + "b" 559 o1, err := ss.Post().Save(o1) 560 require.Nil(t, err) 561 562 o2 := &model.Post{} 563 o2.ChannelId = o1.ChannelId 564 o2.UserId = model.NewId() 565 o2.Message = "zz" + model.NewId() + "b" 566 o2.ParentId = o1.Id 567 o2.RootId = o1.Id 568 o2, err = ss.Post().Save(o2) 569 require.Nil(t, err) 570 571 o3 := &model.Post{} 572 o3.ChannelId = o1.ChannelId 573 o3.UserId = model.NewId() 574 o3.Message = "zz" + model.NewId() + "b" 575 o3.ParentId = o2.Id 576 o3.RootId = o1.Id 577 o3, err = ss.Post().Save(o3) 578 require.Nil(t, err) 579 580 pl, err := ss.Post().Get(o1.Id) 581 if err != nil { 582 t.Fatal(err) 583 } 584 585 if len(pl.Posts) != 3 { 586 t.Fatal("invalid returned post") 587 } 588 589 if dErr := ss.Post().Delete(o3.Id, model.GetMillis(), ""); dErr != nil { 590 t.Fatal(dErr) 591 } 592 593 pl, err = ss.Post().Get(o1.Id) 594 if err != nil { 595 t.Fatal(err) 596 } 597 598 if len(pl.Posts) != 2 { 599 t.Fatal("invalid returned post") 600 } 601 602 if dErr := ss.Post().Delete(o2.Id, model.GetMillis(), ""); dErr != nil { 603 t.Fatal(dErr) 604 } 605 606 pl, err = ss.Post().Get(o1.Id) 607 if err != nil { 608 t.Fatal(err) 609 } 610 611 if len(pl.Posts) != 1 { 612 t.Fatal("invalid returned post") 613 } 614 } 615 616 func testPostStoreGetPostsWithDetails(t *testing.T, ss store.Store) { 617 o1 := &model.Post{} 618 o1.ChannelId = model.NewId() 619 o1.UserId = model.NewId() 620 o1.Message = "zz" + model.NewId() + "b" 621 o1, err := ss.Post().Save(o1) 622 require.Nil(t, err) 623 time.Sleep(2 * time.Millisecond) 624 625 o2 := &model.Post{} 626 o2.ChannelId = o1.ChannelId 627 o2.UserId = model.NewId() 628 o2.Message = "zz" + model.NewId() + "b" 629 o2.ParentId = o1.Id 630 o2.RootId = o1.Id 631 _, err = ss.Post().Save(o2) 632 require.Nil(t, err) 633 time.Sleep(2 * time.Millisecond) 634 635 o2a := &model.Post{} 636 o2a.ChannelId = o1.ChannelId 637 o2a.UserId = model.NewId() 638 o2a.Message = "zz" + model.NewId() + "b" 639 o2a.ParentId = o1.Id 640 o2a.RootId = o1.Id 641 o2a, err = ss.Post().Save(o2a) 642 require.Nil(t, err) 643 time.Sleep(2 * time.Millisecond) 644 645 o3 := &model.Post{} 646 o3.ChannelId = o1.ChannelId 647 o3.UserId = model.NewId() 648 o3.Message = "zz" + model.NewId() + "b" 649 o3.ParentId = o1.Id 650 o3.RootId = o1.Id 651 o3, err = ss.Post().Save(o3) 652 require.Nil(t, err) 653 time.Sleep(2 * time.Millisecond) 654 655 o4 := &model.Post{} 656 o4.ChannelId = o1.ChannelId 657 o4.UserId = model.NewId() 658 o4.Message = "zz" + model.NewId() + "b" 659 o4, err = ss.Post().Save(o4) 660 require.Nil(t, err) 661 time.Sleep(2 * time.Millisecond) 662 663 o5 := &model.Post{} 664 o5.ChannelId = o1.ChannelId 665 o5.UserId = model.NewId() 666 o5.Message = "zz" + model.NewId() + "b" 667 o5.ParentId = o4.Id 668 o5.RootId = o4.Id 669 o5, err = ss.Post().Save(o5) 670 require.Nil(t, err) 671 672 r1, err := ss.Post().GetPosts(o1.ChannelId, 0, 4, false) 673 require.Nil(t, err) 674 675 if r1.Order[0] != o5.Id { 676 t.Fatal("invalid order") 677 } 678 679 if r1.Order[1] != o4.Id { 680 t.Fatal("invalid order") 681 } 682 683 if r1.Order[2] != o3.Id { 684 t.Fatal("invalid order") 685 } 686 687 if r1.Order[3] != o2a.Id { 688 t.Fatal("invalid order") 689 } 690 691 if len(r1.Posts) != 6 { //the last 4, + o1 (o2a and o3's parent) + o2 (in same thread as o2a and o3) 692 t.Fatal("wrong size") 693 } 694 695 if r1.Posts[o1.Id].Message != o1.Message { 696 t.Fatal("Missing parent") 697 } 698 699 r2, err := ss.Post().GetPosts(o1.ChannelId, 0, 4, true) 700 require.Nil(t, err) 701 702 if r2.Order[0] != o5.Id { 703 t.Fatal("invalid order") 704 } 705 706 if r2.Order[1] != o4.Id { 707 t.Fatal("invalid order") 708 } 709 710 if r2.Order[2] != o3.Id { 711 t.Fatal("invalid order") 712 } 713 714 if r2.Order[3] != o2a.Id { 715 t.Fatal("invalid order") 716 } 717 718 if len(r2.Posts) != 6 { //the last 4, + o1 (o2a and o3's parent) + o2 (in same thread as o2a and o3) 719 t.Fatal("wrong size") 720 } 721 722 if r2.Posts[o1.Id].Message != o1.Message { 723 t.Fatal("Missing parent") 724 } 725 726 // Run once to fill cache 727 _, err = ss.Post().GetPosts(o1.ChannelId, 0, 30, true) 728 require.Nil(t, err) 729 730 o6 := &model.Post{} 731 o6.ChannelId = o1.ChannelId 732 o6.UserId = model.NewId() 733 o6.Message = "zz" + model.NewId() + "b" 734 _, err = ss.Post().Save(o6) 735 require.Nil(t, err) 736 737 // Should only be 6 since we hit the cache 738 r3, err := ss.Post().GetPosts(o1.ChannelId, 0, 30, true) 739 require.Nil(t, err) 740 assert.Equal(t, 6, len(r3.Order)) 741 742 ss.Post().InvalidateLastPostTimeCache(o1.ChannelId) 743 744 // Cache was invalidated, we should get all the posts 745 r4, err := ss.Post().GetPosts(o1.ChannelId, 0, 30, true) 746 require.Nil(t, err) 747 assert.Equal(t, 7, len(r4.Order)) 748 } 749 750 func testPostStoreGetPostsBeforeAfter(t *testing.T, ss store.Store) { 751 t.Run("without threads", func(t *testing.T) { 752 channelId := model.NewId() 753 userId := model.NewId() 754 755 var posts []*model.Post 756 for i := 0; i < 10; i++ { 757 post, err := ss.Post().Save(&model.Post{ 758 ChannelId: channelId, 759 UserId: userId, 760 Message: "message", 761 }) 762 require.Nil(t, err) 763 764 posts = append(posts, post) 765 766 time.Sleep(time.Millisecond) 767 } 768 769 t.Run("should not return anything before the first post", func(t *testing.T) { 770 postList, err := ss.Post().GetPostsBefore(channelId, posts[0].Id, 10, 0) 771 assert.Nil(t, err) 772 773 assert.Equal(t, []string{}, postList.Order) 774 assert.Equal(t, map[string]*model.Post{}, postList.Posts) 775 }) 776 777 t.Run("should return posts before a post", func(t *testing.T) { 778 postList, err := ss.Post().GetPostsBefore(channelId, posts[5].Id, 10, 0) 779 assert.Nil(t, err) 780 781 assert.Equal(t, []string{posts[4].Id, posts[3].Id, posts[2].Id, posts[1].Id, posts[0].Id}, postList.Order) 782 assert.Equal(t, map[string]*model.Post{ 783 posts[0].Id: posts[0], 784 posts[1].Id: posts[1], 785 posts[2].Id: posts[2], 786 posts[3].Id: posts[3], 787 posts[4].Id: posts[4], 788 }, postList.Posts) 789 }) 790 791 t.Run("should limit posts before", func(t *testing.T) { 792 postList, err := ss.Post().GetPostsBefore(channelId, posts[5].Id, 2, 0) 793 assert.Nil(t, err) 794 795 assert.Equal(t, []string{posts[4].Id, posts[3].Id}, postList.Order) 796 assert.Equal(t, map[string]*model.Post{ 797 posts[3].Id: posts[3], 798 posts[4].Id: posts[4], 799 }, postList.Posts) 800 }) 801 802 t.Run("should not return anything after the last post", func(t *testing.T) { 803 postList, err := ss.Post().GetPostsAfter(channelId, posts[len(posts)-1].Id, 10, 0) 804 assert.Nil(t, err) 805 806 assert.Equal(t, []string{}, postList.Order) 807 assert.Equal(t, map[string]*model.Post{}, postList.Posts) 808 }) 809 810 t.Run("should return posts after a post", func(t *testing.T) { 811 postList, err := ss.Post().GetPostsAfter(channelId, posts[5].Id, 10, 0) 812 assert.Nil(t, err) 813 814 assert.Equal(t, []string{posts[9].Id, posts[8].Id, posts[7].Id, posts[6].Id}, postList.Order) 815 assert.Equal(t, map[string]*model.Post{ 816 posts[6].Id: posts[6], 817 posts[7].Id: posts[7], 818 posts[8].Id: posts[8], 819 posts[9].Id: posts[9], 820 }, postList.Posts) 821 }) 822 823 t.Run("should limit posts after", func(t *testing.T) { 824 postList, err := ss.Post().GetPostsAfter(channelId, posts[5].Id, 2, 0) 825 assert.Nil(t, err) 826 827 assert.Equal(t, []string{posts[7].Id, posts[6].Id}, postList.Order) 828 assert.Equal(t, map[string]*model.Post{ 829 posts[6].Id: posts[6], 830 posts[7].Id: posts[7], 831 }, postList.Posts) 832 }) 833 }) 834 835 t.Run("with threads", func(t *testing.T) { 836 channelId := model.NewId() 837 userId := model.NewId() 838 839 // This creates a series of posts that looks like: 840 // post1 841 // post2 842 // post3 (in response to post1) 843 // post4 (in response to post2) 844 // post5 845 // post6 (in response to post2) 846 847 post1, err := ss.Post().Save(&model.Post{ 848 ChannelId: channelId, 849 UserId: userId, 850 Message: "message", 851 }) 852 require.Nil(t, err) 853 time.Sleep(time.Millisecond) 854 855 post2, err := ss.Post().Save(&model.Post{ 856 ChannelId: channelId, 857 UserId: userId, 858 Message: "message", 859 }) 860 require.Nil(t, err) 861 time.Sleep(time.Millisecond) 862 863 post3, err := ss.Post().Save(&model.Post{ 864 ChannelId: channelId, 865 UserId: userId, 866 ParentId: post1.Id, 867 RootId: post1.Id, 868 Message: "message", 869 }) 870 require.Nil(t, err) 871 time.Sleep(time.Millisecond) 872 873 post4, err := ss.Post().Save(&model.Post{ 874 ChannelId: channelId, 875 UserId: userId, 876 RootId: post2.Id, 877 ParentId: post2.Id, 878 Message: "message", 879 }) 880 require.Nil(t, err) 881 time.Sleep(time.Millisecond) 882 883 post5, err := ss.Post().Save(&model.Post{ 884 ChannelId: channelId, 885 UserId: userId, 886 Message: "message", 887 }) 888 require.Nil(t, err) 889 time.Sleep(time.Millisecond) 890 891 post6, err := ss.Post().Save(&model.Post{ 892 ChannelId: channelId, 893 UserId: userId, 894 ParentId: post2.Id, 895 RootId: post2.Id, 896 Message: "message", 897 }) 898 require.Nil(t, err) 899 900 // Adding a post to a thread changes the UpdateAt timestamp of the parent post 901 post1.UpdateAt = post3.UpdateAt 902 post2.UpdateAt = post6.UpdateAt 903 904 t.Run("should return each post and thread before a post", func(t *testing.T) { 905 postList, err := ss.Post().GetPostsBefore(channelId, post4.Id, 2, 0) 906 assert.Nil(t, err) 907 908 assert.Equal(t, []string{post3.Id, post2.Id}, postList.Order) 909 assert.Equal(t, map[string]*model.Post{ 910 post1.Id: post1, 911 post2.Id: post2, 912 post3.Id: post3, 913 post4.Id: post4, 914 post6.Id: post6, 915 }, postList.Posts) 916 }) 917 918 t.Run("should return each post and the root of each thread after a post", func(t *testing.T) { 919 postList, err := ss.Post().GetPostsAfter(channelId, post4.Id, 2, 0) 920 assert.Nil(t, err) 921 922 assert.Equal(t, []string{post6.Id, post5.Id}, postList.Order) 923 assert.Equal(t, map[string]*model.Post{ 924 post2.Id: post2, 925 post4.Id: post4, 926 post5.Id: post5, 927 post6.Id: post6, 928 }, postList.Posts) 929 }) 930 }) 931 } 932 933 func testPostStoreGetPostsSince(t *testing.T, ss store.Store) { 934 o0 := &model.Post{} 935 o0.ChannelId = model.NewId() 936 o0.UserId = model.NewId() 937 o0.Message = "zz" + model.NewId() + "b" 938 _, err := ss.Post().Save(o0) 939 require.Nil(t, err) 940 time.Sleep(2 * time.Millisecond) 941 942 o1 := &model.Post{} 943 o1.ChannelId = model.NewId() 944 o1.UserId = model.NewId() 945 o1.Message = "zz" + model.NewId() + "b" 946 o1, err = ss.Post().Save(o1) 947 require.Nil(t, err) 948 time.Sleep(2 * time.Millisecond) 949 950 o2 := &model.Post{} 951 o2.ChannelId = o1.ChannelId 952 o2.UserId = model.NewId() 953 o2.Message = "zz" + model.NewId() + "b" 954 o2.ParentId = o1.Id 955 o2.RootId = o1.Id 956 _, err = ss.Post().Save(o2) 957 require.Nil(t, err) 958 time.Sleep(2 * time.Millisecond) 959 960 o2a := &model.Post{} 961 o2a.ChannelId = o1.ChannelId 962 o2a.UserId = model.NewId() 963 o2a.Message = "zz" + model.NewId() + "b" 964 o2a.ParentId = o1.Id 965 o2a.RootId = o1.Id 966 o2a, err = ss.Post().Save(o2a) 967 require.Nil(t, err) 968 time.Sleep(2 * time.Millisecond) 969 970 o3 := &model.Post{} 971 o3.ChannelId = o1.ChannelId 972 o3.UserId = model.NewId() 973 o3.Message = "zz" + model.NewId() + "b" 974 o3.ParentId = o1.Id 975 o3.RootId = o1.Id 976 o3, err = ss.Post().Save(o3) 977 require.Nil(t, err) 978 time.Sleep(2 * time.Millisecond) 979 980 o4 := &model.Post{} 981 o4.ChannelId = o1.ChannelId 982 o4.UserId = model.NewId() 983 o4.Message = "zz" + model.NewId() + "b" 984 o4, err = ss.Post().Save(o4) 985 require.Nil(t, err) 986 time.Sleep(2 * time.Millisecond) 987 988 o5 := &model.Post{} 989 o5.ChannelId = o1.ChannelId 990 o5.UserId = model.NewId() 991 o5.Message = "zz" + model.NewId() + "b" 992 o5.ParentId = o4.Id 993 o5.RootId = o4.Id 994 o5, err = ss.Post().Save(o5) 995 require.Nil(t, err) 996 997 r1, _ := ss.Post().GetPostsSince(o1.ChannelId, o1.CreateAt, false) 998 999 if r1.Order[0] != o5.Id { 1000 t.Fatal("invalid order") 1001 } 1002 1003 if r1.Order[1] != o4.Id { 1004 t.Fatal("invalid order") 1005 } 1006 1007 if r1.Order[2] != o3.Id { 1008 t.Fatal("invalid order") 1009 } 1010 1011 if r1.Order[3] != o2a.Id { 1012 t.Fatal("invalid order") 1013 } 1014 1015 if len(r1.Posts) != 6 { 1016 t.Fatal("wrong size") 1017 } 1018 1019 if r1.Posts[o1.Id].Message != o1.Message { 1020 t.Fatal("Missing parent") 1021 } 1022 1023 r2, _ := ss.Post().GetPostsSince(o1.ChannelId, o5.UpdateAt, true) 1024 1025 if len(r2.Order) != 0 { 1026 t.Fatal("wrong size ", len(r2.Posts)) 1027 } 1028 } 1029 1030 func testPostStoreSearch(t *testing.T, ss store.Store) { 1031 teamId := model.NewId() 1032 userId := model.NewId() 1033 1034 c1 := &model.Channel{} 1035 c1.TeamId = teamId 1036 c1.DisplayName = "Channel1" 1037 c1.Name = "zz" + model.NewId() + "b" 1038 c1.Type = model.CHANNEL_OPEN 1039 c1, _ = ss.Channel().Save(c1, -1) 1040 1041 m1 := model.ChannelMember{} 1042 m1.ChannelId = c1.Id 1043 m1.UserId = userId 1044 m1.NotifyProps = model.GetDefaultChannelNotifyProps() 1045 store.Must(ss.Channel().SaveMember(&m1)) 1046 1047 c2 := &model.Channel{} 1048 c2.TeamId = teamId 1049 c2.DisplayName = "Channel1" 1050 c2.Name = "zz" + model.NewId() + "b" 1051 c2.Type = model.CHANNEL_OPEN 1052 c2, _ = ss.Channel().Save(c2, -1) 1053 1054 c3 := &model.Channel{} 1055 c3.TeamId = teamId 1056 c3.DisplayName = "Channel1" 1057 c3.Name = "zz" + model.NewId() + "b" 1058 c3.Type = model.CHANNEL_OPEN 1059 c3, _ = ss.Channel().Save(c3, -1) 1060 1061 ss.Channel().Delete(c3.Id, model.GetMillis()) 1062 1063 m3 := model.ChannelMember{} 1064 m3.ChannelId = c3.Id 1065 m3.UserId = userId 1066 m3.NotifyProps = model.GetDefaultChannelNotifyProps() 1067 store.Must(ss.Channel().SaveMember(&m3)) 1068 1069 o1 := &model.Post{} 1070 o1.ChannelId = c1.Id 1071 o1.UserId = model.NewId() 1072 o1.Message = "corey xenia new york" 1073 o1, err := ss.Post().Save(o1) 1074 require.Nil(t, err) 1075 1076 o1a := &model.Post{} 1077 o1a.ChannelId = c1.Id 1078 o1a.UserId = model.NewId() 1079 o1a.Message = "corey xenia new york" 1080 o1a.Type = model.POST_JOIN_CHANNEL 1081 _, err = ss.Post().Save(o1a) 1082 require.Nil(t, err) 1083 1084 o2 := &model.Post{} 1085 o2.ChannelId = c1.Id 1086 o2.UserId = model.NewId() 1087 o2.Message = "New Jersey is where John is from" 1088 o2, err = ss.Post().Save(o2) 1089 require.Nil(t, err) 1090 1091 o3 := &model.Post{} 1092 o3.ChannelId = c2.Id 1093 o3.UserId = model.NewId() 1094 o3.Message = "New Jersey is where John is from corey new york" 1095 _, err = ss.Post().Save(o3) 1096 require.Nil(t, err) 1097 1098 o4 := &model.Post{} 1099 o4.ChannelId = c1.Id 1100 o4.UserId = model.NewId() 1101 o4.Hashtags = "#hashtag" 1102 o4.Message = "(message)blargh" 1103 o4, err = ss.Post().Save(o4) 1104 require.Nil(t, err) 1105 1106 o5 := &model.Post{} 1107 o5.ChannelId = c1.Id 1108 o5.UserId = model.NewId() 1109 o5.Hashtags = "#secret #howdy" 1110 o5, err = ss.Post().Save(o5) 1111 require.Nil(t, err) 1112 1113 o6 := &model.Post{} 1114 o6.ChannelId = c3.Id 1115 o6.UserId = model.NewId() 1116 o6.Hashtags = "#hashtag" 1117 o6, err = ss.Post().Save(o6) 1118 require.Nil(t, err) 1119 1120 o7 := &model.Post{} 1121 o7.ChannelId = c3.Id 1122 o7.UserId = model.NewId() 1123 o7.Message = "New Jersey is where John is from corey new york" 1124 o7, err = ss.Post().Save(o7) 1125 require.Nil(t, err) 1126 1127 o8 := &model.Post{} 1128 o8.ChannelId = c3.Id 1129 o8.UserId = model.NewId() 1130 o8.Message = "Deleted" 1131 o8, err = ss.Post().Save(o8) 1132 require.Nil(t, err) 1133 1134 tt := []struct { 1135 name string 1136 searchParams *model.SearchParams 1137 expectedResultsCount int 1138 expectedMessageResultIds []string 1139 }{ 1140 { 1141 "normal-search-1", 1142 &model.SearchParams{Terms: "corey"}, 1143 1, 1144 []string{o1.Id}, 1145 }, 1146 { 1147 "normal-search-2", 1148 &model.SearchParams{Terms: "new"}, 1149 2, 1150 []string{o1.Id, o2.Id}, 1151 }, 1152 { 1153 "normal-search-3", 1154 &model.SearchParams{Terms: "john"}, 1155 1, 1156 []string{o2.Id}, 1157 }, 1158 { 1159 "wildcard-search", 1160 &model.SearchParams{Terms: "matter*"}, 1161 1, 1162 []string{o1.Id}, 1163 }, 1164 { 1165 "hashtag-search", 1166 &model.SearchParams{Terms: "#hashtag", IsHashtag: true}, 1167 1, 1168 []string{o4.Id}, 1169 }, 1170 { 1171 "hashtag-search-2", 1172 &model.SearchParams{Terms: "#secret", IsHashtag: true}, 1173 1, 1174 []string{o5.Id}, 1175 }, 1176 { 1177 "no-match-mention", 1178 &model.SearchParams{Terms: "@thisshouldmatchnothing", IsHashtag: true}, 1179 0, 1180 []string{}, 1181 }, 1182 { 1183 "no-results-search", 1184 &model.SearchParams{Terms: "xenia jersey"}, 1185 0, 1186 []string{}, 1187 }, 1188 { 1189 "multiple-words-search", 1190 &model.SearchParams{Terms: "corey new york"}, 1191 1, 1192 []string{o1.Id}, 1193 }, 1194 { 1195 "multiple-wildcard-search", 1196 &model.SearchParams{Terms: "matter* jer*"}, 1197 0, 1198 []string{}, 1199 }, 1200 { 1201 "search-with-work-next-to-a-symbol", 1202 &model.SearchParams{Terms: "message blargh"}, 1203 1, 1204 []string{o4.Id}, 1205 }, 1206 { 1207 "search-with-or", 1208 &model.SearchParams{Terms: "Jersey corey", OrTerms: true}, 1209 2, 1210 []string{o1.Id, o2.Id}, 1211 }, 1212 { 1213 "search-with-or-and-deleted", 1214 &model.SearchParams{Terms: "Jersey corey", OrTerms: true, IncludeDeletedChannels: true}, 1215 3, 1216 []string{o1.Id, o2.Id, o7.Id}, 1217 }, 1218 { 1219 "search-hashtag-deleted", 1220 &model.SearchParams{Terms: "#hashtag", IsHashtag: true, IncludeDeletedChannels: true}, 1221 2, 1222 []string{o4.Id, o6.Id}, 1223 }, 1224 { 1225 "search-deleted-only", 1226 &model.SearchParams{Terms: "Deleted", IncludeDeletedChannels: true}, 1227 1, 1228 []string{o8.Id}, 1229 }, 1230 } 1231 for _, tc := range tt { 1232 t.Run(tc.name, func(t *testing.T) { 1233 result := (<-ss.Post().Search(teamId, userId, tc.searchParams)).Data.(*model.PostList) 1234 require.Len(t, result.Order, tc.expectedResultsCount) 1235 for _, expectedMessageResultId := range tc.expectedMessageResultIds { 1236 assert.Contains(t, result.Order, expectedMessageResultId) 1237 } 1238 }) 1239 } 1240 } 1241 1242 func testUserCountsWithPostsByDay(t *testing.T, ss store.Store) { 1243 t1 := &model.Team{} 1244 t1.DisplayName = "DisplayName" 1245 t1.Name = "zz" + model.NewId() + "b" 1246 t1.Email = MakeEmail() 1247 t1.Type = model.TEAM_OPEN 1248 t1, err := ss.Team().Save(t1) 1249 require.Nil(t, err) 1250 1251 c1 := &model.Channel{} 1252 c1.TeamId = t1.Id 1253 c1.DisplayName = "Channel2" 1254 c1.Name = "zz" + model.NewId() + "b" 1255 c1.Type = model.CHANNEL_OPEN 1256 c1, err = ss.Channel().Save(c1, -1) 1257 require.Nil(t, err) 1258 1259 o1 := &model.Post{} 1260 o1.ChannelId = c1.Id 1261 o1.UserId = model.NewId() 1262 o1.CreateAt = utils.MillisFromTime(utils.Yesterday()) 1263 o1.Message = "zz" + model.NewId() + "b" 1264 o1, err = ss.Post().Save(o1) 1265 require.Nil(t, err) 1266 1267 o1a := &model.Post{} 1268 o1a.ChannelId = c1.Id 1269 o1a.UserId = model.NewId() 1270 o1a.CreateAt = o1.CreateAt 1271 o1a.Message = "zz" + model.NewId() + "b" 1272 _, err = ss.Post().Save(o1a) 1273 require.Nil(t, err) 1274 1275 o2 := &model.Post{} 1276 o2.ChannelId = c1.Id 1277 o2.UserId = model.NewId() 1278 o2.CreateAt = o1.CreateAt - (1000 * 60 * 60 * 24) 1279 o2.Message = "zz" + model.NewId() + "b" 1280 o2, err = ss.Post().Save(o2) 1281 require.Nil(t, err) 1282 1283 o2a := &model.Post{} 1284 o2a.ChannelId = c1.Id 1285 o2a.UserId = o2.UserId 1286 o2a.CreateAt = o1.CreateAt - (1000 * 60 * 60 * 24) 1287 o2a.Message = "zz" + model.NewId() + "b" 1288 _, err = ss.Post().Save(o2a) 1289 require.Nil(t, err) 1290 1291 if r1, err := ss.Post().AnalyticsUserCountsWithPostsByDay(t1.Id); err != nil { 1292 t.Fatal(err) 1293 } else { 1294 row1 := r1[0] 1295 if row1.Value != 2 { 1296 t.Fatal("wrong value") 1297 } 1298 1299 row2 := r1[1] 1300 if row2.Value != 1 { 1301 t.Fatal("wrong value") 1302 } 1303 } 1304 } 1305 1306 func testPostCountsByDay(t *testing.T, ss store.Store) { 1307 t1 := &model.Team{} 1308 t1.DisplayName = "DisplayName" 1309 t1.Name = "zz" + model.NewId() + "b" 1310 t1.Email = MakeEmail() 1311 t1.Type = model.TEAM_OPEN 1312 t1, err := ss.Team().Save(t1) 1313 require.Nil(t, err) 1314 1315 c1 := &model.Channel{} 1316 c1.TeamId = t1.Id 1317 c1.DisplayName = "Channel2" 1318 c1.Name = "zz" + model.NewId() + "b" 1319 c1.Type = model.CHANNEL_OPEN 1320 c1, err = ss.Channel().Save(c1, -1) 1321 require.Nil(t, err) 1322 1323 o1 := &model.Post{} 1324 o1.ChannelId = c1.Id 1325 o1.UserId = model.NewId() 1326 o1.CreateAt = utils.MillisFromTime(utils.Yesterday()) 1327 o1.Message = "zz" + model.NewId() + "b" 1328 o1, err = ss.Post().Save(o1) 1329 require.Nil(t, err) 1330 1331 o1a := &model.Post{} 1332 o1a.ChannelId = c1.Id 1333 o1a.UserId = model.NewId() 1334 o1a.CreateAt = o1.CreateAt 1335 o1a.Message = "zz" + model.NewId() + "b" 1336 _, err = ss.Post().Save(o1a) 1337 require.Nil(t, err) 1338 1339 o2 := &model.Post{} 1340 o2.ChannelId = c1.Id 1341 o2.UserId = model.NewId() 1342 o2.CreateAt = o1.CreateAt - (1000 * 60 * 60 * 24 * 2) 1343 o2.Message = "zz" + model.NewId() + "b" 1344 o2, err = ss.Post().Save(o2) 1345 require.Nil(t, err) 1346 1347 o2a := &model.Post{} 1348 o2a.ChannelId = c1.Id 1349 o2a.UserId = o2.UserId 1350 o2a.CreateAt = o1.CreateAt - (1000 * 60 * 60 * 24 * 2) 1351 o2a.Message = "zz" + model.NewId() + "b" 1352 _, err = ss.Post().Save(o2a) 1353 require.Nil(t, err) 1354 1355 time.Sleep(1 * time.Second) 1356 1357 if r1, err := ss.Post().AnalyticsPostCountsByDay(t1.Id); err != nil { 1358 t.Fatal(err) 1359 } else { 1360 row1 := r1[0] 1361 if row1.Value != 2 { 1362 t.Fatal(row1) 1363 } 1364 1365 row2 := r1[1] 1366 if row2.Value != 2 { 1367 t.Fatal("wrong value") 1368 } 1369 } 1370 1371 if r1, err := ss.Post().AnalyticsPostCount(t1.Id, false, false); err != nil { 1372 t.Fatal(err) 1373 } else { 1374 if r1 != 4 { 1375 t.Fatal("wrong value") 1376 } 1377 } 1378 } 1379 1380 func testPostStoreGetFlaggedPostsForTeam(t *testing.T, ss store.Store, s SqlSupplier) { 1381 c1 := &model.Channel{} 1382 c1.TeamId = model.NewId() 1383 c1.DisplayName = "Channel1" 1384 c1.Name = "zz" + model.NewId() + "b" 1385 c1.Type = model.CHANNEL_OPEN 1386 c1, err := ss.Channel().Save(c1, -1) 1387 require.Nil(t, err) 1388 1389 o1 := &model.Post{} 1390 o1.ChannelId = c1.Id 1391 o1.UserId = model.NewId() 1392 o1.Message = "zz" + model.NewId() + "b" 1393 o1, err = ss.Post().Save(o1) 1394 require.Nil(t, err) 1395 time.Sleep(2 * time.Millisecond) 1396 1397 o2 := &model.Post{} 1398 o2.ChannelId = o1.ChannelId 1399 o2.UserId = model.NewId() 1400 o2.Message = "zz" + model.NewId() + "b" 1401 o2, err = ss.Post().Save(o2) 1402 require.Nil(t, err) 1403 time.Sleep(2 * time.Millisecond) 1404 1405 o3 := &model.Post{} 1406 o3.ChannelId = o1.ChannelId 1407 o3.UserId = model.NewId() 1408 o3.Message = "zz" + model.NewId() + "b" 1409 o3.DeleteAt = 1 1410 o3, err = ss.Post().Save(o3) 1411 require.Nil(t, err) 1412 time.Sleep(2 * time.Millisecond) 1413 1414 o4 := &model.Post{} 1415 o4.ChannelId = model.NewId() 1416 o4.UserId = model.NewId() 1417 o4.Message = "zz" + model.NewId() + "b" 1418 o4, err = ss.Post().Save(o4) 1419 require.Nil(t, err) 1420 time.Sleep(2 * time.Millisecond) 1421 1422 c2 := &model.Channel{} 1423 c2.DisplayName = "DMChannel1" 1424 c2.Name = "zz" + model.NewId() + "b" 1425 c2.Type = model.CHANNEL_DIRECT 1426 1427 m1 := &model.ChannelMember{} 1428 m1.ChannelId = c2.Id 1429 m1.UserId = o1.UserId 1430 m1.NotifyProps = model.GetDefaultChannelNotifyProps() 1431 1432 m2 := &model.ChannelMember{} 1433 m2.ChannelId = c2.Id 1434 m2.UserId = model.NewId() 1435 m2.NotifyProps = model.GetDefaultChannelNotifyProps() 1436 1437 c2, err = ss.Channel().SaveDirectChannel(c2, m1, m2) 1438 require.Nil(t, err) 1439 1440 o5 := &model.Post{} 1441 o5.ChannelId = c2.Id 1442 o5.UserId = m2.UserId 1443 o5.Message = "zz" + model.NewId() + "b" 1444 o5, err = ss.Post().Save(o5) 1445 require.Nil(t, err) 1446 time.Sleep(2 * time.Millisecond) 1447 1448 r1, err := ss.Post().GetFlaggedPosts(o1.ChannelId, 0, 2) 1449 require.Nil(t, err) 1450 1451 if len(r1.Order) != 0 { 1452 t.Fatal("should be empty") 1453 } 1454 1455 preferences := model.Preferences{ 1456 { 1457 UserId: o1.UserId, 1458 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1459 Name: o1.Id, 1460 Value: "true", 1461 }, 1462 } 1463 1464 err = ss.Preference().Save(&preferences) 1465 require.Nil(t, err) 1466 1467 r2, err := ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2) 1468 require.Nil(t, err) 1469 1470 if len(r2.Order) != 1 { 1471 t.Fatal("should have 1 post") 1472 } 1473 1474 preferences = model.Preferences{ 1475 { 1476 UserId: o1.UserId, 1477 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1478 Name: o2.Id, 1479 Value: "true", 1480 }, 1481 } 1482 1483 err = ss.Preference().Save(&preferences) 1484 require.Nil(t, err) 1485 1486 r3, err := ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 1) 1487 require.Nil(t, err) 1488 1489 if len(r3.Order) != 1 { 1490 t.Fatal("should have 1 post") 1491 } 1492 1493 r3, err = ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 1, 1) 1494 require.Nil(t, err) 1495 1496 if len(r3.Order) != 1 { 1497 t.Fatal("should have 1 post") 1498 } 1499 1500 r3, err = ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 1000, 10) 1501 require.Nil(t, err) 1502 1503 if len(r3.Order) != 0 { 1504 t.Fatal("should be empty") 1505 } 1506 1507 r4, err := ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2) 1508 require.Nil(t, err) 1509 1510 if len(r4.Order) != 2 { 1511 t.Fatal("should have 2 posts") 1512 } 1513 1514 preferences = model.Preferences{ 1515 { 1516 UserId: o1.UserId, 1517 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1518 Name: o3.Id, 1519 Value: "true", 1520 }, 1521 } 1522 1523 err = ss.Preference().Save(&preferences) 1524 require.Nil(t, err) 1525 1526 r4, err = ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2) 1527 require.Nil(t, err) 1528 1529 if len(r4.Order) != 2 { 1530 t.Fatal("should have 2 posts") 1531 } 1532 1533 preferences = model.Preferences{ 1534 { 1535 UserId: o1.UserId, 1536 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1537 Name: o4.Id, 1538 Value: "true", 1539 }, 1540 } 1541 err = ss.Preference().Save(&preferences) 1542 require.Nil(t, err) 1543 1544 r4, err = ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2) 1545 require.Nil(t, err) 1546 1547 if len(r4.Order) != 2 { 1548 t.Fatal("should have 2 posts") 1549 } 1550 1551 r4, err = ss.Post().GetFlaggedPostsForTeam(o1.UserId, model.NewId(), 0, 2) 1552 require.Nil(t, err) 1553 1554 if len(r4.Order) != 0 { 1555 t.Fatal("should have 0 posts") 1556 } 1557 1558 preferences = model.Preferences{ 1559 { 1560 UserId: o1.UserId, 1561 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1562 Name: o5.Id, 1563 Value: "true", 1564 }, 1565 } 1566 err = ss.Preference().Save(&preferences) 1567 require.Nil(t, err) 1568 1569 r4, err = ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 10) 1570 require.Nil(t, err) 1571 1572 if len(r4.Order) != 3 { 1573 t.Fatal("should have 3 posts") 1574 } 1575 1576 // Manually truncate Channels table until testlib can handle cleanups 1577 s.GetMaster().Exec("TRUNCATE Channels") 1578 } 1579 1580 func testPostStoreGetFlaggedPosts(t *testing.T, ss store.Store) { 1581 o1 := &model.Post{} 1582 o1.ChannelId = model.NewId() 1583 o1.UserId = model.NewId() 1584 o1.Message = "zz" + model.NewId() + "b" 1585 o1, err := ss.Post().Save(o1) 1586 require.Nil(t, err) 1587 time.Sleep(2 * time.Millisecond) 1588 1589 o2 := &model.Post{} 1590 o2.ChannelId = o1.ChannelId 1591 o2.UserId = model.NewId() 1592 o2.Message = "zz" + model.NewId() + "b" 1593 o2, err = ss.Post().Save(o2) 1594 require.Nil(t, err) 1595 time.Sleep(2 * time.Millisecond) 1596 1597 o3 := &model.Post{} 1598 o3.ChannelId = o1.ChannelId 1599 o3.UserId = model.NewId() 1600 o3.Message = "zz" + model.NewId() + "b" 1601 o3.DeleteAt = 1 1602 o3, err = ss.Post().Save(o3) 1603 require.Nil(t, err) 1604 time.Sleep(2 * time.Millisecond) 1605 1606 r1, err := ss.Post().GetFlaggedPosts(o1.UserId, 0, 2) 1607 require.Nil(t, err) 1608 1609 if len(r1.Order) != 0 { 1610 t.Fatal("should be empty") 1611 } 1612 1613 preferences := model.Preferences{ 1614 { 1615 UserId: o1.UserId, 1616 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1617 Name: o1.Id, 1618 Value: "true", 1619 }, 1620 } 1621 1622 err = ss.Preference().Save(&preferences) 1623 require.Nil(t, err) 1624 1625 r2, err := ss.Post().GetFlaggedPosts(o1.UserId, 0, 2) 1626 require.Nil(t, err) 1627 1628 if len(r2.Order) != 1 { 1629 t.Fatal("should have 1 post") 1630 } 1631 1632 preferences = model.Preferences{ 1633 { 1634 UserId: o1.UserId, 1635 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1636 Name: o2.Id, 1637 Value: "true", 1638 }, 1639 } 1640 1641 err = ss.Preference().Save(&preferences) 1642 require.Nil(t, err) 1643 1644 r3, err := ss.Post().GetFlaggedPosts(o1.UserId, 0, 1) 1645 require.Nil(t, err) 1646 1647 if len(r3.Order) != 1 { 1648 t.Fatal("should have 1 post") 1649 } 1650 1651 r3, err = ss.Post().GetFlaggedPosts(o1.UserId, 1, 1) 1652 require.Nil(t, err) 1653 1654 if len(r3.Order) != 1 { 1655 t.Fatal("should have 1 post") 1656 } 1657 1658 r3, err = ss.Post().GetFlaggedPosts(o1.UserId, 1000, 10) 1659 require.Nil(t, err) 1660 1661 if len(r3.Order) != 0 { 1662 t.Fatal("should be empty") 1663 } 1664 1665 r4, err := ss.Post().GetFlaggedPosts(o1.UserId, 0, 2) 1666 require.Nil(t, err) 1667 1668 if len(r4.Order) != 2 { 1669 t.Fatal("should have 2 posts") 1670 } 1671 1672 preferences = model.Preferences{ 1673 { 1674 UserId: o1.UserId, 1675 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1676 Name: o3.Id, 1677 Value: "true", 1678 }, 1679 } 1680 1681 err = ss.Preference().Save(&preferences) 1682 require.Nil(t, err) 1683 1684 r4, err = ss.Post().GetFlaggedPosts(o1.UserId, 0, 2) 1685 require.Nil(t, err) 1686 1687 if len(r4.Order) != 2 { 1688 t.Fatal("should have 2 posts") 1689 } 1690 } 1691 1692 func testPostStoreGetFlaggedPostsForChannel(t *testing.T, ss store.Store) { 1693 o1 := &model.Post{} 1694 o1.ChannelId = model.NewId() 1695 o1.UserId = model.NewId() 1696 o1.Message = "zz" + model.NewId() + "b" 1697 o1, err := ss.Post().Save(o1) 1698 time.Sleep(2 * time.Millisecond) 1699 1700 o2 := &model.Post{} 1701 o2.ChannelId = o1.ChannelId 1702 o2.UserId = model.NewId() 1703 o2.Message = "zz" + model.NewId() + "b" 1704 o2, err = ss.Post().Save(o2) 1705 require.Nil(t, err) 1706 time.Sleep(2 * time.Millisecond) 1707 1708 // deleted post 1709 o3 := &model.Post{} 1710 o3.ChannelId = model.NewId() 1711 o3.UserId = o1.ChannelId 1712 o3.Message = "zz" + model.NewId() + "b" 1713 o3.DeleteAt = 1 1714 o3, err = ss.Post().Save(o3) 1715 time.Sleep(2 * time.Millisecond) 1716 1717 o4 := &model.Post{} 1718 o4.ChannelId = model.NewId() 1719 o4.UserId = model.NewId() 1720 o4.Message = "zz" + model.NewId() + "b" 1721 o4, err = ss.Post().Save(o4) 1722 require.Nil(t, err) 1723 time.Sleep(2 * time.Millisecond) 1724 1725 r, err := ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 10) 1726 require.Nil(t, err) 1727 1728 if len(r.Order) != 0 { 1729 t.Fatal("should be empty") 1730 } 1731 1732 preference := model.Preference{ 1733 UserId: o1.UserId, 1734 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1735 Name: o1.Id, 1736 Value: "true", 1737 } 1738 1739 err = ss.Preference().Save(&model.Preferences{preference}) 1740 require.Nil(t, err) 1741 1742 r, err = ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 10) 1743 require.Nil(t, err) 1744 1745 if len(r.Order) != 1 { 1746 t.Fatal("should have 1 post") 1747 } 1748 1749 preference.Name = o2.Id 1750 err = ss.Preference().Save(&model.Preferences{preference}) 1751 require.Nil(t, err) 1752 1753 preference.Name = o3.Id 1754 err = ss.Preference().Save(&model.Preferences{preference}) 1755 require.Nil(t, err) 1756 1757 r, err = ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 1) 1758 require.Nil(t, err) 1759 1760 if len(r.Order) != 1 { 1761 t.Fatal("should have 1 post") 1762 } 1763 1764 r, err = ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 1, 1) 1765 require.Nil(t, err) 1766 1767 if len(r.Order) != 1 { 1768 t.Fatal("should have 1 post") 1769 } 1770 1771 r, err = ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 1000, 10) 1772 require.Nil(t, err) 1773 1774 if len(r.Order) != 0 { 1775 t.Fatal("should be empty") 1776 } 1777 1778 r, err = ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 10) 1779 require.Nil(t, err) 1780 1781 if len(r.Order) != 2 { 1782 t.Fatal("should have 2 posts") 1783 } 1784 1785 preference.Name = o4.Id 1786 err = ss.Preference().Save(&model.Preferences{preference}) 1787 require.Nil(t, err) 1788 1789 r, err = ss.Post().GetFlaggedPostsForChannel(o1.UserId, o4.ChannelId, 0, 10) 1790 require.Nil(t, err) 1791 1792 if len(r.Order) != 1 { 1793 t.Fatal("should have 1 post") 1794 } 1795 } 1796 1797 func testPostStoreGetPostsCreatedAt(t *testing.T, ss store.Store) { 1798 createTime := model.GetMillis() + 1 1799 1800 o0 := &model.Post{} 1801 o0.ChannelId = model.NewId() 1802 o0.UserId = model.NewId() 1803 o0.Message = "zz" + model.NewId() + "b" 1804 o0.CreateAt = createTime 1805 o0, err := ss.Post().Save(o0) 1806 require.Nil(t, err) 1807 1808 o1 := &model.Post{} 1809 o1.ChannelId = o0.ChannelId 1810 o1.UserId = model.NewId() 1811 o1.Message = "zz" + model.NewId() + "b" 1812 o1.CreateAt = createTime 1813 o1, err = ss.Post().Save(o1) 1814 require.Nil(t, err) 1815 1816 o2 := &model.Post{} 1817 o2.ChannelId = o1.ChannelId 1818 o2.UserId = model.NewId() 1819 o2.Message = "zz" + model.NewId() + "b" 1820 o2.ParentId = o1.Id 1821 o2.RootId = o1.Id 1822 o2.CreateAt = createTime + 1 1823 _, err = ss.Post().Save(o2) 1824 require.Nil(t, err) 1825 1826 o3 := &model.Post{} 1827 o3.ChannelId = model.NewId() 1828 o3.UserId = model.NewId() 1829 o3.Message = "zz" + model.NewId() + "b" 1830 o3.CreateAt = createTime 1831 _, err = ss.Post().Save(o3) 1832 require.Nil(t, err) 1833 1834 r1, _ := ss.Post().GetPostsCreatedAt(o1.ChannelId, createTime) 1835 assert.Equal(t, 2, len(r1)) 1836 } 1837 1838 func testPostStoreOverwrite(t *testing.T, ss store.Store) { 1839 o1 := &model.Post{} 1840 o1.ChannelId = model.NewId() 1841 o1.UserId = model.NewId() 1842 o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1843 o1, err := ss.Post().Save(o1) 1844 require.Nil(t, err) 1845 1846 o2 := &model.Post{} 1847 o2.ChannelId = o1.ChannelId 1848 o2.UserId = model.NewId() 1849 o2.Message = "zz" + model.NewId() + "CCCCCCCCC" 1850 o2.ParentId = o1.Id 1851 o2.RootId = o1.Id 1852 o2, err = ss.Post().Save(o2) 1853 require.Nil(t, err) 1854 1855 o3 := &model.Post{} 1856 o3.ChannelId = o1.ChannelId 1857 o3.UserId = model.NewId() 1858 o3.Message = "zz" + model.NewId() + "QQQQQQQQQQ" 1859 o3, err = ss.Post().Save(o3) 1860 1861 r1, err := ss.Post().Get(o1.Id) 1862 if err != nil { 1863 t.Fatal(err) 1864 } 1865 ro1 := r1.Posts[o1.Id] 1866 r2, err := ss.Post().Get(o1.Id) 1867 if err != nil { 1868 t.Fatal(err) 1869 } 1870 ro2 := r2.Posts[o2.Id] 1871 r3, err := ss.Post().Get(o3.Id) 1872 if err != nil { 1873 t.Fatal(err) 1874 } 1875 ro3 := r3.Posts[o3.Id] 1876 1877 if ro1.Message != o1.Message { 1878 t.Fatal("Failed to save/get") 1879 } 1880 1881 o1a := &model.Post{} 1882 *o1a = *ro1 1883 o1a.Message = ro1.Message + "BBBBBBBBBB" 1884 _, err = ss.Post().Overwrite(o1a) 1885 if err != nil { 1886 t.Fatal(err) 1887 } 1888 1889 r1, err = ss.Post().Get(o1.Id) 1890 if err != nil { 1891 t.Fatal(err) 1892 } 1893 ro1a := r1.Posts[o1.Id] 1894 1895 if ro1a.Message != o1a.Message { 1896 t.Fatal("Failed to overwrite/get") 1897 } 1898 1899 o2a := &model.Post{} 1900 *o2a = *ro2 1901 o2a.Message = ro2.Message + "DDDDDDD" 1902 _, err = ss.Post().Overwrite(o2a) 1903 if err != nil { 1904 t.Fatal(err) 1905 } 1906 1907 r2, err = ss.Post().Get(o1.Id) 1908 if err != nil { 1909 t.Fatal(err) 1910 } 1911 ro2a := r2.Posts[o2.Id] 1912 1913 if ro2a.Message != o2a.Message { 1914 t.Fatal("Failed to overwrite/get") 1915 } 1916 1917 o3a := &model.Post{} 1918 *o3a = *ro3 1919 o3a.Message = ro3.Message + "WWWWWWW" 1920 _, err = ss.Post().Overwrite(o3a) 1921 if err != nil { 1922 t.Fatal(err) 1923 } 1924 1925 r3, err = ss.Post().Get(o3.Id) 1926 if err != nil { 1927 t.Fatal(err) 1928 } 1929 ro3a := r3.Posts[o3.Id] 1930 1931 if ro3a.Message != o3a.Message && ro3a.Hashtags != o3a.Hashtags { 1932 t.Fatal("Failed to overwrite/get") 1933 } 1934 1935 o4, err := ss.Post().Save(&model.Post{ 1936 ChannelId: model.NewId(), 1937 UserId: model.NewId(), 1938 Message: model.NewId(), 1939 Filenames: []string{"test"}, 1940 }) 1941 require.Nil(t, err) 1942 1943 r4, err := ss.Post().Get(o4.Id) 1944 if err != nil { 1945 t.Fatal(err) 1946 } 1947 ro4 := r4.Posts[o4.Id] 1948 1949 o4a := &model.Post{} 1950 *o4a = *ro4 1951 o4a.Filenames = []string{} 1952 o4a.FileIds = []string{model.NewId()} 1953 _, err = ss.Post().Overwrite(o4a) 1954 if err != nil { 1955 t.Fatal(err) 1956 } 1957 1958 r4, err = ss.Post().Get(o4.Id) 1959 if err != nil { 1960 t.Fatal(err) 1961 } 1962 1963 ro4a := r4.Posts[o4.Id] 1964 1965 if len(ro4a.Filenames) != 0 { 1966 t.Fatal("Failed to clear Filenames") 1967 } else if len(ro4a.FileIds) != 1 { 1968 t.Fatal("Failed to set FileIds") 1969 } 1970 } 1971 1972 func testPostStoreGetPostsByIds(t *testing.T, ss store.Store) { 1973 o1 := &model.Post{} 1974 o1.ChannelId = model.NewId() 1975 o1.UserId = model.NewId() 1976 o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1977 o1, err := ss.Post().Save(o1) 1978 require.Nil(t, err) 1979 1980 o2 := &model.Post{} 1981 o2.ChannelId = o1.ChannelId 1982 o2.UserId = model.NewId() 1983 o2.Message = "zz" + model.NewId() + "CCCCCCCCC" 1984 o2, err = ss.Post().Save(o2) 1985 require.Nil(t, err) 1986 1987 o3 := &model.Post{} 1988 o3.ChannelId = o1.ChannelId 1989 o3.UserId = model.NewId() 1990 o3.Message = "zz" + model.NewId() + "QQQQQQQQQQ" 1991 o3, err = ss.Post().Save(o3) 1992 require.Nil(t, err) 1993 1994 r1, err := ss.Post().Get(o1.Id) 1995 if err != nil { 1996 t.Fatal(err) 1997 } 1998 ro1 := r1.Posts[o1.Id] 1999 r2, err := ss.Post().Get(o2.Id) 2000 if err != nil { 2001 t.Fatal(err) 2002 } 2003 ro2 := r2.Posts[o2.Id] 2004 r3, err := ss.Post().Get(o3.Id) 2005 if err != nil { 2006 t.Fatal(err) 2007 } 2008 ro3 := r3.Posts[o3.Id] 2009 2010 postIds := []string{ 2011 ro1.Id, 2012 ro2.Id, 2013 ro3.Id, 2014 } 2015 2016 if posts, err := ss.Post().GetPostsByIds(postIds); err != nil { 2017 t.Fatal(err) 2018 } else if len(posts) != 3 { 2019 t.Fatalf("Expected 3 posts in results. Got %v", len(posts)) 2020 } 2021 2022 if err := ss.Post().Delete(ro1.Id, model.GetMillis(), ""); err != nil { 2023 t.Fatal(err) 2024 } 2025 2026 if posts, err := ss.Post().GetPostsByIds(postIds); err != nil { 2027 t.Fatal(err) 2028 } else if len(posts) != 3 { 2029 t.Fatalf("Expected 3 posts in results. Got %v", len(posts)) 2030 } 2031 } 2032 2033 func testPostStoreGetPostsBatchForIndexing(t *testing.T, ss store.Store) { 2034 c1 := &model.Channel{} 2035 c1.TeamId = model.NewId() 2036 c1.DisplayName = "Channel1" 2037 c1.Name = "zz" + model.NewId() + "b" 2038 c1.Type = model.CHANNEL_OPEN 2039 c1, _ = ss.Channel().Save(c1, -1) 2040 2041 c2 := &model.Channel{} 2042 c2.TeamId = model.NewId() 2043 c2.DisplayName = "Channel2" 2044 c2.Name = "zz" + model.NewId() + "b" 2045 c2.Type = model.CHANNEL_OPEN 2046 c2, _ = ss.Channel().Save(c2, -1) 2047 2048 o1 := &model.Post{} 2049 o1.ChannelId = c1.Id 2050 o1.UserId = model.NewId() 2051 o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 2052 o1, err := ss.Post().Save(o1) 2053 require.Nil(t, err) 2054 2055 o2 := &model.Post{} 2056 o2.ChannelId = c2.Id 2057 o2.UserId = model.NewId() 2058 o2.Message = "zz" + model.NewId() + "CCCCCCCCC" 2059 o2, err = ss.Post().Save(o2) 2060 require.Nil(t, err) 2061 2062 o3 := &model.Post{} 2063 o3.ChannelId = c1.Id 2064 o3.UserId = model.NewId() 2065 o3.ParentId = o1.Id 2066 o3.RootId = o1.Id 2067 o3.Message = "zz" + model.NewId() + "QQQQQQQQQQ" 2068 o3, err = ss.Post().Save(o3) 2069 2070 if r, err := ss.Post().GetPostsBatchForIndexing(o1.CreateAt, model.GetMillis()+100000, 100); err != nil { 2071 t.Fatal(err) 2072 } else if len(r) != 3 { 2073 t.Fatalf("Expected 3 posts in results. Got %v", len(r)) 2074 } else { 2075 for _, p := range r { 2076 if p.Id == o1.Id { 2077 if p.TeamId != c1.TeamId { 2078 t.Fatalf("Unexpected team ID") 2079 } 2080 if p.ParentCreateAt != nil { 2081 t.Fatalf("Unexpected parent create at") 2082 } 2083 } else if p.Id == o2.Id { 2084 if p.TeamId != c2.TeamId { 2085 t.Fatalf("Unexpected team ID") 2086 } 2087 if p.ParentCreateAt != nil { 2088 t.Fatalf("Unexpected parent create at") 2089 } 2090 } else if p.Id == o3.Id { 2091 if p.TeamId != c1.TeamId { 2092 t.Fatalf("Unexpected team ID") 2093 } 2094 if *p.ParentCreateAt != o1.CreateAt { 2095 t.Fatalf("Unexpected parent create at") 2096 } 2097 } else { 2098 t.Fatalf("unexpected post returned") 2099 } 2100 } 2101 } 2102 } 2103 2104 func testPostStorePermanentDeleteBatch(t *testing.T, ss store.Store) { 2105 o1 := &model.Post{} 2106 o1.ChannelId = model.NewId() 2107 o1.UserId = model.NewId() 2108 o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 2109 o1.CreateAt = 1000 2110 o1, err := ss.Post().Save(o1) 2111 require.Nil(t, err) 2112 2113 o2 := &model.Post{} 2114 o2.ChannelId = model.NewId() 2115 o2.UserId = model.NewId() 2116 o2.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 2117 o2.CreateAt = 1000 2118 o2, err = ss.Post().Save(o2) 2119 require.Nil(t, err) 2120 2121 o3 := &model.Post{} 2122 o3.ChannelId = model.NewId() 2123 o3.UserId = model.NewId() 2124 o3.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 2125 o3.CreateAt = 100000 2126 o3, err = ss.Post().Save(o3) 2127 require.Nil(t, err) 2128 2129 _, err = ss.Post().PermanentDeleteBatch(2000, 1000) 2130 require.Nil(t, err) 2131 2132 if _, err := ss.Post().Get(o1.Id); err == nil { 2133 t.Fatalf("Should have not found post 1 after purge") 2134 } 2135 2136 if _, err := ss.Post().Get(o2.Id); err == nil { 2137 t.Fatalf("Should have not found post 2 after purge") 2138 } 2139 2140 if _, err := ss.Post().Get(o3.Id); err != nil { 2141 t.Fatalf("Should have not found post 3 after purge") 2142 } 2143 } 2144 2145 func testPostStoreGetOldest(t *testing.T, ss store.Store) { 2146 o0 := &model.Post{} 2147 o0.ChannelId = model.NewId() 2148 o0.UserId = model.NewId() 2149 o0.Message = "zz" + model.NewId() + "b" 2150 o0.CreateAt = 3 2151 o0, err := ss.Post().Save(o0) 2152 require.Nil(t, err) 2153 2154 o1 := &model.Post{} 2155 o1.ChannelId = o0.Id 2156 o1.UserId = model.NewId() 2157 o1.Message = "zz" + model.NewId() + "b" 2158 o1.CreateAt = 2 2159 o1, err = ss.Post().Save(o1) 2160 require.Nil(t, err) 2161 2162 o2 := &model.Post{} 2163 o2.ChannelId = o1.ChannelId 2164 o2.UserId = model.NewId() 2165 o2.Message = "zz" + model.NewId() + "b" 2166 o2.CreateAt = 1 2167 o2, err = ss.Post().Save(o2) 2168 require.Nil(t, err) 2169 2170 r1, err := ss.Post().GetOldest() 2171 2172 require.Nil(t, err) 2173 assert.EqualValues(t, o2.Id, r1.Id) 2174 } 2175 2176 func testGetMaxPostSize(t *testing.T, ss store.Store) { 2177 assert.Equal(t, model.POST_MESSAGE_MAX_RUNES_V2, ss.Post().GetMaxPostSize()) 2178 assert.Equal(t, model.POST_MESSAGE_MAX_RUNES_V2, ss.Post().GetMaxPostSize()) 2179 } 2180 2181 func testPostStoreGetParentsForExportAfter(t *testing.T, ss store.Store) { 2182 t1 := model.Team{} 2183 t1.DisplayName = "Name" 2184 t1.Name = model.NewId() 2185 t1.Email = MakeEmail() 2186 t1.Type = model.TEAM_OPEN 2187 _, err := ss.Team().Save(&t1) 2188 require.Nil(t, err) 2189 2190 c1 := model.Channel{} 2191 c1.TeamId = t1.Id 2192 c1.DisplayName = "Channel1" 2193 c1.Name = "zz" + model.NewId() + "b" 2194 c1.Type = model.CHANNEL_OPEN 2195 _, err = ss.Channel().Save(&c1, -1) 2196 require.Nil(t, err) 2197 2198 u1 := model.User{} 2199 u1.Username = model.NewId() 2200 u1.Email = MakeEmail() 2201 u1.Nickname = model.NewId() 2202 store.Must(ss.User().Save(&u1)) 2203 2204 p1 := &model.Post{} 2205 p1.ChannelId = c1.Id 2206 p1.UserId = u1.Id 2207 p1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 2208 p1.CreateAt = 1000 2209 p1, err = ss.Post().Save(p1) 2210 require.Nil(t, err) 2211 2212 posts, err := ss.Post().GetParentsForExportAfter(10000, strings.Repeat("0", 26)) 2213 assert.Nil(t, err) 2214 2215 found := false 2216 for _, p := range posts { 2217 if p.Id == p1.Id { 2218 found = true 2219 assert.Equal(t, p.Id, p1.Id) 2220 assert.Equal(t, p.Message, p1.Message) 2221 assert.Equal(t, p.Username, u1.Username) 2222 assert.Equal(t, p.TeamName, t1.Name) 2223 assert.Equal(t, p.ChannelName, c1.Name) 2224 } 2225 } 2226 assert.True(t, found) 2227 } 2228 2229 func testPostStoreGetRepliesForExport(t *testing.T, ss store.Store) { 2230 t1 := model.Team{} 2231 t1.DisplayName = "Name" 2232 t1.Name = model.NewId() 2233 t1.Email = MakeEmail() 2234 t1.Type = model.TEAM_OPEN 2235 _, err := ss.Team().Save(&t1) 2236 require.Nil(t, err) 2237 2238 c1 := model.Channel{} 2239 c1.TeamId = t1.Id 2240 c1.DisplayName = "Channel1" 2241 c1.Name = "zz" + model.NewId() + "b" 2242 c1.Type = model.CHANNEL_OPEN 2243 _, err = ss.Channel().Save(&c1, -1) 2244 require.Nil(t, err) 2245 2246 u1 := model.User{} 2247 u1.Email = MakeEmail() 2248 u1.Nickname = model.NewId() 2249 store.Must(ss.User().Save(&u1)) 2250 2251 p1 := &model.Post{} 2252 p1.ChannelId = c1.Id 2253 p1.UserId = u1.Id 2254 p1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 2255 p1.CreateAt = 1000 2256 p1, err = ss.Post().Save(p1) 2257 require.Nil(t, err) 2258 2259 p2 := &model.Post{} 2260 p2.ChannelId = c1.Id 2261 p2.UserId = u1.Id 2262 p2.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 2263 p2.CreateAt = 1001 2264 p2.ParentId = p1.Id 2265 p2.RootId = p1.Id 2266 p2, err = ss.Post().Save(p2) 2267 require.Nil(t, err) 2268 2269 r1, err := ss.Post().GetRepliesForExport(p1.Id) 2270 assert.Nil(t, err) 2271 2272 assert.Len(t, r1, 1) 2273 2274 reply1 := r1[0] 2275 assert.Equal(t, reply1.Id, p2.Id) 2276 assert.Equal(t, reply1.Message, p2.Message) 2277 assert.Equal(t, reply1.Username, u1.Username) 2278 2279 // Checking whether replies by deleted user are exported 2280 u1.DeleteAt = 1002 2281 _, err = ss.User().Update(&u1, false) 2282 require.Nil(t, err) 2283 2284 r1, err = ss.Post().GetRepliesForExport(p1.Id) 2285 assert.Nil(t, err) 2286 2287 assert.Len(t, r1, 1) 2288 2289 reply1 = r1[0] 2290 assert.Equal(t, reply1.Id, p2.Id) 2291 assert.Equal(t, reply1.Message, p2.Message) 2292 assert.Equal(t, reply1.Username, u1.Username) 2293 2294 } 2295 2296 func testPostStoreGetDirectPostParentsForExportAfter(t *testing.T, ss store.Store, s SqlSupplier) { 2297 teamId := model.NewId() 2298 2299 o1 := model.Channel{} 2300 o1.TeamId = teamId 2301 o1.DisplayName = "Name" 2302 o1.Name = "zz" + model.NewId() + "b" 2303 o1.Type = model.CHANNEL_DIRECT 2304 2305 u1 := &model.User{} 2306 u1.Email = MakeEmail() 2307 u1.Nickname = model.NewId() 2308 store.Must(ss.User().Save(u1)) 2309 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)) 2310 2311 u2 := &model.User{} 2312 u2.Email = MakeEmail() 2313 u2.Nickname = model.NewId() 2314 store.Must(ss.User().Save(u2)) 2315 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)) 2316 2317 m1 := model.ChannelMember{} 2318 m1.ChannelId = o1.Id 2319 m1.UserId = u1.Id 2320 m1.NotifyProps = model.GetDefaultChannelNotifyProps() 2321 2322 m2 := model.ChannelMember{} 2323 m2.ChannelId = o1.Id 2324 m2.UserId = u2.Id 2325 m2.NotifyProps = model.GetDefaultChannelNotifyProps() 2326 2327 ss.Channel().SaveDirectChannel(&o1, &m1, &m2) 2328 2329 p1 := &model.Post{} 2330 p1.ChannelId = o1.Id 2331 p1.UserId = u1.Id 2332 p1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 2333 p1.CreateAt = 1000 2334 p1, err := ss.Post().Save(p1) 2335 require.Nil(t, err) 2336 2337 r1, err := ss.Post().GetDirectPostParentsForExportAfter(10000, strings.Repeat("0", 26)) 2338 assert.Nil(t, err) 2339 2340 assert.Equal(t, p1.Message, r1[0].Message) 2341 2342 // Manually truncate Channels table until testlib can handle cleanups 2343 s.GetMaster().Exec("TRUNCATE Channels") 2344 } 2345 2346 func testPostStoreGetDirectPostParentsForExportAfterDeleted(t *testing.T, ss store.Store, s SqlSupplier) { 2347 teamId := model.NewId() 2348 2349 o1 := model.Channel{} 2350 o1.TeamId = teamId 2351 o1.DisplayName = "Name" 2352 o1.Name = "zz" + model.NewId() + "b" 2353 o1.Type = model.CHANNEL_DIRECT 2354 2355 u1 := &model.User{} 2356 u1.DeleteAt = 1 2357 u1.Email = MakeEmail() 2358 u1.Nickname = model.NewId() 2359 store.Must(ss.User().Save(u1)) 2360 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)) 2361 2362 u2 := &model.User{} 2363 u2.DeleteAt = 1 2364 u2.Email = MakeEmail() 2365 u2.Nickname = model.NewId() 2366 store.Must(ss.User().Save(u2)) 2367 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)) 2368 2369 m1 := model.ChannelMember{} 2370 m1.ChannelId = o1.Id 2371 m1.UserId = u1.Id 2372 m1.NotifyProps = model.GetDefaultChannelNotifyProps() 2373 2374 m2 := model.ChannelMember{} 2375 m2.ChannelId = o1.Id 2376 m2.UserId = u2.Id 2377 m2.NotifyProps = model.GetDefaultChannelNotifyProps() 2378 2379 ss.Channel().SaveDirectChannel(&o1, &m1, &m2) 2380 2381 o1.DeleteAt = 1 2382 err := ss.Channel().SetDeleteAt(o1.Id, 1, 1) 2383 assert.Nil(t, err) 2384 2385 p1 := &model.Post{} 2386 p1.ChannelId = o1.Id 2387 p1.UserId = u1.Id 2388 p1.Message = "zz" + model.NewId() + "BBBBBBBBBBBB" 2389 p1.CreateAt = 1000 2390 p1, err = ss.Post().Save(p1) 2391 require.Nil(t, err) 2392 2393 o1a := &model.Post{} 2394 *o1a = *p1 2395 o1a.DeleteAt = 1 2396 o1a.Message = p1.Message + "BBBBBBBBBB" 2397 if _, err = ss.Post().Update(o1a, p1); err != nil { 2398 t.Fatal(err) 2399 } 2400 2401 r1, err := ss.Post().GetDirectPostParentsForExportAfter(10000, strings.Repeat("0", 26)) 2402 assert.Nil(t, err) 2403 2404 assert.Equal(t, 0, len(r1)) 2405 2406 // Manually truncate Channels table until testlib can handle cleanups 2407 s.GetMaster().Exec("TRUNCATE Channels") 2408 } 2409 2410 func testPostStoreGetDirectPostParentsForExportAfterBatched(t *testing.T, ss store.Store, s SqlSupplier) { 2411 teamId := model.NewId() 2412 2413 o1 := model.Channel{} 2414 o1.TeamId = teamId 2415 o1.DisplayName = "Name" 2416 o1.Name = "zz" + model.NewId() + "b" 2417 o1.Type = model.CHANNEL_DIRECT 2418 2419 var postIds []string 2420 for i := 0; i < 150; i++ { 2421 u1 := &model.User{} 2422 u1.Email = MakeEmail() 2423 u1.Nickname = model.NewId() 2424 store.Must(ss.User().Save(u1)) 2425 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)) 2426 2427 u2 := &model.User{} 2428 u2.Email = MakeEmail() 2429 u2.Nickname = model.NewId() 2430 store.Must(ss.User().Save(u2)) 2431 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)) 2432 2433 m1 := model.ChannelMember{} 2434 m1.ChannelId = o1.Id 2435 m1.UserId = u1.Id 2436 m1.NotifyProps = model.GetDefaultChannelNotifyProps() 2437 2438 m2 := model.ChannelMember{} 2439 m2.ChannelId = o1.Id 2440 m2.UserId = u2.Id 2441 m2.NotifyProps = model.GetDefaultChannelNotifyProps() 2442 2443 ss.Channel().SaveDirectChannel(&o1, &m1, &m2) 2444 2445 p1 := &model.Post{} 2446 p1.ChannelId = o1.Id 2447 p1.UserId = u1.Id 2448 p1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 2449 p1.CreateAt = 1000 2450 p1, err := ss.Post().Save(p1) 2451 require.Nil(t, err) 2452 postIds = append(postIds, p1.Id) 2453 } 2454 sort.Slice(postIds, func(i, j int) bool { return postIds[i] < postIds[j] }) 2455 2456 // Get all posts 2457 r1, err := ss.Post().GetDirectPostParentsForExportAfter(10000, strings.Repeat("0", 26)) 2458 assert.Nil(t, err) 2459 assert.Equal(t, len(postIds), len(r1)) 2460 var exportedPostIds []string 2461 for i := range r1 { 2462 exportedPostIds = append(exportedPostIds, r1[i].Id) 2463 } 2464 sort.Slice(exportedPostIds, func(i, j int) bool { return exportedPostIds[i] < exportedPostIds[j] }) 2465 assert.ElementsMatch(t, postIds, exportedPostIds) 2466 2467 // Get 100 2468 r1, err = ss.Post().GetDirectPostParentsForExportAfter(100, strings.Repeat("0", 26)) 2469 assert.Nil(t, err) 2470 assert.Equal(t, 100, len(r1)) 2471 exportedPostIds = []string{} 2472 for i := range r1 { 2473 exportedPostIds = append(exportedPostIds, r1[i].Id) 2474 } 2475 sort.Slice(exportedPostIds, func(i, j int) bool { return exportedPostIds[i] < exportedPostIds[j] }) 2476 assert.ElementsMatch(t, postIds[:100], exportedPostIds) 2477 2478 // Manually truncate Channels table until testlib can handle cleanups 2479 s.GetMaster().Exec("TRUNCATE Channels") 2480 }