* add support for get/set/delete user preferences

* make mmctl-docs

* make --category required

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
Этот коммит содержится в:
Jesse Hallam
2024-02-07 15:34:37 -04:00
коммит произвёл GitHub
родитель 495245b43e
Коммит ec1c693df9
10 изменённых файлов: 1026 добавлений и 0 удалений

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

@@ -4,6 +4,7 @@
package commands
import (
"context"
"fmt"
"net/http"
@@ -1067,3 +1068,449 @@ func (s *MmctlE2ETestSuite) TestMigrateAuthCmd() {
s.Require().Equal(model.UserAuthServiceLdap, updatedUser.AuthService)
})
}
func (s *MmctlE2ETestSuite) cleanUpPreferences(userID string) {
s.T().Helper()
// Delete any existing preferences
preferences, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), userID)
s.NoError(err)
_, err = s.th.SystemAdminClient.DeletePreferences(context.Background(), userID, preferences)
s.NoError(err)
}
func (s *MmctlE2ETestSuite) TestPreferenceListCmd() {
s.SetupTestHelper().InitBasic()
s.cleanUpPreferences(s.th.BasicUser.Id)
s.cleanUpPreferences(s.th.BasicUser2.Id)
preference1 := model.Preference{UserId: s.th.BasicUser.Id, Category: "display_settings", Name: "collapsed_reply_threads", Value: "threads_view"}
_, err := s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser.Id, model.Preferences{preference1})
s.NoError(err)
preference2 := model.Preference{UserId: s.th.BasicUser.Id, Category: "display_settings", Name: "colorize_usernames", Value: "threads_view"}
_, err = s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser.Id, model.Preferences{preference2})
s.NoError(err)
preference3 := model.Preference{UserId: s.th.BasicUser.Id, Category: "drafts", Name: "drafts_tour_tip_showed", Value: `{"drafts_tour_tip_showed":true}`}
_, err = s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser.Id, model.Preferences{preference3})
s.NoError(err)
preference4 := model.Preference{UserId: s.th.BasicUser2.Id, Category: "display_settings", Name: "collapsed_reply_threads", Value: "threads_view"}
_, err = s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser2.Id, model.Preferences{preference4})
s.NoError(err)
s.Run("list all preferences for single user", func() {
printer.Clean()
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", "", "")
err = preferencesListCmdF(s.th.Client, cmd, []string{s.th.BasicUser.Email})
s.Require().NoError(err)
s.Require().Len(printer.GetLines(), 3)
s.Require().Equal(preference1, printer.GetLines()[0])
s.Require().Equal(preference2, printer.GetLines()[1])
s.Require().Equal(preference3, printer.GetLines()[2])
s.Require().Len(printer.GetErrorLines(), 0)
})
s.Run("list filtered preferences for single user", func() {
printer.Clean()
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preference1.Category, "")
err = preferencesListCmdF(s.th.Client, cmd, []string{s.th.BasicUser.Email})
s.Require().NoError(err)
s.Require().Len(printer.GetLines(), 2)
s.Require().Equal(preference1, printer.GetLines()[0])
s.Require().Equal(preference2, printer.GetLines()[1])
s.Require().Len(printer.GetErrorLines(), 0)
})
s.Run("list all preferences for multiple users as admin", func() {
printer.Clean()
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", "", "")
err = preferencesListCmdF(s.th.SystemAdminClient, cmd, []string{s.th.BasicUser.Email, s.th.BasicUser2.Email})
s.Require().NoError(err)
s.Require().Len(printer.GetLines(), 4)
s.Require().Equal(preference1, printer.GetLines()[0])
s.Require().Equal(preference2, printer.GetLines()[1])
s.Require().Equal(preference3, printer.GetLines()[2])
s.Require().Equal(preference4, printer.GetLines()[3])
s.Require().Len(printer.GetErrorLines(), 0)
})
s.Run("list filtered preferences for multiple users as admin", func() {
printer.Clean()
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preference1.Category, "")
err = preferencesListCmdF(s.th.SystemAdminClient, cmd, []string{s.th.BasicUser.Email, s.th.BasicUser2.Email})
s.Require().NoError(err)
s.Require().Len(printer.GetLines(), 3)
s.Require().Equal(preference1, printer.GetLines()[0])
s.Require().Equal(preference2, printer.GetLines()[1])
s.Require().Equal(preference4, printer.GetLines()[2])
s.Require().Len(printer.GetErrorLines(), 0)
})
s.Run("list preferences for multiple users as non-admin", func() {
printer.Clean()
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preference1.Category, "")
err = preferencesListCmdF(s.th.Client, cmd, []string{s.th.BasicUser.Email, s.th.BasicUser2.Email})
s.Require().Error(err)
})
}
func (s *MmctlE2ETestSuite) TestPreferenceGetCmd() {
s.SetupTestHelper().InitBasic()
s.cleanUpPreferences(s.th.BasicUser.Id)
s.cleanUpPreferences(s.th.BasicUser2.Id)
preference1 := model.Preference{UserId: s.th.BasicUser.Id, Category: "display_settings", Name: "collapsed_reply_threads", Value: "threads_view"}
_, err := s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser.Id, model.Preferences{preference1})
s.NoError(err)
preference2 := model.Preference{UserId: s.th.BasicUser.Id, Category: "display_settings", Name: "colorize_usernames", Value: "threads_view"}
_, err = s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser.Id, model.Preferences{preference2})
s.NoError(err)
preference3 := model.Preference{UserId: s.th.BasicUser.Id, Category: "drafts", Name: "drafts_tour_tip_showed", Value: `{"drafts_tour_tip_showed":true}`}
_, err = s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser.Id, model.Preferences{preference3})
s.NoError(err)
preference4 := model.Preference{UserId: s.th.BasicUser2.Id, Category: "display_settings", Name: "collapsed_reply_threads", Value: "threads_view"}
_, err = s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser2.Id, model.Preferences{preference4})
s.NoError(err)
s.Run("get preference for single user", func() {
printer.Clean()
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preference1.Category, "")
cmd.Flags().StringP("name", "n", preference1.Name, "")
err = preferencesGetCmdF(s.th.Client, cmd, []string{s.th.BasicUser.Email})
s.Require().NoError(err)
s.Require().Len(printer.GetLines(), 1)
s.Require().Equal(&preference1, printer.GetLines()[0])
s.Require().Len(printer.GetErrorLines(), 0)
})
s.Run("get preferences for multiple users as admin", func() {
printer.Clean()
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preference1.Category, "")
cmd.Flags().StringP("name", "n", preference1.Name, "")
err = preferencesGetCmdF(s.th.SystemAdminClient, cmd, []string{s.th.BasicUser.Email, s.th.BasicUser2.Email})
s.Require().NoError(err)
s.Require().Len(printer.GetLines(), 2)
s.Require().Equal(&preference1, printer.GetLines()[0])
s.Require().Equal(&preference4, printer.GetLines()[1])
s.Require().Len(printer.GetErrorLines(), 0)
})
s.Run("get preferences for multiple users as non-admin", func() {
printer.Clean()
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preference1.Category, "")
cmd.Flags().StringP("name", "n", preference1.Name, "")
err = preferencesGetCmdF(s.th.Client, cmd, []string{s.th.BasicUser.Email, s.th.BasicUser2.Email})
s.Require().Error(err)
})
}
func (s *MmctlE2ETestSuite) TestPreferenceUpdateCmd() {
s.SetupTestHelper().InitBasic()
preference1 := model.Preference{UserId: s.th.BasicUser.Id, Category: "display_settings", Name: "collapsed_reply_threads", Value: "threads_view"}
preference2 := model.Preference{UserId: s.th.BasicUser.Id, Category: "display_settings", Name: "colorize_usernames", Value: "threads_view"}
preference3 := model.Preference{UserId: s.th.BasicUser.Id, Category: "drafts", Name: "drafts_tour_tip_showed", Value: `{"drafts_tour_tip_showed":true}`}
preference4 := model.Preference{UserId: s.th.BasicUser2.Id, Category: "display_settings", Name: "collapsed_reply_threads", Value: "threads_view"}
setup := func() {
s.T().Helper()
s.cleanUpPreferences(s.th.BasicUser.Id)
s.cleanUpPreferences(s.th.BasicUser2.Id)
_, err := s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser.Id, model.Preferences{preference1})
s.NoError(err)
_, err = s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser.Id, model.Preferences{preference2})
s.NoError(err)
_, err = s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser.Id, model.Preferences{preference3})
s.NoError(err)
_, err = s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser2.Id, model.Preferences{preference4})
s.NoError(err)
}
s.Run("add new preference for single user", func() {
setup()
printer.Clean()
preferenceNew := model.Preference{UserId: s.th.BasicUser.Id, Category: "zzz_custom", Name: "new", Value: "value"}
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preferenceNew.Category, "")
cmd.Flags().StringP("name", "n", preferenceNew.Name, "")
cmd.Flags().StringP("value", "v", preferenceNew.Value, "")
err := preferencesUpdateCmdF(s.th.Client, cmd, []string{s.th.BasicUser.Email})
s.Require().NoError(err)
s.Require().Len(printer.GetErrorLines(), 0)
actualPreferencesUser1, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), s.th.BasicUser.Id)
s.NoError(err)
s.Require().Len(actualPreferencesUser1, 4)
s.Require().Equal(preference1, actualPreferencesUser1[0])
s.Require().Equal(preference2, actualPreferencesUser1[1])
s.Require().Equal(preference3, actualPreferencesUser1[2])
s.Require().Equal(preferenceNew, actualPreferencesUser1[3])
// Second user unaffected
actualPreferencesUser2, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), s.th.BasicUser2.Id)
s.NoError(err)
s.Require().Len(actualPreferencesUser2, 1)
s.Require().Equal(preference4, actualPreferencesUser2[0])
})
s.Run("add new preference for multiple users as admin", func() {
setup()
printer.Clean()
preferenceNew := model.Preference{UserId: s.th.BasicUser.Id, Category: "zzz_custom", Name: "new", Value: "value"}
preferenceNew2 := model.Preference{UserId: s.th.BasicUser2.Id, Category: "zzz_custom", Name: "new", Value: "value"}
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preferenceNew.Category, "")
cmd.Flags().StringP("name", "n", preferenceNew.Name, "")
cmd.Flags().StringP("value", "v", preferenceNew.Value, "")
err := preferencesUpdateCmdF(s.th.SystemAdminClient, cmd, []string{s.th.BasicUser.Email, s.th.BasicUser2.Email})
s.Require().NoError(err)
s.Require().Len(printer.GetErrorLines(), 0)
actualPreferencesUser1, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), s.th.BasicUser.Id)
s.NoError(err)
s.Require().Len(actualPreferencesUser1, 4)
s.Require().Equal(preference1, actualPreferencesUser1[0])
s.Require().Equal(preference2, actualPreferencesUser1[1])
s.Require().Equal(preference3, actualPreferencesUser1[2])
s.Require().Equal(preferenceNew, actualPreferencesUser1[3])
// Second user unaffected
actualPreferencesUser2, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), s.th.BasicUser2.Id)
s.NoError(err)
s.Require().Len(actualPreferencesUser2, 2)
s.Require().Equal(preference4, actualPreferencesUser2[0])
s.Require().Equal(preferenceNew2, actualPreferencesUser2[1])
})
s.Run("add new preference for multiple users as non-admin", func() {
setup()
printer.Clean()
preference := model.Preference{Category: "display_settings", Name: "collapsed_reply_threads", Value: "threads_view"}
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preference.Category, "")
cmd.Flags().StringP("name", "n", preference.Name, "")
cmd.Flags().StringP("value", "v", preference.Value, "")
err := preferencesUpdateCmdF(s.th.Client, cmd, []string{s.th.BasicUser.Email, s.th.BasicUser2.Email})
s.Require().Error(err)
})
s.Run("update existing preference for single user", func() {
setup()
printer.Clean()
preferenceUpdated := model.Preference{UserId: s.th.BasicUser.Id, Category: preference1.Category, Name: preference1.Name, Value: "new_value"}
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preferenceUpdated.Category, "")
cmd.Flags().StringP("name", "n", preferenceUpdated.Name, "")
cmd.Flags().StringP("value", "v", preferenceUpdated.Value, "")
err := preferencesUpdateCmdF(s.th.Client, cmd, []string{s.th.BasicUser.Email})
s.Require().NoError(err)
s.Require().Len(printer.GetErrorLines(), 0)
actualPreferencesUser1, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), s.th.BasicUser.Id)
s.NoError(err)
s.Require().Len(actualPreferencesUser1, 3)
s.Require().Equal(preferenceUpdated, actualPreferencesUser1[0])
s.Require().Equal(preference2, actualPreferencesUser1[1])
s.Require().Equal(preference3, actualPreferencesUser1[2])
// Second user unaffected
actualPreferencesUser2, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), s.th.BasicUser2.Id)
s.NoError(err)
s.Require().Len(actualPreferencesUser2, 1)
s.Require().Equal(preference4, actualPreferencesUser2[0])
})
s.Run("update existing preference for multiple users as admin", func() {
setup()
printer.Clean()
preferenceUpdated := model.Preference{UserId: s.th.BasicUser.Id, Category: preference1.Category, Name: preference1.Name, Value: "new_value"}
preferenceUpdated2 := model.Preference{UserId: s.th.BasicUser2.Id, Category: preference1.Category, Name: preference1.Name, Value: "new_value"}
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preferenceUpdated.Category, "")
cmd.Flags().StringP("name", "n", preferenceUpdated.Name, "")
cmd.Flags().StringP("value", "v", preferenceUpdated.Value, "")
err := preferencesUpdateCmdF(s.th.SystemAdminClient, cmd, []string{s.th.BasicUser.Email, s.th.BasicUser2.Email})
s.Require().NoError(err)
s.Require().Len(printer.GetErrorLines(), 0)
actualPreferencesUser1, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), s.th.BasicUser.Id)
s.NoError(err)
s.Require().Len(actualPreferencesUser1, 3)
s.Require().Equal(preferenceUpdated, actualPreferencesUser1[0])
s.Require().Equal(preference2, actualPreferencesUser1[1])
s.Require().Equal(preference3, actualPreferencesUser1[2])
actualPreferencesUser2, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), s.th.BasicUser2.Id)
s.NoError(err)
s.Require().Len(actualPreferencesUser2, 1)
s.Require().Equal(preferenceUpdated2, actualPreferencesUser2[0])
})
s.Run("update existing preference for multiple users as non-admin", func() {
setup()
printer.Clean()
preferenceUpdated := model.Preference{Category: preference1.Category, Name: preference1.Name, Value: "new_value"}
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preferenceUpdated.Category, "")
cmd.Flags().StringP("name", "n", preferenceUpdated.Name, "")
cmd.Flags().StringP("value", "v", preferenceUpdated.Value, "")
err := preferencesUpdateCmdF(s.th.Client, cmd, []string{s.th.BasicUser.Email, s.th.BasicUser2.Email})
s.Require().Error(err)
})
}
func (s *MmctlE2ETestSuite) TestPreferenceDeleteCmd() {
s.SetupTestHelper().InitBasic()
s.cleanUpPreferences(s.th.BasicUser.Id)
s.cleanUpPreferences(s.th.BasicUser2.Id)
preference1 := model.Preference{UserId: s.th.BasicUser.Id, Category: "display_settings", Name: "collapsed_reply_threads", Value: "threads_view"}
_, err := s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser.Id, model.Preferences{preference1})
s.NoError(err)
preference2 := model.Preference{UserId: s.th.BasicUser.Id, Category: "display_settings", Name: "colorize_usernames", Value: "threads_view"}
_, err = s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser.Id, model.Preferences{preference2})
s.NoError(err)
preference3 := model.Preference{UserId: s.th.BasicUser.Id, Category: "drafts", Name: "drafts_tour_tip_showed", Value: `{"drafts_tour_tip_showed":true}`}
_, err = s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser.Id, model.Preferences{preference3})
s.NoError(err)
preference4 := model.Preference{UserId: s.th.BasicUser2.Id, Category: "display_settings", Name: "collapsed_reply_threads", Value: "threads_view"}
_, err = s.th.SystemAdminClient.UpdatePreferences(context.Background(), s.th.BasicUser2.Id, model.Preferences{preference4})
s.NoError(err)
s.Run("delete non-existing preference for single user", func() {
printer.Clean()
preference := model.Preference{Category: "does", Name: "not"}
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preference.Category, "")
cmd.Flags().StringP("name", "n", preference.Name, "")
err := preferencesDeleteCmdF(s.th.Client, cmd, []string{s.th.BasicUser.Email})
s.Require().NoError(err)
s.Require().Len(printer.GetErrorLines(), 0)
actualPreferencesUser1, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), s.th.BasicUser.Id)
s.NoError(err)
s.Require().Len(actualPreferencesUser1, 3)
s.Require().Equal(preference1, actualPreferencesUser1[0])
s.Require().Equal(preference2, actualPreferencesUser1[1])
s.Require().Equal(preference3, actualPreferencesUser1[2])
// Second user unaffected
actualPreferencesUser2, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), s.th.BasicUser2.Id)
s.NoError(err)
s.Require().Len(actualPreferencesUser2, 1)
s.Require().Equal(preference4, actualPreferencesUser2[0])
})
s.Run("delete existing preference for single user", func() {
printer.Clean()
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preference1.Category, "")
cmd.Flags().StringP("name", "n", preference1.Name, "")
err := preferencesDeleteCmdF(s.th.Client, cmd, []string{s.th.BasicUser.Email})
s.Require().NoError(err)
s.Require().Len(printer.GetErrorLines(), 0)
actualPreferencesUser1, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), s.th.BasicUser.Id)
s.NoError(err)
s.Require().Len(actualPreferencesUser1, 2)
s.Require().Equal(preference2, actualPreferencesUser1[0])
s.Require().Equal(preference3, actualPreferencesUser1[1])
// Second user unaffected
actualPreferencesUser2, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), s.th.BasicUser2.Id)
s.NoError(err)
s.Require().Len(actualPreferencesUser2, 1)
s.Require().Equal(preference4, actualPreferencesUser2[0])
})
s.Run("delete existing preferences for multiple users as admin", func() {
printer.Clean()
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preference1.Category, "")
cmd.Flags().StringP("name", "n", preference1.Name, "")
err := preferencesDeleteCmdF(s.th.SystemAdminClient, cmd, []string{s.th.BasicUser.Email, s.th.BasicUser2.Email})
s.Require().NoError(err)
s.Require().Len(printer.GetErrorLines(), 0)
actualPreferencesUser1, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), s.th.BasicUser.Id)
s.NoError(err)
s.Require().Len(actualPreferencesUser1, 2)
s.Require().Equal(preference2, actualPreferencesUser1[0])
s.Require().Equal(preference3, actualPreferencesUser1[1])
// Second user unaffected
actualPreferencesUser2, _, err := s.th.SystemAdminClient.GetPreferences(context.Background(), s.th.BasicUser2.Id)
s.NoError(err)
s.Require().Len(actualPreferencesUser2, 0)
})
s.Run("delete existing preferences for multiple users as non-admin", func() {
printer.Clean()
cmd := &cobra.Command{}
cmd.Flags().StringP("category", "c", preference1.Category, "")
cmd.Flags().StringP("name", "n", preference1.Name, "")
err := preferencesDeleteCmdF(s.th.Client, cmd, []string{s.th.BasicUser.Email, s.th.BasicUser2.Email})
s.Require().Error(err)
})
}