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