github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/store/storetest/compliance_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  	"encoding/json"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/mattermost/mattermost-server/v5/model"
    12  	"github.com/mattermost/mattermost-server/v5/store"
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func cleanupStoreState(t *testing.T, ss store.Store) {
    18  	//remove existing users
    19  	allUsers, err := ss.User().GetAll()
    20  	require.Nilf(t, err, "error cleaning all test users: %v", err)
    21  	for _, u := range allUsers {
    22  		err = ss.User().PermanentDelete(u.Id)
    23  		require.Nil(t, err, "failed cleaning up test user %s", u.Username)
    24  
    25  		//remove all posts by this user
    26  		err = ss.Post().PermanentDeleteByUser(u.Id)
    27  		require.Nil(t, err, "failed cleaning all posts of test user %s", u.Username)
    28  	}
    29  
    30  	//remove existing channels
    31  	allChannels, nErr := ss.Channel().GetAllChannels(0, 100000, store.ChannelSearchOpts{IncludeDeleted: true})
    32  	require.Nilf(t, nErr, "error cleaning all test channels: %v", nErr)
    33  	for _, channel := range *allChannels {
    34  		nErr := ss.Channel().PermanentDelete(channel.Id)
    35  		require.Nil(t, nErr, "failed cleaning up test channel %s", channel.Id)
    36  	}
    37  
    38  	//remove existing teams
    39  	allTeams, err := ss.Team().GetAll()
    40  	require.Nilf(t, err, "error cleaning all test teams: %v", err)
    41  	for _, team := range allTeams {
    42  		err := ss.Team().PermanentDelete(team.Id)
    43  		require.Nil(t, err, "failed cleaning up test team %s", team.Id)
    44  	}
    45  }
    46  
    47  func TestComplianceStore(t *testing.T, ss store.Store) {
    48  	t.Run("", func(t *testing.T) { testComplianceStore(t, ss) })
    49  	t.Run("ComplianceExport", func(t *testing.T) { testComplianceExport(t, ss) })
    50  	t.Run("ComplianceExportDirectMessages", func(t *testing.T) { testComplianceExportDirectMessages(t, ss) })
    51  	t.Run("MessageExportPublicChannel", func(t *testing.T) { testMessageExportPublicChannel(t, ss) })
    52  	t.Run("MessageExportPrivateChannel", func(t *testing.T) { testMessageExportPrivateChannel(t, ss) })
    53  	t.Run("MessageExportDirectMessageChannel", func(t *testing.T) { testMessageExportDirectMessageChannel(t, ss) })
    54  	t.Run("MessageExportGroupMessageChannel", func(t *testing.T) { testMessageExportGroupMessageChannel(t, ss) })
    55  	t.Run("MessageEditExportMessage", func(t *testing.T) { testEditExportMessage(t, ss) })
    56  	t.Run("MessageEditAfterExportMessage", func(t *testing.T) { testEditAfterExportMessage(t, ss) })
    57  	t.Run("MessageDeleteExportMessage", func(t *testing.T) { testDeleteExportMessage(t, ss) })
    58  	t.Run("MessageDeleteAfterExportMessage", func(t *testing.T) { testDeleteAfterExportMessage(t, ss) })
    59  }
    60  
    61  func testComplianceStore(t *testing.T, ss store.Store) {
    62  	compliance1 := &model.Compliance{Desc: "Audit for federal subpoena case #22443", UserId: model.NewId(), Status: model.COMPLIANCE_STATUS_FAILED, StartAt: model.GetMillis() - 1, EndAt: model.GetMillis() + 1, Type: model.COMPLIANCE_TYPE_ADHOC}
    63  	_, err := ss.Compliance().Save(compliance1)
    64  	require.Nil(t, err)
    65  	time.Sleep(100 * time.Millisecond)
    66  
    67  	compliance2 := &model.Compliance{Desc: "Audit for federal subpoena case #11458", UserId: model.NewId(), Status: model.COMPLIANCE_STATUS_RUNNING, StartAt: model.GetMillis() - 1, EndAt: model.GetMillis() + 1, Type: model.COMPLIANCE_TYPE_ADHOC}
    68  	_, err = ss.Compliance().Save(compliance2)
    69  	require.Nil(t, err)
    70  	time.Sleep(100 * time.Millisecond)
    71  
    72  	compliances, _ := ss.Compliance().GetAll(0, 1000)
    73  
    74  	require.Equal(t, model.COMPLIANCE_STATUS_RUNNING, compliances[0].Status)
    75  	require.Equal(t, compliance2.Id, compliances[0].Id)
    76  
    77  	compliance2.Status = model.COMPLIANCE_STATUS_FAILED
    78  	_, err = ss.Compliance().Update(compliance2)
    79  	require.Nil(t, err)
    80  
    81  	compliances, _ = ss.Compliance().GetAll(0, 1000)
    82  
    83  	require.Equal(t, model.COMPLIANCE_STATUS_FAILED, compliances[0].Status)
    84  	require.Equal(t, compliance2.Id, compliances[0].Id)
    85  
    86  	compliances, _ = ss.Compliance().GetAll(0, 1)
    87  
    88  	require.Len(t, compliances, 1)
    89  
    90  	compliances, _ = ss.Compliance().GetAll(1, 1)
    91  
    92  	require.Len(t, compliances, 1)
    93  
    94  	rc2, _ := ss.Compliance().Get(compliance2.Id)
    95  	require.Equal(t, compliance2.Status, rc2.Status)
    96  }
    97  
    98  func testComplianceExport(t *testing.T, ss store.Store) {
    99  	time.Sleep(100 * time.Millisecond)
   100  
   101  	t1 := &model.Team{}
   102  	t1.DisplayName = "DisplayName"
   103  	t1.Name = "zz" + model.NewId() + "b"
   104  	t1.Email = MakeEmail()
   105  	t1.Type = model.TEAM_OPEN
   106  	t1, err := ss.Team().Save(t1)
   107  	require.Nil(t, err)
   108  
   109  	u1 := &model.User{}
   110  	u1.Email = MakeEmail()
   111  	u1.Username = model.NewId()
   112  	u1, err = ss.User().Save(u1)
   113  	require.Nil(t, err)
   114  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: t1.Id, UserId: u1.Id}, -1)
   115  	require.Nil(t, err)
   116  
   117  	u2 := &model.User{}
   118  	u2.Email = MakeEmail()
   119  	u2.Username = model.NewId()
   120  	u2, err = ss.User().Save(u2)
   121  	require.Nil(t, err)
   122  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: t1.Id, UserId: u2.Id}, -1)
   123  	require.Nil(t, err)
   124  
   125  	c1 := &model.Channel{}
   126  	c1.TeamId = t1.Id
   127  	c1.DisplayName = "Channel2"
   128  	c1.Name = "zz" + model.NewId() + "b"
   129  	c1.Type = model.CHANNEL_OPEN
   130  	c1, nErr := ss.Channel().Save(c1, -1)
   131  	require.Nil(t, nErr)
   132  
   133  	o1 := &model.Post{}
   134  	o1.ChannelId = c1.Id
   135  	o1.UserId = u1.Id
   136  	o1.CreateAt = model.GetMillis()
   137  	o1.Message = "zz" + model.NewId() + "b"
   138  	o1, err = ss.Post().Save(o1)
   139  	require.Nil(t, err)
   140  
   141  	o1a := &model.Post{}
   142  	o1a.ChannelId = c1.Id
   143  	o1a.UserId = u1.Id
   144  	o1a.CreateAt = o1.CreateAt + 10
   145  	o1a.Message = "zz" + model.NewId() + "b"
   146  	_, err = ss.Post().Save(o1a)
   147  	require.Nil(t, err)
   148  
   149  	o2 := &model.Post{}
   150  	o2.ChannelId = c1.Id
   151  	o2.UserId = u1.Id
   152  	o2.CreateAt = o1.CreateAt + 20
   153  	o2.Message = "zz" + model.NewId() + "b"
   154  	_, err = ss.Post().Save(o2)
   155  	require.Nil(t, err)
   156  
   157  	o2a := &model.Post{}
   158  	o2a.ChannelId = c1.Id
   159  	o2a.UserId = u2.Id
   160  	o2a.CreateAt = o1.CreateAt + 30
   161  	o2a.Message = "zz" + model.NewId() + "b"
   162  	o2a, err = ss.Post().Save(o2a)
   163  	require.Nil(t, err)
   164  
   165  	time.Sleep(100 * time.Millisecond)
   166  
   167  	cr1 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1}
   168  	cposts, nErr := ss.Compliance().ComplianceExport(cr1)
   169  	require.Nil(t, nErr)
   170  	assert.Len(t, cposts, 4)
   171  	assert.Equal(t, cposts[0].PostId, o1.Id)
   172  	assert.Equal(t, cposts[3].PostId, o2a.Id)
   173  
   174  	cr2 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1, Emails: u2.Email}
   175  	cposts, nErr = ss.Compliance().ComplianceExport(cr2)
   176  	require.Nil(t, nErr)
   177  	assert.Len(t, cposts, 1)
   178  	assert.Equal(t, cposts[0].PostId, o2a.Id)
   179  
   180  	cr3 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1, Emails: u2.Email + ", " + u1.Email}
   181  	cposts, nErr = ss.Compliance().ComplianceExport(cr3)
   182  	require.Nil(t, nErr)
   183  	assert.Len(t, cposts, 4)
   184  	assert.Equal(t, cposts[0].PostId, o1.Id)
   185  	assert.Equal(t, cposts[3].PostId, o2a.Id)
   186  
   187  	cr4 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1, Keywords: o2a.Message}
   188  	cposts, nErr = ss.Compliance().ComplianceExport(cr4)
   189  	require.Nil(t, nErr)
   190  	assert.Len(t, cposts, 1)
   191  	assert.Equal(t, cposts[0].PostId, o2a.Id)
   192  
   193  	cr5 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1, Keywords: o2a.Message + " " + o1.Message}
   194  	cposts, nErr = ss.Compliance().ComplianceExport(cr5)
   195  	require.Nil(t, nErr)
   196  	assert.Len(t, cposts, 2)
   197  	assert.Equal(t, cposts[0].PostId, o1.Id)
   198  
   199  	cr6 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1, Emails: u2.Email + ", " + u1.Email, Keywords: o2a.Message + " " + o1.Message}
   200  	cposts, nErr = ss.Compliance().ComplianceExport(cr6)
   201  	require.Nil(t, nErr)
   202  	assert.Len(t, cposts, 2)
   203  	assert.Equal(t, cposts[0].PostId, o1.Id)
   204  	assert.Equal(t, cposts[1].PostId, o2a.Id)
   205  }
   206  
   207  func testComplianceExportDirectMessages(t *testing.T, ss store.Store) {
   208  	time.Sleep(100 * time.Millisecond)
   209  
   210  	t1 := &model.Team{}
   211  	t1.DisplayName = "DisplayName"
   212  	t1.Name = "zz" + model.NewId() + "b"
   213  	t1.Email = MakeEmail()
   214  	t1.Type = model.TEAM_OPEN
   215  	t1, err := ss.Team().Save(t1)
   216  	require.Nil(t, err)
   217  
   218  	u1 := &model.User{}
   219  	u1.Email = MakeEmail()
   220  	u1.Username = model.NewId()
   221  	u1, err = ss.User().Save(u1)
   222  	require.Nil(t, err)
   223  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: t1.Id, UserId: u1.Id}, -1)
   224  	require.Nil(t, err)
   225  
   226  	u2 := &model.User{}
   227  	u2.Email = MakeEmail()
   228  	u2.Username = model.NewId()
   229  	u2, err = ss.User().Save(u2)
   230  	require.Nil(t, err)
   231  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: t1.Id, UserId: u2.Id}, -1)
   232  	require.Nil(t, err)
   233  
   234  	c1 := &model.Channel{}
   235  	c1.TeamId = t1.Id
   236  	c1.DisplayName = "Channel2"
   237  	c1.Name = "zz" + model.NewId() + "b"
   238  	c1.Type = model.CHANNEL_OPEN
   239  	c1, nErr := ss.Channel().Save(c1, -1)
   240  	require.Nil(t, nErr)
   241  
   242  	cDM, nErr := ss.Channel().CreateDirectChannel(u1, u2)
   243  	require.Nil(t, nErr)
   244  	o1 := &model.Post{}
   245  	o1.ChannelId = c1.Id
   246  	o1.UserId = u1.Id
   247  	o1.CreateAt = model.GetMillis()
   248  	o1.Message = "zz" + model.NewId() + "b"
   249  	o1, err = ss.Post().Save(o1)
   250  	require.Nil(t, err)
   251  
   252  	o1a := &model.Post{}
   253  	o1a.ChannelId = c1.Id
   254  	o1a.UserId = u1.Id
   255  	o1a.CreateAt = o1.CreateAt + 10
   256  	o1a.Message = "zz" + model.NewId() + "b"
   257  	_, err = ss.Post().Save(o1a)
   258  	require.Nil(t, err)
   259  
   260  	o2 := &model.Post{}
   261  	o2.ChannelId = c1.Id
   262  	o2.UserId = u1.Id
   263  	o2.CreateAt = o1.CreateAt + 20
   264  	o2.Message = "zz" + model.NewId() + "b"
   265  	_, err = ss.Post().Save(o2)
   266  	require.Nil(t, err)
   267  
   268  	o2a := &model.Post{}
   269  	o2a.ChannelId = c1.Id
   270  	o2a.UserId = u2.Id
   271  	o2a.CreateAt = o1.CreateAt + 30
   272  	o2a.Message = "zz" + model.NewId() + "b"
   273  	_, err = ss.Post().Save(o2a)
   274  	require.Nil(t, err)
   275  
   276  	o3 := &model.Post{}
   277  	o3.ChannelId = cDM.Id
   278  	o3.UserId = u1.Id
   279  	o3.CreateAt = o1.CreateAt + 40
   280  	o3.Message = "zz" + model.NewId() + "b"
   281  	o3, err = ss.Post().Save(o3)
   282  	require.Nil(t, err)
   283  
   284  	time.Sleep(100 * time.Millisecond)
   285  
   286  	cr1 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o3.CreateAt + 1, Emails: u1.Email}
   287  	cposts, nErr := ss.Compliance().ComplianceExport(cr1)
   288  	require.Nil(t, nErr)
   289  	assert.Len(t, cposts, 4)
   290  	assert.Equal(t, cposts[0].PostId, o1.Id)
   291  	assert.Equal(t, cposts[len(cposts)-1].PostId, o3.Id)
   292  }
   293  
   294  func testMessageExportPublicChannel(t *testing.T, ss store.Store) {
   295  	defer cleanupStoreState(t, ss)
   296  
   297  	// get the starting number of message export entries
   298  	startTime := model.GetMillis()
   299  	messages, err := ss.Compliance().MessageExport(startTime-10, 10)
   300  	require.Nil(t, err)
   301  	assert.Equal(t, 0, len(messages))
   302  
   303  	// need a team
   304  	team := &model.Team{
   305  		DisplayName: "DisplayName",
   306  		Name:        "zz" + model.NewId() + "b",
   307  		Email:       MakeEmail(),
   308  		Type:        model.TEAM_OPEN,
   309  	}
   310  	team, err = ss.Team().Save(team)
   311  	require.Nil(t, err)
   312  
   313  	// and two users that are a part of that team
   314  	user1 := &model.User{
   315  		Email:    MakeEmail(),
   316  		Username: model.NewId(),
   317  	}
   318  	user1, err = ss.User().Save(user1)
   319  	require.Nil(t, err)
   320  	_, err = ss.Team().SaveMember(&model.TeamMember{
   321  		TeamId: team.Id,
   322  		UserId: user1.Id,
   323  	}, -1)
   324  	require.Nil(t, err)
   325  
   326  	user2 := &model.User{
   327  		Email:    MakeEmail(),
   328  		Username: model.NewId(),
   329  	}
   330  	user2, err = ss.User().Save(user2)
   331  	require.Nil(t, err)
   332  	_, err = ss.Team().SaveMember(&model.TeamMember{
   333  		TeamId: team.Id,
   334  		UserId: user2.Id,
   335  	}, -1)
   336  	require.Nil(t, err)
   337  
   338  	// need a public channel
   339  	channel := &model.Channel{
   340  		TeamId:      team.Id,
   341  		Name:        model.NewId(),
   342  		DisplayName: "Public Channel",
   343  		Type:        model.CHANNEL_OPEN,
   344  	}
   345  	channel, nErr := ss.Channel().Save(channel, -1)
   346  	require.Nil(t, nErr)
   347  
   348  	// user1 posts twice in the public channel
   349  	post1 := &model.Post{
   350  		ChannelId: channel.Id,
   351  		UserId:    user1.Id,
   352  		CreateAt:  startTime,
   353  		Message:   "zz" + model.NewId() + "a",
   354  	}
   355  	post1, err = ss.Post().Save(post1)
   356  	require.Nil(t, err)
   357  
   358  	post2 := &model.Post{
   359  		ChannelId: channel.Id,
   360  		UserId:    user1.Id,
   361  		CreateAt:  startTime + 10,
   362  		Message:   "zz" + model.NewId() + "b",
   363  	}
   364  	post2, err = ss.Post().Save(post2)
   365  	require.Nil(t, err)
   366  
   367  	// fetch the message exports for both posts that user1 sent
   368  	messageExportMap := map[string]model.MessageExport{}
   369  	messages, err = ss.Compliance().MessageExport(startTime-10, 10)
   370  	require.Nil(t, err)
   371  	assert.Equal(t, 2, len(messages))
   372  
   373  	for _, v := range messages {
   374  		messageExportMap[*v.PostId] = *v
   375  	}
   376  
   377  	// post1 was made by user1 in channel1 and team1
   378  	assert.Equal(t, post1.Id, *messageExportMap[post1.Id].PostId)
   379  	assert.Equal(t, post1.CreateAt, *messageExportMap[post1.Id].PostCreateAt)
   380  	assert.Equal(t, post1.Message, *messageExportMap[post1.Id].PostMessage)
   381  	assert.Equal(t, channel.Id, *messageExportMap[post1.Id].ChannelId)
   382  	assert.Equal(t, channel.DisplayName, *messageExportMap[post1.Id].ChannelDisplayName)
   383  	assert.Equal(t, user1.Id, *messageExportMap[post1.Id].UserId)
   384  	assert.Equal(t, user1.Email, *messageExportMap[post1.Id].UserEmail)
   385  	assert.Equal(t, user1.Username, *messageExportMap[post1.Id].Username)
   386  
   387  	// post2 was made by user1 in channel1 and team1
   388  	assert.Equal(t, post2.Id, *messageExportMap[post2.Id].PostId)
   389  	assert.Equal(t, post2.CreateAt, *messageExportMap[post2.Id].PostCreateAt)
   390  	assert.Equal(t, post2.Message, *messageExportMap[post2.Id].PostMessage)
   391  	assert.Equal(t, channel.Id, *messageExportMap[post2.Id].ChannelId)
   392  	assert.Equal(t, channel.DisplayName, *messageExportMap[post2.Id].ChannelDisplayName)
   393  	assert.Equal(t, user1.Id, *messageExportMap[post2.Id].UserId)
   394  	assert.Equal(t, user1.Email, *messageExportMap[post2.Id].UserEmail)
   395  	assert.Equal(t, user1.Username, *messageExportMap[post2.Id].Username)
   396  }
   397  
   398  func testMessageExportPrivateChannel(t *testing.T, ss store.Store) {
   399  	defer cleanupStoreState(t, ss)
   400  
   401  	// get the starting number of message export entries
   402  	startTime := model.GetMillis()
   403  	messages, err := ss.Compliance().MessageExport(startTime-10, 10)
   404  	require.Nil(t, err)
   405  	assert.Equal(t, 0, len(messages))
   406  
   407  	// need a team
   408  	team := &model.Team{
   409  		DisplayName: "DisplayName",
   410  		Name:        "zz" + model.NewId() + "b",
   411  		Email:       MakeEmail(),
   412  		Type:        model.TEAM_OPEN,
   413  	}
   414  	team, err = ss.Team().Save(team)
   415  	require.Nil(t, err)
   416  
   417  	// and two users that are a part of that team
   418  	user1 := &model.User{
   419  		Email:    MakeEmail(),
   420  		Username: model.NewId(),
   421  	}
   422  	user1, err = ss.User().Save(user1)
   423  	require.Nil(t, err)
   424  	_, err = ss.Team().SaveMember(&model.TeamMember{
   425  		TeamId: team.Id,
   426  		UserId: user1.Id,
   427  	}, -1)
   428  	require.Nil(t, err)
   429  
   430  	user2 := &model.User{
   431  		Email:    MakeEmail(),
   432  		Username: model.NewId(),
   433  	}
   434  	user2, err = ss.User().Save(user2)
   435  	require.Nil(t, err)
   436  	_, err = ss.Team().SaveMember(&model.TeamMember{
   437  		TeamId: team.Id,
   438  		UserId: user2.Id,
   439  	}, -1)
   440  	require.Nil(t, err)
   441  
   442  	// need a private channel
   443  	channel := &model.Channel{
   444  		TeamId:      team.Id,
   445  		Name:        model.NewId(),
   446  		DisplayName: "Private Channel",
   447  		Type:        model.CHANNEL_PRIVATE,
   448  	}
   449  	channel, nErr := ss.Channel().Save(channel, -1)
   450  	require.Nil(t, nErr)
   451  
   452  	// user1 posts twice in the private channel
   453  	post1 := &model.Post{
   454  		ChannelId: channel.Id,
   455  		UserId:    user1.Id,
   456  		CreateAt:  startTime,
   457  		Message:   "zz" + model.NewId() + "a",
   458  	}
   459  	post1, err = ss.Post().Save(post1)
   460  	require.Nil(t, err)
   461  
   462  	post2 := &model.Post{
   463  		ChannelId: channel.Id,
   464  		UserId:    user1.Id,
   465  		CreateAt:  startTime + 10,
   466  		Message:   "zz" + model.NewId() + "b",
   467  	}
   468  	post2, err = ss.Post().Save(post2)
   469  	require.Nil(t, err)
   470  
   471  	// fetch the message exports for both posts that user1 sent
   472  	messageExportMap := map[string]model.MessageExport{}
   473  	messages, err = ss.Compliance().MessageExport(startTime-10, 10)
   474  	require.Nil(t, err)
   475  	assert.Equal(t, 2, len(messages))
   476  
   477  	for _, v := range messages {
   478  		messageExportMap[*v.PostId] = *v
   479  	}
   480  
   481  	// post1 was made by user1 in channel1 and team1
   482  	assert.Equal(t, post1.Id, *messageExportMap[post1.Id].PostId)
   483  	assert.Equal(t, post1.CreateAt, *messageExportMap[post1.Id].PostCreateAt)
   484  	assert.Equal(t, post1.Message, *messageExportMap[post1.Id].PostMessage)
   485  	assert.Equal(t, channel.Id, *messageExportMap[post1.Id].ChannelId)
   486  	assert.Equal(t, channel.DisplayName, *messageExportMap[post1.Id].ChannelDisplayName)
   487  	assert.Equal(t, channel.Type, *messageExportMap[post1.Id].ChannelType)
   488  	assert.Equal(t, user1.Id, *messageExportMap[post1.Id].UserId)
   489  	assert.Equal(t, user1.Email, *messageExportMap[post1.Id].UserEmail)
   490  	assert.Equal(t, user1.Username, *messageExportMap[post1.Id].Username)
   491  
   492  	// post2 was made by user1 in channel1 and team1
   493  	assert.Equal(t, post2.Id, *messageExportMap[post2.Id].PostId)
   494  	assert.Equal(t, post2.CreateAt, *messageExportMap[post2.Id].PostCreateAt)
   495  	assert.Equal(t, post2.Message, *messageExportMap[post2.Id].PostMessage)
   496  	assert.Equal(t, channel.Id, *messageExportMap[post2.Id].ChannelId)
   497  	assert.Equal(t, channel.DisplayName, *messageExportMap[post2.Id].ChannelDisplayName)
   498  	assert.Equal(t, channel.Type, *messageExportMap[post2.Id].ChannelType)
   499  	assert.Equal(t, user1.Id, *messageExportMap[post2.Id].UserId)
   500  	assert.Equal(t, user1.Email, *messageExportMap[post2.Id].UserEmail)
   501  	assert.Equal(t, user1.Username, *messageExportMap[post2.Id].Username)
   502  }
   503  
   504  func testMessageExportDirectMessageChannel(t *testing.T, ss store.Store) {
   505  	defer cleanupStoreState(t, ss)
   506  
   507  	// get the starting number of message export entries
   508  	startTime := model.GetMillis()
   509  	messages, err := ss.Compliance().MessageExport(startTime-10, 10)
   510  	require.Nil(t, err)
   511  	assert.Equal(t, 0, len(messages))
   512  
   513  	// need a team
   514  	team := &model.Team{
   515  		DisplayName: "DisplayName",
   516  		Name:        "zz" + model.NewId() + "b",
   517  		Email:       MakeEmail(),
   518  		Type:        model.TEAM_OPEN,
   519  	}
   520  	team, err = ss.Team().Save(team)
   521  	require.Nil(t, err)
   522  
   523  	// and two users that are a part of that team
   524  	user1 := &model.User{
   525  		Email:    MakeEmail(),
   526  		Username: model.NewId(),
   527  	}
   528  	user1, err = ss.User().Save(user1)
   529  	require.Nil(t, err)
   530  	_, err = ss.Team().SaveMember(&model.TeamMember{
   531  		TeamId: team.Id,
   532  		UserId: user1.Id,
   533  	}, -1)
   534  	require.Nil(t, err)
   535  
   536  	user2 := &model.User{
   537  		Email:    MakeEmail(),
   538  		Username: model.NewId(),
   539  	}
   540  	user2, err = ss.User().Save(user2)
   541  	require.Nil(t, err)
   542  	_, err = ss.Team().SaveMember(&model.TeamMember{
   543  		TeamId: team.Id,
   544  		UserId: user2.Id,
   545  	}, -1)
   546  	require.Nil(t, err)
   547  
   548  	// as well as a DM channel between those users
   549  	directMessageChannel, nErr := ss.Channel().CreateDirectChannel(user1, user2)
   550  	require.Nil(t, nErr)
   551  
   552  	// user1 also sends a DM to user2
   553  	post := &model.Post{
   554  		ChannelId: directMessageChannel.Id,
   555  		UserId:    user1.Id,
   556  		CreateAt:  startTime + 20,
   557  		Message:   "zz" + model.NewId() + "c",
   558  	}
   559  	post, err = ss.Post().Save(post)
   560  	require.Nil(t, err)
   561  
   562  	// fetch the message export for the post that user1 sent
   563  	messageExportMap := map[string]model.MessageExport{}
   564  	messages, err = ss.Compliance().MessageExport(startTime-10, 10)
   565  	require.Nil(t, err)
   566  
   567  	assert.Equal(t, 1, len(messages))
   568  
   569  	for _, v := range messages {
   570  		messageExportMap[*v.PostId] = *v
   571  	}
   572  
   573  	// post is a DM between user1 and user2
   574  	// there is no channel display name for direct messages, so we sub in the string "Direct Message" instead
   575  	assert.Equal(t, post.Id, *messageExportMap[post.Id].PostId)
   576  	assert.Equal(t, post.CreateAt, *messageExportMap[post.Id].PostCreateAt)
   577  	assert.Equal(t, post.Message, *messageExportMap[post.Id].PostMessage)
   578  	assert.Equal(t, directMessageChannel.Id, *messageExportMap[post.Id].ChannelId)
   579  	assert.Equal(t, "Direct Message", *messageExportMap[post.Id].ChannelDisplayName)
   580  	assert.Equal(t, user1.Id, *messageExportMap[post.Id].UserId)
   581  	assert.Equal(t, user1.Email, *messageExportMap[post.Id].UserEmail)
   582  	assert.Equal(t, user1.Username, *messageExportMap[post.Id].Username)
   583  }
   584  
   585  func testMessageExportGroupMessageChannel(t *testing.T, ss store.Store) {
   586  	defer cleanupStoreState(t, ss)
   587  
   588  	// get the starting number of message export entries
   589  	startTime := model.GetMillis()
   590  	messages, err := ss.Compliance().MessageExport(startTime-10, 10)
   591  	require.Nil(t, err)
   592  	assert.Equal(t, 0, len(messages))
   593  
   594  	// need a team
   595  	team := &model.Team{
   596  		DisplayName: "DisplayName",
   597  		Name:        "zz" + model.NewId() + "b",
   598  		Email:       MakeEmail(),
   599  		Type:        model.TEAM_OPEN,
   600  	}
   601  	team, err = ss.Team().Save(team)
   602  	require.Nil(t, err)
   603  
   604  	// and three users that are a part of that team
   605  	user1 := &model.User{
   606  		Email:    MakeEmail(),
   607  		Username: model.NewId(),
   608  	}
   609  	user1, err = ss.User().Save(user1)
   610  	require.Nil(t, err)
   611  	_, err = ss.Team().SaveMember(&model.TeamMember{
   612  		TeamId: team.Id,
   613  		UserId: user1.Id,
   614  	}, -1)
   615  	require.Nil(t, err)
   616  
   617  	user2 := &model.User{
   618  		Email:    MakeEmail(),
   619  		Username: model.NewId(),
   620  	}
   621  	user2, err = ss.User().Save(user2)
   622  	require.Nil(t, err)
   623  	_, err = ss.Team().SaveMember(&model.TeamMember{
   624  		TeamId: team.Id,
   625  		UserId: user2.Id,
   626  	}, -1)
   627  	require.Nil(t, err)
   628  
   629  	user3 := &model.User{
   630  		Email:    MakeEmail(),
   631  		Username: model.NewId(),
   632  	}
   633  	user3, err = ss.User().Save(user3)
   634  	require.Nil(t, err)
   635  	_, err = ss.Team().SaveMember(&model.TeamMember{
   636  		TeamId: team.Id,
   637  		UserId: user3.Id,
   638  	}, -1)
   639  	require.Nil(t, err)
   640  
   641  	// can't create a group channel directly, because importing app creates an import cycle, so we have to fake it
   642  	groupMessageChannel := &model.Channel{
   643  		TeamId: team.Id,
   644  		Name:   model.NewId(),
   645  		Type:   model.CHANNEL_GROUP,
   646  	}
   647  	groupMessageChannel, nErr := ss.Channel().Save(groupMessageChannel, -1)
   648  	require.Nil(t, nErr)
   649  
   650  	// user1 posts in the GM
   651  	post := &model.Post{
   652  		ChannelId: groupMessageChannel.Id,
   653  		UserId:    user1.Id,
   654  		CreateAt:  startTime + 20,
   655  		Message:   "zz" + model.NewId() + "c",
   656  	}
   657  	post, err = ss.Post().Save(post)
   658  	require.Nil(t, err)
   659  
   660  	// fetch the message export for the post that user1 sent
   661  	messageExportMap := map[string]model.MessageExport{}
   662  	messages, err = ss.Compliance().MessageExport(startTime-10, 10)
   663  	require.Nil(t, err)
   664  	assert.Equal(t, 1, len(messages))
   665  
   666  	for _, v := range messages {
   667  		messageExportMap[*v.PostId] = *v
   668  	}
   669  
   670  	// post is a DM between user1 and user2
   671  	// there is no channel display name for direct messages, so we sub in the string "Direct Message" instead
   672  	assert.Equal(t, post.Id, *messageExportMap[post.Id].PostId)
   673  	assert.Equal(t, post.CreateAt, *messageExportMap[post.Id].PostCreateAt)
   674  	assert.Equal(t, post.Message, *messageExportMap[post.Id].PostMessage)
   675  	assert.Equal(t, groupMessageChannel.Id, *messageExportMap[post.Id].ChannelId)
   676  	assert.Equal(t, "Group Message", *messageExportMap[post.Id].ChannelDisplayName)
   677  	assert.Equal(t, user1.Id, *messageExportMap[post.Id].UserId)
   678  	assert.Equal(t, user1.Email, *messageExportMap[post.Id].UserEmail)
   679  	assert.Equal(t, user1.Username, *messageExportMap[post.Id].Username)
   680  }
   681  
   682  //post,edit,export
   683  func testEditExportMessage(t *testing.T, ss store.Store) {
   684  	defer cleanupStoreState(t, ss)
   685  	// get the starting number of message export entries
   686  	startTime := model.GetMillis()
   687  	messages, err := ss.Compliance().MessageExport(startTime-1, 10)
   688  	require.Nil(t, err)
   689  	assert.Equal(t, 0, len(messages))
   690  
   691  	// need a team
   692  	team := &model.Team{
   693  		DisplayName: "DisplayName",
   694  		Name:        "zz" + model.NewId() + "b",
   695  		Email:       MakeEmail(),
   696  		Type:        model.TEAM_OPEN,
   697  	}
   698  	team, err = ss.Team().Save(team)
   699  	require.Nil(t, err)
   700  
   701  	// need a user part of that team
   702  	user1 := &model.User{
   703  		Email:    MakeEmail(),
   704  		Username: model.NewId(),
   705  	}
   706  	user1, err = ss.User().Save(user1)
   707  	require.Nil(t, err)
   708  	_, err = ss.Team().SaveMember(&model.TeamMember{
   709  		TeamId: team.Id,
   710  		UserId: user1.Id,
   711  	}, -1)
   712  	require.Nil(t, err)
   713  
   714  	// need a public channel
   715  	channel := &model.Channel{
   716  		TeamId:      team.Id,
   717  		Name:        model.NewId(),
   718  		DisplayName: "Public Channel",
   719  		Type:        model.CHANNEL_OPEN,
   720  	}
   721  	channel, nErr := ss.Channel().Save(channel, -1)
   722  	require.Nil(t, nErr)
   723  
   724  	// user1 posts in the public channel
   725  	post1 := &model.Post{
   726  		ChannelId: channel.Id,
   727  		UserId:    user1.Id,
   728  		CreateAt:  startTime,
   729  		Message:   "zz" + model.NewId() + "a",
   730  	}
   731  	post1, err = ss.Post().Save(post1)
   732  	require.Nil(t, err)
   733  
   734  	//user 1 edits the previous post
   735  	post1e := &model.Post{}
   736  	post1e = post1.Clone()
   737  	post1e.Message = "edit " + post1.Message
   738  
   739  	post1e, err = ss.Post().Update(post1e, post1)
   740  	require.Nil(t, err)
   741  
   742  	// fetch the message exports from the start
   743  	messages, err = ss.Compliance().MessageExport(startTime-1, 10)
   744  	require.Nil(t, err)
   745  	assert.Equal(t, 2, len(messages))
   746  
   747  	for _, v := range messages {
   748  		if *v.PostDeleteAt > 0 {
   749  			// post1 was made by user1 in channel1 and team1
   750  			assert.Equal(t, post1.Id, *v.PostId)
   751  			assert.Equal(t, post1.OriginalId, *v.PostOriginalId)
   752  			assert.Equal(t, post1.CreateAt, *v.PostCreateAt)
   753  			assert.Equal(t, post1.UpdateAt, *v.PostUpdateAt)
   754  			assert.Equal(t, post1.Message, *v.PostMessage)
   755  			assert.Equal(t, channel.Id, *v.ChannelId)
   756  			assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName)
   757  			assert.Equal(t, user1.Id, *v.UserId)
   758  			assert.Equal(t, user1.Email, *v.UserEmail)
   759  			assert.Equal(t, user1.Username, *v.Username)
   760  		} else {
   761  			// post1e was made by user1 in channel1 and team1
   762  			assert.Equal(t, post1e.Id, *v.PostId)
   763  			assert.Equal(t, post1e.CreateAt, *v.PostCreateAt)
   764  			assert.Equal(t, post1e.UpdateAt, *v.PostUpdateAt)
   765  			assert.Equal(t, post1e.Message, *v.PostMessage)
   766  			assert.Equal(t, channel.Id, *v.ChannelId)
   767  			assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName)
   768  			assert.Equal(t, user1.Id, *v.UserId)
   769  			assert.Equal(t, user1.Email, *v.UserEmail)
   770  			assert.Equal(t, user1.Username, *v.Username)
   771  		}
   772  	}
   773  }
   774  
   775  //post, export, edit, export
   776  func testEditAfterExportMessage(t *testing.T, ss store.Store) {
   777  	defer cleanupStoreState(t, ss)
   778  	// get the starting number of message export entries
   779  	startTime := model.GetMillis()
   780  	messages, err := ss.Compliance().MessageExport(startTime-1, 10)
   781  	require.Nil(t, err)
   782  	assert.Equal(t, 0, len(messages))
   783  
   784  	// need a team
   785  	team := &model.Team{
   786  		DisplayName: "DisplayName",
   787  		Name:        "zz" + model.NewId() + "b",
   788  		Email:       MakeEmail(),
   789  		Type:        model.TEAM_OPEN,
   790  	}
   791  	team, err = ss.Team().Save(team)
   792  	require.Nil(t, err)
   793  
   794  	// need a user part of that team
   795  	user1 := &model.User{
   796  		Email:    MakeEmail(),
   797  		Username: model.NewId(),
   798  	}
   799  	user1, err = ss.User().Save(user1)
   800  	require.Nil(t, err)
   801  	_, err = ss.Team().SaveMember(&model.TeamMember{
   802  		TeamId: team.Id,
   803  		UserId: user1.Id,
   804  	}, -1)
   805  	require.Nil(t, err)
   806  
   807  	// need a public channel
   808  	channel := &model.Channel{
   809  		TeamId:      team.Id,
   810  		Name:        model.NewId(),
   811  		DisplayName: "Public Channel",
   812  		Type:        model.CHANNEL_OPEN,
   813  	}
   814  	channel, nErr := ss.Channel().Save(channel, -1)
   815  	require.Nil(t, nErr)
   816  
   817  	// user1 posts in the public channel
   818  	post1 := &model.Post{
   819  		ChannelId: channel.Id,
   820  		UserId:    user1.Id,
   821  		CreateAt:  startTime,
   822  		Message:   "zz" + model.NewId() + "a",
   823  	}
   824  	post1, err = ss.Post().Save(post1)
   825  	require.Nil(t, err)
   826  
   827  	// fetch the message exports from the start
   828  	messages, err = ss.Compliance().MessageExport(startTime-1, 10)
   829  	require.Nil(t, err)
   830  	assert.Equal(t, 1, len(messages))
   831  
   832  	v := messages[0]
   833  	// post1 was made by user1 in channel1 and team1
   834  	assert.Equal(t, post1.Id, *v.PostId)
   835  	assert.Equal(t, post1.OriginalId, *v.PostOriginalId)
   836  	assert.Equal(t, post1.CreateAt, *v.PostCreateAt)
   837  	assert.Equal(t, post1.UpdateAt, *v.PostUpdateAt)
   838  	assert.Equal(t, post1.Message, *v.PostMessage)
   839  	assert.Equal(t, channel.Id, *v.ChannelId)
   840  	assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName)
   841  	assert.Equal(t, user1.Id, *v.UserId)
   842  	assert.Equal(t, user1.Email, *v.UserEmail)
   843  	assert.Equal(t, user1.Username, *v.Username)
   844  
   845  	postEditTime := post1.UpdateAt + 1
   846  	//user 1 edits the previous post
   847  	post1e := &model.Post{}
   848  	post1e = post1.Clone()
   849  	post1e.EditAt = postEditTime
   850  	post1e.Message = "edit " + post1.Message
   851  	post1e, err = ss.Post().Update(post1e, post1)
   852  	require.Nil(t, err)
   853  
   854  	// fetch the message exports after edit
   855  	messages, err = ss.Compliance().MessageExport(postEditTime-1, 10)
   856  	require.Nil(t, err)
   857  	assert.Equal(t, 2, len(messages))
   858  
   859  	for _, v := range messages {
   860  		if *v.PostDeleteAt > 0 {
   861  			// post1 was made by user1 in channel1 and team1
   862  			assert.Equal(t, post1.Id, *v.PostId)
   863  			assert.Equal(t, post1.OriginalId, *v.PostOriginalId)
   864  			assert.Equal(t, post1.CreateAt, *v.PostCreateAt)
   865  			assert.Equal(t, post1.UpdateAt, *v.PostUpdateAt)
   866  			assert.Equal(t, post1.Message, *v.PostMessage)
   867  			assert.Equal(t, channel.Id, *v.ChannelId)
   868  			assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName)
   869  			assert.Equal(t, user1.Id, *v.UserId)
   870  			assert.Equal(t, user1.Email, *v.UserEmail)
   871  			assert.Equal(t, user1.Username, *v.Username)
   872  		} else {
   873  			// post1e was made by user1 in channel1 and team1
   874  			assert.Equal(t, post1e.Id, *v.PostId)
   875  			assert.Equal(t, post1e.CreateAt, *v.PostCreateAt)
   876  			assert.Equal(t, post1e.UpdateAt, *v.PostUpdateAt)
   877  			assert.Equal(t, post1e.Message, *v.PostMessage)
   878  			assert.Equal(t, channel.Id, *v.ChannelId)
   879  			assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName)
   880  			assert.Equal(t, user1.Id, *v.UserId)
   881  			assert.Equal(t, user1.Email, *v.UserEmail)
   882  			assert.Equal(t, user1.Username, *v.Username)
   883  		}
   884  	}
   885  }
   886  
   887  //post, delete, export
   888  func testDeleteExportMessage(t *testing.T, ss store.Store) {
   889  	defer cleanupStoreState(t, ss)
   890  	// get the starting number of message export entries
   891  	startTime := model.GetMillis()
   892  	messages, err := ss.Compliance().MessageExport(startTime-1, 10)
   893  	require.Nil(t, err)
   894  	assert.Equal(t, 0, len(messages))
   895  
   896  	// need a team
   897  	team := &model.Team{
   898  		DisplayName: "DisplayName",
   899  		Name:        "zz" + model.NewId() + "b",
   900  		Email:       MakeEmail(),
   901  		Type:        model.TEAM_OPEN,
   902  	}
   903  	team, err = ss.Team().Save(team)
   904  	require.Nil(t, err)
   905  
   906  	// need a user part of that team
   907  	user1 := &model.User{
   908  		Email:    MakeEmail(),
   909  		Username: model.NewId(),
   910  	}
   911  	user1, err = ss.User().Save(user1)
   912  	require.Nil(t, err)
   913  	_, err = ss.Team().SaveMember(&model.TeamMember{
   914  		TeamId: team.Id,
   915  		UserId: user1.Id,
   916  	}, -1)
   917  	require.Nil(t, err)
   918  
   919  	// need a public channel
   920  	channel := &model.Channel{
   921  		TeamId:      team.Id,
   922  		Name:        model.NewId(),
   923  		DisplayName: "Public Channel",
   924  		Type:        model.CHANNEL_OPEN,
   925  	}
   926  	channel, nErr := ss.Channel().Save(channel, -1)
   927  	require.Nil(t, nErr)
   928  
   929  	// user1 posts in the public channel
   930  	post1 := &model.Post{
   931  		ChannelId: channel.Id,
   932  		UserId:    user1.Id,
   933  		CreateAt:  startTime,
   934  		Message:   "zz" + model.NewId() + "a",
   935  	}
   936  	post1, err = ss.Post().Save(post1)
   937  	require.Nil(t, err)
   938  
   939  	//user 1 deletes the previous post
   940  	postDeleteTime := post1.UpdateAt + 1
   941  	err = ss.Post().Delete(post1.Id, postDeleteTime, user1.Id)
   942  	require.Nil(t, err)
   943  
   944  	// fetch the message exports from the start
   945  	messages, err = ss.Compliance().MessageExport(startTime-1, 10)
   946  	require.Nil(t, err)
   947  	assert.Equal(t, 1, len(messages))
   948  
   949  	v := messages[0]
   950  	// post1 was made and deleted by user1 in channel1 and team1
   951  	assert.Equal(t, post1.Id, *v.PostId)
   952  	assert.Equal(t, post1.OriginalId, *v.PostOriginalId)
   953  	assert.Equal(t, post1.CreateAt, *v.PostCreateAt)
   954  	assert.Equal(t, postDeleteTime, *v.PostUpdateAt)
   955  	assert.NotNil(t, v.PostProps)
   956  
   957  	props := map[string]interface{}{}
   958  	e := json.Unmarshal([]byte(*v.PostProps), &props)
   959  	require.Nil(t, e)
   960  
   961  	_, ok := props[model.POST_PROPS_DELETE_BY]
   962  	assert.True(t, ok)
   963  
   964  	assert.Equal(t, post1.Message, *v.PostMessage)
   965  	assert.Equal(t, channel.Id, *v.ChannelId)
   966  	assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName)
   967  	assert.Equal(t, user1.Id, *v.UserId)
   968  	assert.Equal(t, user1.Email, *v.UserEmail)
   969  	assert.Equal(t, user1.Username, *v.Username)
   970  }
   971  
   972  //post,export,delete,export
   973  func testDeleteAfterExportMessage(t *testing.T, ss store.Store) {
   974  	defer cleanupStoreState(t, ss)
   975  	// get the starting number of message export entries
   976  	startTime := model.GetMillis()
   977  	messages, err := ss.Compliance().MessageExport(startTime-1, 10)
   978  	require.Nil(t, err)
   979  	assert.Equal(t, 0, len(messages))
   980  
   981  	// need a team
   982  	team := &model.Team{
   983  		DisplayName: "DisplayName",
   984  		Name:        "zz" + model.NewId() + "b",
   985  		Email:       MakeEmail(),
   986  		Type:        model.TEAM_OPEN,
   987  	}
   988  	team, err = ss.Team().Save(team)
   989  	require.Nil(t, err)
   990  
   991  	// need a user part of that team
   992  	user1 := &model.User{
   993  		Email:    MakeEmail(),
   994  		Username: model.NewId(),
   995  	}
   996  	user1, err = ss.User().Save(user1)
   997  	require.Nil(t, err)
   998  	_, err = ss.Team().SaveMember(&model.TeamMember{
   999  		TeamId: team.Id,
  1000  		UserId: user1.Id,
  1001  	}, -1)
  1002  	require.Nil(t, err)
  1003  
  1004  	// need a public channel
  1005  	channel := &model.Channel{
  1006  		TeamId:      team.Id,
  1007  		Name:        model.NewId(),
  1008  		DisplayName: "Public Channel",
  1009  		Type:        model.CHANNEL_OPEN,
  1010  	}
  1011  	channel, nErr := ss.Channel().Save(channel, -1)
  1012  	require.Nil(t, nErr)
  1013  
  1014  	// user1 posts in the public channel
  1015  	post1 := &model.Post{
  1016  		ChannelId: channel.Id,
  1017  		UserId:    user1.Id,
  1018  		CreateAt:  startTime,
  1019  		Message:   "zz" + model.NewId() + "a",
  1020  	}
  1021  	post1, err = ss.Post().Save(post1)
  1022  	require.Nil(t, err)
  1023  
  1024  	// fetch the message exports from the start
  1025  	messages, err = ss.Compliance().MessageExport(startTime-1, 10)
  1026  	require.Nil(t, err)
  1027  	assert.Equal(t, 1, len(messages))
  1028  
  1029  	v := messages[0]
  1030  	// post1 was created by user1 in channel1 and team1
  1031  	assert.Equal(t, post1.Id, *v.PostId)
  1032  	assert.Equal(t, post1.OriginalId, *v.PostOriginalId)
  1033  	assert.Equal(t, post1.CreateAt, *v.PostCreateAt)
  1034  	assert.Equal(t, post1.UpdateAt, *v.PostUpdateAt)
  1035  	assert.Equal(t, post1.Message, *v.PostMessage)
  1036  	assert.Equal(t, channel.Id, *v.ChannelId)
  1037  	assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName)
  1038  	assert.Equal(t, user1.Id, *v.UserId)
  1039  	assert.Equal(t, user1.Email, *v.UserEmail)
  1040  	assert.Equal(t, user1.Username, *v.Username)
  1041  
  1042  	//user 1 deletes the previous post
  1043  	postDeleteTime := post1.UpdateAt + 1
  1044  	err = ss.Post().Delete(post1.Id, postDeleteTime, user1.Id)
  1045  	require.Nil(t, err)
  1046  
  1047  	// fetch the message exports after delete
  1048  	messages, err = ss.Compliance().MessageExport(postDeleteTime-1, 10)
  1049  	require.Nil(t, err)
  1050  	assert.Equal(t, 1, len(messages))
  1051  
  1052  	v = messages[0]
  1053  	// post1 was created and deleted by user1 in channel1 and team1
  1054  	assert.Equal(t, post1.Id, *v.PostId)
  1055  	assert.Equal(t, post1.OriginalId, *v.PostOriginalId)
  1056  	assert.Equal(t, post1.CreateAt, *v.PostCreateAt)
  1057  	assert.Equal(t, postDeleteTime, *v.PostUpdateAt)
  1058  	assert.NotNil(t, v.PostProps)
  1059  
  1060  	props := map[string]interface{}{}
  1061  	e := json.Unmarshal([]byte(*v.PostProps), &props)
  1062  	require.Nil(t, e)
  1063  
  1064  	_, ok := props[model.POST_PROPS_DELETE_BY]
  1065  	assert.True(t, ok)
  1066  
  1067  	assert.Equal(t, post1.Message, *v.PostMessage)
  1068  	assert.Equal(t, channel.Id, *v.ChannelId)
  1069  	assert.Equal(t, channel.DisplayName, *v.ChannelDisplayName)
  1070  	assert.Equal(t, user1.Id, *v.UserId)
  1071  	assert.Equal(t, user1.Email, *v.UserEmail)
  1072  	assert.Equal(t, user1.Username, *v.Username)
  1073  }