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