Remove waitForSidebarCategories (#17004)

Этот коммит содержится в:
Claudio Costa
2021-02-26 09:42:19 +01:00
коммит произвёл GitHub
родитель 978fee3c20
Коммит 33c8b0ad73
9 изменённых файлов: 233 добавлений и 205 удалений

Просмотреть файл

@@ -6,34 +6,30 @@ package app
import ( import (
"errors" "errors"
"net/http" "net/http"
"time"
"github.com/mattermost/mattermost-server/v5/mlog" "github.com/mattermost/mattermost-server/v5/mlog"
"github.com/mattermost/mattermost-server/v5/model" "github.com/mattermost/mattermost-server/v5/model"
"github.com/mattermost/mattermost-server/v5/store" "github.com/mattermost/mattermost-server/v5/store"
) )
func (a *App) createInitialSidebarCategories(userID, teamID string) *model.AppError { func (a *App) createInitialSidebarCategories(userID, teamID string) (*model.OrderedSidebarCategories, *model.AppError) {
nErr := a.Srv().Store.Channel().CreateInitialSidebarCategories(userID, teamID) categories, nErr := a.Srv().Store.Channel().CreateInitialSidebarCategories(userID, teamID)
if nErr != nil { if nErr != nil {
return model.NewAppError("createInitialSidebarCategories", "app.channel.create_initial_sidebar_categories.internal_error", nil, nErr.Error(), http.StatusInternalServerError) return nil, model.NewAppError("createInitialSidebarCategories", "app.channel.create_initial_sidebar_categories.internal_error", nil, nErr.Error(), http.StatusInternalServerError)
} }
return nil return categories, nil
} }
func (a *App) GetSidebarCategories(userID, teamID string) (*model.OrderedSidebarCategories, *model.AppError) { func (a *App) GetSidebarCategories(userID, teamID string) (*model.OrderedSidebarCategories, *model.AppError) {
var appErr *model.AppError
categories, err := a.Srv().Store.Channel().GetSidebarCategories(userID, teamID) categories, err := a.Srv().Store.Channel().GetSidebarCategories(userID, teamID)
if err == nil && len(categories.Categories) == 0 { if err == nil && len(categories.Categories) == 0 {
// A user must always have categories, so migration must not have happened yet, and we should run it ourselves // A user must always have categories, so migration must not have happened yet, and we should run it ourselves
appErr := a.createInitialSidebarCategories(userID, teamID) categories, appErr = a.createInitialSidebarCategories(userID, teamID)
if appErr != nil { if appErr != nil {
return nil, appErr return nil, appErr
} }
categories, err = a.waitForSidebarCategories(userID, teamID)
} }
if err != nil { if err != nil {
@@ -49,32 +45,6 @@ func (a *App) GetSidebarCategories(userID, teamID string) (*model.OrderedSidebar
return categories, nil return categories, nil
} }
// waitForSidebarCategories is used to get a user's sidebar categories after they've been created since there may be
// replication lag if any database replicas exist. It will wait until results are available to return them.
func (a *App) waitForSidebarCategories(userID, teamID string) (*model.OrderedSidebarCategories, error) {
if len(a.Config().SqlSettings.DataSourceReplicas) == 0 {
// The categories should be available immediately on a single database
return a.Srv().Store.Channel().GetSidebarCategories(userID, teamID)
}
now := model.GetMillis()
for model.GetMillis()-now < 12000 {
time.Sleep(100 * time.Millisecond)
categories, err := a.Srv().Store.Channel().GetSidebarCategories(userID, teamID)
if err != nil || len(categories.Categories) > 0 {
// We've found something, so return
return categories, err
}
}
mlog.Error("waitForSidebarCategories giving up", mlog.String("user_id", userID), mlog.String("team_id", teamID))
return &model.OrderedSidebarCategories{}, nil
}
func (a *App) GetSidebarCategoryOrder(userID, teamID string) ([]string, *model.AppError) { func (a *App) GetSidebarCategoryOrder(userID, teamID string) ([]string, *model.AppError) {
categories, err := a.Srv().Store.Channel().GetSidebarCategoryOrder(userID, teamID) categories, err := a.Srv().Store.Channel().GetSidebarCategoryOrder(userID, teamID)
if err != nil { if err != nil {

Просмотреть файл

@@ -783,7 +783,7 @@ func (a *App) JoinUserToTeam(team *model.Team, user *model.User, userRequestorId
return model.NewAppError("JoinUserToTeam", "app.user.update_update.app_error", nil, err.Error(), http.StatusInternalServerError) return model.NewAppError("JoinUserToTeam", "app.user.update_update.app_error", nil, err.Error(), http.StatusInternalServerError)
} }
if err := a.createInitialSidebarCategories(user.Id, team.Id); err != nil { if _, err := a.createInitialSidebarCategories(user.Id, team.Id); err != nil {
mlog.Warn( mlog.Warn(
"Encountered an issue creating default sidebar categories.", "Encountered an issue creating default sidebar categories.",
mlog.String("user_id", user.Id), mlog.String("user_id", user.Id),

Просмотреть файл

@@ -661,7 +661,7 @@ func (s *OpenTracingLayerChannelStore) CreateDirectChannel(userId *model.User, o
return result, err return result, err
} }
func (s *OpenTracingLayerChannelStore) CreateInitialSidebarCategories(userId string, teamID string) error { func (s *OpenTracingLayerChannelStore) CreateInitialSidebarCategories(userId string, teamID string) (*model.OrderedSidebarCategories, error) {
origCtx := s.Root.Store.Context() origCtx := s.Root.Store.Context()
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "ChannelStore.CreateInitialSidebarCategories") span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "ChannelStore.CreateInitialSidebarCategories")
s.Root.Store.SetContext(newCtx) s.Root.Store.SetContext(newCtx)
@@ -670,13 +670,13 @@ func (s *OpenTracingLayerChannelStore) CreateInitialSidebarCategories(userId str
}() }()
defer span.Finish() defer span.Finish()
err := s.ChannelStore.CreateInitialSidebarCategories(userId, teamID) result, err := s.ChannelStore.CreateInitialSidebarCategories(userId, teamID)
if err != nil { if err != nil {
span.LogFields(spanlog.Error(err)) span.LogFields(spanlog.Error(err))
ext.Error.Set(span, true) ext.Error.Set(span, true)
} }
return err return result, err
} }
func (s *OpenTracingLayerChannelStore) CreateSidebarCategory(userId string, teamID string, newCategory *model.SidebarCategoryWithChannels) (*model.SidebarCategoryWithChannels, error) { func (s *OpenTracingLayerChannelStore) CreateSidebarCategory(userId string, teamID string, newCategory *model.SidebarCategoryWithChannels) (*model.SidebarCategoryWithChannels, error) {

Просмотреть файл

@@ -704,21 +704,21 @@ func (s *RetryLayerChannelStore) CreateDirectChannel(userId *model.User, otherUs
} }
func (s *RetryLayerChannelStore) CreateInitialSidebarCategories(userId string, teamID string) error { func (s *RetryLayerChannelStore) CreateInitialSidebarCategories(userId string, teamID string) (*model.OrderedSidebarCategories, error) {
tries := 0 tries := 0
for { for {
err := s.ChannelStore.CreateInitialSidebarCategories(userId, teamID) result, err := s.ChannelStore.CreateInitialSidebarCategories(userId, teamID)
if err == nil { if err == nil {
return nil return result, nil
} }
if !isRepeatableError(err) { if !isRepeatableError(err) {
return err return result, err
} }
tries++ tries++
if tries >= 3 { if tries >= 3 {
err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures") err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
return err return result, err
} }
} }

Просмотреть файл

@@ -14,22 +14,27 @@ import (
"github.com/mattermost/mattermost-server/v5/store" "github.com/mattermost/mattermost-server/v5/store"
) )
func (s SqlChannelStore) CreateInitialSidebarCategories(userId, teamId string) error { func (s SqlChannelStore) CreateInitialSidebarCategories(userId, teamId string) (*model.OrderedSidebarCategories, error) {
transaction, err := s.GetMaster().Begin() transaction, err := s.GetMaster().Begin()
if err != nil { if err != nil {
return errors.Wrap(err, "CreateInitialSidebarCategories: begin_transaction") return nil, errors.Wrap(err, "CreateInitialSidebarCategories: begin_transaction")
} }
defer finalizeTransaction(transaction) defer finalizeTransaction(transaction)
if err := s.createInitialSidebarCategoriesT(transaction, userId, teamId); err != nil { if err = s.createInitialSidebarCategoriesT(transaction, userId, teamId); err != nil {
return errors.Wrap(err, "CreateInitialSidebarCategories: createInitialSidebarCategoriesT") return nil, errors.Wrap(err, "CreateInitialSidebarCategories: createInitialSidebarCategoriesT")
}
oc, err := s.getSidebarCategoriesT(transaction, userId, teamId)
if err != nil {
return nil, errors.Wrap(err, "CreateInitialSidebarCategories: getSidebarCategoriesT")
} }
if err := transaction.Commit(); err != nil { if err := transaction.Commit(); err != nil {
return errors.Wrap(err, "CreateInitialSidebarCategories: commit_transaction") return nil, errors.Wrap(err, "CreateInitialSidebarCategories: commit_transaction")
} }
return nil return oc, nil
} }
func (s SqlChannelStore) createInitialSidebarCategoriesT(transaction *gorp.Transaction, userId, teamId string) error { func (s SqlChannelStore) createInitialSidebarCategoriesT(transaction *gorp.Transaction, userId, teamId string) error {
@@ -499,7 +504,7 @@ func (s SqlChannelStore) getSidebarCategoriesT(transaction *gorp.Transaction, us
} }
func (s SqlChannelStore) GetSidebarCategories(userId, teamId string) (*model.OrderedSidebarCategories, error) { func (s SqlChannelStore) GetSidebarCategories(userId, teamId string) (*model.OrderedSidebarCategories, error) {
transaction, err := s.GetMaster().Begin() transaction, err := s.GetReplica().Begin()
if err != nil { if err != nil {
return nil, errors.Wrap(err, "begin_transaction") return nil, errors.Wrap(err, "begin_transaction")
} }

Просмотреть файл

@@ -215,7 +215,7 @@ type ChannelStore interface {
ResetAllChannelSchemes() error ResetAllChannelSchemes() error
ClearAllCustomRoleAssignments() error ClearAllCustomRoleAssignments() error
MigratePublicChannels() error MigratePublicChannels() error
CreateInitialSidebarCategories(userId, teamID string) error CreateInitialSidebarCategories(userId, teamID string) (*model.OrderedSidebarCategories, error)
GetSidebarCategories(userId, teamID string) (*model.OrderedSidebarCategories, error) GetSidebarCategories(userId, teamID string) (*model.OrderedSidebarCategories, error)
GetSidebarCategory(categoryID string) (*model.SidebarCategoryWithChannels, error) GetSidebarCategory(categoryID string) (*model.SidebarCategoryWithChannels, error)
GetSidebarCategoryOrder(userId, teamID string) ([]string, error) GetSidebarCategoryOrder(userId, teamID string) ([]string, error)

Просмотреть файл

@@ -33,72 +33,80 @@ func testCreateInitialSidebarCategories(t *testing.T, ss store.Store) {
userId := model.NewId() userId := model.NewId()
teamId := model.NewId() teamId := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
assert.NoError(t, nErr) assert.NoError(t, nErr)
res, err := ss.Channel().GetSidebarCategories(userId, teamId)
assert.NoError(t, err)
assert.Len(t, res.Categories, 3) assert.Len(t, res.Categories, 3)
assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
assert.Equal(t, model.SidebarCategoryChannels, res.Categories[1].Type) assert.Equal(t, model.SidebarCategoryChannels, res.Categories[1].Type)
assert.Equal(t, model.SidebarCategoryDirectMessages, res.Categories[2].Type) assert.Equal(t, model.SidebarCategoryDirectMessages, res.Categories[2].Type)
res2, err := ss.Channel().GetSidebarCategories(userId, teamId)
assert.NoError(t, err)
assert.Equal(t, res, res2)
}) })
t.Run("should create initial favorites/channels/DMs categories for multiple users", func(t *testing.T) { t.Run("should create initial favorites/channels/DMs categories for multiple users", func(t *testing.T) {
userId := model.NewId() userId := model.NewId()
teamId := model.NewId() teamId := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
userId2 := model.NewId() userId2 := model.NewId()
nErr = ss.Channel().CreateInitialSidebarCategories(userId2, teamId) res, nErr = ss.Channel().CreateInitialSidebarCategories(userId2, teamId)
assert.NoError(t, nErr) assert.NoError(t, nErr)
res, err := ss.Channel().GetSidebarCategories(userId2, teamId)
assert.NoError(t, err)
assert.Len(t, res.Categories, 3) assert.Len(t, res.Categories, 3)
assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
assert.Equal(t, model.SidebarCategoryChannels, res.Categories[1].Type) assert.Equal(t, model.SidebarCategoryChannels, res.Categories[1].Type)
assert.Equal(t, model.SidebarCategoryDirectMessages, res.Categories[2].Type) assert.Equal(t, model.SidebarCategoryDirectMessages, res.Categories[2].Type)
res2, err := ss.Channel().GetSidebarCategories(userId2, teamId)
assert.NoError(t, err)
assert.Equal(t, res, res2)
}) })
t.Run("should create initial favorites/channels/DMs categories on different teams", func(t *testing.T) { t.Run("should create initial favorites/channels/DMs categories on different teams", func(t *testing.T) {
userId := model.NewId() userId := model.NewId()
teamId := model.NewId() teamId := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
teamId2 := model.NewId() teamId2 := model.NewId()
nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId2) res, nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId2)
assert.NoError(t, nErr) assert.NoError(t, nErr)
res, err := ss.Channel().GetSidebarCategories(userId, teamId2)
assert.NoError(t, err)
assert.Len(t, res.Categories, 3) assert.Len(t, res.Categories, 3)
assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
assert.Equal(t, model.SidebarCategoryChannels, res.Categories[1].Type) assert.Equal(t, model.SidebarCategoryChannels, res.Categories[1].Type)
assert.Equal(t, model.SidebarCategoryDirectMessages, res.Categories[2].Type) assert.Equal(t, model.SidebarCategoryDirectMessages, res.Categories[2].Type)
res2, err := ss.Channel().GetSidebarCategories(userId, teamId2)
assert.NoError(t, err)
assert.Equal(t, res, res2)
}) })
t.Run("shouldn't create additional categories when ones already exist", func(t *testing.T) { t.Run("shouldn't create additional categories when ones already exist", func(t *testing.T) {
userId := model.NewId() userId := model.NewId()
teamId := model.NewId() teamId := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId) initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, res, initialCategories)
// Calling CreateInitialSidebarCategories a second time shouldn't create any new categories // Calling CreateInitialSidebarCategories a second time shouldn't create any new categories
nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId)
assert.NoError(t, nErr) assert.NoError(t, nErr)
assert.NotEmpty(t, res)
res, err := ss.Channel().GetSidebarCategories(userId, teamId) res, err = ss.Channel().GetSidebarCategories(userId, teamId)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, initialCategories.Categories, res.Categories) assert.Equal(t, initialCategories.Categories, res.Categories)
}) })
@@ -115,7 +123,7 @@ func testCreateInitialSidebarCategories(t *testing.T, ss store.Store) {
go func() { go func() {
defer wg.Done() defer wg.Done()
_ = ss.Channel().CreateInitialSidebarCategories(userId, teamId) _, _ = ss.Channel().CreateInitialSidebarCategories(userId, teamId)
}() }()
} }
@@ -168,17 +176,18 @@ func testCreateInitialSidebarCategories(t *testing.T, ss store.Store) {
require.NoError(t, nErr) require.NoError(t, nErr)
// Create the categories // Create the categories
nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId) categories, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr)
// Get and check the categories for channels
categories, nErr := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.Len(t, categories.Categories, 3) require.Len(t, categories.Categories, 3)
assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type)
assert.Equal(t, []string{channel1.Id}, categories.Categories[0].Channels) assert.Equal(t, []string{channel1.Id}, categories.Categories[0].Channels)
assert.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) assert.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type)
assert.Equal(t, []string{channel2.Id}, categories.Categories[1].Channels) assert.Equal(t, []string{channel2.Id}, categories.Categories[1].Channels)
// Get and check the categories for channels
categories2, nErr := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, nErr)
require.Equal(t, categories, categories2)
}) })
t.Run("should populate the Favorites category in alphabetical order", func(t *testing.T) { t.Run("should populate the Favorites category in alphabetical order", func(t *testing.T) {
@@ -231,15 +240,16 @@ func testCreateInitialSidebarCategories(t *testing.T, ss store.Store) {
require.NoError(t, nErr) require.NoError(t, nErr)
// Create the categories // Create the categories
nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId) categories, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr)
// Get and check the categories for channels
categories, nErr := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.Len(t, categories.Categories, 3) require.Len(t, categories.Categories, 3)
assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type)
assert.Equal(t, []string{channel2.Id, channel1.Id}, categories.Categories[0].Channels) assert.Equal(t, []string{channel2.Id, channel1.Id}, categories.Categories[0].Channels)
// Get and check the categories for channels
categories2, nErr := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, nErr)
require.Equal(t, categories, categories2)
}) })
t.Run("should populate the Favorites category with DMs and GMs", func(t *testing.T) { t.Run("should populate the Favorites category with DMs and GMs", func(t *testing.T) {
@@ -293,17 +303,18 @@ func testCreateInitialSidebarCategories(t *testing.T, ss store.Store) {
require.NoError(t, err) require.NoError(t, err)
// Create the categories // Create the categories
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) categories, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
// Get and check the categories for channels
categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err)
require.Len(t, categories.Categories, 3) require.Len(t, categories.Categories, 3)
assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type)
assert.Equal(t, []string{dmChannel1.Id}, categories.Categories[0].Channels) assert.Equal(t, []string{dmChannel1.Id}, categories.Categories[0].Channels)
assert.Equal(t, model.SidebarCategoryDirectMessages, categories.Categories[2].Type) assert.Equal(t, model.SidebarCategoryDirectMessages, categories.Categories[2].Type)
assert.Equal(t, []string{dmChannel2.Id}, categories.Categories[2].Channels) assert.Equal(t, []string{dmChannel2.Id}, categories.Categories[2].Channels)
// Get and check the categories for channels
categories2, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err)
require.Equal(t, categories, categories2)
}) })
t.Run("should not populate the Favorites category with channels from other teams", func(t *testing.T) { t.Run("should not populate the Favorites category with channels from other teams", func(t *testing.T) {
@@ -336,17 +347,18 @@ func testCreateInitialSidebarCategories(t *testing.T, ss store.Store) {
require.NoError(t, nErr) require.NoError(t, nErr)
// Create the categories // Create the categories
nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId) categories, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr)
// Get and check the categories for channels
categories, nErr := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.Len(t, categories.Categories, 3) require.Len(t, categories.Categories, 3)
assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type)
assert.Equal(t, []string{}, categories.Categories[0].Channels) assert.Equal(t, []string{}, categories.Categories[0].Channels)
assert.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type) assert.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type)
assert.Equal(t, []string{}, categories.Categories[1].Channels) assert.Equal(t, []string{}, categories.Categories[1].Channels)
// Get and check the categories for channels
categories2, nErr := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, nErr)
require.Equal(t, categories, categories2)
}) })
} }
@@ -355,8 +367,9 @@ func testCreateSidebarCategory(t *testing.T, ss store.Store) {
userId := model.NewId() userId := model.NewId()
teamId := model.NewId() teamId := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
// Create the category // Create the category
created, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{ created, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
@@ -367,7 +380,7 @@ func testCreateSidebarCategory(t *testing.T, ss store.Store) {
require.NoError(t, err) require.NoError(t, err)
// Confirm that it comes second // Confirm that it comes second
res, err := ss.Channel().GetSidebarCategories(userId, teamId) res, err = ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, res.Categories, 4) require.Len(t, res.Categories, 4)
assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
@@ -379,8 +392,9 @@ func testCreateSidebarCategory(t *testing.T, ss store.Store) {
userId := model.NewId() userId := model.NewId()
teamId := model.NewId() teamId := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
// Re-arrange the categories so that Favorites comes last // Re-arrange the categories so that Favorites comes last
categories, err := ss.Channel().GetSidebarCategories(userId, teamId) categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
@@ -404,7 +418,7 @@ func testCreateSidebarCategory(t *testing.T, ss store.Store) {
require.NoError(t, err) require.NoError(t, err)
// Confirm that it comes first // Confirm that it comes first
res, err := ss.Channel().GetSidebarCategories(userId, teamId) res, err = ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, res.Categories, 4) require.Len(t, res.Categories, 4)
assert.Equal(t, model.SidebarCategoryCustom, res.Categories[0].Type) assert.Equal(t, model.SidebarCategoryCustom, res.Categories[0].Type)
@@ -415,8 +429,9 @@ func testCreateSidebarCategory(t *testing.T, ss store.Store) {
userId := model.NewId() userId := model.NewId()
teamId := model.NewId() teamId := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
// Create some channels // Create some channels
channel1, err := ss.Channel().Save(&model.Channel{ channel1, err := ss.Channel().Save(&model.Channel{
@@ -443,17 +458,18 @@ func testCreateSidebarCategory(t *testing.T, ss store.Store) {
assert.Equal(t, []string{channel2.Id, channel1.Id}, created.Channels) assert.Equal(t, []string{channel2.Id, channel1.Id}, created.Channels)
// Get the channel again to ensure that the SidebarChannels were saved correctly // Get the channel again to ensure that the SidebarChannels were saved correctly
res, err := ss.Channel().GetSidebarCategory(created.Id) res2, err := ss.Channel().GetSidebarCategory(created.Id)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, []string{channel2.Id, channel1.Id}, res.Channels) assert.Equal(t, []string{channel2.Id, channel1.Id}, res2.Channels)
}) })
t.Run("should remove any channels from their previous categories", func(t *testing.T) { t.Run("should remove any channels from their previous categories", func(t *testing.T) {
userId := model.NewId() userId := model.NewId()
teamId := model.NewId() teamId := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
categories, err := ss.Channel().GetSidebarCategories(userId, teamId) categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -498,13 +514,13 @@ func testCreateSidebarCategory(t *testing.T, ss store.Store) {
assert.Equal(t, []string{channel2.Id, channel1.Id}, created.Channels) assert.Equal(t, []string{channel2.Id, channel1.Id}, created.Channels)
// Confirm that the channels were removed from their original categories // Confirm that the channels were removed from their original categories
res, err := ss.Channel().GetSidebarCategory(favoritesCategory.Id) res2, err := ss.Channel().GetSidebarCategory(favoritesCategory.Id)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, []string{}, res.Channels) assert.Equal(t, []string{}, res2.Channels)
res, err = ss.Channel().GetSidebarCategory(channelsCategory.Id) res2, err = ss.Channel().GetSidebarCategory(channelsCategory.Id)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, []string{}, res.Channels) assert.Equal(t, []string{}, res2.Channels)
}) })
} }
@@ -517,8 +533,9 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
channelId2 := model.NewId() channelId2 := model.NewId()
channelId3 := model.NewId() channelId3 := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
// Create a category and assign some channels to it // Create a category and assign some channels to it
created, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{ created, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
@@ -533,12 +550,12 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
require.NotNil(t, created) require.NotNil(t, created)
// Ensure that they're returned in order // Ensure that they're returned in order
res, err := ss.Channel().GetSidebarCategory(created.Id) res2, err := ss.Channel().GetSidebarCategory(created.Id)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, created.Id, res.Id) assert.Equal(t, created.Id, res2.Id)
assert.Equal(t, model.SidebarCategoryCustom, res.Type) assert.Equal(t, model.SidebarCategoryCustom, res2.Type)
assert.Equal(t, created.DisplayName, res.DisplayName) assert.Equal(t, created.DisplayName, res2.DisplayName)
assert.Equal(t, []string{channelId1, channelId2, channelId3}, res.Channels) assert.Equal(t, []string{channelId1, channelId2, channelId3}, res2.Channels)
}) })
t.Run("should return any orphaned channels with the Channels category", func(t *testing.T) { t.Run("should return any orphaned channels with the Channels category", func(t *testing.T) {
@@ -546,8 +563,9 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
teamId := model.NewId() teamId := model.NewId()
// Create the initial categories and find the channels category // Create the initial categories and find the channels category
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
categories, err := ss.Channel().GetSidebarCategories(userId, teamId) categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -596,11 +614,11 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
assert.Equal(t, int64(0), count) assert.Equal(t, int64(0), count)
// Ensure that the Channels are returned in alphabetical order // Ensure that the Channels are returned in alphabetical order
res, err := ss.Channel().GetSidebarCategory(channelsCategory.Id) res2, err := ss.Channel().GetSidebarCategory(channelsCategory.Id)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, channelsCategory.Id, res.Id) assert.Equal(t, channelsCategory.Id, res2.Id)
assert.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type) assert.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type)
assert.Equal(t, []string{channel2.Id, channel1.Id}, res.Channels) assert.Equal(t, []string{channel2.Id, channel1.Id}, res2.Channels)
}) })
t.Run("shouldn't return orphaned channels on another team with the Channels category", func(t *testing.T) { t.Run("shouldn't return orphaned channels on another team with the Channels category", func(t *testing.T) {
@@ -608,8 +626,9 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
teamId := model.NewId() teamId := model.NewId()
// Create the initial categories and find the channels category // Create the initial categories and find the channels category
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
categories, err := ss.Channel().GetSidebarCategories(userId, teamId) categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -624,6 +643,7 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
Type: model.CHANNEL_OPEN, Type: model.CHANNEL_OPEN,
}, 10) }, 10)
require.NoError(t, nErr) require.NoError(t, nErr)
defer ss.Channel().PermanentDelete(channel1.Id)
_, nErr = ss.Channel().SaveMember(&model.ChannelMember{ _, nErr = ss.Channel().SaveMember(&model.ChannelMember{
UserId: userId, UserId: userId,
@@ -633,11 +653,11 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
require.NoError(t, nErr) require.NoError(t, nErr)
// Ensure that no channels are returned // Ensure that no channels are returned
res, err := ss.Channel().GetSidebarCategory(channelsCategory.Id) res2, err := ss.Channel().GetSidebarCategory(channelsCategory.Id)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, channelsCategory.Id, res.Id) assert.Equal(t, channelsCategory.Id, res2.Id)
assert.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type) assert.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type)
assert.Len(t, res.Channels, 0) assert.Len(t, res2.Channels, 0)
}) })
t.Run("shouldn't return non-orphaned channels with the Channels category", func(t *testing.T) { t.Run("shouldn't return non-orphaned channels with the Channels category", func(t *testing.T) {
@@ -645,8 +665,9 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
teamId := model.NewId() teamId := model.NewId()
// Create the initial categories and find the channels category // Create the initial categories and find the channels category
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
categories, err := ss.Channel().GetSidebarCategories(userId, teamId) categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -695,11 +716,11 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
require.NoError(t, err) require.NoError(t, err)
// Ensure that the correct channel is returned in the Channels category // Ensure that the correct channel is returned in the Channels category
res, err := ss.Channel().GetSidebarCategory(channelsCategory.Id) res2, err := ss.Channel().GetSidebarCategory(channelsCategory.Id)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, channelsCategory.Id, res.Id) assert.Equal(t, channelsCategory.Id, res2.Id)
assert.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type) assert.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type)
assert.Equal(t, []string{channel1.Id}, res.Channels) assert.Equal(t, []string{channel1.Id}, res2.Channels)
}) })
t.Run("should return any orphaned DM channels with the Direct Messages category", func(t *testing.T) { t.Run("should return any orphaned DM channels with the Direct Messages category", func(t *testing.T) {
@@ -707,8 +728,9 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
teamId := model.NewId() teamId := model.NewId()
// Create the initial categories and find the DMs category // Create the initial categories and find the DMs category
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
categories, err := ss.Channel().GetSidebarCategories(userId, teamId) categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -735,11 +757,11 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
require.NoError(t, nErr) require.NoError(t, nErr)
// Ensure that the DM is returned // Ensure that the DM is returned
res, err := ss.Channel().GetSidebarCategory(dmsCategory.Id) res2, err := ss.Channel().GetSidebarCategory(dmsCategory.Id)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, dmsCategory.Id, res.Id) assert.Equal(t, dmsCategory.Id, res2.Id)
assert.Equal(t, model.SidebarCategoryDirectMessages, res.Type) assert.Equal(t, model.SidebarCategoryDirectMessages, res2.Type)
assert.Equal(t, []string{dmChannel.Id}, res.Channels) assert.Equal(t, []string{dmChannel.Id}, res2.Channels)
}) })
t.Run("should return any orphaned GM channels with the Direct Messages category", func(t *testing.T) { t.Run("should return any orphaned GM channels with the Direct Messages category", func(t *testing.T) {
@@ -747,8 +769,9 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
teamId := model.NewId() teamId := model.NewId()
// Create the initial categories and find the DMs category // Create the initial categories and find the DMs category
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
categories, err := ss.Channel().GetSidebarCategories(userId, teamId) categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -763,6 +786,7 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
Type: model.CHANNEL_GROUP, Type: model.CHANNEL_GROUP,
}, 10) }, 10)
require.NoError(t, nErr) require.NoError(t, nErr)
defer ss.Channel().PermanentDelete(gmChannel.Id)
_, nErr = ss.Channel().SaveMember(&model.ChannelMember{ _, nErr = ss.Channel().SaveMember(&model.ChannelMember{
UserId: userId, UserId: userId,
ChannelId: gmChannel.Id, ChannelId: gmChannel.Id,
@@ -771,11 +795,11 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
require.NoError(t, nErr) require.NoError(t, nErr)
// Ensure that the DM is returned // Ensure that the DM is returned
res, err := ss.Channel().GetSidebarCategory(dmsCategory.Id) res2, err := ss.Channel().GetSidebarCategory(dmsCategory.Id)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, dmsCategory.Id, res.Id) assert.Equal(t, dmsCategory.Id, res2.Id)
assert.Equal(t, model.SidebarCategoryDirectMessages, res.Type) assert.Equal(t, model.SidebarCategoryDirectMessages, res2.Type)
assert.Equal(t, []string{gmChannel.Id}, res.Channels) assert.Equal(t, []string{gmChannel.Id}, res2.Channels)
}) })
t.Run("should return orphaned DM channels in the DMs categorywhich are in a custom category on another team", func(t *testing.T) { t.Run("should return orphaned DM channels in the DMs categorywhich are in a custom category on another team", func(t *testing.T) {
@@ -783,8 +807,9 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
teamId := model.NewId() teamId := model.NewId()
// Create the initial categories and find the DMs category // Create the initial categories and find the DMs category
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
categories, err := ss.Channel().GetSidebarCategories(userId, teamId) categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -813,8 +838,9 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
// Create another team and assign the DM to a custom category on that team // Create another team and assign the DM to a custom category on that team
otherTeamId := model.NewId() otherTeamId := model.NewId()
nErr = ss.Channel().CreateInitialSidebarCategories(userId, otherTeamId) res, nErr = ss.Channel().CreateInitialSidebarCategories(userId, otherTeamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
_, err = ss.Channel().CreateSidebarCategory(userId, otherTeamId, &model.SidebarCategoryWithChannels{ _, err = ss.Channel().CreateSidebarCategory(userId, otherTeamId, &model.SidebarCategoryWithChannels{
SidebarCategory: model.SidebarCategory{ SidebarCategory: model.SidebarCategory{
@@ -826,11 +852,11 @@ func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
require.NoError(t, err) require.NoError(t, err)
// Ensure that the DM is returned with the DMs category on the original team // Ensure that the DM is returned with the DMs category on the original team
res, err := ss.Channel().GetSidebarCategory(dmsCategory.Id) res2, err := ss.Channel().GetSidebarCategory(dmsCategory.Id)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, dmsCategory.Id, res.Id) assert.Equal(t, dmsCategory.Id, res2.Id)
assert.Equal(t, model.SidebarCategoryDirectMessages, res.Type) assert.Equal(t, model.SidebarCategoryDirectMessages, res2.Type)
assert.Equal(t, []string{dmChannel.Id}, res.Channels) assert.Equal(t, []string{dmChannel.Id}, res2.Channels)
}) })
} }
@@ -839,8 +865,9 @@ func testGetSidebarCategories(t *testing.T, ss store.Store) {
userId := model.NewId() userId := model.NewId()
teamId := model.NewId() teamId := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
channelIds := []string{ channelIds := []string{
model.NewId(), model.NewId(),
@@ -857,7 +884,7 @@ func testGetSidebarCategories(t *testing.T, ss store.Store) {
gotCategory, err := ss.Channel().GetSidebarCategory(newCategory.Id) gotCategory, err := ss.Channel().GetSidebarCategory(newCategory.Id)
require.NoError(t, err) require.NoError(t, err)
res, err := ss.Channel().GetSidebarCategories(userId, teamId) res, err = ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, res.Categories, 4) require.Len(t, res.Categories, 4)
@@ -876,8 +903,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
teamId := model.NewId() teamId := model.NewId()
// Create the initial categories // Create the initial categories
err := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, err := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
require.NotEmpty(t, res)
initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId) initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -909,8 +937,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
teamId := model.NewId() teamId := model.NewId()
// Create the initial categories // Create the initial categories
err := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, err := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
require.NotEmpty(t, res)
initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId) initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -935,8 +964,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
userId := model.NewId() userId := model.NewId()
teamId := model.NewId() teamId := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId) initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -1001,8 +1031,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
teamId := model.NewId() teamId := model.NewId()
// Create the initial categories and find the favorites category // Create the initial categories and find the favorites category
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
categories, err := ss.Channel().GetSidebarCategories(userId, teamId) categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -1033,10 +1064,10 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
}) })
assert.NoError(t, err) assert.NoError(t, err)
res, nErr := ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id) res2, nErr := ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
assert.NoError(t, nErr) assert.NoError(t, nErr)
assert.NotNil(t, res) assert.NotNil(t, res2)
assert.Equal(t, "true", res.Value) assert.Equal(t, "true", res2.Value)
// And then remove it // And then remove it
channelsCategory := categories.Categories[1] channelsCategory := categories.Categories[1]
@@ -1050,10 +1081,10 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
}) })
assert.NoError(t, err) assert.NoError(t, err)
res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id) res2, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
assert.Error(t, nErr) assert.Error(t, nErr)
assert.True(t, errors.Is(nErr, sql.ErrNoRows)) assert.True(t, errors.Is(nErr, sql.ErrNoRows))
assert.Nil(t, res) assert.Nil(t, res2)
}) })
t.Run("should add and remove favorites preferences for DMs", func(t *testing.T) { t.Run("should add and remove favorites preferences for DMs", func(t *testing.T) {
@@ -1061,8 +1092,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
teamId := model.NewId() teamId := model.NewId()
// Create the initial categories and find the favorites category // Create the initial categories and find the favorites category
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
categories, err := ss.Channel().GetSidebarCategories(userId, teamId) categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -1098,10 +1130,10 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
}) })
assert.NoError(t, err) assert.NoError(t, err)
res, nErr := ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id) res2, nErr := ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id)
assert.NoError(t, nErr) assert.NoError(t, nErr)
assert.NotNil(t, res) assert.NotNil(t, res2)
assert.Equal(t, "true", res.Value) assert.Equal(t, "true", res2.Value)
// And then remove it // And then remove it
dmsCategory := categories.Categories[2] dmsCategory := categories.Categories[2]
@@ -1115,10 +1147,10 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
}) })
assert.NoError(t, err) assert.NoError(t, err)
res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id) res2, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id)
assert.Error(t, nErr) assert.Error(t, nErr)
assert.True(t, errors.Is(nErr, sql.ErrNoRows)) assert.True(t, errors.Is(nErr, sql.ErrNoRows))
assert.Nil(t, res) assert.Nil(t, res2)
}) })
t.Run("should add and remove favorites preferences, even if the channel is already favorited in preferences", func(t *testing.T) { t.Run("should add and remove favorites preferences, even if the channel is already favorited in preferences", func(t *testing.T) {
@@ -1127,8 +1159,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
teamId2 := model.NewId() teamId2 := model.NewId()
// Create the initial categories and find the favorites categories in each team // Create the initial categories and find the favorites categories in each team
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
categories, err := ss.Channel().GetSidebarCategories(userId, teamId) categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -1136,8 +1169,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
favoritesCategory := categories.Categories[0] favoritesCategory := categories.Categories[0]
require.Equal(t, model.SidebarCategoryFavorites, favoritesCategory.Type) require.Equal(t, model.SidebarCategoryFavorites, favoritesCategory.Type)
nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId2) res, nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId2)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
categories2, err := ss.Channel().GetSidebarCategories(userId, teamId2) categories2, err := ss.Channel().GetSidebarCategories(userId, teamId2)
require.NoError(t, err) require.NoError(t, err)
@@ -1173,10 +1207,10 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
}) })
assert.NoError(t, err) assert.NoError(t, err)
res, nErr := ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id) res2, nErr := ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id)
assert.NoError(t, nErr) assert.NoError(t, nErr)
assert.NotNil(t, res) assert.NotNil(t, res2)
assert.Equal(t, "true", res.Value) assert.Equal(t, "true", res2.Value)
// Assign it to favorites on the second team. The favorites preference is already set. // Assign it to favorites on the second team. The favorites preference is already set.
updated, _, err := ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{ updated, _, err := ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
@@ -1188,10 +1222,10 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, []string{dmChannel.Id}, updated[0].Channels) assert.Equal(t, []string{dmChannel.Id}, updated[0].Channels)
res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id) res2, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id)
assert.NoError(t, nErr) assert.NoError(t, nErr)
assert.NotNil(t, res) assert.NotNil(t, res2)
assert.Equal(t, "true", res.Value) assert.Equal(t, "true", res2.Value)
// Remove it from favorites on the first team. This clears the favorites preference for all teams. // Remove it from favorites on the first team. This clears the favorites preference for all teams.
_, _, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{ _, _, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
@@ -1202,9 +1236,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
}) })
assert.NoError(t, err) assert.NoError(t, err)
res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id) res2, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id)
require.Error(t, nErr) require.Error(t, nErr)
assert.Nil(t, res) assert.Nil(t, res2)
// Remove it from favorites on the second team. The favorites preference was already deleted. // Remove it from favorites on the second team. The favorites preference was already deleted.
_, _, err = ss.Channel().UpdateSidebarCategories(userId, teamId2, []*model.SidebarCategoryWithChannels{ _, _, err = ss.Channel().UpdateSidebarCategories(userId, teamId2, []*model.SidebarCategoryWithChannels{
@@ -1215,9 +1249,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
}) })
assert.NoError(t, err) assert.NoError(t, err)
res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id) res2, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id)
require.Error(t, nErr) require.Error(t, nErr)
assert.Nil(t, res) assert.Nil(t, res2)
}) })
t.Run("should not affect other users' favorites preferences", func(t *testing.T) { t.Run("should not affect other users' favorites preferences", func(t *testing.T) {
@@ -1225,8 +1259,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
teamId := model.NewId() teamId := model.NewId()
// Create the initial categories and find the favorites category // Create the initial categories and find the favorites category
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
categories, err := ss.Channel().GetSidebarCategories(userId, teamId) categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -1239,8 +1274,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
// Create the other users' categories // Create the other users' categories
userId2 := model.NewId() userId2 := model.NewId()
nErr = ss.Channel().CreateInitialSidebarCategories(userId2, teamId) res, nErr = ss.Channel().CreateInitialSidebarCategories(userId2, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
categories2, err := ss.Channel().GetSidebarCategories(userId2, teamId) categories2, err := ss.Channel().GetSidebarCategories(userId2, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -1283,14 +1319,14 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
}) })
assert.NoError(t, err) assert.NoError(t, err)
res, nErr := ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id) res2, nErr := ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
assert.NoError(t, nErr) assert.NoError(t, nErr)
assert.NotNil(t, res) assert.NotNil(t, res2)
assert.Equal(t, "true", res.Value) assert.Equal(t, "true", res2.Value)
res, nErr = ss.Preference().Get(userId2, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id) res2, nErr = ss.Preference().Get(userId2, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
assert.True(t, errors.Is(nErr, sql.ErrNoRows)) assert.True(t, errors.Is(nErr, sql.ErrNoRows))
assert.Nil(t, res) assert.Nil(t, res2)
// And user2 favorite it // And user2 favorite it
_, _, err = ss.Channel().UpdateSidebarCategories(userId2, teamId, []*model.SidebarCategoryWithChannels{ _, _, err = ss.Channel().UpdateSidebarCategories(userId2, teamId, []*model.SidebarCategoryWithChannels{
@@ -1305,15 +1341,15 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
}) })
assert.NoError(t, err) assert.NoError(t, err)
res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id) res2, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
assert.NoError(t, nErr) assert.NoError(t, nErr)
assert.NotNil(t, res) assert.NotNil(t, res2)
assert.Equal(t, "true", res.Value) assert.Equal(t, "true", res2.Value)
res, nErr = ss.Preference().Get(userId2, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id) res2, nErr = ss.Preference().Get(userId2, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
assert.NoError(t, nErr) assert.NoError(t, nErr)
assert.NotNil(t, res) assert.NotNil(t, res2)
assert.Equal(t, "true", res.Value) assert.Equal(t, "true", res2.Value)
// And then user1 unfavorite it // And then user1 unfavorite it
_, _, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{ _, _, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
@@ -1328,14 +1364,14 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
}) })
assert.NoError(t, err) assert.NoError(t, err)
res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id) res2, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
assert.True(t, errors.Is(nErr, sql.ErrNoRows)) assert.True(t, errors.Is(nErr, sql.ErrNoRows))
assert.Nil(t, res) assert.Nil(t, res2)
res, nErr = ss.Preference().Get(userId2, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id) res2, nErr = ss.Preference().Get(userId2, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
assert.NoError(t, nErr) assert.NoError(t, nErr)
assert.NotNil(t, res) assert.NotNil(t, res2)
assert.Equal(t, "true", res.Value) assert.Equal(t, "true", res2.Value)
// And finally user2 favorite it // And finally user2 favorite it
_, _, err = ss.Channel().UpdateSidebarCategories(userId2, teamId, []*model.SidebarCategoryWithChannels{ _, _, err = ss.Channel().UpdateSidebarCategories(userId2, teamId, []*model.SidebarCategoryWithChannels{
@@ -1350,13 +1386,13 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
}) })
assert.NoError(t, err) assert.NoError(t, err)
res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id) res2, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
assert.True(t, errors.Is(nErr, sql.ErrNoRows)) assert.True(t, errors.Is(nErr, sql.ErrNoRows))
assert.Nil(t, res) assert.Nil(t, res2)
res, nErr = ss.Preference().Get(userId2, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id) res2, nErr = ss.Preference().Get(userId2, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
assert.True(t, errors.Is(nErr, sql.ErrNoRows)) assert.True(t, errors.Is(nErr, sql.ErrNoRows))
assert.Nil(t, res) assert.Nil(t, res2)
}) })
t.Run("channels removed from Channels or DMs categories should be re-added", func(t *testing.T) { t.Run("channels removed from Channels or DMs categories should be re-added", func(t *testing.T) {
@@ -1394,8 +1430,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
) )
require.NoError(t, nErr) require.NoError(t, nErr)
nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
// And some categories // And some categories
initialCategories, nErr := ss.Channel().GetSidebarCategories(userId, teamId) initialCategories, nErr := ss.Channel().GetSidebarCategories(userId, teamId)
@@ -1448,8 +1485,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
) )
require.NoError(t, nErr) require.NoError(t, nErr)
nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
// The DM should start in the DMs category // The DM should start in the DMs category
initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId) initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId)
@@ -1535,8 +1573,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
require.NoError(t, err) require.NoError(t, err)
// And then create the initial categories so that it includes the channel // And then create the initial categories so that it includes the channel
nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
initialCategories, nErr := ss.Channel().GetSidebarCategories(userId, teamId) initialCategories, nErr := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
@@ -1598,8 +1637,9 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store) {
require.NoError(t, err) require.NoError(t, err)
// And then create the initial categories so that Channels includes the channel // And then create the initial categories so that Channels includes the channel
nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
initialCategories, nErr := ss.Channel().GetSidebarCategories(userId, teamId) initialCategories, nErr := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
@@ -1655,8 +1695,9 @@ func setupInitialSidebarCategories(t *testing.T, ss store.Store) (string, string
userId := model.NewId() userId := model.NewId()
teamId := model.NewId() teamId := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
res, err := ss.Channel().GetSidebarCategories(userId, teamId) res, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.NoError(t, err) require.NoError(t, err)
@@ -1775,10 +1816,11 @@ func testClearSidebarOnTeamLeave(t *testing.T, ss store.Store, s SqlStore) {
// Create a second team and set up the sidebar categories for it // Create a second team and set up the sidebar categories for it
teamId2 := model.NewId() teamId2 := model.NewId()
err := ss.Channel().CreateInitialSidebarCategories(userId, teamId2) res, err := ss.Channel().CreateInitialSidebarCategories(userId, teamId2)
require.NoError(t, err) require.NoError(t, err)
require.NotEmpty(t, res)
res, err := ss.Channel().GetSidebarCategories(userId, teamId2) res, err = ss.Channel().GetSidebarCategories(userId, teamId2)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, res.Categories, 3) require.Len(t, res.Categories, 3)
@@ -1959,8 +2001,9 @@ func testUpdateSidebarChannelsByPreferences(t *testing.T, ss store.Store) {
userId := model.NewId() userId := model.NewId()
teamId := model.NewId() teamId := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res)
channel, nErr := ss.Channel().Save(&model.Channel{ channel, nErr := ss.Channel().Save(&model.Channel{
Name: "channel", Name: "channel",
@@ -1983,8 +2026,9 @@ func testUpdateSidebarChannelsByPreferences(t *testing.T, ss store.Store) {
userId := model.NewId() userId := model.NewId()
teamId := model.NewId() teamId := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId) res, nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
assert.NoError(t, nErr) assert.NoError(t, nErr)
require.NotEmpty(t, res)
require.NotPanics(t, func() { require.NotPanics(t, func() {
_ = ss.Channel().UpdateSidebarChannelsByPreferences(&model.Preferences{ _ = ss.Channel().UpdateSidebarChannelsByPreferences(&model.Preferences{

Просмотреть файл

@@ -181,17 +181,26 @@ func (_m *ChannelStore) CreateDirectChannel(userId *model.User, otherUserId *mod
} }
// CreateInitialSidebarCategories provides a mock function with given fields: userId, teamID // CreateInitialSidebarCategories provides a mock function with given fields: userId, teamID
func (_m *ChannelStore) CreateInitialSidebarCategories(userId string, teamID string) error { func (_m *ChannelStore) CreateInitialSidebarCategories(userId string, teamID string) (*model.OrderedSidebarCategories, error) {
ret := _m.Called(userId, teamID) ret := _m.Called(userId, teamID)
var r0 error var r0 *model.OrderedSidebarCategories
if rf, ok := ret.Get(0).(func(string, string) error); ok { if rf, ok := ret.Get(0).(func(string, string) *model.OrderedSidebarCategories); ok {
r0 = rf(userId, teamID) r0 = rf(userId, teamID)
} else { } else {
r0 = ret.Error(0) if ret.Get(0) != nil {
r0 = ret.Get(0).(*model.OrderedSidebarCategories)
}
} }
return r0 var r1 error
if rf, ok := ret.Get(1).(func(string, string) error); ok {
r1 = rf(userId, teamID)
} else {
r1 = ret.Error(1)
}
return r0, r1
} }
// CreateSidebarCategory provides a mock function with given fields: userId, teamID, newCategory // CreateSidebarCategory provides a mock function with given fields: userId, teamID, newCategory

Просмотреть файл

@@ -631,10 +631,10 @@ func (s *TimerLayerChannelStore) CreateDirectChannel(userId *model.User, otherUs
return result, err return result, err
} }
func (s *TimerLayerChannelStore) CreateInitialSidebarCategories(userId string, teamID string) error { func (s *TimerLayerChannelStore) CreateInitialSidebarCategories(userId string, teamID string) (*model.OrderedSidebarCategories, error) {
start := timemodule.Now() start := timemodule.Now()
err := s.ChannelStore.CreateInitialSidebarCategories(userId, teamID) result, err := s.ChannelStore.CreateInitialSidebarCategories(userId, teamID)
elapsed := float64(timemodule.Since(start)) / float64(timemodule.Second) elapsed := float64(timemodule.Since(start)) / float64(timemodule.Second)
if s.Root.Metrics != nil { if s.Root.Metrics != nil {
@@ -644,7 +644,7 @@ func (s *TimerLayerChannelStore) CreateInitialSidebarCategories(userId string, t
} }
s.Root.Metrics.ObserveStoreMethodDuration("ChannelStore.CreateInitialSidebarCategories", success, elapsed) s.Root.Metrics.ObserveStoreMethodDuration("ChannelStore.CreateInitialSidebarCategories", success, elapsed)
} }
return err return result, err
} }
func (s *TimerLayerChannelStore) CreateSidebarCategory(userId string, teamID string, newCategory *model.SidebarCategoryWithChannels) (*model.SidebarCategoryWithChannels, error) { func (s *TimerLayerChannelStore) CreateSidebarCategory(userId string, teamID string, newCategory *model.SidebarCategoryWithChannels) (*model.SidebarCategoryWithChannels, error) {