github.com/psyb0t/mattermost-server@v4.6.1-0.20180125161845-5503a1351abf+incompatible/store/storetest/post_store.go (about)

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