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