github.com/gigforks/mattermost-server@v4.9.1-0.20180619094218-800d97fa55d0+incompatible/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  	"testing"
     8  	"time"
     9  
    10  	"github.com/mattermost/mattermost-server/model"
    11  	"github.com/mattermost/mattermost-server/store"
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  func TestComplianceStore(t *testing.T, ss store.Store) {
    16  	t.Run("", func(t *testing.T) { testComplianceStore(t, ss) })
    17  	t.Run("ComplianceExport", func(t *testing.T) { testComplianceExport(t, ss) })
    18  	t.Run("ComplianceExportDirectMessages", func(t *testing.T) { testComplianceExportDirectMessages(t, ss) })
    19  	t.Run("MessageExportPublicChannel", func(t *testing.T) { testMessageExportPublicChannel(t, ss) })
    20  	t.Run("MessageExportPrivateChannel", func(t *testing.T) { testMessageExportPrivateChannel(t, ss) })
    21  	t.Run("MessageExportDirectMessageChannel", func(t *testing.T) { testMessageExportDirectMessageChannel(t, ss) })
    22  	t.Run("MessageExportGroupMessageChannel", func(t *testing.T) { testMessageExportGroupMessageChannel(t, ss) })
    23  }
    24  
    25  func testComplianceStore(t *testing.T, ss store.Store) {
    26  	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}
    27  	store.Must(ss.Compliance().Save(compliance1))
    28  	time.Sleep(100 * time.Millisecond)
    29  
    30  	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}
    31  	store.Must(ss.Compliance().Save(compliance2))
    32  	time.Sleep(100 * time.Millisecond)
    33  
    34  	c := ss.Compliance().GetAll(0, 1000)
    35  	result := <-c
    36  	compliances := result.Data.(model.Compliances)
    37  
    38  	if compliances[0].Status != model.COMPLIANCE_STATUS_RUNNING && compliance2.Id != compliances[0].Id {
    39  		t.Fatal()
    40  	}
    41  
    42  	compliance2.Status = model.COMPLIANCE_STATUS_FAILED
    43  	store.Must(ss.Compliance().Update(compliance2))
    44  
    45  	c = ss.Compliance().GetAll(0, 1000)
    46  	result = <-c
    47  	compliances = result.Data.(model.Compliances)
    48  
    49  	if compliances[0].Status != model.COMPLIANCE_STATUS_FAILED && compliance2.Id != compliances[0].Id {
    50  		t.Fatal()
    51  	}
    52  
    53  	c = ss.Compliance().GetAll(0, 1)
    54  	result = <-c
    55  	compliances = result.Data.(model.Compliances)
    56  
    57  	if len(compliances) != 1 {
    58  		t.Fatal("should only have returned 1")
    59  	}
    60  
    61  	c = ss.Compliance().GetAll(1, 1)
    62  	result = <-c
    63  	compliances = result.Data.(model.Compliances)
    64  
    65  	if len(compliances) != 1 {
    66  		t.Fatal("should only have returned 1")
    67  	}
    68  
    69  	rc2 := (<-ss.Compliance().Get(compliance2.Id)).Data.(*model.Compliance)
    70  	if rc2.Status != compliance2.Status {
    71  		t.Fatal()
    72  	}
    73  }
    74  
    75  func testComplianceExport(t *testing.T, ss store.Store) {
    76  	time.Sleep(100 * time.Millisecond)
    77  
    78  	t1 := &model.Team{}
    79  	t1.DisplayName = "DisplayName"
    80  	t1.Name = "zz" + model.NewId() + "b"
    81  	t1.Email = model.NewId() + "@nowhere.com"
    82  	t1.Type = model.TEAM_OPEN
    83  	t1 = store.Must(ss.Team().Save(t1)).(*model.Team)
    84  
    85  	u1 := &model.User{}
    86  	u1.Email = model.NewId()
    87  	u1.Username = model.NewId()
    88  	u1 = store.Must(ss.User().Save(u1)).(*model.User)
    89  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: t1.Id, UserId: u1.Id}, -1))
    90  
    91  	u2 := &model.User{}
    92  	u2.Email = model.NewId()
    93  	u2.Username = model.NewId()
    94  	u2 = store.Must(ss.User().Save(u2)).(*model.User)
    95  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: t1.Id, UserId: u2.Id}, -1))
    96  
    97  	c1 := &model.Channel{}
    98  	c1.TeamId = t1.Id
    99  	c1.DisplayName = "Channel2"
   100  	c1.Name = "zz" + model.NewId() + "b"
   101  	c1.Type = model.CHANNEL_OPEN
   102  	c1 = store.Must(ss.Channel().Save(c1, -1)).(*model.Channel)
   103  
   104  	o1 := &model.Post{}
   105  	o1.ChannelId = c1.Id
   106  	o1.UserId = u1.Id
   107  	o1.CreateAt = model.GetMillis()
   108  	o1.Message = "zz" + model.NewId() + "b"
   109  	o1 = store.Must(ss.Post().Save(o1)).(*model.Post)
   110  
   111  	o1a := &model.Post{}
   112  	o1a.ChannelId = c1.Id
   113  	o1a.UserId = u1.Id
   114  	o1a.CreateAt = o1.CreateAt + 10
   115  	o1a.Message = "zz" + model.NewId() + "b"
   116  	o1a = store.Must(ss.Post().Save(o1a)).(*model.Post)
   117  
   118  	o2 := &model.Post{}
   119  	o2.ChannelId = c1.Id
   120  	o2.UserId = u1.Id
   121  	o2.CreateAt = o1.CreateAt + 20
   122  	o2.Message = "zz" + model.NewId() + "b"
   123  	o2 = store.Must(ss.Post().Save(o2)).(*model.Post)
   124  
   125  	o2a := &model.Post{}
   126  	o2a.ChannelId = c1.Id
   127  	o2a.UserId = u2.Id
   128  	o2a.CreateAt = o1.CreateAt + 30
   129  	o2a.Message = "zz" + model.NewId() + "b"
   130  	o2a = store.Must(ss.Post().Save(o2a)).(*model.Post)
   131  
   132  	time.Sleep(100 * time.Millisecond)
   133  
   134  	cr1 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1}
   135  	if r1 := <-ss.Compliance().ComplianceExport(cr1); r1.Err != nil {
   136  		t.Fatal(r1.Err)
   137  	} else {
   138  		cposts := r1.Data.([]*model.CompliancePost)
   139  
   140  		if len(cposts) != 4 {
   141  			t.Fatal("return wrong results length")
   142  		}
   143  
   144  		if cposts[0].PostId != o1.Id {
   145  			t.Fatal("Wrong sort")
   146  		}
   147  
   148  		if cposts[3].PostId != o2a.Id {
   149  			t.Fatal("Wrong sort")
   150  		}
   151  	}
   152  
   153  	cr2 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1, Emails: u2.Email}
   154  	if r1 := <-ss.Compliance().ComplianceExport(cr2); r1.Err != nil {
   155  		t.Fatal(r1.Err)
   156  	} else {
   157  		cposts := r1.Data.([]*model.CompliancePost)
   158  
   159  		if len(cposts) != 1 {
   160  			t.Fatal("return wrong results length")
   161  		}
   162  
   163  		if cposts[0].PostId != o2a.Id {
   164  			t.Fatal("Wrong sort")
   165  		}
   166  	}
   167  
   168  	cr3 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1, Emails: u2.Email + ", " + u1.Email}
   169  	if r1 := <-ss.Compliance().ComplianceExport(cr3); r1.Err != nil {
   170  		t.Fatal(r1.Err)
   171  	} else {
   172  		cposts := r1.Data.([]*model.CompliancePost)
   173  
   174  		if len(cposts) != 4 {
   175  			t.Fatal("return wrong results length")
   176  		}
   177  
   178  		if cposts[0].PostId != o1.Id {
   179  			t.Fatal("Wrong sort")
   180  		}
   181  
   182  		if cposts[3].PostId != o2a.Id {
   183  			t.Fatal("Wrong sort")
   184  		}
   185  	}
   186  
   187  	cr4 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1, Keywords: o2a.Message}
   188  	if r1 := <-ss.Compliance().ComplianceExport(cr4); r1.Err != nil {
   189  		t.Fatal(r1.Err)
   190  	} else {
   191  		cposts := r1.Data.([]*model.CompliancePost)
   192  
   193  		if len(cposts) != 1 {
   194  			t.Fatal("return wrong results length")
   195  		}
   196  
   197  		if cposts[0].PostId != o2a.Id {
   198  			t.Fatal("Wrong sort")
   199  		}
   200  	}
   201  
   202  	cr5 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o2a.CreateAt + 1, Keywords: o2a.Message + " " + o1.Message}
   203  	if r1 := <-ss.Compliance().ComplianceExport(cr5); r1.Err != nil {
   204  		t.Fatal(r1.Err)
   205  	} else {
   206  		cposts := r1.Data.([]*model.CompliancePost)
   207  
   208  		if len(cposts) != 2 {
   209  			t.Fatal("return wrong results length")
   210  		}
   211  
   212  		if cposts[0].PostId != o1.Id {
   213  			t.Fatal("Wrong sort")
   214  		}
   215  	}
   216  
   217  	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}
   218  	if r1 := <-ss.Compliance().ComplianceExport(cr6); r1.Err != nil {
   219  		t.Fatal(r1.Err)
   220  	} else {
   221  		cposts := r1.Data.([]*model.CompliancePost)
   222  
   223  		if len(cposts) != 2 {
   224  			t.Fatal("return wrong results length")
   225  		}
   226  
   227  		if cposts[0].PostId != o1.Id {
   228  			t.Fatal("Wrong sort")
   229  		}
   230  
   231  		if cposts[1].PostId != o2a.Id {
   232  			t.Fatal("Wrong sort")
   233  		}
   234  	}
   235  }
   236  
   237  func testComplianceExportDirectMessages(t *testing.T, ss store.Store) {
   238  	time.Sleep(100 * time.Millisecond)
   239  
   240  	t1 := &model.Team{}
   241  	t1.DisplayName = "DisplayName"
   242  	t1.Name = "zz" + model.NewId() + "b"
   243  	t1.Email = model.NewId() + "@nowhere.com"
   244  	t1.Type = model.TEAM_OPEN
   245  	t1 = store.Must(ss.Team().Save(t1)).(*model.Team)
   246  
   247  	u1 := &model.User{}
   248  	u1.Email = model.NewId()
   249  	u1.Username = model.NewId()
   250  	u1 = store.Must(ss.User().Save(u1)).(*model.User)
   251  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: t1.Id, UserId: u1.Id}, -1))
   252  
   253  	u2 := &model.User{}
   254  	u2.Email = model.NewId()
   255  	u2.Username = model.NewId()
   256  	u2 = store.Must(ss.User().Save(u2)).(*model.User)
   257  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: t1.Id, UserId: u2.Id}, -1))
   258  
   259  	c1 := &model.Channel{}
   260  	c1.TeamId = t1.Id
   261  	c1.DisplayName = "Channel2"
   262  	c1.Name = "zz" + model.NewId() + "b"
   263  	c1.Type = model.CHANNEL_OPEN
   264  	c1 = store.Must(ss.Channel().Save(c1, -1)).(*model.Channel)
   265  
   266  	cDM := store.Must(ss.Channel().CreateDirectChannel(u1.Id, u2.Id)).(*model.Channel)
   267  
   268  	o1 := &model.Post{}
   269  	o1.ChannelId = c1.Id
   270  	o1.UserId = u1.Id
   271  	o1.CreateAt = model.GetMillis()
   272  	o1.Message = "zz" + model.NewId() + "b"
   273  	o1 = store.Must(ss.Post().Save(o1)).(*model.Post)
   274  
   275  	o1a := &model.Post{}
   276  	o1a.ChannelId = c1.Id
   277  	o1a.UserId = u1.Id
   278  	o1a.CreateAt = o1.CreateAt + 10
   279  	o1a.Message = "zz" + model.NewId() + "b"
   280  	o1a = store.Must(ss.Post().Save(o1a)).(*model.Post)
   281  
   282  	o2 := &model.Post{}
   283  	o2.ChannelId = c1.Id
   284  	o2.UserId = u1.Id
   285  	o2.CreateAt = o1.CreateAt + 20
   286  	o2.Message = "zz" + model.NewId() + "b"
   287  	o2 = store.Must(ss.Post().Save(o2)).(*model.Post)
   288  
   289  	o2a := &model.Post{}
   290  	o2a.ChannelId = c1.Id
   291  	o2a.UserId = u2.Id
   292  	o2a.CreateAt = o1.CreateAt + 30
   293  	o2a.Message = "zz" + model.NewId() + "b"
   294  	o2a = store.Must(ss.Post().Save(o2a)).(*model.Post)
   295  
   296  	o3 := &model.Post{}
   297  	o3.ChannelId = cDM.Id
   298  	o3.UserId = u1.Id
   299  	o3.CreateAt = o1.CreateAt + 40
   300  	o3.Message = "zz" + model.NewId() + "b"
   301  	o3 = store.Must(ss.Post().Save(o3)).(*model.Post)
   302  
   303  	time.Sleep(100 * time.Millisecond)
   304  
   305  	cr1 := &model.Compliance{Desc: "test" + model.NewId(), StartAt: o1.CreateAt - 1, EndAt: o3.CreateAt + 1, Emails: u1.Email}
   306  	if r1 := <-ss.Compliance().ComplianceExport(cr1); r1.Err != nil {
   307  		t.Fatal(r1.Err)
   308  	} else {
   309  		cposts := r1.Data.([]*model.CompliancePost)
   310  
   311  		if len(cposts) != 4 {
   312  			t.Fatal("return wrong results length")
   313  		}
   314  
   315  		if cposts[0].PostId != o1.Id {
   316  			t.Fatal("Wrong sort")
   317  		}
   318  
   319  		if cposts[len(cposts)-1].PostId != o3.Id {
   320  			t.Fatal("Wrong sort")
   321  		}
   322  	}
   323  }
   324  
   325  func testMessageExportPublicChannel(t *testing.T, ss store.Store) {
   326  	// get the starting number of message export entries
   327  	startTime := model.GetMillis()
   328  	var numMessageExports = 0
   329  	if r1 := <-ss.Compliance().MessageExport(startTime-10, 10); r1.Err != nil {
   330  		t.Fatal(r1.Err)
   331  	} else {
   332  		messages := r1.Data.([]*model.MessageExport)
   333  		numMessageExports = len(messages)
   334  	}
   335  
   336  	// need a team
   337  	team := &model.Team{
   338  		DisplayName: "DisplayName",
   339  		Name:        "zz" + model.NewId() + "b",
   340  		Email:       model.NewId() + "@nowhere.com",
   341  		Type:        model.TEAM_OPEN,
   342  	}
   343  	team = store.Must(ss.Team().Save(team)).(*model.Team)
   344  
   345  	// and two users that are a part of that team
   346  	user1 := &model.User{
   347  		Email:    model.NewId(),
   348  		Username: model.NewId(),
   349  	}
   350  	user1 = store.Must(ss.User().Save(user1)).(*model.User)
   351  	store.Must(ss.Team().SaveMember(&model.TeamMember{
   352  		TeamId: team.Id,
   353  		UserId: user1.Id,
   354  	}, -1))
   355  
   356  	user2 := &model.User{
   357  		Email:    model.NewId(),
   358  		Username: model.NewId(),
   359  	}
   360  	user2 = store.Must(ss.User().Save(user2)).(*model.User)
   361  	store.Must(ss.Team().SaveMember(&model.TeamMember{
   362  		TeamId: team.Id,
   363  		UserId: user2.Id,
   364  	}, -1))
   365  
   366  	// need a public channel
   367  	channel := &model.Channel{
   368  		TeamId:      team.Id,
   369  		Name:        model.NewId(),
   370  		DisplayName: "Public Channel",
   371  		Type:        model.CHANNEL_OPEN,
   372  	}
   373  	channel = store.Must(ss.Channel().Save(channel, -1)).(*model.Channel)
   374  
   375  	// user1 posts twice in the public channel
   376  	post1 := &model.Post{
   377  		ChannelId: channel.Id,
   378  		UserId:    user1.Id,
   379  		CreateAt:  startTime,
   380  		Message:   "zz" + model.NewId() + "a",
   381  	}
   382  	post1 = store.Must(ss.Post().Save(post1)).(*model.Post)
   383  
   384  	post2 := &model.Post{
   385  		ChannelId: channel.Id,
   386  		UserId:    user1.Id,
   387  		CreateAt:  startTime + 10,
   388  		Message:   "zz" + model.NewId() + "b",
   389  	}
   390  	post2 = store.Must(ss.Post().Save(post2)).(*model.Post)
   391  
   392  	// fetch the message exports for both posts that user1 sent
   393  	messageExportMap := map[string]model.MessageExport{}
   394  	if r1 := <-ss.Compliance().MessageExport(startTime-10, 10); r1.Err != nil {
   395  		t.Fatal(r1.Err)
   396  	} else {
   397  		messages := r1.Data.([]*model.MessageExport)
   398  		assert.Equal(t, numMessageExports+2, len(messages))
   399  
   400  		for _, v := range messages {
   401  			messageExportMap[*v.PostId] = *v
   402  		}
   403  	}
   404  
   405  	// post1 was made by user1 in channel1 and team1
   406  	assert.Equal(t, post1.Id, *messageExportMap[post1.Id].PostId)
   407  	assert.Equal(t, post1.CreateAt, *messageExportMap[post1.Id].PostCreateAt)
   408  	assert.Equal(t, post1.Message, *messageExportMap[post1.Id].PostMessage)
   409  	assert.Equal(t, channel.Id, *messageExportMap[post1.Id].ChannelId)
   410  	assert.Equal(t, channel.DisplayName, *messageExportMap[post1.Id].ChannelDisplayName)
   411  	assert.Equal(t, user1.Id, *messageExportMap[post1.Id].UserId)
   412  	assert.Equal(t, user1.Email, *messageExportMap[post1.Id].UserEmail)
   413  	assert.Equal(t, user1.Username, *messageExportMap[post1.Id].Username)
   414  
   415  	// post2 was made by user1 in channel1 and team1
   416  	assert.Equal(t, post2.Id, *messageExportMap[post2.Id].PostId)
   417  	assert.Equal(t, post2.CreateAt, *messageExportMap[post2.Id].PostCreateAt)
   418  	assert.Equal(t, post2.Message, *messageExportMap[post2.Id].PostMessage)
   419  	assert.Equal(t, channel.Id, *messageExportMap[post2.Id].ChannelId)
   420  	assert.Equal(t, channel.DisplayName, *messageExportMap[post2.Id].ChannelDisplayName)
   421  	assert.Equal(t, user1.Id, *messageExportMap[post2.Id].UserId)
   422  	assert.Equal(t, user1.Email, *messageExportMap[post2.Id].UserEmail)
   423  	assert.Equal(t, user1.Username, *messageExportMap[post2.Id].Username)
   424  }
   425  
   426  func testMessageExportPrivateChannel(t *testing.T, ss store.Store) {
   427  	// get the starting number of message export entries
   428  	startTime := model.GetMillis()
   429  	var numMessageExports = 0
   430  	if r1 := <-ss.Compliance().MessageExport(startTime-10, 10); r1.Err != nil {
   431  		t.Fatal(r1.Err)
   432  	} else {
   433  		messages := r1.Data.([]*model.MessageExport)
   434  		numMessageExports = len(messages)
   435  	}
   436  
   437  	// need a team
   438  	team := &model.Team{
   439  		DisplayName: "DisplayName",
   440  		Name:        "zz" + model.NewId() + "b",
   441  		Email:       model.NewId() + "@nowhere.com",
   442  		Type:        model.TEAM_OPEN,
   443  	}
   444  	team = store.Must(ss.Team().Save(team)).(*model.Team)
   445  
   446  	// and two users that are a part of that team
   447  	user1 := &model.User{
   448  		Email:    model.NewId(),
   449  		Username: model.NewId(),
   450  	}
   451  	user1 = store.Must(ss.User().Save(user1)).(*model.User)
   452  	store.Must(ss.Team().SaveMember(&model.TeamMember{
   453  		TeamId: team.Id,
   454  		UserId: user1.Id,
   455  	}, -1))
   456  
   457  	user2 := &model.User{
   458  		Email:    model.NewId(),
   459  		Username: model.NewId(),
   460  	}
   461  	user2 = store.Must(ss.User().Save(user2)).(*model.User)
   462  	store.Must(ss.Team().SaveMember(&model.TeamMember{
   463  		TeamId: team.Id,
   464  		UserId: user2.Id,
   465  	}, -1))
   466  
   467  	// need a private channel
   468  	channel := &model.Channel{
   469  		TeamId:      team.Id,
   470  		Name:        model.NewId(),
   471  		DisplayName: "Private Channel",
   472  		Type:        model.CHANNEL_PRIVATE,
   473  	}
   474  	channel = store.Must(ss.Channel().Save(channel, -1)).(*model.Channel)
   475  
   476  	// user1 posts twice in the private channel
   477  	post1 := &model.Post{
   478  		ChannelId: channel.Id,
   479  		UserId:    user1.Id,
   480  		CreateAt:  startTime,
   481  		Message:   "zz" + model.NewId() + "a",
   482  	}
   483  	post1 = store.Must(ss.Post().Save(post1)).(*model.Post)
   484  
   485  	post2 := &model.Post{
   486  		ChannelId: channel.Id,
   487  		UserId:    user1.Id,
   488  		CreateAt:  startTime + 10,
   489  		Message:   "zz" + model.NewId() + "b",
   490  	}
   491  	post2 = store.Must(ss.Post().Save(post2)).(*model.Post)
   492  
   493  	// fetch the message exports for both posts that user1 sent
   494  	messageExportMap := map[string]model.MessageExport{}
   495  	if r1 := <-ss.Compliance().MessageExport(startTime-10, 10); r1.Err != nil {
   496  		t.Fatal(r1.Err)
   497  	} else {
   498  		messages := r1.Data.([]*model.MessageExport)
   499  		assert.Equal(t, numMessageExports+2, len(messages))
   500  
   501  		for _, v := range messages {
   502  			messageExportMap[*v.PostId] = *v
   503  		}
   504  	}
   505  
   506  	// post1 was made by user1 in channel1 and team1
   507  	assert.Equal(t, post1.Id, *messageExportMap[post1.Id].PostId)
   508  	assert.Equal(t, post1.CreateAt, *messageExportMap[post1.Id].PostCreateAt)
   509  	assert.Equal(t, post1.Message, *messageExportMap[post1.Id].PostMessage)
   510  	assert.Equal(t, channel.Id, *messageExportMap[post1.Id].ChannelId)
   511  	assert.Equal(t, channel.DisplayName, *messageExportMap[post1.Id].ChannelDisplayName)
   512  	assert.Equal(t, channel.Type, *messageExportMap[post1.Id].ChannelType)
   513  	assert.Equal(t, user1.Id, *messageExportMap[post1.Id].UserId)
   514  	assert.Equal(t, user1.Email, *messageExportMap[post1.Id].UserEmail)
   515  	assert.Equal(t, user1.Username, *messageExportMap[post1.Id].Username)
   516  
   517  	// post2 was made by user1 in channel1 and team1
   518  	assert.Equal(t, post2.Id, *messageExportMap[post2.Id].PostId)
   519  	assert.Equal(t, post2.CreateAt, *messageExportMap[post2.Id].PostCreateAt)
   520  	assert.Equal(t, post2.Message, *messageExportMap[post2.Id].PostMessage)
   521  	assert.Equal(t, channel.Id, *messageExportMap[post2.Id].ChannelId)
   522  	assert.Equal(t, channel.DisplayName, *messageExportMap[post2.Id].ChannelDisplayName)
   523  	assert.Equal(t, channel.Type, *messageExportMap[post2.Id].ChannelType)
   524  	assert.Equal(t, user1.Id, *messageExportMap[post2.Id].UserId)
   525  	assert.Equal(t, user1.Email, *messageExportMap[post2.Id].UserEmail)
   526  	assert.Equal(t, user1.Username, *messageExportMap[post2.Id].Username)
   527  }
   528  
   529  func testMessageExportDirectMessageChannel(t *testing.T, ss store.Store) {
   530  	// get the starting number of message export entries
   531  	startTime := model.GetMillis()
   532  	var numMessageExports = 0
   533  	if r1 := <-ss.Compliance().MessageExport(startTime-10, 10); r1.Err != nil {
   534  		t.Fatal(r1.Err)
   535  	} else {
   536  		messages := r1.Data.([]*model.MessageExport)
   537  		numMessageExports = len(messages)
   538  	}
   539  
   540  	// need a team
   541  	team := &model.Team{
   542  		DisplayName: "DisplayName",
   543  		Name:        "zz" + model.NewId() + "b",
   544  		Email:       model.NewId() + "@nowhere.com",
   545  		Type:        model.TEAM_OPEN,
   546  	}
   547  	team = store.Must(ss.Team().Save(team)).(*model.Team)
   548  
   549  	// and two users that are a part of that team
   550  	user1 := &model.User{
   551  		Email:    model.NewId(),
   552  		Username: model.NewId(),
   553  	}
   554  	user1 = store.Must(ss.User().Save(user1)).(*model.User)
   555  	store.Must(ss.Team().SaveMember(&model.TeamMember{
   556  		TeamId: team.Id,
   557  		UserId: user1.Id,
   558  	}, -1))
   559  
   560  	user2 := &model.User{
   561  		Email:    model.NewId(),
   562  		Username: model.NewId(),
   563  	}
   564  	user2 = store.Must(ss.User().Save(user2)).(*model.User)
   565  	store.Must(ss.Team().SaveMember(&model.TeamMember{
   566  		TeamId: team.Id,
   567  		UserId: user2.Id,
   568  	}, -1))
   569  
   570  	// as well as a DM channel between those users
   571  	directMessageChannel := store.Must(ss.Channel().CreateDirectChannel(user1.Id, user2.Id)).(*model.Channel)
   572  
   573  	// user1 also sends a DM to user2
   574  	post := &model.Post{
   575  		ChannelId: directMessageChannel.Id,
   576  		UserId:    user1.Id,
   577  		CreateAt:  startTime + 20,
   578  		Message:   "zz" + model.NewId() + "c",
   579  	}
   580  	post = store.Must(ss.Post().Save(post)).(*model.Post)
   581  
   582  	// fetch the message export for the post that user1 sent
   583  	messageExportMap := map[string]model.MessageExport{}
   584  	if r1 := <-ss.Compliance().MessageExport(startTime-10, 10); r1.Err != nil {
   585  		t.Fatal(r1.Err)
   586  	} else {
   587  		messages := r1.Data.([]*model.MessageExport)
   588  		assert.Equal(t, numMessageExports+1, len(messages))
   589  
   590  		for _, v := range messages {
   591  			messageExportMap[*v.PostId] = *v
   592  		}
   593  	}
   594  
   595  	// post is a DM between user1 and user2
   596  	// there is no channel display name for direct messages, so we sub in the string "Direct Message" instead
   597  	assert.Equal(t, post.Id, *messageExportMap[post.Id].PostId)
   598  	assert.Equal(t, post.CreateAt, *messageExportMap[post.Id].PostCreateAt)
   599  	assert.Equal(t, post.Message, *messageExportMap[post.Id].PostMessage)
   600  	assert.Equal(t, directMessageChannel.Id, *messageExportMap[post.Id].ChannelId)
   601  	assert.Equal(t, "Direct Message", *messageExportMap[post.Id].ChannelDisplayName)
   602  	assert.Equal(t, user1.Id, *messageExportMap[post.Id].UserId)
   603  	assert.Equal(t, user1.Email, *messageExportMap[post.Id].UserEmail)
   604  	assert.Equal(t, user1.Username, *messageExportMap[post.Id].Username)
   605  }
   606  
   607  func testMessageExportGroupMessageChannel(t *testing.T, ss store.Store) {
   608  	// get the starting number of message export entries
   609  	startTime := model.GetMillis()
   610  	var numMessageExports = 0
   611  	if r1 := <-ss.Compliance().MessageExport(startTime-10, 10); r1.Err != nil {
   612  		t.Fatal(r1.Err)
   613  	} else {
   614  		messages := r1.Data.([]*model.MessageExport)
   615  		numMessageExports = len(messages)
   616  	}
   617  
   618  	// need a team
   619  	team := &model.Team{
   620  		DisplayName: "DisplayName",
   621  		Name:        "zz" + model.NewId() + "b",
   622  		Email:       model.NewId() + "@nowhere.com",
   623  		Type:        model.TEAM_OPEN,
   624  	}
   625  	team = store.Must(ss.Team().Save(team)).(*model.Team)
   626  
   627  	// and three users that are a part of that team
   628  	user1 := &model.User{
   629  		Email:    model.NewId(),
   630  		Username: model.NewId(),
   631  	}
   632  	user1 = store.Must(ss.User().Save(user1)).(*model.User)
   633  	store.Must(ss.Team().SaveMember(&model.TeamMember{
   634  		TeamId: team.Id,
   635  		UserId: user1.Id,
   636  	}, -1))
   637  
   638  	user2 := &model.User{
   639  		Email:    model.NewId(),
   640  		Username: model.NewId(),
   641  	}
   642  	user2 = store.Must(ss.User().Save(user2)).(*model.User)
   643  	store.Must(ss.Team().SaveMember(&model.TeamMember{
   644  		TeamId: team.Id,
   645  		UserId: user2.Id,
   646  	}, -1))
   647  
   648  	user3 := &model.User{
   649  		Email:    model.NewId(),
   650  		Username: model.NewId(),
   651  	}
   652  	user3 = store.Must(ss.User().Save(user3)).(*model.User)
   653  	store.Must(ss.Team().SaveMember(&model.TeamMember{
   654  		TeamId: team.Id,
   655  		UserId: user3.Id,
   656  	}, -1))
   657  
   658  	// can't create a group channel directly, because importing app creates an import cycle, so we have to fake it
   659  	groupMessageChannel := &model.Channel{
   660  		TeamId: team.Id,
   661  		Name:   model.NewId(),
   662  		Type:   model.CHANNEL_GROUP,
   663  	}
   664  	groupMessageChannel = store.Must(ss.Channel().Save(groupMessageChannel, -1)).(*model.Channel)
   665  
   666  	// user1 posts in the GM
   667  	post := &model.Post{
   668  		ChannelId: groupMessageChannel.Id,
   669  		UserId:    user1.Id,
   670  		CreateAt:  startTime + 20,
   671  		Message:   "zz" + model.NewId() + "c",
   672  	}
   673  	post = store.Must(ss.Post().Save(post)).(*model.Post)
   674  
   675  	// fetch the message export for the post that user1 sent
   676  	messageExportMap := map[string]model.MessageExport{}
   677  	if r1 := <-ss.Compliance().MessageExport(startTime-10, 10); r1.Err != nil {
   678  		t.Fatal(r1.Err)
   679  	} else {
   680  		messages := r1.Data.([]*model.MessageExport)
   681  		assert.Equal(t, numMessageExports+1, len(messages))
   682  
   683  		for _, v := range messages {
   684  			messageExportMap[*v.PostId] = *v
   685  		}
   686  	}
   687  
   688  	// post is a DM between user1 and user2
   689  	// there is no channel display name for direct messages, so we sub in the string "Direct Message" instead
   690  	assert.Equal(t, post.Id, *messageExportMap[post.Id].PostId)
   691  	assert.Equal(t, post.CreateAt, *messageExportMap[post.Id].PostCreateAt)
   692  	assert.Equal(t, post.Message, *messageExportMap[post.Id].PostMessage)
   693  	assert.Equal(t, groupMessageChannel.Id, *messageExportMap[post.Id].ChannelId)
   694  	assert.Equal(t, "Group Message", *messageExportMap[post.Id].ChannelDisplayName)
   695  	assert.Equal(t, user1.Id, *messageExportMap[post.Id].UserId)
   696  	assert.Equal(t, user1.Email, *messageExportMap[post.Id].UserEmail)
   697  	assert.Equal(t, user1.Username, *messageExportMap[post.Id].Username)
   698  }