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