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  }