github.com/lologarithm/mattermost-server@v5.3.2-0.20181002060438-c82a84ed765b+incompatible/store/storetest/post_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 "fmt" 8 "strings" 9 "testing" 10 "time" 11 12 "github.com/mattermost/mattermost-server/model" 13 "github.com/mattermost/mattermost-server/store" 14 "github.com/mattermost/mattermost-server/utils" 15 "github.com/stretchr/testify/assert" 16 "github.com/stretchr/testify/require" 17 ) 18 19 func TestPostStore(t *testing.T, ss store.Store) { 20 t.Run("Save", func(t *testing.T) { testPostStoreSave(t, ss) }) 21 t.Run("Get", func(t *testing.T) { testPostStoreGet(t, ss) }) 22 t.Run("GetSingle", func(t *testing.T) { testPostStoreGetSingle(t, ss) }) 23 t.Run("GetEtagCache", func(t *testing.T) { testGetEtagCache(t, ss) }) 24 t.Run("Update", func(t *testing.T) { testPostStoreUpdate(t, ss) }) 25 t.Run("Delete", func(t *testing.T) { testPostStoreDelete(t, ss) }) 26 t.Run("Delete1Level", func(t *testing.T) { testPostStoreDelete1Level(t, ss) }) 27 t.Run("Delete2Level", func(t *testing.T) { testPostStoreDelete2Level(t, ss) }) 28 t.Run("PermDelete1Level", func(t *testing.T) { testPostStorePermDelete1Level(t, ss) }) 29 t.Run("PermDelete1Level2", func(t *testing.T) { testPostStorePermDelete1Level2(t, ss) }) 30 t.Run("GetWithChildren", func(t *testing.T) { testPostStoreGetWithChildren(t, ss) }) 31 t.Run("GetPostsWithDetails", func(t *testing.T) { testPostStoreGetPostsWithDetails(t, ss) }) 32 t.Run("GetPostsBeforeAfter", func(t *testing.T) { testPostStoreGetPostsBeforeAfter(t, ss) }) 33 t.Run("GetPostsSince", func(t *testing.T) { testPostStoreGetPostsSince(t, ss) }) 34 t.Run("Search", func(t *testing.T) { testPostStoreSearch(t, ss) }) 35 t.Run("UserCountsWithPostsByDay", func(t *testing.T) { testUserCountsWithPostsByDay(t, ss) }) 36 t.Run("PostCountsByDay", func(t *testing.T) { testPostCountsByDay(t, ss) }) 37 t.Run("GetFlaggedPostsForTeam", func(t *testing.T) { testPostStoreGetFlaggedPostsForTeam(t, ss) }) 38 t.Run("GetFlaggedPosts", func(t *testing.T) { testPostStoreGetFlaggedPosts(t, ss) }) 39 t.Run("GetFlaggedPostsForChannel", func(t *testing.T) { testPostStoreGetFlaggedPostsForChannel(t, ss) }) 40 t.Run("GetPostsCreatedAt", func(t *testing.T) { testPostStoreGetPostsCreatedAt(t, ss) }) 41 t.Run("Overwrite", func(t *testing.T) { testPostStoreOverwrite(t, ss) }) 42 t.Run("GetPostsByIds", func(t *testing.T) { testPostStoreGetPostsByIds(t, ss) }) 43 t.Run("GetPostsBatchForIndexing", func(t *testing.T) { testPostStoreGetPostsBatchForIndexing(t, ss) }) 44 t.Run("PermanentDeleteBatch", func(t *testing.T) { testPostStorePermanentDeleteBatch(t, ss) }) 45 t.Run("GetOldest", func(t *testing.T) { testPostStoreGetOldest(t, ss) }) 46 t.Run("TestGetMaxPostSize", func(t *testing.T) { testGetMaxPostSize(t, ss) }) 47 t.Run("GetParentsForExportAfter", func(t *testing.T) { testPostStoreGetParentsForExportAfter(t, ss) }) 48 t.Run("GetRepliesForExport", func(t *testing.T) { testPostStoreGetRepliesForExport(t, ss) }) 49 } 50 51 func testPostStoreSave(t *testing.T, ss store.Store) { 52 o1 := model.Post{} 53 o1.ChannelId = model.NewId() 54 o1.UserId = model.NewId() 55 o1.Message = "zz" + model.NewId() + "b" 56 57 if err := (<-ss.Post().Save(&o1)).Err; err != nil { 58 t.Fatal("couldn't save item", err) 59 } 60 61 if err := (<-ss.Post().Save(&o1)).Err; err == nil { 62 t.Fatal("shouldn't be able to update from save") 63 } 64 } 65 66 func testPostStoreGet(t *testing.T, ss store.Store) { 67 o1 := &model.Post{} 68 o1.ChannelId = model.NewId() 69 o1.UserId = model.NewId() 70 o1.Message = "zz" + model.NewId() + "b" 71 72 etag1 := (<-ss.Post().GetEtag(o1.ChannelId, false)).Data.(string) 73 if strings.Index(etag1, model.CurrentVersion+".") != 0 { 74 t.Fatal("Invalid Etag") 75 } 76 77 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 78 79 etag2 := (<-ss.Post().GetEtag(o1.ChannelId, false)).Data.(string) 80 if strings.Index(etag2, fmt.Sprintf("%v.%v", model.CurrentVersion, o1.UpdateAt)) != 0 { 81 t.Fatal("Invalid Etag") 82 } 83 84 if r1 := <-ss.Post().Get(o1.Id); r1.Err != nil { 85 t.Fatal(r1.Err) 86 } else { 87 if r1.Data.(*model.PostList).Posts[o1.Id].CreateAt != o1.CreateAt { 88 t.Fatal("invalid returned post") 89 } 90 } 91 92 if err := (<-ss.Post().Get("123")).Err; err == nil { 93 t.Fatal("Missing id should have failed") 94 } 95 96 if err := (<-ss.Post().Get("")).Err; err == nil { 97 t.Fatal("should fail for blank post ids") 98 } 99 } 100 101 func testPostStoreGetSingle(t *testing.T, ss store.Store) { 102 o1 := &model.Post{} 103 o1.ChannelId = model.NewId() 104 o1.UserId = model.NewId() 105 o1.Message = "zz" + model.NewId() + "b" 106 107 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 108 109 if r1 := <-ss.Post().GetSingle(o1.Id); r1.Err != nil { 110 t.Fatal(r1.Err) 111 } else { 112 if r1.Data.(*model.Post).CreateAt != o1.CreateAt { 113 t.Fatal("invalid returned post") 114 } 115 } 116 117 if err := (<-ss.Post().GetSingle("123")).Err; err == nil { 118 t.Fatal("Missing id should have failed") 119 } 120 } 121 122 func testGetEtagCache(t *testing.T, ss store.Store) { 123 o1 := &model.Post{} 124 o1.ChannelId = model.NewId() 125 o1.UserId = model.NewId() 126 o1.Message = "zz" + model.NewId() + "b" 127 128 etag1 := (<-ss.Post().GetEtag(o1.ChannelId, true)).Data.(string) 129 if strings.Index(etag1, model.CurrentVersion+".") != 0 { 130 t.Fatal("Invalid Etag") 131 } 132 133 // This one should come from the cache 134 etag2 := (<-ss.Post().GetEtag(o1.ChannelId, true)).Data.(string) 135 if strings.Index(etag2, model.CurrentVersion+".") != 0 { 136 t.Fatal("Invalid Etag") 137 } 138 139 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 140 141 // We have not invalidated the cache so this should be the same as above 142 etag3 := (<-ss.Post().GetEtag(o1.ChannelId, true)).Data.(string) 143 if strings.Index(etag3, etag2) != 0 { 144 t.Fatal("Invalid Etag") 145 } 146 147 ss.Post().InvalidateLastPostTimeCache(o1.ChannelId) 148 149 // Invalidated cache so we should get a good result 150 etag4 := (<-ss.Post().GetEtag(o1.ChannelId, true)).Data.(string) 151 if strings.Index(etag4, fmt.Sprintf("%v.%v", model.CurrentVersion, o1.UpdateAt)) != 0 { 152 t.Fatal("Invalid Etag") 153 } 154 } 155 156 func testPostStoreUpdate(t *testing.T, ss store.Store) { 157 o1 := &model.Post{} 158 o1.ChannelId = model.NewId() 159 o1.UserId = model.NewId() 160 o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 161 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 162 163 o2 := &model.Post{} 164 o2.ChannelId = o1.ChannelId 165 o2.UserId = model.NewId() 166 o2.Message = "zz" + model.NewId() + "CCCCCCCCC" 167 o2.ParentId = o1.Id 168 o2.RootId = o1.Id 169 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 170 171 o3 := &model.Post{} 172 o3.ChannelId = o1.ChannelId 173 o3.UserId = model.NewId() 174 o3.Message = "zz" + model.NewId() + "QQQQQQQQQQ" 175 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 176 177 ro1 := (<-ss.Post().Get(o1.Id)).Data.(*model.PostList).Posts[o1.Id] 178 ro2 := (<-ss.Post().Get(o1.Id)).Data.(*model.PostList).Posts[o2.Id] 179 ro3 := (<-ss.Post().Get(o3.Id)).Data.(*model.PostList).Posts[o3.Id] 180 181 if ro1.Message != o1.Message { 182 t.Fatal("Failed to save/get") 183 } 184 185 o1a := &model.Post{} 186 *o1a = *ro1 187 o1a.Message = ro1.Message + "BBBBBBBBBB" 188 if result := <-ss.Post().Update(o1a, ro1); result.Err != nil { 189 t.Fatal(result.Err) 190 } 191 192 ro1a := (<-ss.Post().Get(o1.Id)).Data.(*model.PostList).Posts[o1.Id] 193 194 if ro1a.Message != o1a.Message { 195 t.Fatal("Failed to update/get") 196 } 197 198 o2a := &model.Post{} 199 *o2a = *ro2 200 o2a.Message = ro2.Message + "DDDDDDD" 201 if result := <-ss.Post().Update(o2a, ro2); result.Err != nil { 202 t.Fatal(result.Err) 203 } 204 205 ro2a := (<-ss.Post().Get(o1.Id)).Data.(*model.PostList).Posts[o2.Id] 206 207 if ro2a.Message != o2a.Message { 208 t.Fatal("Failed to update/get") 209 } 210 211 o3a := &model.Post{} 212 *o3a = *ro3 213 o3a.Message = ro3.Message + "WWWWWWW" 214 if result := <-ss.Post().Update(o3a, ro3); result.Err != nil { 215 t.Fatal(result.Err) 216 } 217 218 ro3a := (<-ss.Post().Get(o3.Id)).Data.(*model.PostList).Posts[o3.Id] 219 220 if ro3a.Message != o3a.Message && ro3a.Hashtags != o3a.Hashtags { 221 t.Fatal("Failed to update/get") 222 } 223 224 o4 := store.Must(ss.Post().Save(&model.Post{ 225 ChannelId: model.NewId(), 226 UserId: model.NewId(), 227 Message: model.NewId(), 228 Filenames: []string{"test"}, 229 })).(*model.Post) 230 231 ro4 := (<-ss.Post().Get(o4.Id)).Data.(*model.PostList).Posts[o4.Id] 232 233 o4a := &model.Post{} 234 *o4a = *ro4 235 o4a.Filenames = []string{} 236 o4a.FileIds = []string{model.NewId()} 237 if result := <-ss.Post().Update(o4a, ro4); result.Err != nil { 238 t.Fatal(result.Err) 239 } 240 241 if ro4a := store.Must(ss.Post().Get(o4.Id)).(*model.PostList).Posts[o4.Id]; len(ro4a.Filenames) != 0 { 242 t.Fatal("Failed to clear Filenames") 243 } else if len(ro4a.FileIds) != 1 { 244 t.Fatal("Failed to set FileIds") 245 } 246 } 247 248 func testPostStoreDelete(t *testing.T, ss store.Store) { 249 o1 := &model.Post{} 250 o1.ChannelId = model.NewId() 251 o1.UserId = model.NewId() 252 o1.Message = "zz" + model.NewId() + "b" 253 deleteByID := model.NewId() 254 255 etag1 := (<-ss.Post().GetEtag(o1.ChannelId, false)).Data.(string) 256 if strings.Index(etag1, model.CurrentVersion+".") != 0 { 257 t.Fatal("Invalid Etag") 258 } 259 260 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 261 262 if r1 := <-ss.Post().Get(o1.Id); r1.Err != nil { 263 t.Fatal(r1.Err) 264 } else { 265 if r1.Data.(*model.PostList).Posts[o1.Id].CreateAt != o1.CreateAt { 266 t.Fatal("invalid returned post") 267 } 268 } 269 270 if r2 := <-ss.Post().Delete(o1.Id, model.GetMillis(), deleteByID); r2.Err != nil { 271 t.Fatal(r2.Err) 272 } 273 274 r5 := <-ss.Post().GetPostsCreatedAt(o1.ChannelId, o1.CreateAt) 275 post := r5.Data.([]*model.Post)[0] 276 actual := post.Props[model.POST_PROPS_DELETE_BY] 277 if actual != deleteByID { 278 t.Errorf("Expected (*Post).Props[model.POST_PROPS_DELETE_BY] to be %v but got %v.", deleteByID, actual) 279 } 280 281 if r3 := (<-ss.Post().Get(o1.Id)); r3.Err == nil { 282 t.Log(r3.Data) 283 t.Fatal("Missing id should have failed") 284 } 285 286 etag2 := (<-ss.Post().GetEtag(o1.ChannelId, false)).Data.(string) 287 if strings.Index(etag2, model.CurrentVersion+".") != 0 { 288 t.Fatal("Invalid Etag") 289 } 290 } 291 292 func testPostStoreDelete1Level(t *testing.T, ss store.Store) { 293 o1 := &model.Post{} 294 o1.ChannelId = model.NewId() 295 o1.UserId = model.NewId() 296 o1.Message = "zz" + model.NewId() + "b" 297 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 298 299 o2 := &model.Post{} 300 o2.ChannelId = o1.ChannelId 301 o2.UserId = model.NewId() 302 o2.Message = "zz" + model.NewId() + "b" 303 o2.ParentId = o1.Id 304 o2.RootId = o1.Id 305 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 306 307 if r2 := <-ss.Post().Delete(o1.Id, model.GetMillis(), ""); r2.Err != nil { 308 t.Fatal(r2.Err) 309 } 310 311 if r3 := (<-ss.Post().Get(o1.Id)); r3.Err == nil { 312 t.Fatal("Deleted id should have failed") 313 } 314 315 if r4 := (<-ss.Post().Get(o2.Id)); r4.Err == nil { 316 t.Fatal("Deleted id should have failed") 317 } 318 } 319 320 func testPostStoreDelete2Level(t *testing.T, ss store.Store) { 321 o1 := &model.Post{} 322 o1.ChannelId = model.NewId() 323 o1.UserId = model.NewId() 324 o1.Message = "zz" + model.NewId() + "b" 325 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 326 327 o2 := &model.Post{} 328 o2.ChannelId = o1.ChannelId 329 o2.UserId = model.NewId() 330 o2.Message = "zz" + model.NewId() + "b" 331 o2.ParentId = o1.Id 332 o2.RootId = o1.Id 333 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 334 335 o3 := &model.Post{} 336 o3.ChannelId = o1.ChannelId 337 o3.UserId = model.NewId() 338 o3.Message = "zz" + model.NewId() + "b" 339 o3.ParentId = o2.Id 340 o3.RootId = o1.Id 341 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 342 343 o4 := &model.Post{} 344 o4.ChannelId = model.NewId() 345 o4.UserId = model.NewId() 346 o4.Message = "zz" + model.NewId() + "b" 347 o4 = (<-ss.Post().Save(o4)).Data.(*model.Post) 348 349 if r2 := <-ss.Post().Delete(o1.Id, model.GetMillis(), ""); r2.Err != nil { 350 t.Fatal(r2.Err) 351 } 352 353 if r3 := (<-ss.Post().Get(o1.Id)); r3.Err == nil { 354 t.Fatal("Deleted id should have failed") 355 } 356 357 if r4 := (<-ss.Post().Get(o2.Id)); r4.Err == nil { 358 t.Fatal("Deleted id should have failed") 359 } 360 361 if r5 := (<-ss.Post().Get(o3.Id)); r5.Err == nil { 362 t.Fatal("Deleted id should have failed") 363 } 364 365 if r6 := <-ss.Post().Get(o4.Id); r6.Err != nil { 366 t.Fatal(r6.Err) 367 } 368 } 369 370 func testPostStorePermDelete1Level(t *testing.T, ss store.Store) { 371 o1 := &model.Post{} 372 o1.ChannelId = model.NewId() 373 o1.UserId = model.NewId() 374 o1.Message = "zz" + model.NewId() + "b" 375 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 376 377 o2 := &model.Post{} 378 o2.ChannelId = o1.ChannelId 379 o2.UserId = model.NewId() 380 o2.Message = "zz" + model.NewId() + "b" 381 o2.ParentId = o1.Id 382 o2.RootId = o1.Id 383 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 384 385 o3 := &model.Post{} 386 o3.ChannelId = model.NewId() 387 o3.UserId = model.NewId() 388 o3.Message = "zz" + model.NewId() + "b" 389 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 390 391 if r2 := <-ss.Post().PermanentDeleteByUser(o2.UserId); r2.Err != nil { 392 t.Fatal(r2.Err) 393 } 394 395 if r3 := (<-ss.Post().Get(o1.Id)); r3.Err != nil { 396 t.Fatal("Deleted id shouldn't have failed") 397 } 398 399 if r4 := (<-ss.Post().Get(o2.Id)); r4.Err == nil { 400 t.Fatal("Deleted id should have failed") 401 } 402 403 if r2 := <-ss.Post().PermanentDeleteByChannel(o3.ChannelId); r2.Err != nil { 404 t.Fatal(r2.Err) 405 } 406 407 if r3 := (<-ss.Post().Get(o3.Id)); r3.Err == nil { 408 t.Fatal("Deleted id should have failed") 409 } 410 } 411 412 func testPostStorePermDelete1Level2(t *testing.T, ss store.Store) { 413 o1 := &model.Post{} 414 o1.ChannelId = model.NewId() 415 o1.UserId = model.NewId() 416 o1.Message = "zz" + model.NewId() + "b" 417 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 418 419 o2 := &model.Post{} 420 o2.ChannelId = o1.ChannelId 421 o2.UserId = model.NewId() 422 o2.Message = "zz" + model.NewId() + "b" 423 o2.ParentId = o1.Id 424 o2.RootId = o1.Id 425 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 426 427 o3 := &model.Post{} 428 o3.ChannelId = model.NewId() 429 o3.UserId = model.NewId() 430 o3.Message = "zz" + model.NewId() + "b" 431 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 432 433 if r2 := <-ss.Post().PermanentDeleteByUser(o1.UserId); r2.Err != nil { 434 t.Fatal(r2.Err) 435 } 436 437 if r3 := (<-ss.Post().Get(o1.Id)); r3.Err == nil { 438 t.Fatal("Deleted id should have failed") 439 } 440 441 if r4 := (<-ss.Post().Get(o2.Id)); r4.Err == nil { 442 t.Fatal("Deleted id should have failed") 443 } 444 445 if r5 := (<-ss.Post().Get(o3.Id)); r5.Err != nil { 446 t.Fatal("Deleted id shouldn't have failed") 447 } 448 } 449 450 func testPostStoreGetWithChildren(t *testing.T, ss store.Store) { 451 o1 := &model.Post{} 452 o1.ChannelId = model.NewId() 453 o1.UserId = model.NewId() 454 o1.Message = "zz" + model.NewId() + "b" 455 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 456 457 o2 := &model.Post{} 458 o2.ChannelId = o1.ChannelId 459 o2.UserId = model.NewId() 460 o2.Message = "zz" + model.NewId() + "b" 461 o2.ParentId = o1.Id 462 o2.RootId = o1.Id 463 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 464 465 o3 := &model.Post{} 466 o3.ChannelId = o1.ChannelId 467 o3.UserId = model.NewId() 468 o3.Message = "zz" + model.NewId() + "b" 469 o3.ParentId = o2.Id 470 o3.RootId = o1.Id 471 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 472 473 if r1 := <-ss.Post().Get(o1.Id); r1.Err != nil { 474 t.Fatal(r1.Err) 475 } else { 476 pl := r1.Data.(*model.PostList) 477 if len(pl.Posts) != 3 { 478 t.Fatal("invalid returned post") 479 } 480 } 481 482 store.Must(ss.Post().Delete(o3.Id, model.GetMillis(), "")) 483 484 if r2 := <-ss.Post().Get(o1.Id); r2.Err != nil { 485 t.Fatal(r2.Err) 486 } else { 487 pl := r2.Data.(*model.PostList) 488 if len(pl.Posts) != 2 { 489 t.Fatal("invalid returned post") 490 } 491 } 492 493 store.Must(ss.Post().Delete(o2.Id, model.GetMillis(), "")) 494 495 if r3 := <-ss.Post().Get(o1.Id); r3.Err != nil { 496 t.Fatal(r3.Err) 497 } else { 498 pl := r3.Data.(*model.PostList) 499 if len(pl.Posts) != 1 { 500 t.Fatal("invalid returned post") 501 } 502 } 503 } 504 505 func testPostStoreGetPostsWithDetails(t *testing.T, ss store.Store) { 506 o1 := &model.Post{} 507 o1.ChannelId = model.NewId() 508 o1.UserId = model.NewId() 509 o1.Message = "zz" + model.NewId() + "b" 510 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 511 time.Sleep(2 * time.Millisecond) 512 513 o2 := &model.Post{} 514 o2.ChannelId = o1.ChannelId 515 o2.UserId = model.NewId() 516 o2.Message = "zz" + model.NewId() + "b" 517 o2.ParentId = o1.Id 518 o2.RootId = o1.Id 519 _ = (<-ss.Post().Save(o2)).Data.(*model.Post) 520 time.Sleep(2 * time.Millisecond) 521 522 o2a := &model.Post{} 523 o2a.ChannelId = o1.ChannelId 524 o2a.UserId = model.NewId() 525 o2a.Message = "zz" + model.NewId() + "b" 526 o2a.ParentId = o1.Id 527 o2a.RootId = o1.Id 528 o2a = (<-ss.Post().Save(o2a)).Data.(*model.Post) 529 time.Sleep(2 * time.Millisecond) 530 531 o3 := &model.Post{} 532 o3.ChannelId = o1.ChannelId 533 o3.UserId = model.NewId() 534 o3.Message = "zz" + model.NewId() + "b" 535 o3.ParentId = o1.Id 536 o3.RootId = o1.Id 537 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 538 time.Sleep(2 * time.Millisecond) 539 540 o4 := &model.Post{} 541 o4.ChannelId = o1.ChannelId 542 o4.UserId = model.NewId() 543 o4.Message = "zz" + model.NewId() + "b" 544 o4 = (<-ss.Post().Save(o4)).Data.(*model.Post) 545 time.Sleep(2 * time.Millisecond) 546 547 o5 := &model.Post{} 548 o5.ChannelId = o1.ChannelId 549 o5.UserId = model.NewId() 550 o5.Message = "zz" + model.NewId() + "b" 551 o5.ParentId = o4.Id 552 o5.RootId = o4.Id 553 o5 = (<-ss.Post().Save(o5)).Data.(*model.Post) 554 555 r1 := (<-ss.Post().GetPosts(o1.ChannelId, 0, 4, false)).Data.(*model.PostList) 556 557 if r1.Order[0] != o5.Id { 558 t.Fatal("invalid order") 559 } 560 561 if r1.Order[1] != o4.Id { 562 t.Fatal("invalid order") 563 } 564 565 if r1.Order[2] != o3.Id { 566 t.Fatal("invalid order") 567 } 568 569 if r1.Order[3] != o2a.Id { 570 t.Fatal("invalid order") 571 } 572 573 if len(r1.Posts) != 6 { //the last 4, + o1 (o2a and o3's parent) + o2 (in same thread as o2a and o3) 574 t.Fatal("wrong size") 575 } 576 577 if r1.Posts[o1.Id].Message != o1.Message { 578 t.Fatal("Missing parent") 579 } 580 581 r2 := (<-ss.Post().GetPosts(o1.ChannelId, 0, 4, true)).Data.(*model.PostList) 582 583 if r2.Order[0] != o5.Id { 584 t.Fatal("invalid order") 585 } 586 587 if r2.Order[1] != o4.Id { 588 t.Fatal("invalid order") 589 } 590 591 if r2.Order[2] != o3.Id { 592 t.Fatal("invalid order") 593 } 594 595 if r2.Order[3] != o2a.Id { 596 t.Fatal("invalid order") 597 } 598 599 if len(r2.Posts) != 6 { //the last 4, + o1 (o2a and o3's parent) + o2 (in same thread as o2a and o3) 600 t.Fatal("wrong size") 601 } 602 603 if r2.Posts[o1.Id].Message != o1.Message { 604 t.Fatal("Missing parent") 605 } 606 607 // Run once to fill cache 608 <-ss.Post().GetPosts(o1.ChannelId, 0, 30, true) 609 610 o6 := &model.Post{} 611 o6.ChannelId = o1.ChannelId 612 o6.UserId = model.NewId() 613 o6.Message = "zz" + model.NewId() + "b" 614 _ = (<-ss.Post().Save(o6)).Data.(*model.Post) 615 616 // Should only be 6 since we hit the cache 617 r3 := (<-ss.Post().GetPosts(o1.ChannelId, 0, 30, true)).Data.(*model.PostList) 618 assert.Equal(t, 6, len(r3.Order)) 619 620 ss.Post().InvalidateLastPostTimeCache(o1.ChannelId) 621 622 // Cache was invalidated, we should get all the posts 623 r4 := (<-ss.Post().GetPosts(o1.ChannelId, 0, 30, true)).Data.(*model.PostList) 624 assert.Equal(t, 7, len(r4.Order)) 625 } 626 627 func testPostStoreGetPostsBeforeAfter(t *testing.T, ss store.Store) { 628 o0 := &model.Post{} 629 o0.ChannelId = model.NewId() 630 o0.UserId = model.NewId() 631 o0.Message = "zz" + model.NewId() + "b" 632 _ = (<-ss.Post().Save(o0)).Data.(*model.Post) 633 time.Sleep(2 * time.Millisecond) 634 635 o1 := &model.Post{} 636 o1.ChannelId = model.NewId() 637 o1.UserId = model.NewId() 638 o1.Message = "zz" + model.NewId() + "b" 639 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 640 time.Sleep(2 * time.Millisecond) 641 642 o2 := &model.Post{} 643 o2.ChannelId = o1.ChannelId 644 o2.UserId = model.NewId() 645 o2.Message = "zz" + model.NewId() + "b" 646 o2.ParentId = o1.Id 647 o2.RootId = o1.Id 648 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 649 time.Sleep(2 * time.Millisecond) 650 651 o2a := &model.Post{} 652 o2a.ChannelId = o1.ChannelId 653 o2a.UserId = model.NewId() 654 o2a.Message = "zz" + model.NewId() + "b" 655 o2a.ParentId = o1.Id 656 o2a.RootId = o1.Id 657 o2a = (<-ss.Post().Save(o2a)).Data.(*model.Post) 658 time.Sleep(2 * time.Millisecond) 659 660 o3 := &model.Post{} 661 o3.ChannelId = o1.ChannelId 662 o3.UserId = model.NewId() 663 o3.Message = "zz" + model.NewId() + "b" 664 o3.ParentId = o1.Id 665 o3.RootId = o1.Id 666 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 667 time.Sleep(2 * time.Millisecond) 668 669 o4 := &model.Post{} 670 o4.ChannelId = o1.ChannelId 671 o4.UserId = model.NewId() 672 o4.Message = "zz" + model.NewId() + "b" 673 o4 = (<-ss.Post().Save(o4)).Data.(*model.Post) 674 time.Sleep(2 * time.Millisecond) 675 676 o5 := &model.Post{} 677 o5.ChannelId = o1.ChannelId 678 o5.UserId = model.NewId() 679 o5.Message = "zz" + model.NewId() + "b" 680 o5.ParentId = o4.Id 681 o5.RootId = o4.Id 682 _ = (<-ss.Post().Save(o5)).Data.(*model.Post) 683 684 r1 := (<-ss.Post().GetPostsBefore(o1.ChannelId, o1.Id, 4, 0)).Data.(*model.PostList) 685 686 if len(r1.Posts) != 0 { 687 t.Fatal("Wrong size") 688 } 689 690 r2 := (<-ss.Post().GetPostsAfter(o1.ChannelId, o1.Id, 4, 0)).Data.(*model.PostList) 691 692 if r2.Order[0] != o4.Id { 693 t.Fatal("invalid order") 694 } 695 696 if r2.Order[1] != o3.Id { 697 t.Fatal("invalid order") 698 } 699 700 if r2.Order[2] != o2a.Id { 701 t.Fatal("invalid order") 702 } 703 704 if r2.Order[3] != o2.Id { 705 t.Fatal("invalid order") 706 } 707 708 if len(r2.Posts) != 5 { 709 t.Fatal("wrong size") 710 } 711 712 r3 := (<-ss.Post().GetPostsBefore(o3.ChannelId, o3.Id, 2, 0)).Data.(*model.PostList) 713 714 if r3.Order[0] != o2a.Id { 715 t.Fatal("invalid order") 716 } 717 718 if r3.Order[1] != o2.Id { 719 t.Fatal("invalid order") 720 } 721 722 if len(r3.Posts) != 3 { 723 t.Fatal("wrong size") 724 } 725 726 if r3.Posts[o1.Id].Message != o1.Message { 727 t.Fatal("Missing parent") 728 } 729 } 730 731 func testPostStoreGetPostsSince(t *testing.T, ss store.Store) { 732 o0 := &model.Post{} 733 o0.ChannelId = model.NewId() 734 o0.UserId = model.NewId() 735 o0.Message = "zz" + model.NewId() + "b" 736 _ = (<-ss.Post().Save(o0)).Data.(*model.Post) 737 time.Sleep(2 * time.Millisecond) 738 739 o1 := &model.Post{} 740 o1.ChannelId = model.NewId() 741 o1.UserId = model.NewId() 742 o1.Message = "zz" + model.NewId() + "b" 743 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 744 time.Sleep(2 * time.Millisecond) 745 746 o2 := &model.Post{} 747 o2.ChannelId = o1.ChannelId 748 o2.UserId = model.NewId() 749 o2.Message = "zz" + model.NewId() + "b" 750 o2.ParentId = o1.Id 751 o2.RootId = o1.Id 752 _ = (<-ss.Post().Save(o2)).Data.(*model.Post) 753 time.Sleep(2 * time.Millisecond) 754 755 o2a := &model.Post{} 756 o2a.ChannelId = o1.ChannelId 757 o2a.UserId = model.NewId() 758 o2a.Message = "zz" + model.NewId() + "b" 759 o2a.ParentId = o1.Id 760 o2a.RootId = o1.Id 761 o2a = (<-ss.Post().Save(o2a)).Data.(*model.Post) 762 time.Sleep(2 * time.Millisecond) 763 764 o3 := &model.Post{} 765 o3.ChannelId = o1.ChannelId 766 o3.UserId = model.NewId() 767 o3.Message = "zz" + model.NewId() + "b" 768 o3.ParentId = o1.Id 769 o3.RootId = o1.Id 770 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 771 time.Sleep(2 * time.Millisecond) 772 773 o4 := &model.Post{} 774 o4.ChannelId = o1.ChannelId 775 o4.UserId = model.NewId() 776 o4.Message = "zz" + model.NewId() + "b" 777 o4 = (<-ss.Post().Save(o4)).Data.(*model.Post) 778 time.Sleep(2 * time.Millisecond) 779 780 o5 := &model.Post{} 781 o5.ChannelId = o1.ChannelId 782 o5.UserId = model.NewId() 783 o5.Message = "zz" + model.NewId() + "b" 784 o5.ParentId = o4.Id 785 o5.RootId = o4.Id 786 o5 = (<-ss.Post().Save(o5)).Data.(*model.Post) 787 788 r1 := (<-ss.Post().GetPostsSince(o1.ChannelId, o1.CreateAt, false)).Data.(*model.PostList) 789 790 if r1.Order[0] != o5.Id { 791 t.Fatal("invalid order") 792 } 793 794 if r1.Order[1] != o4.Id { 795 t.Fatal("invalid order") 796 } 797 798 if r1.Order[2] != o3.Id { 799 t.Fatal("invalid order") 800 } 801 802 if r1.Order[3] != o2a.Id { 803 t.Fatal("invalid order") 804 } 805 806 if len(r1.Posts) != 6 { 807 t.Fatal("wrong size") 808 } 809 810 if r1.Posts[o1.Id].Message != o1.Message { 811 t.Fatal("Missing parent") 812 } 813 814 r2 := (<-ss.Post().GetPostsSince(o1.ChannelId, o5.UpdateAt, true)).Data.(*model.PostList) 815 816 if len(r2.Order) != 0 { 817 t.Fatal("wrong size ", len(r2.Posts)) 818 } 819 } 820 821 func testPostStoreSearch(t *testing.T, ss store.Store) { 822 teamId := model.NewId() 823 userId := model.NewId() 824 825 c1 := &model.Channel{} 826 c1.TeamId = teamId 827 c1.DisplayName = "Channel1" 828 c1.Name = "zz" + model.NewId() + "b" 829 c1.Type = model.CHANNEL_OPEN 830 c1 = (<-ss.Channel().Save(c1, -1)).Data.(*model.Channel) 831 832 m1 := model.ChannelMember{} 833 m1.ChannelId = c1.Id 834 m1.UserId = userId 835 m1.NotifyProps = model.GetDefaultChannelNotifyProps() 836 store.Must(ss.Channel().SaveMember(&m1)) 837 838 c2 := &model.Channel{} 839 c2.TeamId = teamId 840 c2.DisplayName = "Channel1" 841 c2.Name = "zz" + model.NewId() + "b" 842 c2.Type = model.CHANNEL_OPEN 843 c2 = (<-ss.Channel().Save(c2, -1)).Data.(*model.Channel) 844 845 c3 := &model.Channel{} 846 c3.TeamId = teamId 847 c3.DisplayName = "Channel1" 848 c3.Name = "zz" + model.NewId() + "b" 849 c3.Type = model.CHANNEL_OPEN 850 c3 = (<-ss.Channel().Save(c3, -1)).Data.(*model.Channel) 851 <-ss.Channel().Delete(c3.Id, model.GetMillis()) 852 853 m3 := model.ChannelMember{} 854 m3.ChannelId = c3.Id 855 m3.UserId = userId 856 m3.NotifyProps = model.GetDefaultChannelNotifyProps() 857 store.Must(ss.Channel().SaveMember(&m3)) 858 859 o1 := &model.Post{} 860 o1.ChannelId = c1.Id 861 o1.UserId = model.NewId() 862 o1.Message = "corey mattermost new york" 863 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 864 865 o1a := &model.Post{} 866 o1a.ChannelId = c1.Id 867 o1a.UserId = model.NewId() 868 o1a.Message = "corey mattermost new york" 869 o1a.Type = model.POST_JOIN_CHANNEL 870 _ = (<-ss.Post().Save(o1a)).Data.(*model.Post) 871 872 o2 := &model.Post{} 873 o2.ChannelId = c1.Id 874 o2.UserId = model.NewId() 875 o2.Message = "New Jersey is where John is from" 876 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 877 878 o3 := &model.Post{} 879 o3.ChannelId = c2.Id 880 o3.UserId = model.NewId() 881 o3.Message = "New Jersey is where John is from corey new york" 882 _ = (<-ss.Post().Save(o3)).Data.(*model.Post) 883 884 o4 := &model.Post{} 885 o4.ChannelId = c1.Id 886 o4.UserId = model.NewId() 887 o4.Hashtags = "#hashtag" 888 o4.Message = "(message)blargh" 889 o4 = (<-ss.Post().Save(o4)).Data.(*model.Post) 890 891 o5 := &model.Post{} 892 o5.ChannelId = c1.Id 893 o5.UserId = model.NewId() 894 o5.Hashtags = "#secret #howdy" 895 o5 = (<-ss.Post().Save(o5)).Data.(*model.Post) 896 897 o6 := &model.Post{} 898 o6.ChannelId = c3.Id 899 o6.UserId = model.NewId() 900 o6.Hashtags = "#hashtag" 901 o6 = (<-ss.Post().Save(o6)).Data.(*model.Post) 902 903 o7 := &model.Post{} 904 o7.ChannelId = c3.Id 905 o7.UserId = model.NewId() 906 o7.Message = "New Jersey is where John is from corey new york" 907 o7 = (<-ss.Post().Save(o7)).Data.(*model.Post) 908 909 o8 := &model.Post{} 910 o8.ChannelId = c3.Id 911 o8.UserId = model.NewId() 912 o8.Message = "Deleted" 913 o8 = (<-ss.Post().Save(o8)).Data.(*model.Post) 914 915 tt := []struct { 916 name string 917 searchParams *model.SearchParams 918 extectedResultsCount int 919 expectedMessageResultIds []string 920 }{ 921 { 922 "normal-search-1", 923 &model.SearchParams{Terms: "corey"}, 924 1, 925 []string{o1.Id}, 926 }, 927 { 928 "normal-search-2", 929 &model.SearchParams{Terms: "new"}, 930 2, 931 []string{o1.Id, o2.Id}, 932 }, 933 { 934 "normal-search-3", 935 &model.SearchParams{Terms: "john"}, 936 1, 937 []string{o2.Id}, 938 }, 939 { 940 "wildcard-search", 941 &model.SearchParams{Terms: "matter*"}, 942 1, 943 []string{o1.Id}, 944 }, 945 { 946 "hashtag-search", 947 &model.SearchParams{Terms: "#hashtag", IsHashtag: true}, 948 1, 949 []string{o4.Id}, 950 }, 951 { 952 "hashtag-search-2", 953 &model.SearchParams{Terms: "#secret", IsHashtag: true}, 954 1, 955 []string{o5.Id}, 956 }, 957 { 958 "no-match-mention", 959 &model.SearchParams{Terms: "@thisshouldmatchnothing", IsHashtag: true}, 960 0, 961 []string{}, 962 }, 963 { 964 "no-results-search", 965 &model.SearchParams{Terms: "mattermost jersey"}, 966 0, 967 []string{}, 968 }, 969 { 970 "multiple-words-search", 971 &model.SearchParams{Terms: "corey new york"}, 972 1, 973 []string{o1.Id}, 974 }, 975 { 976 "multiple-wildcard-search", 977 &model.SearchParams{Terms: "matter* jer*"}, 978 0, 979 []string{}, 980 }, 981 { 982 "search-with-work-next-to-a-symbol", 983 &model.SearchParams{Terms: "message blargh"}, 984 1, 985 []string{o4.Id}, 986 }, 987 { 988 "search-with-or", 989 &model.SearchParams{Terms: "Jersey corey", OrTerms: true}, 990 2, 991 []string{o1.Id, o2.Id}, 992 }, 993 { 994 "search-with-or-and-deleted", 995 &model.SearchParams{Terms: "Jersey corey", OrTerms: true, IncludeDeletedChannels: true}, 996 3, 997 []string{o1.Id, o2.Id, o7.Id}, 998 }, 999 { 1000 "search-hashtag-deleted", 1001 &model.SearchParams{Terms: "#hashtag", IsHashtag: true, IncludeDeletedChannels: true}, 1002 2, 1003 []string{o4.Id, o6.Id}, 1004 }, 1005 { 1006 "search-deleted-only", 1007 &model.SearchParams{Terms: "Deleted", IncludeDeletedChannels: true}, 1008 1, 1009 []string{o8.Id}, 1010 }, 1011 } 1012 for _, tc := range tt { 1013 t.Run(tc.name, func(t *testing.T) { 1014 result := (<-ss.Post().Search(teamId, userId, tc.searchParams)).Data.(*model.PostList) 1015 require.Len(t, result.Order, tc.extectedResultsCount) 1016 for _, expectedMessageResultId := range tc.expectedMessageResultIds { 1017 assert.Contains(t, result.Order, expectedMessageResultId) 1018 } 1019 }) 1020 } 1021 } 1022 1023 func testUserCountsWithPostsByDay(t *testing.T, ss store.Store) { 1024 t1 := &model.Team{} 1025 t1.DisplayName = "DisplayName" 1026 t1.Name = "zz" + model.NewId() + "b" 1027 t1.Email = MakeEmail() 1028 t1.Type = model.TEAM_OPEN 1029 t1 = store.Must(ss.Team().Save(t1)).(*model.Team) 1030 1031 c1 := &model.Channel{} 1032 c1.TeamId = t1.Id 1033 c1.DisplayName = "Channel2" 1034 c1.Name = "zz" + model.NewId() + "b" 1035 c1.Type = model.CHANNEL_OPEN 1036 c1 = store.Must(ss.Channel().Save(c1, -1)).(*model.Channel) 1037 1038 o1 := &model.Post{} 1039 o1.ChannelId = c1.Id 1040 o1.UserId = model.NewId() 1041 o1.CreateAt = utils.MillisFromTime(utils.Yesterday()) 1042 o1.Message = "zz" + model.NewId() + "b" 1043 o1 = store.Must(ss.Post().Save(o1)).(*model.Post) 1044 1045 o1a := &model.Post{} 1046 o1a.ChannelId = c1.Id 1047 o1a.UserId = model.NewId() 1048 o1a.CreateAt = o1.CreateAt 1049 o1a.Message = "zz" + model.NewId() + "b" 1050 _ = store.Must(ss.Post().Save(o1a)).(*model.Post) 1051 1052 o2 := &model.Post{} 1053 o2.ChannelId = c1.Id 1054 o2.UserId = model.NewId() 1055 o2.CreateAt = o1.CreateAt - (1000 * 60 * 60 * 24) 1056 o2.Message = "zz" + model.NewId() + "b" 1057 o2 = store.Must(ss.Post().Save(o2)).(*model.Post) 1058 1059 o2a := &model.Post{} 1060 o2a.ChannelId = c1.Id 1061 o2a.UserId = o2.UserId 1062 o2a.CreateAt = o1.CreateAt - (1000 * 60 * 60 * 24) 1063 o2a.Message = "zz" + model.NewId() + "b" 1064 _ = store.Must(ss.Post().Save(o2a)).(*model.Post) 1065 1066 if r1 := <-ss.Post().AnalyticsUserCountsWithPostsByDay(t1.Id); r1.Err != nil { 1067 t.Fatal(r1.Err) 1068 } else { 1069 row1 := r1.Data.(model.AnalyticsRows)[0] 1070 if row1.Value != 2 { 1071 t.Fatal("wrong value") 1072 } 1073 1074 row2 := r1.Data.(model.AnalyticsRows)[1] 1075 if row2.Value != 1 { 1076 t.Fatal("wrong value") 1077 } 1078 } 1079 } 1080 1081 func testPostCountsByDay(t *testing.T, ss store.Store) { 1082 t1 := &model.Team{} 1083 t1.DisplayName = "DisplayName" 1084 t1.Name = "zz" + model.NewId() + "b" 1085 t1.Email = MakeEmail() 1086 t1.Type = model.TEAM_OPEN 1087 t1 = store.Must(ss.Team().Save(t1)).(*model.Team) 1088 1089 c1 := &model.Channel{} 1090 c1.TeamId = t1.Id 1091 c1.DisplayName = "Channel2" 1092 c1.Name = "zz" + model.NewId() + "b" 1093 c1.Type = model.CHANNEL_OPEN 1094 c1 = store.Must(ss.Channel().Save(c1, -1)).(*model.Channel) 1095 1096 o1 := &model.Post{} 1097 o1.ChannelId = c1.Id 1098 o1.UserId = model.NewId() 1099 o1.CreateAt = utils.MillisFromTime(utils.Yesterday()) 1100 o1.Message = "zz" + model.NewId() + "b" 1101 o1 = store.Must(ss.Post().Save(o1)).(*model.Post) 1102 1103 o1a := &model.Post{} 1104 o1a.ChannelId = c1.Id 1105 o1a.UserId = model.NewId() 1106 o1a.CreateAt = o1.CreateAt 1107 o1a.Message = "zz" + model.NewId() + "b" 1108 _ = store.Must(ss.Post().Save(o1a)).(*model.Post) 1109 1110 o2 := &model.Post{} 1111 o2.ChannelId = c1.Id 1112 o2.UserId = model.NewId() 1113 o2.CreateAt = o1.CreateAt - (1000 * 60 * 60 * 24 * 2) 1114 o2.Message = "zz" + model.NewId() + "b" 1115 o2 = store.Must(ss.Post().Save(o2)).(*model.Post) 1116 1117 o2a := &model.Post{} 1118 o2a.ChannelId = c1.Id 1119 o2a.UserId = o2.UserId 1120 o2a.CreateAt = o1.CreateAt - (1000 * 60 * 60 * 24 * 2) 1121 o2a.Message = "zz" + model.NewId() + "b" 1122 _ = store.Must(ss.Post().Save(o2a)).(*model.Post) 1123 1124 time.Sleep(1 * time.Second) 1125 1126 if r1 := <-ss.Post().AnalyticsPostCountsByDay(t1.Id); r1.Err != nil { 1127 t.Fatal(r1.Err) 1128 } else { 1129 row1 := r1.Data.(model.AnalyticsRows)[0] 1130 if row1.Value != 2 { 1131 t.Fatal(row1) 1132 } 1133 1134 row2 := r1.Data.(model.AnalyticsRows)[1] 1135 if row2.Value != 2 { 1136 t.Fatal("wrong value") 1137 } 1138 } 1139 1140 if r1 := <-ss.Post().AnalyticsPostCount(t1.Id, false, false); r1.Err != nil { 1141 t.Fatal(r1.Err) 1142 } else { 1143 if r1.Data.(int64) != 4 { 1144 t.Fatal("wrong value") 1145 } 1146 } 1147 } 1148 1149 func testPostStoreGetFlaggedPostsForTeam(t *testing.T, ss store.Store) { 1150 c1 := &model.Channel{} 1151 c1.TeamId = model.NewId() 1152 c1.DisplayName = "Channel1" 1153 c1.Name = "zz" + model.NewId() + "b" 1154 c1.Type = model.CHANNEL_OPEN 1155 c1 = store.Must(ss.Channel().Save(c1, -1)).(*model.Channel) 1156 1157 o1 := &model.Post{} 1158 o1.ChannelId = c1.Id 1159 o1.UserId = model.NewId() 1160 o1.Message = "zz" + model.NewId() + "b" 1161 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1162 time.Sleep(2 * time.Millisecond) 1163 1164 o2 := &model.Post{} 1165 o2.ChannelId = o1.ChannelId 1166 o2.UserId = model.NewId() 1167 o2.Message = "zz" + model.NewId() + "b" 1168 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1169 time.Sleep(2 * time.Millisecond) 1170 1171 o3 := &model.Post{} 1172 o3.ChannelId = o1.ChannelId 1173 o3.UserId = model.NewId() 1174 o3.Message = "zz" + model.NewId() + "b" 1175 o3.DeleteAt = 1 1176 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1177 time.Sleep(2 * time.Millisecond) 1178 1179 o4 := &model.Post{} 1180 o4.ChannelId = model.NewId() 1181 o4.UserId = model.NewId() 1182 o4.Message = "zz" + model.NewId() + "b" 1183 o4 = (<-ss.Post().Save(o4)).Data.(*model.Post) 1184 time.Sleep(2 * time.Millisecond) 1185 1186 c2 := &model.Channel{} 1187 c2.DisplayName = "DMChannel1" 1188 c2.Name = "zz" + model.NewId() + "b" 1189 c2.Type = model.CHANNEL_DIRECT 1190 1191 m1 := &model.ChannelMember{} 1192 m1.ChannelId = c2.Id 1193 m1.UserId = o1.UserId 1194 m1.NotifyProps = model.GetDefaultChannelNotifyProps() 1195 1196 m2 := &model.ChannelMember{} 1197 m2.ChannelId = c2.Id 1198 m2.UserId = model.NewId() 1199 m2.NotifyProps = model.GetDefaultChannelNotifyProps() 1200 1201 c2 = store.Must(ss.Channel().SaveDirectChannel(c2, m1, m2)).(*model.Channel) 1202 1203 o5 := &model.Post{} 1204 o5.ChannelId = c2.Id 1205 o5.UserId = m2.UserId 1206 o5.Message = "zz" + model.NewId() + "b" 1207 o5 = (<-ss.Post().Save(o5)).Data.(*model.Post) 1208 time.Sleep(2 * time.Millisecond) 1209 1210 r1 := (<-ss.Post().GetFlaggedPosts(o1.ChannelId, 0, 2)).Data.(*model.PostList) 1211 1212 if len(r1.Order) != 0 { 1213 t.Fatal("should be empty") 1214 } 1215 1216 preferences := model.Preferences{ 1217 { 1218 UserId: o1.UserId, 1219 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1220 Name: o1.Id, 1221 Value: "true", 1222 }, 1223 } 1224 1225 store.Must(ss.Preference().Save(&preferences)) 1226 1227 r2 := (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2)).Data.(*model.PostList) 1228 1229 if len(r2.Order) != 1 { 1230 t.Fatal("should have 1 post") 1231 } 1232 1233 preferences = model.Preferences{ 1234 { 1235 UserId: o1.UserId, 1236 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1237 Name: o2.Id, 1238 Value: "true", 1239 }, 1240 } 1241 1242 store.Must(ss.Preference().Save(&preferences)) 1243 1244 r3 := (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 1)).Data.(*model.PostList) 1245 1246 if len(r3.Order) != 1 { 1247 t.Fatal("should have 1 post") 1248 } 1249 1250 r3 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 1, 1)).Data.(*model.PostList) 1251 1252 if len(r3.Order) != 1 { 1253 t.Fatal("should have 1 post") 1254 } 1255 1256 r3 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 1000, 10)).Data.(*model.PostList) 1257 1258 if len(r3.Order) != 0 { 1259 t.Fatal("should be empty") 1260 } 1261 1262 r4 := (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2)).Data.(*model.PostList) 1263 1264 if len(r4.Order) != 2 { 1265 t.Fatal("should have 2 posts") 1266 } 1267 1268 preferences = model.Preferences{ 1269 { 1270 UserId: o1.UserId, 1271 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1272 Name: o3.Id, 1273 Value: "true", 1274 }, 1275 } 1276 1277 store.Must(ss.Preference().Save(&preferences)) 1278 1279 r4 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2)).Data.(*model.PostList) 1280 1281 if len(r4.Order) != 2 { 1282 t.Fatal("should have 2 posts") 1283 } 1284 1285 preferences = model.Preferences{ 1286 { 1287 UserId: o1.UserId, 1288 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1289 Name: o4.Id, 1290 Value: "true", 1291 }, 1292 } 1293 store.Must(ss.Preference().Save(&preferences)) 1294 1295 r4 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2)).Data.(*model.PostList) 1296 1297 if len(r4.Order) != 2 { 1298 t.Fatal("should have 2 posts") 1299 } 1300 1301 r4 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, model.NewId(), 0, 2)).Data.(*model.PostList) 1302 1303 if len(r4.Order) != 0 { 1304 t.Fatal("should have 0 posts") 1305 } 1306 1307 preferences = model.Preferences{ 1308 { 1309 UserId: o1.UserId, 1310 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1311 Name: o5.Id, 1312 Value: "true", 1313 }, 1314 } 1315 store.Must(ss.Preference().Save(&preferences)) 1316 1317 r4 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 10)).Data.(*model.PostList) 1318 1319 if len(r4.Order) != 3 { 1320 t.Fatal("should have 3 posts") 1321 } 1322 } 1323 1324 func testPostStoreGetFlaggedPosts(t *testing.T, ss store.Store) { 1325 o1 := &model.Post{} 1326 o1.ChannelId = model.NewId() 1327 o1.UserId = model.NewId() 1328 o1.Message = "zz" + model.NewId() + "b" 1329 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1330 time.Sleep(2 * time.Millisecond) 1331 1332 o2 := &model.Post{} 1333 o2.ChannelId = o1.ChannelId 1334 o2.UserId = model.NewId() 1335 o2.Message = "zz" + model.NewId() + "b" 1336 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1337 time.Sleep(2 * time.Millisecond) 1338 1339 o3 := &model.Post{} 1340 o3.ChannelId = o1.ChannelId 1341 o3.UserId = model.NewId() 1342 o3.Message = "zz" + model.NewId() + "b" 1343 o3.DeleteAt = 1 1344 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1345 time.Sleep(2 * time.Millisecond) 1346 1347 r1 := (<-ss.Post().GetFlaggedPosts(o1.UserId, 0, 2)).Data.(*model.PostList) 1348 1349 if len(r1.Order) != 0 { 1350 t.Fatal("should be empty") 1351 } 1352 1353 preferences := model.Preferences{ 1354 { 1355 UserId: o1.UserId, 1356 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1357 Name: o1.Id, 1358 Value: "true", 1359 }, 1360 } 1361 1362 store.Must(ss.Preference().Save(&preferences)) 1363 1364 r2 := (<-ss.Post().GetFlaggedPosts(o1.UserId, 0, 2)).Data.(*model.PostList) 1365 1366 if len(r2.Order) != 1 { 1367 t.Fatal("should have 1 post") 1368 } 1369 1370 preferences = model.Preferences{ 1371 { 1372 UserId: o1.UserId, 1373 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1374 Name: o2.Id, 1375 Value: "true", 1376 }, 1377 } 1378 1379 store.Must(ss.Preference().Save(&preferences)) 1380 1381 r3 := (<-ss.Post().GetFlaggedPosts(o1.UserId, 0, 1)).Data.(*model.PostList) 1382 1383 if len(r3.Order) != 1 { 1384 t.Fatal("should have 1 post") 1385 } 1386 1387 r3 = (<-ss.Post().GetFlaggedPosts(o1.UserId, 1, 1)).Data.(*model.PostList) 1388 1389 if len(r3.Order) != 1 { 1390 t.Fatal("should have 1 post") 1391 } 1392 1393 r3 = (<-ss.Post().GetFlaggedPosts(o1.UserId, 1000, 10)).Data.(*model.PostList) 1394 1395 if len(r3.Order) != 0 { 1396 t.Fatal("should be empty") 1397 } 1398 1399 r4 := (<-ss.Post().GetFlaggedPosts(o1.UserId, 0, 2)).Data.(*model.PostList) 1400 1401 if len(r4.Order) != 2 { 1402 t.Fatal("should have 2 posts") 1403 } 1404 1405 preferences = model.Preferences{ 1406 { 1407 UserId: o1.UserId, 1408 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1409 Name: o3.Id, 1410 Value: "true", 1411 }, 1412 } 1413 1414 store.Must(ss.Preference().Save(&preferences)) 1415 1416 r4 = (<-ss.Post().GetFlaggedPosts(o1.UserId, 0, 2)).Data.(*model.PostList) 1417 1418 if len(r4.Order) != 2 { 1419 t.Fatal("should have 2 posts") 1420 } 1421 } 1422 1423 func testPostStoreGetFlaggedPostsForChannel(t *testing.T, ss store.Store) { 1424 o1 := &model.Post{} 1425 o1.ChannelId = model.NewId() 1426 o1.UserId = model.NewId() 1427 o1.Message = "zz" + model.NewId() + "b" 1428 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1429 time.Sleep(2 * time.Millisecond) 1430 1431 o2 := &model.Post{} 1432 o2.ChannelId = o1.ChannelId 1433 o2.UserId = model.NewId() 1434 o2.Message = "zz" + model.NewId() + "b" 1435 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1436 time.Sleep(2 * time.Millisecond) 1437 1438 // deleted post 1439 o3 := &model.Post{} 1440 o3.ChannelId = model.NewId() 1441 o3.UserId = o1.ChannelId 1442 o3.Message = "zz" + model.NewId() + "b" 1443 o3.DeleteAt = 1 1444 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1445 time.Sleep(2 * time.Millisecond) 1446 1447 o4 := &model.Post{} 1448 o4.ChannelId = model.NewId() 1449 o4.UserId = model.NewId() 1450 o4.Message = "zz" + model.NewId() + "b" 1451 o4 = (<-ss.Post().Save(o4)).Data.(*model.Post) 1452 time.Sleep(2 * time.Millisecond) 1453 1454 r := (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 10)).Data.(*model.PostList) 1455 1456 if len(r.Order) != 0 { 1457 t.Fatal("should be empty") 1458 } 1459 1460 preference := model.Preference{ 1461 UserId: o1.UserId, 1462 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1463 Name: o1.Id, 1464 Value: "true", 1465 } 1466 1467 store.Must(ss.Preference().Save(&model.Preferences{preference})) 1468 1469 r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 10)).Data.(*model.PostList) 1470 1471 if len(r.Order) != 1 { 1472 t.Fatal("should have 1 post") 1473 } 1474 1475 preference.Name = o2.Id 1476 store.Must(ss.Preference().Save(&model.Preferences{preference})) 1477 1478 preference.Name = o3.Id 1479 store.Must(ss.Preference().Save(&model.Preferences{preference})) 1480 1481 r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 1)).Data.(*model.PostList) 1482 1483 if len(r.Order) != 1 { 1484 t.Fatal("should have 1 post") 1485 } 1486 1487 r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 1, 1)).Data.(*model.PostList) 1488 1489 if len(r.Order) != 1 { 1490 t.Fatal("should have 1 post") 1491 } 1492 1493 r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 1000, 10)).Data.(*model.PostList) 1494 1495 if len(r.Order) != 0 { 1496 t.Fatal("should be empty") 1497 } 1498 1499 r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 10)).Data.(*model.PostList) 1500 1501 if len(r.Order) != 2 { 1502 t.Fatal("should have 2 posts") 1503 } 1504 1505 preference.Name = o4.Id 1506 store.Must(ss.Preference().Save(&model.Preferences{preference})) 1507 1508 r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o4.ChannelId, 0, 10)).Data.(*model.PostList) 1509 1510 if len(r.Order) != 1 { 1511 t.Fatal("should have 1 post") 1512 } 1513 } 1514 1515 func testPostStoreGetPostsCreatedAt(t *testing.T, ss store.Store) { 1516 createTime := model.GetMillis() + 1 1517 1518 o0 := &model.Post{} 1519 o0.ChannelId = model.NewId() 1520 o0.UserId = model.NewId() 1521 o0.Message = "zz" + model.NewId() + "b" 1522 o0.CreateAt = createTime 1523 o0 = (<-ss.Post().Save(o0)).Data.(*model.Post) 1524 1525 o1 := &model.Post{} 1526 o1.ChannelId = o0.ChannelId 1527 o1.UserId = model.NewId() 1528 o1.Message = "zz" + model.NewId() + "b" 1529 o1.CreateAt = createTime 1530 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1531 1532 o2 := &model.Post{} 1533 o2.ChannelId = o1.ChannelId 1534 o2.UserId = model.NewId() 1535 o2.Message = "zz" + model.NewId() + "b" 1536 o2.ParentId = o1.Id 1537 o2.RootId = o1.Id 1538 o2.CreateAt = createTime + 1 1539 _ = (<-ss.Post().Save(o2)).Data.(*model.Post) 1540 1541 o3 := &model.Post{} 1542 o3.ChannelId = model.NewId() 1543 o3.UserId = model.NewId() 1544 o3.Message = "zz" + model.NewId() + "b" 1545 o3.CreateAt = createTime 1546 _ = (<-ss.Post().Save(o3)).Data.(*model.Post) 1547 1548 r1 := (<-ss.Post().GetPostsCreatedAt(o1.ChannelId, createTime)).Data.([]*model.Post) 1549 assert.Equal(t, 2, len(r1)) 1550 } 1551 1552 func testPostStoreOverwrite(t *testing.T, ss store.Store) { 1553 o1 := &model.Post{} 1554 o1.ChannelId = model.NewId() 1555 o1.UserId = model.NewId() 1556 o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1557 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1558 1559 o2 := &model.Post{} 1560 o2.ChannelId = o1.ChannelId 1561 o2.UserId = model.NewId() 1562 o2.Message = "zz" + model.NewId() + "CCCCCCCCC" 1563 o2.ParentId = o1.Id 1564 o2.RootId = o1.Id 1565 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1566 1567 o3 := &model.Post{} 1568 o3.ChannelId = o1.ChannelId 1569 o3.UserId = model.NewId() 1570 o3.Message = "zz" + model.NewId() + "QQQQQQQQQQ" 1571 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1572 1573 ro1 := (<-ss.Post().Get(o1.Id)).Data.(*model.PostList).Posts[o1.Id] 1574 ro2 := (<-ss.Post().Get(o1.Id)).Data.(*model.PostList).Posts[o2.Id] 1575 ro3 := (<-ss.Post().Get(o3.Id)).Data.(*model.PostList).Posts[o3.Id] 1576 1577 if ro1.Message != o1.Message { 1578 t.Fatal("Failed to save/get") 1579 } 1580 1581 o1a := &model.Post{} 1582 *o1a = *ro1 1583 o1a.Message = ro1.Message + "BBBBBBBBBB" 1584 if result := <-ss.Post().Overwrite(o1a); result.Err != nil { 1585 t.Fatal(result.Err) 1586 } 1587 1588 ro1a := (<-ss.Post().Get(o1.Id)).Data.(*model.PostList).Posts[o1.Id] 1589 1590 if ro1a.Message != o1a.Message { 1591 t.Fatal("Failed to overwrite/get") 1592 } 1593 1594 o2a := &model.Post{} 1595 *o2a = *ro2 1596 o2a.Message = ro2.Message + "DDDDDDD" 1597 if result := <-ss.Post().Overwrite(o2a); result.Err != nil { 1598 t.Fatal(result.Err) 1599 } 1600 1601 ro2a := (<-ss.Post().Get(o1.Id)).Data.(*model.PostList).Posts[o2.Id] 1602 1603 if ro2a.Message != o2a.Message { 1604 t.Fatal("Failed to overwrite/get") 1605 } 1606 1607 o3a := &model.Post{} 1608 *o3a = *ro3 1609 o3a.Message = ro3.Message + "WWWWWWW" 1610 if result := <-ss.Post().Overwrite(o3a); result.Err != nil { 1611 t.Fatal(result.Err) 1612 } 1613 1614 ro3a := (<-ss.Post().Get(o3.Id)).Data.(*model.PostList).Posts[o3.Id] 1615 1616 if ro3a.Message != o3a.Message && ro3a.Hashtags != o3a.Hashtags { 1617 t.Fatal("Failed to overwrite/get") 1618 } 1619 1620 o4 := store.Must(ss.Post().Save(&model.Post{ 1621 ChannelId: model.NewId(), 1622 UserId: model.NewId(), 1623 Message: model.NewId(), 1624 Filenames: []string{"test"}, 1625 })).(*model.Post) 1626 1627 ro4 := (<-ss.Post().Get(o4.Id)).Data.(*model.PostList).Posts[o4.Id] 1628 1629 o4a := &model.Post{} 1630 *o4a = *ro4 1631 o4a.Filenames = []string{} 1632 o4a.FileIds = []string{model.NewId()} 1633 if result := <-ss.Post().Overwrite(o4a); result.Err != nil { 1634 t.Fatal(result.Err) 1635 } 1636 1637 if ro4a := store.Must(ss.Post().Get(o4.Id)).(*model.PostList).Posts[o4.Id]; len(ro4a.Filenames) != 0 { 1638 t.Fatal("Failed to clear Filenames") 1639 } else if len(ro4a.FileIds) != 1 { 1640 t.Fatal("Failed to set FileIds") 1641 } 1642 } 1643 1644 func testPostStoreGetPostsByIds(t *testing.T, ss store.Store) { 1645 o1 := &model.Post{} 1646 o1.ChannelId = model.NewId() 1647 o1.UserId = model.NewId() 1648 o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1649 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1650 1651 o2 := &model.Post{} 1652 o2.ChannelId = o1.ChannelId 1653 o2.UserId = model.NewId() 1654 o2.Message = "zz" + model.NewId() + "CCCCCCCCC" 1655 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1656 1657 o3 := &model.Post{} 1658 o3.ChannelId = o1.ChannelId 1659 o3.UserId = model.NewId() 1660 o3.Message = "zz" + model.NewId() + "QQQQQQQQQQ" 1661 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1662 1663 ro1 := (<-ss.Post().Get(o1.Id)).Data.(*model.PostList).Posts[o1.Id] 1664 ro2 := (<-ss.Post().Get(o2.Id)).Data.(*model.PostList).Posts[o2.Id] 1665 ro3 := (<-ss.Post().Get(o3.Id)).Data.(*model.PostList).Posts[o3.Id] 1666 1667 postIds := []string{ 1668 ro1.Id, 1669 ro2.Id, 1670 ro3.Id, 1671 } 1672 1673 if ro4 := store.Must(ss.Post().GetPostsByIds(postIds)).([]*model.Post); len(ro4) != 3 { 1674 t.Fatalf("Expected 3 posts in results. Got %v", len(ro4)) 1675 } 1676 1677 store.Must(ss.Post().Delete(ro1.Id, model.GetMillis(), "")) 1678 1679 if ro5 := store.Must(ss.Post().GetPostsByIds(postIds)).([]*model.Post); len(ro5) != 3 { 1680 t.Fatalf("Expected 3 posts in results. Got %v", len(ro5)) 1681 } 1682 } 1683 1684 func testPostStoreGetPostsBatchForIndexing(t *testing.T, ss store.Store) { 1685 c1 := &model.Channel{} 1686 c1.TeamId = model.NewId() 1687 c1.DisplayName = "Channel1" 1688 c1.Name = "zz" + model.NewId() + "b" 1689 c1.Type = model.CHANNEL_OPEN 1690 c1 = (<-ss.Channel().Save(c1, -1)).Data.(*model.Channel) 1691 1692 c2 := &model.Channel{} 1693 c2.TeamId = model.NewId() 1694 c2.DisplayName = "Channel2" 1695 c2.Name = "zz" + model.NewId() + "b" 1696 c2.Type = model.CHANNEL_OPEN 1697 c2 = (<-ss.Channel().Save(c2, -1)).Data.(*model.Channel) 1698 1699 o1 := &model.Post{} 1700 o1.ChannelId = c1.Id 1701 o1.UserId = model.NewId() 1702 o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1703 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1704 1705 o2 := &model.Post{} 1706 o2.ChannelId = c2.Id 1707 o2.UserId = model.NewId() 1708 o2.Message = "zz" + model.NewId() + "CCCCCCCCC" 1709 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1710 1711 o3 := &model.Post{} 1712 o3.ChannelId = c1.Id 1713 o3.UserId = model.NewId() 1714 o3.ParentId = o1.Id 1715 o3.RootId = o1.Id 1716 o3.Message = "zz" + model.NewId() + "QQQQQQQQQQ" 1717 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1718 1719 if r := store.Must(ss.Post().GetPostsBatchForIndexing(o1.CreateAt, model.GetMillis()+100000, 100)).([]*model.PostForIndexing); len(r) != 3 { 1720 t.Fatalf("Expected 3 posts in results. Got %v", len(r)) 1721 } else { 1722 for _, p := range r { 1723 if p.Id == o1.Id { 1724 if p.TeamId != c1.TeamId { 1725 t.Fatalf("Unexpected team ID") 1726 } 1727 if p.ParentCreateAt != nil { 1728 t.Fatalf("Unexpected parent create at") 1729 } 1730 } else if p.Id == o2.Id { 1731 if p.TeamId != c2.TeamId { 1732 t.Fatalf("Unexpected team ID") 1733 } 1734 if p.ParentCreateAt != nil { 1735 t.Fatalf("Unexpected parent create at") 1736 } 1737 } else if p.Id == o3.Id { 1738 if p.TeamId != c1.TeamId { 1739 t.Fatalf("Unexpected team ID") 1740 } 1741 if *p.ParentCreateAt != o1.CreateAt { 1742 t.Fatalf("Unexpected parent create at") 1743 } 1744 } else { 1745 t.Fatalf("unexpected post returned") 1746 } 1747 } 1748 } 1749 } 1750 1751 func testPostStorePermanentDeleteBatch(t *testing.T, ss store.Store) { 1752 o1 := &model.Post{} 1753 o1.ChannelId = model.NewId() 1754 o1.UserId = model.NewId() 1755 o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1756 o1.CreateAt = 1000 1757 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1758 1759 o2 := &model.Post{} 1760 o2.ChannelId = model.NewId() 1761 o2.UserId = model.NewId() 1762 o2.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1763 o2.CreateAt = 1000 1764 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1765 1766 o3 := &model.Post{} 1767 o3.ChannelId = model.NewId() 1768 o3.UserId = model.NewId() 1769 o3.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1770 o3.CreateAt = 100000 1771 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1772 1773 store.Must(ss.Post().PermanentDeleteBatch(2000, 1000)) 1774 1775 if p := <-ss.Post().Get(o1.Id); p.Err == nil { 1776 t.Fatalf("Should have not found post 1 after purge") 1777 } 1778 1779 if p := <-ss.Post().Get(o2.Id); p.Err == nil { 1780 t.Fatalf("Should have not found post 2 after purge") 1781 } 1782 1783 if p := <-ss.Post().Get(o3.Id); p.Err != nil { 1784 t.Fatalf("Should have found post 3 after purge") 1785 } 1786 } 1787 1788 func testPostStoreGetOldest(t *testing.T, ss store.Store) { 1789 o0 := &model.Post{} 1790 o0.ChannelId = model.NewId() 1791 o0.UserId = model.NewId() 1792 o0.Message = "zz" + model.NewId() + "b" 1793 o0.CreateAt = 3 1794 o0 = (<-ss.Post().Save(o0)).Data.(*model.Post) 1795 1796 o1 := &model.Post{} 1797 o1.ChannelId = o0.Id 1798 o1.UserId = model.NewId() 1799 o1.Message = "zz" + model.NewId() + "b" 1800 o1.CreateAt = 2 1801 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1802 1803 o2 := &model.Post{} 1804 o2.ChannelId = o1.ChannelId 1805 o2.UserId = model.NewId() 1806 o2.Message = "zz" + model.NewId() + "b" 1807 o2.CreateAt = 1 1808 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1809 1810 r1 := (<-ss.Post().GetOldest()).Data.(*model.Post) 1811 1812 assert.EqualValues(t, o2.Id, r1.Id) 1813 } 1814 1815 func testGetMaxPostSize(t *testing.T, ss store.Store) { 1816 assert.Equal(t, model.POST_MESSAGE_MAX_RUNES_V2, (<-ss.Post().GetMaxPostSize()).Data.(int)) 1817 assert.Equal(t, model.POST_MESSAGE_MAX_RUNES_V2, (<-ss.Post().GetMaxPostSize()).Data.(int)) 1818 } 1819 1820 func testPostStoreGetParentsForExportAfter(t *testing.T, ss store.Store) { 1821 t1 := model.Team{} 1822 t1.DisplayName = "Name" 1823 t1.Name = model.NewId() 1824 t1.Email = MakeEmail() 1825 t1.Type = model.TEAM_OPEN 1826 store.Must(ss.Team().Save(&t1)) 1827 1828 c1 := model.Channel{} 1829 c1.TeamId = t1.Id 1830 c1.DisplayName = "Channel1" 1831 c1.Name = "zz" + model.NewId() + "b" 1832 c1.Type = model.CHANNEL_OPEN 1833 store.Must(ss.Channel().Save(&c1, -1)) 1834 1835 u1 := model.User{} 1836 u1.Username = model.NewId() 1837 u1.Email = MakeEmail() 1838 u1.Nickname = model.NewId() 1839 store.Must(ss.User().Save(&u1)) 1840 1841 p1 := &model.Post{} 1842 p1.ChannelId = c1.Id 1843 p1.UserId = u1.Id 1844 p1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1845 p1.CreateAt = 1000 1846 p1 = (<-ss.Post().Save(p1)).Data.(*model.Post) 1847 1848 r1 := <-ss.Post().GetParentsForExportAfter(10000, strings.Repeat("0", 26)) 1849 assert.Nil(t, r1.Err) 1850 d1 := r1.Data.([]*model.PostForExport) 1851 1852 found := false 1853 for _, p := range d1 { 1854 if p.Id == p1.Id { 1855 found = true 1856 assert.Equal(t, p.Id, p1.Id) 1857 assert.Equal(t, p.Message, p1.Message) 1858 assert.Equal(t, p.Username, u1.Username) 1859 assert.Equal(t, p.TeamName, t1.Name) 1860 assert.Equal(t, p.ChannelName, c1.Name) 1861 } 1862 } 1863 assert.True(t, found) 1864 } 1865 1866 func testPostStoreGetRepliesForExport(t *testing.T, ss store.Store) { 1867 t1 := model.Team{} 1868 t1.DisplayName = "Name" 1869 t1.Name = model.NewId() 1870 t1.Email = MakeEmail() 1871 t1.Type = model.TEAM_OPEN 1872 store.Must(ss.Team().Save(&t1)) 1873 1874 c1 := model.Channel{} 1875 c1.TeamId = t1.Id 1876 c1.DisplayName = "Channel1" 1877 c1.Name = "zz" + model.NewId() + "b" 1878 c1.Type = model.CHANNEL_OPEN 1879 store.Must(ss.Channel().Save(&c1, -1)) 1880 1881 u1 := model.User{} 1882 u1.Email = MakeEmail() 1883 u1.Nickname = model.NewId() 1884 store.Must(ss.User().Save(&u1)) 1885 1886 p1 := &model.Post{} 1887 p1.ChannelId = c1.Id 1888 p1.UserId = u1.Id 1889 p1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1890 p1.CreateAt = 1000 1891 p1 = (<-ss.Post().Save(p1)).Data.(*model.Post) 1892 1893 p2 := &model.Post{} 1894 p2.ChannelId = c1.Id 1895 p2.UserId = u1.Id 1896 p2.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1897 p2.CreateAt = 1001 1898 p2.ParentId = p1.Id 1899 p2.RootId = p1.Id 1900 p2 = (<-ss.Post().Save(p2)).Data.(*model.Post) 1901 1902 r1 := <-ss.Post().GetRepliesForExport(p1.Id) 1903 assert.Nil(t, r1.Err) 1904 1905 d1 := r1.Data.([]*model.ReplyForExport) 1906 assert.Len(t, d1, 1) 1907 1908 reply1 := d1[0] 1909 assert.Equal(t, reply1.Id, p2.Id) 1910 assert.Equal(t, reply1.Message, p2.Message) 1911 assert.Equal(t, reply1.Username, u1.Username) 1912 }