github.com/coincircle/mattermost-server@v4.8.1-0.20180321182714-9d701c704416+incompatible/store/storetest/post_store.go (about)

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