Remove insights (#23952)
* removed server side * Updated store layer * unused import * Updated autogenerated code template * Updated tests * lint fix * unused translations * webapp side * Updated i18n * lint fix: * type fix * Updated snapshots * Removed insights from API specs * updated e2e * Updated e2e tests * Updated e2e tests * Removed insights tests * Removed Insights as possible channel to load in sidebar from test * Removed more insights tests * More e2e fixed * More cleanup * Lint * More cleanup in client4 and boards api * More cleanup * Fixes * lint fix --------- Co-authored-by: maria.nunez <maria.nunez@mattermost.com> Co-authored-by: Mattermost Build <build@mattermost.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
e37459cd00
Коммит
26617fcbdc
@@ -149,8 +149,6 @@ func TestChannelStore(t *testing.T, ss store.Store, s SqlStore) {
|
||||
t.Run("UpdateSidebarChannelsByPreferences", func(t *testing.T) { testUpdateSidebarChannelsByPreferences(t, ss) })
|
||||
t.Run("SetShared", func(t *testing.T) { testSetShared(t, ss) })
|
||||
t.Run("GetTeamForChannel", func(t *testing.T) { testGetTeamForChannel(t, ss) })
|
||||
t.Run("PostCountsByDuration", func(t *testing.T) { testChannelPostCountsByDuration(t, ss) })
|
||||
t.Run("GetTopInactiveChannels", func(t *testing.T) { testGetTopInactiveChannels(t, ss) })
|
||||
}
|
||||
|
||||
func testChannelStoreSave(t *testing.T, ss store.Store) {
|
||||
@@ -8067,235 +8065,3 @@ func testGetTeamForChannel(t *testing.T, ss store.Store) {
|
||||
var nfErr *store.ErrNotFound
|
||||
require.True(t, errors.As(err, &nfErr))
|
||||
}
|
||||
|
||||
func testChannelPostCountsByDuration(t *testing.T, ss store.Store) {
|
||||
team, err := ss.Team().Save(&model.Team{
|
||||
Name: model.NewId(),
|
||||
DisplayName: "DisplayName",
|
||||
Email: MakeEmail(),
|
||||
Type: model.TeamOpen,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer func() { ss.Team().PermanentDelete(team.Id) }()
|
||||
|
||||
channel := &model.Channel{
|
||||
TeamId: team.Id,
|
||||
DisplayName: "test_share_flag",
|
||||
Name: "test_share_flag",
|
||||
Type: model.ChannelTypeOpen,
|
||||
}
|
||||
channelSaved, err := ss.Channel().Save(channel, 999)
|
||||
require.NoError(t, err)
|
||||
defer func() { ss.Channel().PermanentDelete(channelSaved.Id) }()
|
||||
|
||||
userID := model.NewId()
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
UserId: userID,
|
||||
ChannelId: channel.Id,
|
||||
Message: "test",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
UserId: userID,
|
||||
ChannelId: channel.Id,
|
||||
Message: "test",
|
||||
Props: model.StringInterface{
|
||||
"from_bot": true,
|
||||
},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
UserId: userID,
|
||||
ChannelId: channel.Id,
|
||||
Message: "test",
|
||||
Props: model.StringInterface{
|
||||
"from_webhook": true,
|
||||
},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
dpc, err := ss.Channel().PostCountsByDuration([]string{channelSaved.Id}, 0, &userID, model.PostsByDay, time.Now().Location())
|
||||
require.NoError(t, err)
|
||||
require.Len(t, dpc, 1)
|
||||
require.Equal(t, channel.Id, dpc[0].ChannelID)
|
||||
require.Equal(t, 1, dpc[0].PostCount)
|
||||
}
|
||||
|
||||
func testGetTopInactiveChannels(t *testing.T, ss store.Store) {
|
||||
team, err := ss.Team().Save(&model.Team{
|
||||
Name: model.NewId(),
|
||||
DisplayName: "DisplayName",
|
||||
Email: MakeEmail(),
|
||||
Type: model.TeamOpen,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer func() { ss.Team().PermanentDelete(team.Id) }()
|
||||
|
||||
channelPublic0 := &model.Channel{
|
||||
TeamId: team.Id,
|
||||
DisplayName: "test_share_flag asdf",
|
||||
Name: "test_share_flag_public0",
|
||||
Type: model.ChannelTypeOpen,
|
||||
CreateAt: 1,
|
||||
}
|
||||
|
||||
channelSaved0, err := ss.Channel().Save(channelPublic0, 999)
|
||||
require.NoError(t, err)
|
||||
defer func() { ss.Channel().PermanentDelete(channelSaved0.Id) }()
|
||||
|
||||
channelPublic1 := &model.Channel{
|
||||
TeamId: team.Id,
|
||||
DisplayName: "test_share_flag",
|
||||
Name: "test_share_flag",
|
||||
Type: model.ChannelTypeOpen,
|
||||
CreateAt: 1,
|
||||
}
|
||||
|
||||
channelSaved1, err := ss.Channel().Save(channelPublic1, 999)
|
||||
require.NoError(t, err)
|
||||
defer func() { ss.Channel().PermanentDelete(channelSaved1.Id) }()
|
||||
|
||||
// create private channel
|
||||
c3 := model.Channel{}
|
||||
c3.TeamId = team.Id
|
||||
c3.DisplayName = "Channel3" + model.NewId()
|
||||
c3.Name = NewTestId()
|
||||
c3.Type = model.ChannelTypePrivate
|
||||
c3.CreateAt = 1
|
||||
channelPrivate, nErr := ss.Channel().Save(&c3, -1)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
// create private channel with post
|
||||
c3NoPost := model.Channel{}
|
||||
c3NoPost.TeamId = team.Id
|
||||
c3NoPost.DisplayName = "Channel3" + model.NewId()
|
||||
c3NoPost.Name = NewTestId()
|
||||
c3NoPost.Type = model.ChannelTypePrivate
|
||||
c3NoPost.CreateAt = 1
|
||||
channelPrivateNoPost, nErr := ss.Channel().Save(&c3NoPost, -1)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
// create dm channel
|
||||
u1 := model.User{}
|
||||
u1.Email = MakeEmail()
|
||||
u1.Nickname = model.NewId()
|
||||
_, err = ss.User().Save(&u1)
|
||||
require.NoError(t, err)
|
||||
|
||||
u2 := model.User{}
|
||||
u2.Email = MakeEmail()
|
||||
u2.Nickname = model.NewId()
|
||||
_, err = ss.User().Save(&u2)
|
||||
require.NoError(t, err)
|
||||
|
||||
uBot := model.User{Id: model.NewId()}
|
||||
_, nErr = ss.Channel().CreateDirectChannel(&u1, &u2)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
// add u1, u2 to channels
|
||||
|
||||
cm1 := &model.ChannelMember{ChannelId: channelPrivate.Id, UserId: u1.Id, NotifyProps: model.GetDefaultChannelNotifyProps()}
|
||||
_, err = ss.Channel().SaveMember(cm1)
|
||||
require.NoError(t, err)
|
||||
cm1NoPost := &model.ChannelMember{ChannelId: channelPrivateNoPost.Id, UserId: u1.Id, NotifyProps: model.GetDefaultChannelNotifyProps()}
|
||||
_, err = ss.Channel().SaveMember(cm1NoPost)
|
||||
require.NoError(t, err)
|
||||
cm1Public := &model.ChannelMember{ChannelId: channelPublic1.Id, UserId: u1.Id, NotifyProps: model.GetDefaultChannelNotifyProps()}
|
||||
_, err = ss.Channel().SaveMember(cm1Public)
|
||||
require.NoError(t, err)
|
||||
cm2 := &model.ChannelMember{ChannelId: channelPublic0.Id, UserId: u2.Id, NotifyProps: model.GetDefaultChannelNotifyProps()}
|
||||
_, err = ss.Channel().SaveMember(cm2)
|
||||
require.NoError(t, err)
|
||||
cmBot := &model.ChannelMember{ChannelId: channelPublic0.Id, UserId: uBot.Id, NotifyProps: model.GetDefaultChannelNotifyProps()}
|
||||
_, err = ss.Channel().SaveMember(cmBot)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
UserId: u1.Id,
|
||||
ChannelId: channelPrivate.Id,
|
||||
Message: "test",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
UserId: u1.Id,
|
||||
ChannelId: channelPrivate.Id,
|
||||
Message: "test1",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
// create posts in channel public 0
|
||||
postToCheckLastUpdateAt, err := ss.Post().Save(&model.Post{
|
||||
UserId: u2.Id,
|
||||
ChannelId: channelSaved0.Id,
|
||||
Message: "test",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
UserId: model.NewId(),
|
||||
ChannelId: channelPublic1.Id,
|
||||
Message: "test",
|
||||
Props: model.StringInterface{
|
||||
"from_bot": true,
|
||||
},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
// create posts in channel public 1
|
||||
for i := 0; i < 3; i++ {
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
UserId: model.NewId(),
|
||||
ChannelId: channelPublic1.Id,
|
||||
Message: "test",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
// for u1
|
||||
t.Run("top inactive channels for team - u1 ", func(t *testing.T) {
|
||||
topInactiveChannels, err := ss.Channel().GetTopInactiveChannelsForTeamSince(team.Id, u1.Id, 2, 0, 10)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, topInactiveChannels.Items, 4)
|
||||
require.Equal(t, topInactiveChannels.Items[0].ID, channelPrivateNoPost.Id)
|
||||
require.Equal(t, topInactiveChannels.Items[1].ID, channelSaved0.Id)
|
||||
require.Equal(t, topInactiveChannels.Items[1].LastActivityAt, postToCheckLastUpdateAt.CreateAt)
|
||||
require.Equal(t, topInactiveChannels.Items[2].ID, channelPrivate.Id)
|
||||
require.Equal(t, topInactiveChannels.Items[3].ID, channelPublic1.Id)
|
||||
// test bot posts are counted
|
||||
require.Equal(t, topInactiveChannels.Items[3].MessageCount, int64(4))
|
||||
|
||||
// participants
|
||||
require.Equal(t, topInactiveChannels.Items[2].Participants[0], u1.Id)
|
||||
require.Equal(t, topInactiveChannels.Items[3].Participants[0], u1.Id)
|
||||
})
|
||||
|
||||
t.Run("top inactive channels for user - u1 ", func(t *testing.T) {
|
||||
topInactiveChannels, err := ss.Channel().GetTopInactiveChannelsForUserSince(team.Id, u1.Id, 2, 0, 10)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, topInactiveChannels.Items, 3)
|
||||
require.Equal(t, topInactiveChannels.Items[0].ID, channelPrivateNoPost.Id)
|
||||
require.Equal(t, topInactiveChannels.Items[1].ID, channelPrivate.Id)
|
||||
require.Equal(t, topInactiveChannels.Items[2].ID, channelPublic1.Id)
|
||||
})
|
||||
|
||||
// for u2
|
||||
t.Run("top inactive channels for team - u2 ", func(t *testing.T) {
|
||||
topInactiveChannels, err := ss.Channel().GetTopInactiveChannelsForTeamSince(team.Id, u2.Id, 2, 0, 10)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, topInactiveChannels.Items, 2)
|
||||
require.Equal(t, topInactiveChannels.Items[0].ID, channelSaved0.Id)
|
||||
require.Equal(t, topInactiveChannels.Items[0].LastActivityAt, postToCheckLastUpdateAt.CreateAt)
|
||||
require.Equal(t, topInactiveChannels.Items[1].ID, channelPublic1.Id)
|
||||
})
|
||||
|
||||
t.Run("top inactive channels for user - u2 ", func(t *testing.T) {
|
||||
topInactiveChannels, err := ss.Channel().GetTopInactiveChannelsForUserSince(team.Id, u2.Id, 2, 0, 10)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, topInactiveChannels.Items, 1)
|
||||
require.Equal(t, topInactiveChannels.Items[0].ID, channelPublic0.Id)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
@@ -11,8 +11,6 @@ import (
|
||||
mock "github.com/stretchr/testify/mock"
|
||||
|
||||
store "github.com/mattermost/mattermost/server/v8/channels/store"
|
||||
|
||||
time "time"
|
||||
)
|
||||
|
||||
// ChannelStore is an autogenerated mock type for the ChannelStore type
|
||||
@@ -1774,110 +1772,6 @@ func (_m *ChannelStore) GetTeamMembersForChannel(channelID string) ([]string, er
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetTopChannelsForTeamSince provides a mock function with given fields: teamID, userID, since, offset, limit
|
||||
func (_m *ChannelStore) GetTopChannelsForTeamSince(teamID string, userID string, since int64, offset int, limit int) (*model.TopChannelList, error) {
|
||||
ret := _m.Called(teamID, userID, since, offset, limit)
|
||||
|
||||
var r0 *model.TopChannelList
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) (*model.TopChannelList, error)); ok {
|
||||
return rf(teamID, userID, since, offset, limit)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) *model.TopChannelList); ok {
|
||||
r0 = rf(teamID, userID, since, offset, limit)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.TopChannelList)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, string, int64, int, int) error); ok {
|
||||
r1 = rf(teamID, userID, since, offset, limit)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetTopChannelsForUserSince provides a mock function with given fields: userID, teamID, since, offset, limit
|
||||
func (_m *ChannelStore) GetTopChannelsForUserSince(userID string, teamID string, since int64, offset int, limit int) (*model.TopChannelList, error) {
|
||||
ret := _m.Called(userID, teamID, since, offset, limit)
|
||||
|
||||
var r0 *model.TopChannelList
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) (*model.TopChannelList, error)); ok {
|
||||
return rf(userID, teamID, since, offset, limit)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) *model.TopChannelList); ok {
|
||||
r0 = rf(userID, teamID, since, offset, limit)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.TopChannelList)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, string, int64, int, int) error); ok {
|
||||
r1 = rf(userID, teamID, since, offset, limit)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetTopInactiveChannelsForTeamSince provides a mock function with given fields: teamID, userID, since, offset, limit
|
||||
func (_m *ChannelStore) GetTopInactiveChannelsForTeamSince(teamID string, userID string, since int64, offset int, limit int) (*model.TopInactiveChannelList, error) {
|
||||
ret := _m.Called(teamID, userID, since, offset, limit)
|
||||
|
||||
var r0 *model.TopInactiveChannelList
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) (*model.TopInactiveChannelList, error)); ok {
|
||||
return rf(teamID, userID, since, offset, limit)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) *model.TopInactiveChannelList); ok {
|
||||
r0 = rf(teamID, userID, since, offset, limit)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.TopInactiveChannelList)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, string, int64, int, int) error); ok {
|
||||
r1 = rf(teamID, userID, since, offset, limit)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetTopInactiveChannelsForUserSince provides a mock function with given fields: teamID, userID, since, offset, limit
|
||||
func (_m *ChannelStore) GetTopInactiveChannelsForUserSince(teamID string, userID string, since int64, offset int, limit int) (*model.TopInactiveChannelList, error) {
|
||||
ret := _m.Called(teamID, userID, since, offset, limit)
|
||||
|
||||
var r0 *model.TopInactiveChannelList
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) (*model.TopInactiveChannelList, error)); ok {
|
||||
return rf(teamID, userID, since, offset, limit)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) *model.TopInactiveChannelList); ok {
|
||||
r0 = rf(teamID, userID, since, offset, limit)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.TopInactiveChannelList)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, string, int64, int, int) error); ok {
|
||||
r1 = rf(teamID, userID, since, offset, limit)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GroupSyncedChannelCount provides a mock function with given fields:
|
||||
func (_m *ChannelStore) GroupSyncedChannelCount() (int64, error) {
|
||||
ret := _m.Called()
|
||||
@@ -2047,32 +1941,6 @@ func (_m *ChannelStore) PermanentDeleteMembersByUser(userID string) error {
|
||||
return r0
|
||||
}
|
||||
|
||||
// PostCountsByDuration provides a mock function with given fields: channelIDs, sinceUnixMillis, userID, duration, groupingLocation
|
||||
func (_m *ChannelStore) PostCountsByDuration(channelIDs []string, sinceUnixMillis int64, userID *string, duration model.PostCountGrouping, groupingLocation *time.Location) ([]*model.DurationPostCount, error) {
|
||||
ret := _m.Called(channelIDs, sinceUnixMillis, userID, duration, groupingLocation)
|
||||
|
||||
var r0 []*model.DurationPostCount
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func([]string, int64, *string, model.PostCountGrouping, *time.Location) ([]*model.DurationPostCount, error)); ok {
|
||||
return rf(channelIDs, sinceUnixMillis, userID, duration, groupingLocation)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func([]string, int64, *string, model.PostCountGrouping, *time.Location) []*model.DurationPostCount); ok {
|
||||
r0 = rf(channelIDs, sinceUnixMillis, userID, duration, groupingLocation)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).([]*model.DurationPostCount)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func([]string, int64, *string, model.PostCountGrouping, *time.Location) error); ok {
|
||||
r1 = rf(channelIDs, sinceUnixMillis, userID, duration, groupingLocation)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// RemoveAllDeactivatedMembers provides a mock function with given fields: channelID
|
||||
func (_m *ChannelStore) RemoveAllDeactivatedMembers(channelID string) error {
|
||||
ret := _m.Called(channelID)
|
||||
|
||||
@@ -840,32 +840,6 @@ func (_m *PostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error)
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetTopDMsForUserSince provides a mock function with given fields: userID, since, offset, limit
|
||||
func (_m *PostStore) GetTopDMsForUserSince(userID string, since int64, offset int, limit int) (*model.TopDMList, error) {
|
||||
ret := _m.Called(userID, since, offset, limit)
|
||||
|
||||
var r0 *model.TopDMList
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, int64, int, int) (*model.TopDMList, error)); ok {
|
||||
return rf(userID, since, offset, limit)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, int64, int, int) *model.TopDMList); ok {
|
||||
r0 = rf(userID, since, offset, limit)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.TopDMList)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, int64, int, int) error); ok {
|
||||
r1 = rf(userID, since, offset, limit)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// HasAutoResponsePostByUserSince provides a mock function with given fields: options, userId
|
||||
func (_m *PostStore) HasAutoResponsePostByUserSince(options model.GetPostsSinceOptions, userId string) (bool, error) {
|
||||
ret := _m.Called(options, userId)
|
||||
|
||||
@@ -156,58 +156,6 @@ func (_m *ReactionStore) GetForPostSince(postId string, since int64, excludeRemo
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetTopForTeamSince provides a mock function with given fields: teamID, userID, since, offset, limit
|
||||
func (_m *ReactionStore) GetTopForTeamSince(teamID string, userID string, since int64, offset int, limit int) (*model.TopReactionList, error) {
|
||||
ret := _m.Called(teamID, userID, since, offset, limit)
|
||||
|
||||
var r0 *model.TopReactionList
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) (*model.TopReactionList, error)); ok {
|
||||
return rf(teamID, userID, since, offset, limit)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) *model.TopReactionList); ok {
|
||||
r0 = rf(teamID, userID, since, offset, limit)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.TopReactionList)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, string, int64, int, int) error); ok {
|
||||
r1 = rf(teamID, userID, since, offset, limit)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetTopForUserSince provides a mock function with given fields: userID, teamID, since, offset, limit
|
||||
func (_m *ReactionStore) GetTopForUserSince(userID string, teamID string, since int64, offset int, limit int) (*model.TopReactionList, error) {
|
||||
ret := _m.Called(userID, teamID, since, offset, limit)
|
||||
|
||||
var r0 *model.TopReactionList
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) (*model.TopReactionList, error)); ok {
|
||||
return rf(userID, teamID, since, offset, limit)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) *model.TopReactionList); ok {
|
||||
r0 = rf(userID, teamID, since, offset, limit)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.TopReactionList)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, string, int64, int, int) error); ok {
|
||||
r1 = rf(userID, teamID, since, offset, limit)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// PermanentDeleteBatch provides a mock function with given fields: endTime, limit
|
||||
func (_m *ReactionStore) PermanentDeleteBatch(endTime int64, limit int64) (int64, error) {
|
||||
ret := _m.Called(endTime, limit)
|
||||
|
||||
@@ -549,39 +549,6 @@ func (_m *TeamStore) GetMembersByIds(teamID string, userIds []string, restrictio
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetNewTeamMembersSince provides a mock function with given fields: teamID, since, offset, limit, showFullName
|
||||
func (_m *TeamStore) GetNewTeamMembersSince(teamID string, since int64, offset int, limit int, showFullName bool) (*model.NewTeamMembersList, int64, error) {
|
||||
ret := _m.Called(teamID, since, offset, limit, showFullName)
|
||||
|
||||
var r0 *model.NewTeamMembersList
|
||||
var r1 int64
|
||||
var r2 error
|
||||
if rf, ok := ret.Get(0).(func(string, int64, int, int, bool) (*model.NewTeamMembersList, int64, error)); ok {
|
||||
return rf(teamID, since, offset, limit, showFullName)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, int64, int, int, bool) *model.NewTeamMembersList); ok {
|
||||
r0 = rf(teamID, since, offset, limit, showFullName)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.NewTeamMembersList)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, int64, int, int, bool) int64); ok {
|
||||
r1 = rf(teamID, since, offset, limit, showFullName)
|
||||
} else {
|
||||
r1 = ret.Get(1).(int64)
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(2).(func(string, int64, int, int, bool) error); ok {
|
||||
r2 = rf(teamID, since, offset, limit, showFullName)
|
||||
} else {
|
||||
r2 = ret.Error(2)
|
||||
}
|
||||
|
||||
return r0, r1, r2
|
||||
}
|
||||
|
||||
// GetTeamMembersForExport provides a mock function with given fields: userID
|
||||
func (_m *TeamStore) GetTeamMembersForExport(userID string) ([]*model.TeamMemberForExport, error) {
|
||||
ret := _m.Called(userID)
|
||||
|
||||
@@ -273,58 +273,6 @@ func (_m *ThreadStore) GetThreadsForUser(userId string, teamID string, opts mode
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetTopThreadsForTeamSince provides a mock function with given fields: teamID, userID, since, offset, limit
|
||||
func (_m *ThreadStore) GetTopThreadsForTeamSince(teamID string, userID string, since int64, offset int, limit int) (*model.TopThreadList, error) {
|
||||
ret := _m.Called(teamID, userID, since, offset, limit)
|
||||
|
||||
var r0 *model.TopThreadList
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) (*model.TopThreadList, error)); ok {
|
||||
return rf(teamID, userID, since, offset, limit)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) *model.TopThreadList); ok {
|
||||
r0 = rf(teamID, userID, since, offset, limit)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.TopThreadList)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, string, int64, int, int) error); ok {
|
||||
r1 = rf(teamID, userID, since, offset, limit)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetTopThreadsForUserSince provides a mock function with given fields: teamID, userID, since, offset, limit
|
||||
func (_m *ThreadStore) GetTopThreadsForUserSince(teamID string, userID string, since int64, offset int, limit int) (*model.TopThreadList, error) {
|
||||
ret := _m.Called(teamID, userID, since, offset, limit)
|
||||
|
||||
var r0 *model.TopThreadList
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) (*model.TopThreadList, error)); ok {
|
||||
return rf(teamID, userID, since, offset, limit)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, string, int64, int, int) *model.TopThreadList); ok {
|
||||
r0 = rf(teamID, userID, since, offset, limit)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.TopThreadList)
|
||||
}
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, string, int64, int, int) error); ok {
|
||||
r1 = rf(teamID, userID, since, offset, limit)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetTotalThreads provides a mock function with given fields: userId, teamID, opts
|
||||
func (_m *ThreadStore) GetTotalThreads(userId string, teamID string, opts model.GetUserThreadsOpts) (int64, error) {
|
||||
ret := _m.Called(userId, teamID, opts)
|
||||
|
||||
@@ -62,7 +62,6 @@ func TestPostStore(t *testing.T, ss store.Store, s SqlStore) {
|
||||
t.Run("GetPostReminders", func(t *testing.T) { testGetPostReminders(t, ss, s) })
|
||||
t.Run("GetPostReminderMetadata", func(t *testing.T) { testGetPostReminderMetadata(t, ss, s) })
|
||||
t.Run("GetNthRecentPostTime", func(t *testing.T) { testGetNthRecentPostTime(t, ss) })
|
||||
t.Run("GetTopDMsForUserSince", func(t *testing.T) { testGetTopDMsForUserSince(t, ss, s) })
|
||||
t.Run("GetEditHistoryForPost", func(t *testing.T) { testGetEditHistoryForPost(t, ss) })
|
||||
}
|
||||
|
||||
@@ -4862,180 +4861,6 @@ func testGetNthRecentPostTime(t *testing.T, ss store.Store) {
|
||||
assert.IsType(t, &store.ErrNotFound{}, err)
|
||||
}
|
||||
|
||||
func testGetTopDMsForUserSince(t *testing.T, ss store.Store, s SqlStore) {
|
||||
// users
|
||||
user := model.User{Email: MakeEmail(), Username: model.NewId()}
|
||||
u1 := model.User{Email: MakeEmail(), Username: model.NewId()}
|
||||
u2 := model.User{Email: MakeEmail(), Username: model.NewId()}
|
||||
u3 := model.User{Email: MakeEmail(), Username: model.NewId()}
|
||||
u4 := model.User{Email: MakeEmail(), Username: model.NewId()}
|
||||
u5 := model.User{Email: MakeEmail(), Username: model.NewId()}
|
||||
|
||||
_, err := ss.User().Save(&user)
|
||||
require.NoError(t, err)
|
||||
_, err = ss.User().Save(&u1)
|
||||
require.NoError(t, err)
|
||||
_, err = ss.User().Save(&u2)
|
||||
require.NoError(t, err)
|
||||
_, err = ss.User().Save(&u3)
|
||||
require.NoError(t, err)
|
||||
_, err = ss.User().Save(&u4)
|
||||
require.NoError(t, err)
|
||||
_, err = ss.User().Save(&u5)
|
||||
require.NoError(t, err)
|
||||
bot := &model.Bot{
|
||||
Username: "bot_user",
|
||||
Description: "bot",
|
||||
OwnerId: model.NewId(),
|
||||
UserId: u5.Id,
|
||||
}
|
||||
|
||||
savedBot, nErr := ss.Bot().Save(bot)
|
||||
require.NoError(t, nErr)
|
||||
// user direct messages
|
||||
chUser1, nErr := ss.Channel().CreateDirectChannel(&u1, &user)
|
||||
require.NoError(t, nErr)
|
||||
chUser2, nErr := ss.Channel().CreateDirectChannel(&u2, &user)
|
||||
require.NoError(t, nErr)
|
||||
chUser3, nErr := ss.Channel().CreateDirectChannel(&u3, &user)
|
||||
require.NoError(t, nErr)
|
||||
// other user direct message
|
||||
chUser3User4, nErr := ss.Channel().CreateDirectChannel(&u3, &u4)
|
||||
require.NoError(t, nErr)
|
||||
|
||||
// bot direct message - should be ignored by top DMs
|
||||
botUser, err := ss.User().Get(context.Background(), savedBot.UserId)
|
||||
require.NoError(t, err)
|
||||
chBot, nErr := ss.Channel().CreateDirectChannel(&user, botUser)
|
||||
require.NoError(t, nErr)
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
ChannelId: chBot.Id,
|
||||
UserId: botUser.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
// sample post data
|
||||
// for u1
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
ChannelId: chUser1.Id,
|
||||
UserId: u1.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
ChannelId: chUser1.Id,
|
||||
UserId: user.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
// for u2: 1 post
|
||||
postToDelete, err := ss.Post().Save(&model.Post{
|
||||
ChannelId: chUser2.Id,
|
||||
UserId: u2.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
// create second post for u2: modify create at to a very old date to make sure it isn't counted
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
ChannelId: chUser2.Id,
|
||||
UserId: u2.Id,
|
||||
CreateAt: 100,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
// for user-u3: 3 posts
|
||||
for i := 0; i < 3; i++ {
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
ChannelId: chUser3.Id,
|
||||
UserId: user.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
// for u4-u3: 4 posts
|
||||
u3u4Post1, err := ss.Post().Save(&model.Post{
|
||||
ChannelId: chUser3User4.Id,
|
||||
UserId: u3.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
ChannelId: chUser3User4.Id,
|
||||
UserId: u4.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
u3u4Post2, err := ss.Post().Save(&model.Post{
|
||||
ChannelId: chUser3User4.Id,
|
||||
UserId: u3.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
ChannelId: chUser3User4.Id,
|
||||
UserId: u4.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
t.Run("should return topDMs when userid is specified ", func(t *testing.T) {
|
||||
topDMs, storeErr := ss.Post().GetTopDMsForUserSince(user.Id, 100, 0, 100)
|
||||
require.NoError(t, storeErr)
|
||||
// len of topDMs.Items should be 3
|
||||
require.Len(t, topDMs.Items, 3)
|
||||
// check order, magnitude of items
|
||||
require.Equal(t, topDMs.Items[0].SecondParticipant.Id, u3.Id)
|
||||
require.Equal(t, topDMs.Items[0].MessageCount, int64(3))
|
||||
require.Equal(t, topDMs.Items[0].OutgoingMessageCount, int64(3))
|
||||
require.Equal(t, topDMs.Items[1].SecondParticipant.Id, u1.Id)
|
||||
require.Equal(t, topDMs.Items[1].MessageCount, int64(2))
|
||||
require.Equal(t, topDMs.Items[1].OutgoingMessageCount, int64(1))
|
||||
require.Equal(t, topDMs.Items[2].SecondParticipant.Id, u2.Id)
|
||||
require.Equal(t, topDMs.Items[2].MessageCount, int64(1))
|
||||
require.Equal(t, topDMs.Items[2].OutgoingMessageCount, int64(0))
|
||||
// this also ensures that u3-u4 conversation doesn't show up in others' top DMs.
|
||||
})
|
||||
t.Run("topDMs should only consider user's DM channels ", func(t *testing.T) {
|
||||
// u4 only takes part in one conversation
|
||||
topDMs, storeErr := ss.Post().GetTopDMsForUserSince(u4.Id, 100, 0, 100)
|
||||
require.NoError(t, storeErr)
|
||||
// len of topDMs.Items should be 3
|
||||
require.Len(t, topDMs.Items, 1)
|
||||
// check order, magnitude of items
|
||||
require.Equal(t, topDMs.Items[0].SecondParticipant.Id, u3.Id)
|
||||
require.Equal(t, topDMs.Items[0].MessageCount, int64(4))
|
||||
})
|
||||
t.Run("topDMs will not consider self dms", func(t *testing.T) {
|
||||
chUser, nErr := ss.Channel().CreateDirectChannel(&user, &user)
|
||||
require.NoError(t, nErr)
|
||||
_, err = ss.Post().Save(&model.Post{
|
||||
ChannelId: chUser.Id,
|
||||
UserId: user.Id,
|
||||
})
|
||||
// delete u2 post
|
||||
err := ss.Post().Delete(postToDelete.Id, 200, user.Id)
|
||||
require.NoError(t, err)
|
||||
// u4 only takes part in one conversation
|
||||
topDMs, err := ss.Post().GetTopDMsForUserSince(user.Id, 100, 0, 100)
|
||||
require.NoError(t, err)
|
||||
// len of topDMs.Items should be 3
|
||||
require.Len(t, topDMs.Items, 2)
|
||||
})
|
||||
t.Run("topDMs will not consider deleted second user", func(t *testing.T) {
|
||||
// u4 only takes part in one conversation
|
||||
topDMs, err := ss.Post().GetTopDMsForUserSince(u4.Id, 100, 0, 100)
|
||||
require.NoError(t, err)
|
||||
// len of topDMs.Items should be 1
|
||||
require.Len(t, topDMs.Items, 1)
|
||||
// delete user3
|
||||
err = ss.User().PermanentDelete(u3.Id)
|
||||
require.NoError(t, err)
|
||||
// delete user3 posts
|
||||
err = ss.Post().Delete(u3u4Post1.Id, 200, u3.Id)
|
||||
require.NoError(t, err)
|
||||
err = ss.Post().Delete(u3u4Post2.Id, 200, u3.Id)
|
||||
require.NoError(t, err)
|
||||
// delete channel memberships
|
||||
err = ss.Channel().PermanentDeleteMembersByUser(u3.Id)
|
||||
require.NoError(t, err)
|
||||
topDMs, err = ss.Post().GetTopDMsForUserSince(u4.Id, 100, 0, 100)
|
||||
require.NoError(t, err)
|
||||
// len of topDMs.Items should be 0 since u3 is deleted
|
||||
require.Len(t, topDMs.Items, 0)
|
||||
})
|
||||
}
|
||||
|
||||
func testGetEditHistoryForPost(t *testing.T, ss store.Store) {
|
||||
t.Run("should return edit history for post", func(t *testing.T) {
|
||||
// create a post
|
||||
|
||||
@@ -73,7 +73,6 @@ func TestTeamStore(t *testing.T, ss store.Store) {
|
||||
t.Run("GetTeamMembersForExport", func(t *testing.T) { testTeamStoreGetTeamMembersForExport(t, ss) })
|
||||
t.Run("GetTeamsForUserWithPagination", func(t *testing.T) { testTeamMembersWithPagination(t, ss) })
|
||||
t.Run("GroupSyncedTeamCount", func(t *testing.T) { testGroupSyncedTeamCount(t, ss) })
|
||||
t.Run("GetNewTeamMembersSince", func(t *testing.T) { testGetNewTeamMembersSince(t, ss) })
|
||||
}
|
||||
|
||||
func testTeamStoreSave(t *testing.T, ss store.Store) {
|
||||
@@ -3619,17 +3618,3 @@ func testGroupSyncedTeamCount(t *testing.T, ss store.Store) {
|
||||
require.NoError(t, err)
|
||||
require.GreaterOrEqual(t, countAfter, count+1)
|
||||
}
|
||||
|
||||
func testGetNewTeamMembersSince(t *testing.T, ss store.Store) {
|
||||
team, err := ss.Team().Save(&model.Team{
|
||||
DisplayName: NewTestId(),
|
||||
Name: NewTestId(),
|
||||
Email: MakeEmail(),
|
||||
Type: model.TeamInvite,
|
||||
GroupConstrained: model.NewBool(true),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
_, _, err = ss.Team().GetNewTeamMembersSince(team.Id, 0, 0, 1000, false)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
@@ -27,7 +27,6 @@ func TestThreadStore(t *testing.T, ss store.Store, s SqlStore) {
|
||||
t.Run("GetTeamsUnreadForUser", func(t *testing.T) { testGetTeamsUnreadForUser(t, ss) })
|
||||
t.Run("GetVarious", func(t *testing.T) { testVarious(t, ss) })
|
||||
t.Run("MarkAllAsReadByChannels", func(t *testing.T) { testMarkAllAsReadByChannels(t, ss) })
|
||||
t.Run("GetTopThreads", func(t *testing.T) { testGetTopThreads(t, ss) })
|
||||
t.Run("MarkAllAsReadByTeam", func(t *testing.T) { testMarkAllAsReadByTeam(t, ss) })
|
||||
t.Run("DeleteMembershipsForChannel", func(t *testing.T) { testDeleteMembershipsForChannel(t, ss) })
|
||||
}
|
||||
@@ -1349,347 +1348,6 @@ func testMarkAllAsReadByChannels(t *testing.T, ss store.Store) {
|
||||
})
|
||||
}
|
||||
|
||||
func testGetTopThreads(t *testing.T, ss store.Store) {
|
||||
// create two users
|
||||
u1 := model.User{
|
||||
Email: MakeEmail(),
|
||||
Username: model.NewId(),
|
||||
}
|
||||
|
||||
_, err := ss.User().Save(&u1)
|
||||
require.NoError(t, err)
|
||||
|
||||
u2 := model.User{
|
||||
Email: MakeEmail(),
|
||||
Username: model.NewId(),
|
||||
}
|
||||
|
||||
_, err = ss.User().Save(&u2)
|
||||
require.NoError(t, err)
|
||||
|
||||
u3 := model.User{
|
||||
Email: MakeEmail(),
|
||||
Username: model.NewId(),
|
||||
}
|
||||
|
||||
_, err = ss.User().Save(&u3)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("test get top team threads", func(t *testing.T) {
|
||||
const limit = 10
|
||||
team, err := ss.Team().Save(&model.Team{
|
||||
DisplayName: "DisplayName",
|
||||
Name: "team" + model.NewId(),
|
||||
Email: MakeEmail(),
|
||||
Type: model.TeamOpen,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
channel, err := ss.Channel().Save(&model.Channel{
|
||||
TeamId: team.Id,
|
||||
DisplayName: "DisplayName",
|
||||
Name: "channel" + model.NewId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}, -1)
|
||||
require.NoError(t, err)
|
||||
|
||||
post1, err := ss.Post().Save(&model.Post{
|
||||
ChannelId: channel.Id,
|
||||
UserId: u1.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
post2, err := ss.Post().Save(&model.Post{
|
||||
ChannelId: channel.Id,
|
||||
UserId: u2.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
threadStoreCreateReply(t, ss, channel.Id, post1.Id, post1.UserId, 2000)
|
||||
threadStoreCreateReply(t, ss, channel.Id, post1.Id, post1.UserId, 2000)
|
||||
|
||||
threadStoreCreateReply(t, ss, channel.Id, post2.Id, post1.UserId, 2000)
|
||||
|
||||
// get top threads
|
||||
topThreadsInTeam, err := ss.Thread().GetTopThreadsForTeamSince(team.Id, model.NewId(), 12, 0, limit)
|
||||
require.NoError(t, err)
|
||||
// require length of top threads to be 2
|
||||
require.Len(t, topThreadsInTeam.Items, 2)
|
||||
|
||||
// require first element to be post1 with 2 replyCount=2
|
||||
require.Equal(t, topThreadsInTeam.Items[0].PostId, post1.Id)
|
||||
require.Equal(t, topThreadsInTeam.Items[0].UserId, post1.UserId)
|
||||
require.Equal(t, topThreadsInTeam.Items[0].UserInformation.Id, post1.UserId)
|
||||
require.Equal(t, topThreadsInTeam.Items[0].Post.ReplyCount, int64(2))
|
||||
require.Equal(t, topThreadsInTeam.Items[0].Post.Message, post1.Message)
|
||||
// require second element to be post2 with 2 replyCount=2
|
||||
require.Equal(t, topThreadsInTeam.Items[1].PostId, post2.Id)
|
||||
require.Equal(t, topThreadsInTeam.Items[1].Post.ReplyCount, int64(1))
|
||||
require.Equal(t, topThreadsInTeam.Items[1].UserId, post2.UserId)
|
||||
require.Equal(t, topThreadsInTeam.Items[1].UserInformation.Id, post2.UserId)
|
||||
require.Equal(t, topThreadsInTeam.Items[1].Post.Message, post2.Message)
|
||||
|
||||
// require topThreads[i].Post is not null
|
||||
require.Equal(t, topThreadsInTeam.Items[0].Post.Id, post1.Id)
|
||||
require.Equal(t, topThreadsInTeam.Items[1].Post.Id, post2.Id)
|
||||
})
|
||||
t.Run("test get top user threads", func(t *testing.T) {
|
||||
const limit = 10
|
||||
team, err := ss.Team().Save(&model.Team{
|
||||
DisplayName: "DisplayName",
|
||||
Name: "team" + model.NewId(),
|
||||
Email: MakeEmail(),
|
||||
Type: model.TeamOpen,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
channel, err := ss.Channel().Save(&model.Channel{
|
||||
TeamId: team.Id,
|
||||
DisplayName: "DisplayName",
|
||||
Name: "channel" + model.NewId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}, -1)
|
||||
require.NoError(t, err)
|
||||
|
||||
post1, err := ss.Post().Save(&model.Post{
|
||||
ChannelId: channel.Id,
|
||||
UserId: u1.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
post2, err := ss.Post().Save(&model.Post{
|
||||
ChannelId: channel.Id,
|
||||
UserId: u2.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
post3, err := ss.Post().Save(&model.Post{
|
||||
ChannelId: channel.Id,
|
||||
UserId: u3.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
threadStoreCreateReply(t, ss, channel.Id, post1.Id, post1.UserId, 2000)
|
||||
threadStoreCreateReply(t, ss, channel.Id, post1.Id, post1.UserId, 2000)
|
||||
|
||||
threadStoreCreateReply(t, ss, channel.Id, post2.Id, post2.UserId, 2000)
|
||||
threadStoreCreateReply(t, ss, channel.Id, post2.Id, post2.UserId, 2000)
|
||||
threadStoreCreateReply(t, ss, channel.Id, post3.Id, post3.UserId, 2000)
|
||||
opts := store.ThreadMembershipOpts{
|
||||
Following: true,
|
||||
IncrementMentions: false,
|
||||
UpdateFollowing: true,
|
||||
UpdateViewedTimestamp: false,
|
||||
UpdateParticipants: false,
|
||||
}
|
||||
|
||||
// create threadmemberships entries.
|
||||
_, err = ss.Thread().MaintainMembership(post1.UserId, post1.Id, opts)
|
||||
require.NoError(t, err)
|
||||
_, err = ss.Thread().MaintainMembership(post2.UserId, post2.Id, opts)
|
||||
require.NoError(t, err)
|
||||
_, err = ss.Thread().MaintainMembership(post2.UserId, post3.Id, opts)
|
||||
require.NoError(t, err)
|
||||
|
||||
// get top threads by user
|
||||
topThreadsByUser1, err := ss.Thread().GetTopThreadsForUserSince(team.Id, post1.UserId, 12, 0, limit)
|
||||
require.NoError(t, err)
|
||||
topThreadsByUser2, err := ss.Thread().GetTopThreadsForUserSince(team.Id, post2.UserId, 12, 0, limit)
|
||||
require.NoError(t, err)
|
||||
// require length of top threads by users to be 1,2 respectively
|
||||
require.Len(t, topThreadsByUser1.Items, 1)
|
||||
require.Len(t, topThreadsByUser2.Items, 2)
|
||||
|
||||
// require first element of topThreadsByUser1 to be post1 with 2 replyCount=2
|
||||
require.Equal(t, topThreadsByUser1.Items[0].PostId, post1.Id)
|
||||
require.Equal(t, topThreadsByUser1.Items[0].Post.ReplyCount, int64(2))
|
||||
require.Equal(t, topThreadsByUser1.Items[0].Post.Message, post1.Message)
|
||||
require.Equal(t, topThreadsByUser1.Items[0].UserId, post1.UserId)
|
||||
require.Equal(t, topThreadsByUser1.Items[0].UserInformation.Id, post1.UserId)
|
||||
// require elements of topThreadsByUser2 to be post2 and post3 respectively
|
||||
require.Equal(t, topThreadsByUser2.Items[0].PostId, post2.Id)
|
||||
require.Equal(t, topThreadsByUser2.Items[0].Post.ReplyCount, int64(2))
|
||||
require.Equal(t, topThreadsByUser2.Items[0].Post.Message, post2.Message)
|
||||
require.Equal(t, topThreadsByUser2.Items[0].UserId, post2.UserId)
|
||||
require.Equal(t, topThreadsByUser2.Items[0].UserInformation.Id, post2.UserId)
|
||||
|
||||
require.Equal(t, topThreadsByUser2.Items[1].PostId, post3.Id)
|
||||
require.Equal(t, topThreadsByUser2.Items[1].Post.ReplyCount, int64(1))
|
||||
require.Equal(t, topThreadsByUser2.Items[1].Post.Message, post3.Message)
|
||||
require.Equal(t, topThreadsByUser2.Items[1].UserId, post3.UserId)
|
||||
require.Equal(t, topThreadsByUser2.Items[1].UserInformation.Id, post3.UserId)
|
||||
|
||||
// require topThreads[i].Post is not null
|
||||
require.Equal(t, topThreadsByUser1.Items[0].Post.Id, post1.Id)
|
||||
require.Equal(t, topThreadsByUser2.Items[1].Post.Id, post3.Id)
|
||||
})
|
||||
t.Run("test get top threads only from given teamid", func(t *testing.T) {
|
||||
const limit = 10
|
||||
team1, err := ss.Team().Save(&model.Team{
|
||||
DisplayName: "DisplayName",
|
||||
Name: "team" + model.NewId(),
|
||||
Email: MakeEmail(),
|
||||
Type: model.TeamOpen,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
team2, err := ss.Team().Save(&model.Team{
|
||||
DisplayName: "DisplayName",
|
||||
Name: "team" + model.NewId(),
|
||||
Email: MakeEmail(),
|
||||
Type: model.TeamOpen,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
channel1, err := ss.Channel().Save(&model.Channel{
|
||||
TeamId: team1.Id,
|
||||
DisplayName: "DisplayName",
|
||||
Name: "channel" + model.NewId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}, -1)
|
||||
require.NoError(t, err)
|
||||
|
||||
channel2, err := ss.Channel().Save(&model.Channel{
|
||||
TeamId: team2.Id,
|
||||
DisplayName: "DisplayName",
|
||||
Name: "channel" + model.NewId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}, -1)
|
||||
require.NoError(t, err)
|
||||
|
||||
post1, err := ss.Post().Save(&model.Post{
|
||||
ChannelId: channel1.Id,
|
||||
UserId: u1.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
post2, err := ss.Post().Save(&model.Post{
|
||||
ChannelId: channel2.Id,
|
||||
UserId: u2.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
threadStoreCreateReply(t, ss, channel1.Id, post1.Id, post1.UserId, 2000)
|
||||
threadStoreCreateReply(t, ss, channel1.Id, post1.Id, post1.UserId, 2000)
|
||||
|
||||
threadStoreCreateReply(t, ss, channel2.Id, post2.Id, post2.UserId, 2000)
|
||||
|
||||
// assert that getting top threads from teamid 1 doesn't have post1.Id
|
||||
|
||||
topThreadsTeam2, err := ss.Thread().GetTopThreadsForTeamSince(team2.Id, u1.Id, 12, 0, limit)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, topThreadsTeam2.Items, 1)
|
||||
require.Equal(t, topThreadsTeam2.Items[0].Post.Id, post2.Id)
|
||||
})
|
||||
t.Run("test get top threads only from non-direct channels", func(t *testing.T) {
|
||||
const limit = 10
|
||||
team1, err := ss.Team().Save(&model.Team{
|
||||
DisplayName: "DisplayName",
|
||||
Name: "team" + model.NewId(),
|
||||
Email: MakeEmail(),
|
||||
Type: model.TeamOpen,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
channel1, err := ss.Channel().CreateDirectChannel(&u1, &u2)
|
||||
require.NoError(t, err)
|
||||
|
||||
channel2, err := ss.Channel().Save(&model.Channel{
|
||||
TeamId: team1.Id,
|
||||
DisplayName: "DisplayName",
|
||||
Name: "channel" + model.NewId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}, -1)
|
||||
require.NoError(t, err)
|
||||
|
||||
post1, err := ss.Post().Save(&model.Post{
|
||||
ChannelId: channel1.Id,
|
||||
UserId: u1.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
post2, err := ss.Post().Save(&model.Post{
|
||||
ChannelId: channel2.Id,
|
||||
UserId: u2.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
threadStoreCreateReply(t, ss, channel1.Id, post1.Id, post1.UserId, 2000)
|
||||
threadStoreCreateReply(t, ss, channel1.Id, post1.Id, post1.UserId, 2000)
|
||||
|
||||
threadStoreCreateReply(t, ss, channel2.Id, post2.Id, u1.Id, 2000)
|
||||
|
||||
opts := store.ThreadMembershipOpts{
|
||||
Following: true,
|
||||
IncrementMentions: false,
|
||||
UpdateFollowing: true,
|
||||
UpdateViewedTimestamp: false,
|
||||
UpdateParticipants: false,
|
||||
}
|
||||
|
||||
// create threadmemberships entries.
|
||||
_, err = ss.Thread().MaintainMembership(u1.Id, post1.Id, opts)
|
||||
require.NoError(t, err)
|
||||
_, err = ss.Thread().MaintainMembership(u1.Id, post2.Id, opts)
|
||||
require.NoError(t, err)
|
||||
_, err = ss.Thread().MaintainMembership(u2.Id, post1.Id, opts)
|
||||
require.NoError(t, err)
|
||||
_, err = ss.Thread().MaintainMembership(u2.Id, post2.Id, opts)
|
||||
require.NoError(t, err)
|
||||
|
||||
// assert that getting top threads from teamid 1 doesn't have DMs
|
||||
|
||||
topThreadsTeam1, err := ss.Thread().GetTopThreadsForTeamSince(team1.Id, u1.Id, 12, 0, limit)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, topThreadsTeam1.Items, 1)
|
||||
require.Equal(t, topThreadsTeam1.Items[0].Post.Id, post2.Id)
|
||||
|
||||
// assert that getting top threads from user 1 doesn't contain dm threads.
|
||||
topUserThreads, err := ss.Thread().GetTopThreadsForUserSince(team1.Id, u1.Id, 12, 0, limit)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, topUserThreads.Items, 1)
|
||||
require.Equal(t, topUserThreads.Items[0].Post.Id, post2.Id)
|
||||
})
|
||||
t.Run("test get top threads doesn't exceed duration", func(t *testing.T) {
|
||||
const limit = 10
|
||||
team, err := ss.Team().Save(&model.Team{
|
||||
DisplayName: "DisplayName",
|
||||
Name: "team" + model.NewId(),
|
||||
Email: MakeEmail(),
|
||||
Type: model.TeamOpen,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
channel, err := ss.Channel().Save(&model.Channel{
|
||||
TeamId: team.Id,
|
||||
DisplayName: "DisplayName",
|
||||
Name: "channel" + model.NewId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}, -1)
|
||||
require.NoError(t, err)
|
||||
|
||||
post1, err := ss.Post().Save(&model.Post{
|
||||
ChannelId: channel.Id,
|
||||
UserId: u1.Id,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
// post 2 has replies after 10 ms unix time.
|
||||
post2, err := ss.Post().Save(&model.Post{
|
||||
ChannelId: channel.Id,
|
||||
UserId: u2.Id,
|
||||
CreateAt: 1,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
threadStoreCreateReply(t, ss, channel.Id, post1.Id, post1.UserId, 2000)
|
||||
threadStoreCreateReply(t, ss, channel.Id, post1.Id, post1.UserId, 2000)
|
||||
|
||||
threadStoreCreateReply(t, ss, channel.Id, post2.Id, post1.UserId, 10)
|
||||
|
||||
// get top threads
|
||||
topThreadsInTeamNewer, err := ss.Thread().GetTopThreadsForTeamSince(team.Id, model.NewId(), 12, 0, limit)
|
||||
require.NoError(t, err)
|
||||
// require length of top threads to be 2
|
||||
require.Len(t, topThreadsInTeamNewer.Items, 1)
|
||||
|
||||
// require first element to be post1 with 2 replyCount=2
|
||||
require.Equal(t, topThreadsInTeamNewer.Items[0].PostId, post1.Id)
|
||||
|
||||
// get top threads
|
||||
topThreadsInTeamOlder, err := ss.Thread().GetTopThreadsForTeamSince(team.Id, model.NewId(), 9, 0, limit)
|
||||
require.NoError(t, err)
|
||||
// require length of top threads to be 2
|
||||
require.Len(t, topThreadsInTeamOlder.Items, 2)
|
||||
|
||||
// require first element to be post1 with 2 replyCount=2
|
||||
require.Equal(t, topThreadsInTeamOlder.Items[1].PostId, post2.Id)
|
||||
})
|
||||
}
|
||||
|
||||
func testMarkAllAsReadByTeam(t *testing.T, ss store.Store) {
|
||||
createThreadMembership := func(userID, postID string) {
|
||||
t.Helper()
|
||||
|
||||
Ссылка в новой задаче
Block a user