github.com/wgh-/mattermost-server@v4.8.0-rc2+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("GetPostsWithDetails", func(t *testing.T) { testPostStoreGetPostsWithDetails(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 testPostStoreGetPostsWithDetails(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 // Run once to fill cache 596 <-ss.Post().GetPosts(o1.ChannelId, 0, 30, true) 597 598 o6 := &model.Post{} 599 o6.ChannelId = o1.ChannelId 600 o6.UserId = model.NewId() 601 o6.Message = "zz" + model.NewId() + "b" 602 o6 = (<-ss.Post().Save(o6)).Data.(*model.Post) 603 604 // Should only be 6 since we hit the cache 605 r3 := (<-ss.Post().GetPosts(o1.ChannelId, 0, 30, true)).Data.(*model.PostList) 606 assert.Equal(t, 6, len(r3.Order)) 607 608 ss.Post().InvalidateLastPostTimeCache(o1.ChannelId) 609 610 // Cache was invalidated, we should get all the posts 611 r4 := (<-ss.Post().GetPosts(o1.ChannelId, 0, 30, true)).Data.(*model.PostList) 612 assert.Equal(t, 7, len(r4.Order)) 613 } 614 615 func testPostStoreGetPostsBeforeAfter(t *testing.T, ss store.Store) { 616 o0 := &model.Post{} 617 o0.ChannelId = model.NewId() 618 o0.UserId = model.NewId() 619 o0.Message = "zz" + model.NewId() + "b" 620 o0 = (<-ss.Post().Save(o0)).Data.(*model.Post) 621 time.Sleep(2 * time.Millisecond) 622 623 o1 := &model.Post{} 624 o1.ChannelId = model.NewId() 625 o1.UserId = model.NewId() 626 o1.Message = "zz" + model.NewId() + "b" 627 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 628 time.Sleep(2 * time.Millisecond) 629 630 o2 := &model.Post{} 631 o2.ChannelId = o1.ChannelId 632 o2.UserId = model.NewId() 633 o2.Message = "zz" + model.NewId() + "b" 634 o2.ParentId = o1.Id 635 o2.RootId = o1.Id 636 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 637 time.Sleep(2 * time.Millisecond) 638 639 o2a := &model.Post{} 640 o2a.ChannelId = o1.ChannelId 641 o2a.UserId = model.NewId() 642 o2a.Message = "zz" + model.NewId() + "b" 643 o2a.ParentId = o1.Id 644 o2a.RootId = o1.Id 645 o2a = (<-ss.Post().Save(o2a)).Data.(*model.Post) 646 time.Sleep(2 * time.Millisecond) 647 648 o3 := &model.Post{} 649 o3.ChannelId = o1.ChannelId 650 o3.UserId = model.NewId() 651 o3.Message = "zz" + model.NewId() + "b" 652 o3.ParentId = o1.Id 653 o3.RootId = o1.Id 654 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 655 time.Sleep(2 * time.Millisecond) 656 657 o4 := &model.Post{} 658 o4.ChannelId = o1.ChannelId 659 o4.UserId = model.NewId() 660 o4.Message = "zz" + model.NewId() + "b" 661 o4 = (<-ss.Post().Save(o4)).Data.(*model.Post) 662 time.Sleep(2 * time.Millisecond) 663 664 o5 := &model.Post{} 665 o5.ChannelId = o1.ChannelId 666 o5.UserId = model.NewId() 667 o5.Message = "zz" + model.NewId() + "b" 668 o5.ParentId = o4.Id 669 o5.RootId = o4.Id 670 o5 = (<-ss.Post().Save(o5)).Data.(*model.Post) 671 672 r1 := (<-ss.Post().GetPostsBefore(o1.ChannelId, o1.Id, 4, 0)).Data.(*model.PostList) 673 674 if len(r1.Posts) != 0 { 675 t.Fatal("Wrong size") 676 } 677 678 r2 := (<-ss.Post().GetPostsAfter(o1.ChannelId, o1.Id, 4, 0)).Data.(*model.PostList) 679 680 if r2.Order[0] != o4.Id { 681 t.Fatal("invalid order") 682 } 683 684 if r2.Order[1] != o3.Id { 685 t.Fatal("invalid order") 686 } 687 688 if r2.Order[2] != o2a.Id { 689 t.Fatal("invalid order") 690 } 691 692 if r2.Order[3] != o2.Id { 693 t.Fatal("invalid order") 694 } 695 696 if len(r2.Posts) != 5 { 697 t.Fatal("wrong size") 698 } 699 700 r3 := (<-ss.Post().GetPostsBefore(o3.ChannelId, o3.Id, 2, 0)).Data.(*model.PostList) 701 702 if r3.Order[0] != o2a.Id { 703 t.Fatal("invalid order") 704 } 705 706 if r3.Order[1] != o2.Id { 707 t.Fatal("invalid order") 708 } 709 710 if len(r3.Posts) != 3 { 711 t.Fatal("wrong size") 712 } 713 714 if r3.Posts[o1.Id].Message != o1.Message { 715 t.Fatal("Missing parent") 716 } 717 } 718 719 func testPostStoreGetPostsSince(t *testing.T, ss store.Store) { 720 o0 := &model.Post{} 721 o0.ChannelId = model.NewId() 722 o0.UserId = model.NewId() 723 o0.Message = "zz" + model.NewId() + "b" 724 o0 = (<-ss.Post().Save(o0)).Data.(*model.Post) 725 time.Sleep(2 * time.Millisecond) 726 727 o1 := &model.Post{} 728 o1.ChannelId = model.NewId() 729 o1.UserId = model.NewId() 730 o1.Message = "zz" + model.NewId() + "b" 731 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 732 time.Sleep(2 * time.Millisecond) 733 734 o2 := &model.Post{} 735 o2.ChannelId = o1.ChannelId 736 o2.UserId = model.NewId() 737 o2.Message = "zz" + model.NewId() + "b" 738 o2.ParentId = o1.Id 739 o2.RootId = o1.Id 740 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 741 time.Sleep(2 * time.Millisecond) 742 743 o2a := &model.Post{} 744 o2a.ChannelId = o1.ChannelId 745 o2a.UserId = model.NewId() 746 o2a.Message = "zz" + model.NewId() + "b" 747 o2a.ParentId = o1.Id 748 o2a.RootId = o1.Id 749 o2a = (<-ss.Post().Save(o2a)).Data.(*model.Post) 750 time.Sleep(2 * time.Millisecond) 751 752 o3 := &model.Post{} 753 o3.ChannelId = o1.ChannelId 754 o3.UserId = model.NewId() 755 o3.Message = "zz" + model.NewId() + "b" 756 o3.ParentId = o1.Id 757 o3.RootId = o1.Id 758 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 759 time.Sleep(2 * time.Millisecond) 760 761 o4 := &model.Post{} 762 o4.ChannelId = o1.ChannelId 763 o4.UserId = model.NewId() 764 o4.Message = "zz" + model.NewId() + "b" 765 o4 = (<-ss.Post().Save(o4)).Data.(*model.Post) 766 time.Sleep(2 * time.Millisecond) 767 768 o5 := &model.Post{} 769 o5.ChannelId = o1.ChannelId 770 o5.UserId = model.NewId() 771 o5.Message = "zz" + model.NewId() + "b" 772 o5.ParentId = o4.Id 773 o5.RootId = o4.Id 774 o5 = (<-ss.Post().Save(o5)).Data.(*model.Post) 775 776 r1 := (<-ss.Post().GetPostsSince(o1.ChannelId, o1.CreateAt, false)).Data.(*model.PostList) 777 778 if r1.Order[0] != o5.Id { 779 t.Fatal("invalid order") 780 } 781 782 if r1.Order[1] != o4.Id { 783 t.Fatal("invalid order") 784 } 785 786 if r1.Order[2] != o3.Id { 787 t.Fatal("invalid order") 788 } 789 790 if r1.Order[3] != o2a.Id { 791 t.Fatal("invalid order") 792 } 793 794 if len(r1.Posts) != 6 { 795 t.Fatal("wrong size") 796 } 797 798 if r1.Posts[o1.Id].Message != o1.Message { 799 t.Fatal("Missing parent") 800 } 801 802 r2 := (<-ss.Post().GetPostsSince(o1.ChannelId, o5.UpdateAt, true)).Data.(*model.PostList) 803 804 if len(r2.Order) != 0 { 805 t.Fatal("wrong size ", len(r2.Posts)) 806 } 807 } 808 809 func testPostStoreSearch(t *testing.T, ss store.Store) { 810 teamId := model.NewId() 811 userId := model.NewId() 812 813 c1 := &model.Channel{} 814 c1.TeamId = teamId 815 c1.DisplayName = "Channel1" 816 c1.Name = "zz" + model.NewId() + "b" 817 c1.Type = model.CHANNEL_OPEN 818 c1 = (<-ss.Channel().Save(c1, -1)).Data.(*model.Channel) 819 820 m1 := model.ChannelMember{} 821 m1.ChannelId = c1.Id 822 m1.UserId = userId 823 m1.NotifyProps = model.GetDefaultChannelNotifyProps() 824 store.Must(ss.Channel().SaveMember(&m1)) 825 826 c2 := &model.Channel{} 827 c2.TeamId = teamId 828 c2.DisplayName = "Channel1" 829 c2.Name = "zz" + model.NewId() + "b" 830 c2.Type = model.CHANNEL_OPEN 831 c2 = (<-ss.Channel().Save(c2, -1)).Data.(*model.Channel) 832 833 o1 := &model.Post{} 834 o1.ChannelId = c1.Id 835 o1.UserId = model.NewId() 836 o1.Message = "corey mattermost new york" 837 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 838 839 o1a := &model.Post{} 840 o1a.ChannelId = c1.Id 841 o1a.UserId = model.NewId() 842 o1a.Message = "corey mattermost new york" 843 o1a.Type = model.POST_JOIN_CHANNEL 844 o1a = (<-ss.Post().Save(o1a)).Data.(*model.Post) 845 846 o2 := &model.Post{} 847 o2.ChannelId = c1.Id 848 o2.UserId = model.NewId() 849 o2.Message = "New Jersey is where John is from" 850 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 851 852 o3 := &model.Post{} 853 o3.ChannelId = c2.Id 854 o3.UserId = model.NewId() 855 o3.Message = "New Jersey is where John is from corey new york" 856 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 857 858 o4 := &model.Post{} 859 o4.ChannelId = c1.Id 860 o4.UserId = model.NewId() 861 o4.Hashtags = "#hashtag" 862 o4.Message = "(message)blargh" 863 o4 = (<-ss.Post().Save(o4)).Data.(*model.Post) 864 865 o5 := &model.Post{} 866 o5.ChannelId = c1.Id 867 o5.UserId = model.NewId() 868 o5.Hashtags = "#secret #howdy" 869 o5 = (<-ss.Post().Save(o5)).Data.(*model.Post) 870 871 r1 := (<-ss.Post().Search(teamId, userId, &model.SearchParams{Terms: "corey", IsHashtag: false})).Data.(*model.PostList) 872 if len(r1.Order) != 1 || r1.Order[0] != o1.Id { 873 t.Fatal("returned wrong search result") 874 } 875 876 r3 := (<-ss.Post().Search(teamId, userId, &model.SearchParams{Terms: "new", IsHashtag: false})).Data.(*model.PostList) 877 if len(r3.Order) != 2 || (r3.Order[0] != o1.Id && r3.Order[1] != o1.Id) { 878 t.Fatal("returned wrong search result") 879 } 880 881 r4 := (<-ss.Post().Search(teamId, userId, &model.SearchParams{Terms: "john", IsHashtag: false})).Data.(*model.PostList) 882 if len(r4.Order) != 1 || r4.Order[0] != o2.Id { 883 t.Fatal("returned wrong search result") 884 } 885 886 r5 := (<-ss.Post().Search(teamId, userId, &model.SearchParams{Terms: "matter*", IsHashtag: false})).Data.(*model.PostList) 887 if len(r5.Order) != 1 || r5.Order[0] != o1.Id { 888 t.Fatal("returned wrong search result") 889 } 890 891 r6 := (<-ss.Post().Search(teamId, userId, &model.SearchParams{Terms: "#hashtag", IsHashtag: true})).Data.(*model.PostList) 892 if len(r6.Order) != 1 || r6.Order[0] != o4.Id { 893 t.Fatal("returned wrong search result") 894 } 895 896 r7 := (<-ss.Post().Search(teamId, userId, &model.SearchParams{Terms: "#secret", IsHashtag: true})).Data.(*model.PostList) 897 if len(r7.Order) != 1 || r7.Order[0] != o5.Id { 898 t.Fatal("returned wrong search result") 899 } 900 901 r8 := (<-ss.Post().Search(teamId, userId, &model.SearchParams{Terms: "@thisshouldmatchnothing", IsHashtag: true})).Data.(*model.PostList) 902 if len(r8.Order) != 0 { 903 t.Fatal("returned wrong search result") 904 } 905 906 r9 := (<-ss.Post().Search(teamId, userId, &model.SearchParams{Terms: "mattermost jersey", IsHashtag: false})).Data.(*model.PostList) 907 if len(r9.Order) != 0 { 908 t.Fatal("returned wrong search result") 909 } 910 911 r9a := (<-ss.Post().Search(teamId, userId, &model.SearchParams{Terms: "corey new york", IsHashtag: false})).Data.(*model.PostList) 912 if len(r9a.Order) != 1 { 913 t.Fatal("returned wrong search result") 914 } 915 916 r10 := (<-ss.Post().Search(teamId, userId, &model.SearchParams{Terms: "matter* jer*", IsHashtag: false})).Data.(*model.PostList) 917 if len(r10.Order) != 0 { 918 t.Fatal("returned wrong search result") 919 } 920 921 r11 := (<-ss.Post().Search(teamId, userId, &model.SearchParams{Terms: "message blargh", IsHashtag: false})).Data.(*model.PostList) 922 if len(r11.Order) != 1 { 923 t.Fatal("returned wrong search result") 924 } 925 926 r12 := (<-ss.Post().Search(teamId, userId, &model.SearchParams{Terms: "blargh>", IsHashtag: false})).Data.(*model.PostList) 927 if len(r12.Order) != 1 { 928 t.Fatal("returned wrong search result") 929 } 930 931 r13 := (<-ss.Post().Search(teamId, userId, &model.SearchParams{Terms: "Jersey corey", IsHashtag: false, OrTerms: true})).Data.(*model.PostList) 932 if len(r13.Order) != 2 { 933 t.Fatal("returned wrong search result") 934 } 935 } 936 937 func testUserCountsWithPostsByDay(t *testing.T, ss store.Store) { 938 t1 := &model.Team{} 939 t1.DisplayName = "DisplayName" 940 t1.Name = "zz" + model.NewId() + "b" 941 t1.Email = model.NewId() + "@nowhere.com" 942 t1.Type = model.TEAM_OPEN 943 t1 = store.Must(ss.Team().Save(t1)).(*model.Team) 944 945 c1 := &model.Channel{} 946 c1.TeamId = t1.Id 947 c1.DisplayName = "Channel2" 948 c1.Name = "zz" + model.NewId() + "b" 949 c1.Type = model.CHANNEL_OPEN 950 c1 = store.Must(ss.Channel().Save(c1, -1)).(*model.Channel) 951 952 o1 := &model.Post{} 953 o1.ChannelId = c1.Id 954 o1.UserId = model.NewId() 955 o1.CreateAt = utils.MillisFromTime(utils.Yesterday()) 956 o1.Message = "zz" + model.NewId() + "b" 957 o1 = store.Must(ss.Post().Save(o1)).(*model.Post) 958 959 o1a := &model.Post{} 960 o1a.ChannelId = c1.Id 961 o1a.UserId = model.NewId() 962 o1a.CreateAt = o1.CreateAt 963 o1a.Message = "zz" + model.NewId() + "b" 964 o1a = store.Must(ss.Post().Save(o1a)).(*model.Post) 965 966 o2 := &model.Post{} 967 o2.ChannelId = c1.Id 968 o2.UserId = model.NewId() 969 o2.CreateAt = o1.CreateAt - (1000 * 60 * 60 * 24) 970 o2.Message = "zz" + model.NewId() + "b" 971 o2 = store.Must(ss.Post().Save(o2)).(*model.Post) 972 973 o2a := &model.Post{} 974 o2a.ChannelId = c1.Id 975 o2a.UserId = o2.UserId 976 o2a.CreateAt = o1.CreateAt - (1000 * 60 * 60 * 24) 977 o2a.Message = "zz" + model.NewId() + "b" 978 o2a = store.Must(ss.Post().Save(o2a)).(*model.Post) 979 980 if r1 := <-ss.Post().AnalyticsUserCountsWithPostsByDay(t1.Id); r1.Err != nil { 981 t.Fatal(r1.Err) 982 } else { 983 row1 := r1.Data.(model.AnalyticsRows)[0] 984 if row1.Value != 2 { 985 t.Fatal("wrong value") 986 } 987 988 row2 := r1.Data.(model.AnalyticsRows)[1] 989 if row2.Value != 1 { 990 t.Fatal("wrong value") 991 } 992 } 993 } 994 995 func testPostCountsByDay(t *testing.T, ss store.Store) { 996 t1 := &model.Team{} 997 t1.DisplayName = "DisplayName" 998 t1.Name = "zz" + model.NewId() + "b" 999 t1.Email = model.NewId() + "@nowhere.com" 1000 t1.Type = model.TEAM_OPEN 1001 t1 = store.Must(ss.Team().Save(t1)).(*model.Team) 1002 1003 c1 := &model.Channel{} 1004 c1.TeamId = t1.Id 1005 c1.DisplayName = "Channel2" 1006 c1.Name = "zz" + model.NewId() + "b" 1007 c1.Type = model.CHANNEL_OPEN 1008 c1 = store.Must(ss.Channel().Save(c1, -1)).(*model.Channel) 1009 1010 o1 := &model.Post{} 1011 o1.ChannelId = c1.Id 1012 o1.UserId = model.NewId() 1013 o1.CreateAt = utils.MillisFromTime(utils.Yesterday()) 1014 o1.Message = "zz" + model.NewId() + "b" 1015 o1 = store.Must(ss.Post().Save(o1)).(*model.Post) 1016 1017 o1a := &model.Post{} 1018 o1a.ChannelId = c1.Id 1019 o1a.UserId = model.NewId() 1020 o1a.CreateAt = o1.CreateAt 1021 o1a.Message = "zz" + model.NewId() + "b" 1022 o1a = store.Must(ss.Post().Save(o1a)).(*model.Post) 1023 1024 o2 := &model.Post{} 1025 o2.ChannelId = c1.Id 1026 o2.UserId = model.NewId() 1027 o2.CreateAt = o1.CreateAt - (1000 * 60 * 60 * 24 * 2) 1028 o2.Message = "zz" + model.NewId() + "b" 1029 o2 = store.Must(ss.Post().Save(o2)).(*model.Post) 1030 1031 o2a := &model.Post{} 1032 o2a.ChannelId = c1.Id 1033 o2a.UserId = o2.UserId 1034 o2a.CreateAt = o1.CreateAt - (1000 * 60 * 60 * 24 * 2) 1035 o2a.Message = "zz" + model.NewId() + "b" 1036 o2a = store.Must(ss.Post().Save(o2a)).(*model.Post) 1037 1038 time.Sleep(1 * time.Second) 1039 1040 if r1 := <-ss.Post().AnalyticsPostCountsByDay(t1.Id); r1.Err != nil { 1041 t.Fatal(r1.Err) 1042 } else { 1043 row1 := r1.Data.(model.AnalyticsRows)[0] 1044 if row1.Value != 2 { 1045 t.Fatal(row1) 1046 } 1047 1048 row2 := r1.Data.(model.AnalyticsRows)[1] 1049 if row2.Value != 2 { 1050 t.Fatal("wrong value") 1051 } 1052 } 1053 1054 if r1 := <-ss.Post().AnalyticsPostCount(t1.Id, false, false); r1.Err != nil { 1055 t.Fatal(r1.Err) 1056 } else { 1057 if r1.Data.(int64) != 4 { 1058 t.Fatal("wrong value") 1059 } 1060 } 1061 } 1062 1063 func testPostStoreGetFlaggedPostsForTeam(t *testing.T, ss store.Store) { 1064 c1 := &model.Channel{} 1065 c1.TeamId = model.NewId() 1066 c1.DisplayName = "Channel1" 1067 c1.Name = "zz" + model.NewId() + "b" 1068 c1.Type = model.CHANNEL_OPEN 1069 c1 = store.Must(ss.Channel().Save(c1, -1)).(*model.Channel) 1070 1071 o1 := &model.Post{} 1072 o1.ChannelId = c1.Id 1073 o1.UserId = model.NewId() 1074 o1.Message = "zz" + model.NewId() + "b" 1075 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1076 time.Sleep(2 * time.Millisecond) 1077 1078 o2 := &model.Post{} 1079 o2.ChannelId = o1.ChannelId 1080 o2.UserId = model.NewId() 1081 o2.Message = "zz" + model.NewId() + "b" 1082 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1083 time.Sleep(2 * time.Millisecond) 1084 1085 o3 := &model.Post{} 1086 o3.ChannelId = o1.ChannelId 1087 o3.UserId = model.NewId() 1088 o3.Message = "zz" + model.NewId() + "b" 1089 o3.DeleteAt = 1 1090 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1091 time.Sleep(2 * time.Millisecond) 1092 1093 o4 := &model.Post{} 1094 o4.ChannelId = model.NewId() 1095 o4.UserId = model.NewId() 1096 o4.Message = "zz" + model.NewId() + "b" 1097 o4 = (<-ss.Post().Save(o4)).Data.(*model.Post) 1098 time.Sleep(2 * time.Millisecond) 1099 1100 c2 := &model.Channel{} 1101 c2.DisplayName = "DMChannel1" 1102 c2.Name = "zz" + model.NewId() + "b" 1103 c2.Type = model.CHANNEL_DIRECT 1104 1105 m1 := &model.ChannelMember{} 1106 m1.ChannelId = c2.Id 1107 m1.UserId = o1.UserId 1108 m1.NotifyProps = model.GetDefaultChannelNotifyProps() 1109 1110 m2 := &model.ChannelMember{} 1111 m2.ChannelId = c2.Id 1112 m2.UserId = model.NewId() 1113 m2.NotifyProps = model.GetDefaultChannelNotifyProps() 1114 1115 c2 = store.Must(ss.Channel().SaveDirectChannel(c2, m1, m2)).(*model.Channel) 1116 1117 o5 := &model.Post{} 1118 o5.ChannelId = c2.Id 1119 o5.UserId = m2.UserId 1120 o5.Message = "zz" + model.NewId() + "b" 1121 o5 = (<-ss.Post().Save(o5)).Data.(*model.Post) 1122 time.Sleep(2 * time.Millisecond) 1123 1124 r1 := (<-ss.Post().GetFlaggedPosts(o1.ChannelId, 0, 2)).Data.(*model.PostList) 1125 1126 if len(r1.Order) != 0 { 1127 t.Fatal("should be empty") 1128 } 1129 1130 preferences := model.Preferences{ 1131 { 1132 UserId: o1.UserId, 1133 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1134 Name: o1.Id, 1135 Value: "true", 1136 }, 1137 } 1138 1139 store.Must(ss.Preference().Save(&preferences)) 1140 1141 r2 := (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2)).Data.(*model.PostList) 1142 1143 if len(r2.Order) != 1 { 1144 t.Fatal("should have 1 post") 1145 } 1146 1147 preferences = model.Preferences{ 1148 { 1149 UserId: o1.UserId, 1150 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1151 Name: o2.Id, 1152 Value: "true", 1153 }, 1154 } 1155 1156 store.Must(ss.Preference().Save(&preferences)) 1157 1158 r3 := (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 1)).Data.(*model.PostList) 1159 1160 if len(r3.Order) != 1 { 1161 t.Fatal("should have 1 post") 1162 } 1163 1164 r3 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 1, 1)).Data.(*model.PostList) 1165 1166 if len(r3.Order) != 1 { 1167 t.Fatal("should have 1 post") 1168 } 1169 1170 r3 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 1000, 10)).Data.(*model.PostList) 1171 1172 if len(r3.Order) != 0 { 1173 t.Fatal("should be empty") 1174 } 1175 1176 r4 := (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2)).Data.(*model.PostList) 1177 1178 if len(r4.Order) != 2 { 1179 t.Fatal("should have 2 posts") 1180 } 1181 1182 preferences = model.Preferences{ 1183 { 1184 UserId: o1.UserId, 1185 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1186 Name: o3.Id, 1187 Value: "true", 1188 }, 1189 } 1190 1191 store.Must(ss.Preference().Save(&preferences)) 1192 1193 r4 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2)).Data.(*model.PostList) 1194 1195 if len(r4.Order) != 2 { 1196 t.Fatal("should have 2 posts") 1197 } 1198 1199 preferences = model.Preferences{ 1200 { 1201 UserId: o1.UserId, 1202 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1203 Name: o4.Id, 1204 Value: "true", 1205 }, 1206 } 1207 store.Must(ss.Preference().Save(&preferences)) 1208 1209 r4 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2)).Data.(*model.PostList) 1210 1211 if len(r4.Order) != 2 { 1212 t.Fatal("should have 2 posts") 1213 } 1214 1215 r4 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, model.NewId(), 0, 2)).Data.(*model.PostList) 1216 1217 if len(r4.Order) != 0 { 1218 t.Fatal("should have 0 posts") 1219 } 1220 1221 preferences = model.Preferences{ 1222 { 1223 UserId: o1.UserId, 1224 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1225 Name: o5.Id, 1226 Value: "true", 1227 }, 1228 } 1229 store.Must(ss.Preference().Save(&preferences)) 1230 1231 r4 = (<-ss.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 10)).Data.(*model.PostList) 1232 1233 if len(r4.Order) != 3 { 1234 t.Fatal("should have 3 posts") 1235 } 1236 } 1237 1238 func testPostStoreGetFlaggedPosts(t *testing.T, ss store.Store) { 1239 o1 := &model.Post{} 1240 o1.ChannelId = model.NewId() 1241 o1.UserId = model.NewId() 1242 o1.Message = "zz" + model.NewId() + "b" 1243 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1244 time.Sleep(2 * time.Millisecond) 1245 1246 o2 := &model.Post{} 1247 o2.ChannelId = o1.ChannelId 1248 o2.UserId = model.NewId() 1249 o2.Message = "zz" + model.NewId() + "b" 1250 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1251 time.Sleep(2 * time.Millisecond) 1252 1253 o3 := &model.Post{} 1254 o3.ChannelId = o1.ChannelId 1255 o3.UserId = model.NewId() 1256 o3.Message = "zz" + model.NewId() + "b" 1257 o3.DeleteAt = 1 1258 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1259 time.Sleep(2 * time.Millisecond) 1260 1261 r1 := (<-ss.Post().GetFlaggedPosts(o1.UserId, 0, 2)).Data.(*model.PostList) 1262 1263 if len(r1.Order) != 0 { 1264 t.Fatal("should be empty") 1265 } 1266 1267 preferences := model.Preferences{ 1268 { 1269 UserId: o1.UserId, 1270 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1271 Name: o1.Id, 1272 Value: "true", 1273 }, 1274 } 1275 1276 store.Must(ss.Preference().Save(&preferences)) 1277 1278 r2 := (<-ss.Post().GetFlaggedPosts(o1.UserId, 0, 2)).Data.(*model.PostList) 1279 1280 if len(r2.Order) != 1 { 1281 t.Fatal("should have 1 post") 1282 } 1283 1284 preferences = model.Preferences{ 1285 { 1286 UserId: o1.UserId, 1287 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1288 Name: o2.Id, 1289 Value: "true", 1290 }, 1291 } 1292 1293 store.Must(ss.Preference().Save(&preferences)) 1294 1295 r3 := (<-ss.Post().GetFlaggedPosts(o1.UserId, 0, 1)).Data.(*model.PostList) 1296 1297 if len(r3.Order) != 1 { 1298 t.Fatal("should have 1 post") 1299 } 1300 1301 r3 = (<-ss.Post().GetFlaggedPosts(o1.UserId, 1, 1)).Data.(*model.PostList) 1302 1303 if len(r3.Order) != 1 { 1304 t.Fatal("should have 1 post") 1305 } 1306 1307 r3 = (<-ss.Post().GetFlaggedPosts(o1.UserId, 1000, 10)).Data.(*model.PostList) 1308 1309 if len(r3.Order) != 0 { 1310 t.Fatal("should be empty") 1311 } 1312 1313 r4 := (<-ss.Post().GetFlaggedPosts(o1.UserId, 0, 2)).Data.(*model.PostList) 1314 1315 if len(r4.Order) != 2 { 1316 t.Fatal("should have 2 posts") 1317 } 1318 1319 preferences = model.Preferences{ 1320 { 1321 UserId: o1.UserId, 1322 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1323 Name: o3.Id, 1324 Value: "true", 1325 }, 1326 } 1327 1328 store.Must(ss.Preference().Save(&preferences)) 1329 1330 r4 = (<-ss.Post().GetFlaggedPosts(o1.UserId, 0, 2)).Data.(*model.PostList) 1331 1332 if len(r4.Order) != 2 { 1333 t.Fatal("should have 2 posts") 1334 } 1335 } 1336 1337 func testPostStoreGetFlaggedPostsForChannel(t *testing.T, ss store.Store) { 1338 o1 := &model.Post{} 1339 o1.ChannelId = model.NewId() 1340 o1.UserId = model.NewId() 1341 o1.Message = "zz" + model.NewId() + "b" 1342 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1343 time.Sleep(2 * time.Millisecond) 1344 1345 o2 := &model.Post{} 1346 o2.ChannelId = o1.ChannelId 1347 o2.UserId = model.NewId() 1348 o2.Message = "zz" + model.NewId() + "b" 1349 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1350 time.Sleep(2 * time.Millisecond) 1351 1352 // deleted post 1353 o3 := &model.Post{} 1354 o3.ChannelId = model.NewId() 1355 o3.UserId = o1.ChannelId 1356 o3.Message = "zz" + model.NewId() + "b" 1357 o3.DeleteAt = 1 1358 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1359 time.Sleep(2 * time.Millisecond) 1360 1361 o4 := &model.Post{} 1362 o4.ChannelId = model.NewId() 1363 o4.UserId = model.NewId() 1364 o4.Message = "zz" + model.NewId() + "b" 1365 o4 = (<-ss.Post().Save(o4)).Data.(*model.Post) 1366 time.Sleep(2 * time.Millisecond) 1367 1368 r := (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 10)).Data.(*model.PostList) 1369 1370 if len(r.Order) != 0 { 1371 t.Fatal("should be empty") 1372 } 1373 1374 preference := model.Preference{ 1375 UserId: o1.UserId, 1376 Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, 1377 Name: o1.Id, 1378 Value: "true", 1379 } 1380 1381 store.Must(ss.Preference().Save(&model.Preferences{preference})) 1382 1383 r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 10)).Data.(*model.PostList) 1384 1385 if len(r.Order) != 1 { 1386 t.Fatal("should have 1 post") 1387 } 1388 1389 preference.Name = o2.Id 1390 store.Must(ss.Preference().Save(&model.Preferences{preference})) 1391 1392 preference.Name = o3.Id 1393 store.Must(ss.Preference().Save(&model.Preferences{preference})) 1394 1395 r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 1)).Data.(*model.PostList) 1396 1397 if len(r.Order) != 1 { 1398 t.Fatal("should have 1 post") 1399 } 1400 1401 r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 1, 1)).Data.(*model.PostList) 1402 1403 if len(r.Order) != 1 { 1404 t.Fatal("should have 1 post") 1405 } 1406 1407 r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 1000, 10)).Data.(*model.PostList) 1408 1409 if len(r.Order) != 0 { 1410 t.Fatal("should be empty") 1411 } 1412 1413 r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 10)).Data.(*model.PostList) 1414 1415 if len(r.Order) != 2 { 1416 t.Fatal("should have 2 posts") 1417 } 1418 1419 preference.Name = o4.Id 1420 store.Must(ss.Preference().Save(&model.Preferences{preference})) 1421 1422 r = (<-ss.Post().GetFlaggedPostsForChannel(o1.UserId, o4.ChannelId, 0, 10)).Data.(*model.PostList) 1423 1424 if len(r.Order) != 1 { 1425 t.Fatal("should have 1 post") 1426 } 1427 } 1428 1429 func testPostStoreGetPostsCreatedAt(t *testing.T, ss store.Store) { 1430 createTime := model.GetMillis() + 1 1431 1432 o0 := &model.Post{} 1433 o0.ChannelId = model.NewId() 1434 o0.UserId = model.NewId() 1435 o0.Message = "zz" + model.NewId() + "b" 1436 o0.CreateAt = createTime 1437 o0 = (<-ss.Post().Save(o0)).Data.(*model.Post) 1438 1439 o1 := &model.Post{} 1440 o1.ChannelId = o0.ChannelId 1441 o1.UserId = model.NewId() 1442 o1.Message = "zz" + model.NewId() + "b" 1443 o1.CreateAt = createTime 1444 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1445 1446 o2 := &model.Post{} 1447 o2.ChannelId = o1.ChannelId 1448 o2.UserId = model.NewId() 1449 o2.Message = "zz" + model.NewId() + "b" 1450 o2.ParentId = o1.Id 1451 o2.RootId = o1.Id 1452 o2.CreateAt = createTime + 1 1453 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1454 1455 o3 := &model.Post{} 1456 o3.ChannelId = model.NewId() 1457 o3.UserId = model.NewId() 1458 o3.Message = "zz" + model.NewId() + "b" 1459 o3.CreateAt = createTime 1460 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1461 1462 r1 := (<-ss.Post().GetPostsCreatedAt(o1.ChannelId, createTime)).Data.([]*model.Post) 1463 assert.Equal(t, 2, len(r1)) 1464 } 1465 1466 func testPostStoreOverwrite(t *testing.T, ss store.Store) { 1467 o1 := &model.Post{} 1468 o1.ChannelId = model.NewId() 1469 o1.UserId = model.NewId() 1470 o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1471 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1472 1473 o2 := &model.Post{} 1474 o2.ChannelId = o1.ChannelId 1475 o2.UserId = model.NewId() 1476 o2.Message = "zz" + model.NewId() + "CCCCCCCCC" 1477 o2.ParentId = o1.Id 1478 o2.RootId = o1.Id 1479 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1480 1481 o3 := &model.Post{} 1482 o3.ChannelId = o1.ChannelId 1483 o3.UserId = model.NewId() 1484 o3.Message = "zz" + model.NewId() + "QQQQQQQQQQ" 1485 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1486 1487 ro1 := (<-ss.Post().Get(o1.Id)).Data.(*model.PostList).Posts[o1.Id] 1488 ro2 := (<-ss.Post().Get(o1.Id)).Data.(*model.PostList).Posts[o2.Id] 1489 ro3 := (<-ss.Post().Get(o3.Id)).Data.(*model.PostList).Posts[o3.Id] 1490 1491 if ro1.Message != o1.Message { 1492 t.Fatal("Failed to save/get") 1493 } 1494 1495 o1a := &model.Post{} 1496 *o1a = *ro1 1497 o1a.Message = ro1.Message + "BBBBBBBBBB" 1498 if result := <-ss.Post().Overwrite(o1a); result.Err != nil { 1499 t.Fatal(result.Err) 1500 } 1501 1502 ro1a := (<-ss.Post().Get(o1.Id)).Data.(*model.PostList).Posts[o1.Id] 1503 1504 if ro1a.Message != o1a.Message { 1505 t.Fatal("Failed to overwrite/get") 1506 } 1507 1508 o2a := &model.Post{} 1509 *o2a = *ro2 1510 o2a.Message = ro2.Message + "DDDDDDD" 1511 if result := <-ss.Post().Overwrite(o2a); result.Err != nil { 1512 t.Fatal(result.Err) 1513 } 1514 1515 ro2a := (<-ss.Post().Get(o1.Id)).Data.(*model.PostList).Posts[o2.Id] 1516 1517 if ro2a.Message != o2a.Message { 1518 t.Fatal("Failed to overwrite/get") 1519 } 1520 1521 o3a := &model.Post{} 1522 *o3a = *ro3 1523 o3a.Message = ro3.Message + "WWWWWWW" 1524 if result := <-ss.Post().Overwrite(o3a); result.Err != nil { 1525 t.Fatal(result.Err) 1526 } 1527 1528 ro3a := (<-ss.Post().Get(o3.Id)).Data.(*model.PostList).Posts[o3.Id] 1529 1530 if ro3a.Message != o3a.Message && ro3a.Hashtags != o3a.Hashtags { 1531 t.Fatal("Failed to overwrite/get") 1532 } 1533 1534 o4 := store.Must(ss.Post().Save(&model.Post{ 1535 ChannelId: model.NewId(), 1536 UserId: model.NewId(), 1537 Message: model.NewId(), 1538 Filenames: []string{"test"}, 1539 })).(*model.Post) 1540 1541 ro4 := (<-ss.Post().Get(o4.Id)).Data.(*model.PostList).Posts[o4.Id] 1542 1543 o4a := &model.Post{} 1544 *o4a = *ro4 1545 o4a.Filenames = []string{} 1546 o4a.FileIds = []string{model.NewId()} 1547 if result := <-ss.Post().Overwrite(o4a); result.Err != nil { 1548 t.Fatal(result.Err) 1549 } 1550 1551 if ro4a := store.Must(ss.Post().Get(o4.Id)).(*model.PostList).Posts[o4.Id]; len(ro4a.Filenames) != 0 { 1552 t.Fatal("Failed to clear Filenames") 1553 } else if len(ro4a.FileIds) != 1 { 1554 t.Fatal("Failed to set FileIds") 1555 } 1556 } 1557 1558 func testPostStoreGetPostsByIds(t *testing.T, ss store.Store) { 1559 o1 := &model.Post{} 1560 o1.ChannelId = model.NewId() 1561 o1.UserId = model.NewId() 1562 o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1563 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1564 1565 o2 := &model.Post{} 1566 o2.ChannelId = o1.ChannelId 1567 o2.UserId = model.NewId() 1568 o2.Message = "zz" + model.NewId() + "CCCCCCCCC" 1569 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1570 1571 o3 := &model.Post{} 1572 o3.ChannelId = o1.ChannelId 1573 o3.UserId = model.NewId() 1574 o3.Message = "zz" + model.NewId() + "QQQQQQQQQQ" 1575 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1576 1577 ro1 := (<-ss.Post().Get(o1.Id)).Data.(*model.PostList).Posts[o1.Id] 1578 ro2 := (<-ss.Post().Get(o2.Id)).Data.(*model.PostList).Posts[o2.Id] 1579 ro3 := (<-ss.Post().Get(o3.Id)).Data.(*model.PostList).Posts[o3.Id] 1580 1581 postIds := []string{ 1582 ro1.Id, 1583 ro2.Id, 1584 ro3.Id, 1585 } 1586 1587 if ro4 := store.Must(ss.Post().GetPostsByIds(postIds)).([]*model.Post); len(ro4) != 3 { 1588 t.Fatalf("Expected 3 posts in results. Got %v", len(ro4)) 1589 } 1590 1591 store.Must(ss.Post().Delete(ro1.Id, model.GetMillis())) 1592 1593 if ro5 := store.Must(ss.Post().GetPostsByIds(postIds)).([]*model.Post); len(ro5) != 2 { 1594 t.Fatalf("Expected 2 posts in results. Got %v", len(ro5)) 1595 } 1596 } 1597 1598 func testPostStoreGetPostsBatchForIndexing(t *testing.T, ss store.Store) { 1599 c1 := &model.Channel{} 1600 c1.TeamId = model.NewId() 1601 c1.DisplayName = "Channel1" 1602 c1.Name = "zz" + model.NewId() + "b" 1603 c1.Type = model.CHANNEL_OPEN 1604 c1 = (<-ss.Channel().Save(c1, -1)).Data.(*model.Channel) 1605 1606 c2 := &model.Channel{} 1607 c2.TeamId = model.NewId() 1608 c2.DisplayName = "Channel2" 1609 c2.Name = "zz" + model.NewId() + "b" 1610 c2.Type = model.CHANNEL_OPEN 1611 c2 = (<-ss.Channel().Save(c2, -1)).Data.(*model.Channel) 1612 1613 o1 := &model.Post{} 1614 o1.ChannelId = c1.Id 1615 o1.UserId = model.NewId() 1616 o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1617 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1618 1619 o2 := &model.Post{} 1620 o2.ChannelId = c2.Id 1621 o2.UserId = model.NewId() 1622 o2.Message = "zz" + model.NewId() + "CCCCCCCCC" 1623 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1624 1625 o3 := &model.Post{} 1626 o3.ChannelId = c1.Id 1627 o3.UserId = model.NewId() 1628 o3.ParentId = o1.Id 1629 o3.RootId = o1.Id 1630 o3.Message = "zz" + model.NewId() + "QQQQQQQQQQ" 1631 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1632 1633 if r := store.Must(ss.Post().GetPostsBatchForIndexing(o1.CreateAt, model.GetMillis()+100000, 100)).([]*model.PostForIndexing); len(r) != 3 { 1634 t.Fatalf("Expected 3 posts in results. Got %v", len(r)) 1635 } else { 1636 for _, p := range r { 1637 if p.Id == o1.Id { 1638 if p.TeamId != c1.TeamId { 1639 t.Fatalf("Unexpected team ID") 1640 } 1641 if p.ParentCreateAt != nil { 1642 t.Fatalf("Unexpected parent create at") 1643 } 1644 } else if p.Id == o2.Id { 1645 if p.TeamId != c2.TeamId { 1646 t.Fatalf("Unexpected team ID") 1647 } 1648 if p.ParentCreateAt != nil { 1649 t.Fatalf("Unexpected parent create at") 1650 } 1651 } else if p.Id == o3.Id { 1652 if p.TeamId != c1.TeamId { 1653 t.Fatalf("Unexpected team ID") 1654 } 1655 if *p.ParentCreateAt != o1.CreateAt { 1656 t.Fatalf("Unexpected parent create at") 1657 } 1658 } else { 1659 t.Fatalf("unexpected post returned") 1660 } 1661 } 1662 } 1663 } 1664 1665 func testPostStorePermanentDeleteBatch(t *testing.T, ss store.Store) { 1666 o1 := &model.Post{} 1667 o1.ChannelId = model.NewId() 1668 o1.UserId = model.NewId() 1669 o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1670 o1.CreateAt = 1000 1671 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1672 1673 o2 := &model.Post{} 1674 o2.ChannelId = model.NewId() 1675 o2.UserId = model.NewId() 1676 o2.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1677 o2.CreateAt = 1000 1678 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1679 1680 o3 := &model.Post{} 1681 o3.ChannelId = model.NewId() 1682 o3.UserId = model.NewId() 1683 o3.Message = "zz" + model.NewId() + "AAAAAAAAAAA" 1684 o3.CreateAt = 100000 1685 o3 = (<-ss.Post().Save(o3)).Data.(*model.Post) 1686 1687 store.Must(ss.Post().PermanentDeleteBatch(2000, 1000)) 1688 1689 if p := <-ss.Post().Get(o1.Id); p.Err == nil { 1690 t.Fatalf("Should have not found post 1 after purge") 1691 } 1692 1693 if p := <-ss.Post().Get(o2.Id); p.Err == nil { 1694 t.Fatalf("Should have not found post 2 after purge") 1695 } 1696 1697 if p := <-ss.Post().Get(o3.Id); p.Err != nil { 1698 t.Fatalf("Should have found post 3 after purge") 1699 } 1700 } 1701 1702 func testPostStoreGetOldest(t *testing.T, ss store.Store) { 1703 o0 := &model.Post{} 1704 o0.ChannelId = model.NewId() 1705 o0.UserId = model.NewId() 1706 o0.Message = "zz" + model.NewId() + "b" 1707 o0.CreateAt = 3 1708 o0 = (<-ss.Post().Save(o0)).Data.(*model.Post) 1709 1710 o1 := &model.Post{} 1711 o1.ChannelId = o0.Id 1712 o1.UserId = model.NewId() 1713 o1.Message = "zz" + model.NewId() + "b" 1714 o1.CreateAt = 2 1715 o1 = (<-ss.Post().Save(o1)).Data.(*model.Post) 1716 1717 o2 := &model.Post{} 1718 o2.ChannelId = o1.ChannelId 1719 o2.UserId = model.NewId() 1720 o2.Message = "zz" + model.NewId() + "b" 1721 o2.CreateAt = 1 1722 o2 = (<-ss.Post().Save(o2)).Data.(*model.Post) 1723 1724 r1 := (<-ss.Post().GetOldest()).Data.(*model.Post) 1725 1726 assert.EqualValues(t, o2.Id, r1.Id) 1727 }