MM-30314 Don't delete all SidebarChannels when removed from team (#16692)

* MM-30314 Don't delete all SidebarChannels when removed from team

* Revert some changes to minimize diff
Этот коммит содержится в:
Harrison Healey
2021-01-18 12:42:55 -05:00
коммит произвёл GitHub
родитель 0391fe7de9
Коммит 90952a1bd5
2 изменённых файлов: 201 добавлений и 9 удалений

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

@@ -962,7 +962,20 @@ func (s SqlChannelStore) ClearSidebarOnTeamLeave(userId, teamId string) error {
if s.DriverName() == model.DATABASE_DRIVER_MYSQL {
deleteQuery = "DELETE SidebarChannels FROM SidebarChannels LEFT JOIN SidebarCategories ON SidebarCategories.Id = SidebarChannels.CategoryId WHERE SidebarCategories.TeamId=:TeamId AND SidebarCategories.UserId=:UserId"
} else {
deleteQuery = "DELETE FROM SidebarChannels USING SidebarChannels AS chan LEFT OUTER JOIN SidebarCategories AS cat ON cat.Id = chan.CategoryId WHERE cat.UserId = :UserId AND cat.TeamId = :TeamId"
deleteQuery = `
DELETE FROM
SidebarChannels
WHERE
CategoryId IN (
SELECT
CategoryId
FROM
SidebarChannels,
SidebarCategories
WHERE
SidebarChannels.CategoryId = SidebarCategories.Id
AND SidebarCategories.TeamId = :TeamId
AND SidebarChannels.UserId = :UserId)`
}
if _, err := s.GetMaster().Exec(deleteQuery, params); err != nil {
return errors.Wrap(err, "failed to delete from SidebarChannels")

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

@@ -22,6 +22,7 @@ func TestChannelStoreCategories(t *testing.T, ss store.Store, s SqlStore) {
t.Run("GetSidebarCategory", func(t *testing.T) { testGetSidebarCategory(t, ss, s) })
t.Run("GetSidebarCategories", func(t *testing.T) { testGetSidebarCategories(t, ss) })
t.Run("UpdateSidebarCategories", func(t *testing.T) { testUpdateSidebarCategories(t, ss, s) })
t.Run("ClearSidebarOnTeamLeave", func(t *testing.T) { testClearSidebarOnTeamLeave(t, ss, s) })
t.Run("DeleteSidebarCategory", func(t *testing.T) { testDeleteSidebarCategory(t, ss, s) })
t.Run("UpdateSidebarChannelsByPreferences", func(t *testing.T) { testUpdateSidebarChannelsByPreferences(t, ss) })
}
@@ -1649,21 +1650,199 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store, s SqlStore) {
})
}
func testDeleteSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
setupInitialSidebarCategories := func(t *testing.T, ss store.Store) (string, string) {
userId := model.NewId()
teamId := model.NewId()
func setupInitialSidebarCategories(t *testing.T, ss store.Store) (string, string) {
userId := model.NewId()
teamId := model.NewId()
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
require.Nil(t, nErr)
res, err := ss.Channel().GetSidebarCategories(userId, teamId)
require.Nil(t, err)
require.Len(t, res.Categories, 3)
return userId, teamId
}
func testClearSidebarOnTeamLeave(t *testing.T, ss store.Store, s SqlStore) {
t.Run("should delete all sidebar categories and channels on the team", func(t *testing.T) {
userId, teamId := setupInitialSidebarCategories(t, ss)
user := &model.User{
Id: userId,
}
// Create some channels and assign them to a custom category
channel1, nErr := ss.Channel().Save(&model.Channel{
Name: model.NewId(),
TeamId: teamId,
Type: model.CHANNEL_OPEN,
}, 1000)
require.Nil(t, nErr)
res, err := ss.Channel().GetSidebarCategories(userId, teamId)
dmChannel1, nErr := ss.Channel().CreateDirectChannel(user, &model.User{
Id: model.NewId(),
})
require.Nil(t, nErr)
_, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
Channels: []string{channel1.Id, dmChannel1.Id},
})
require.Nil(t, err)
// Confirm that we start with the right number of categories and SidebarChannels entries
count, err := s.GetMaster().SelectInt("SELECT COUNT(*) FROM SidebarCategories WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
require.Nil(t, err)
require.Equal(t, int64(4), count)
count, err = s.GetMaster().SelectInt("SELECT COUNT(*) FROM SidebarChannels WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
require.Nil(t, err)
require.Equal(t, int64(2), count)
// Leave the team
err = ss.Channel().ClearSidebarOnTeamLeave(userId, teamId)
assert.Nil(t, err)
// Confirm that all the categories and SidebarChannel entries have been deleted
count, err = s.GetMaster().SelectInt("SELECT COUNT(*) FROM SidebarCategories WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
require.Nil(t, err)
assert.Equal(t, int64(0), count)
count, err = s.GetMaster().SelectInt("SELECT COUNT(*) FROM SidebarChannels WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
require.Nil(t, err)
assert.Equal(t, int64(0), count)
})
t.Run("should not delete sidebar categories and channels on another the team", func(t *testing.T) {
userId, teamId := setupInitialSidebarCategories(t, ss)
user := &model.User{
Id: userId,
}
// Create some channels and assign them to a custom category
channel1, nErr := ss.Channel().Save(&model.Channel{
Name: model.NewId(),
TeamId: teamId,
Type: model.CHANNEL_OPEN,
}, 1000)
require.Nil(t, nErr)
dmChannel1, nErr := ss.Channel().CreateDirectChannel(user, &model.User{
Id: model.NewId(),
})
require.Nil(t, nErr)
_, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
Channels: []string{channel1.Id, dmChannel1.Id},
})
require.Nil(t, err)
// Confirm that we start with the right number of categories and SidebarChannels entries
count, err := s.GetMaster().SelectInt("SELECT COUNT(*) FROM SidebarCategories WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
require.Nil(t, err)
require.Equal(t, int64(4), count)
count, err = s.GetMaster().SelectInt("SELECT COUNT(*) FROM SidebarChannels WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
require.Nil(t, err)
require.Equal(t, int64(2), count)
// Leave another team
err = ss.Channel().ClearSidebarOnTeamLeave(userId, model.NewId())
assert.Nil(t, err)
// Confirm that nothing has been deleted
count, err = s.GetMaster().SelectInt("SELECT COUNT(*) FROM SidebarCategories WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
require.Nil(t, err)
assert.Equal(t, int64(4), count)
count, err = s.GetMaster().SelectInt("SELECT COUNT(*) FROM SidebarChannels WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
require.Nil(t, err)
assert.Equal(t, int64(2), count)
})
t.Run("MM-30314 should not delete channels on another team under specific circumstances", func(t *testing.T) {
userId, teamId := setupInitialSidebarCategories(t, ss)
user := &model.User{
Id: userId,
}
user2 := &model.User{
Id: model.NewId(),
}
// Create a second team and set up the sidebar categories for it
teamId2 := model.NewId()
err := ss.Channel().CreateInitialSidebarCategories(userId, teamId2)
require.Nil(t, err)
res, err := ss.Channel().GetSidebarCategories(userId, teamId2)
require.Nil(t, err)
require.Len(t, res.Categories, 3)
return userId, teamId
}
// On the first team, create some channels and assign them to a custom category
channel1, nErr := ss.Channel().Save(&model.Channel{
Name: model.NewId(),
TeamId: teamId,
Type: model.CHANNEL_OPEN,
}, 1000)
require.Nil(t, nErr)
dmChannel1, nErr := ss.Channel().CreateDirectChannel(user, user2)
require.Nil(t, nErr)
_, err = ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
Channels: []string{channel1.Id, dmChannel1.Id},
})
require.Nil(t, err)
// Do the same on the second team
channel2, nErr := ss.Channel().Save(&model.Channel{
Name: model.NewId(),
TeamId: teamId2,
Type: model.CHANNEL_OPEN,
}, 1000)
require.Nil(t, nErr)
_, err = ss.Channel().CreateSidebarCategory(userId, teamId2, &model.SidebarCategoryWithChannels{
Channels: []string{channel2.Id, dmChannel1.Id},
})
require.Nil(t, err)
// Confirm that we start with the right number of categories and SidebarChannels entries
count, err := s.GetMaster().SelectInt("SELECT COUNT(*) FROM SidebarCategories WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
require.Nil(t, err)
require.Equal(t, int64(8), count)
count, err = s.GetMaster().SelectInt("SELECT COUNT(*) FROM SidebarChannels WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
require.Nil(t, err)
require.Equal(t, int64(4), count)
// Leave the first team
err = ss.Channel().ClearSidebarOnTeamLeave(userId, teamId)
assert.Nil(t, err)
// Confirm that we have the correct number of categories and SidebarChannels entries left over
count, err = s.GetMaster().SelectInt("SELECT COUNT(*) FROM SidebarCategories WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
require.Nil(t, err)
assert.Equal(t, int64(4), count)
count, err = s.GetMaster().SelectInt("SELECT COUNT(*) FROM SidebarChannels WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
require.Nil(t, err)
assert.Equal(t, int64(2), count)
// Confirm that the categories on the second team are unchanged
res, err = ss.Channel().GetSidebarCategories(userId, teamId2)
require.Nil(t, err)
assert.Len(t, res.Categories, 4)
assert.Equal(t, model.SidebarCategoryCustom, res.Categories[1].Type)
assert.Equal(t, []string{channel2.Id, dmChannel1.Id}, res.Categories[1].Channels)
})
}
func testDeleteSidebarCategory(t *testing.T, ss store.Store, s SqlStore) {
t.Run("should correctly remove an empty category", func(t *testing.T) {
userId, teamId := setupInitialSidebarCategories(t, ss)
defer ss.User().PermanentDelete(userId)