* 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 удалений

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

@@ -9,6 +9,7 @@ import (
"fmt"
"net/http"
"os"
"sort"
"github.com/mattermost/mattermost/server/public/model"
@@ -251,6 +252,45 @@ var MigrateAuthCmd = &cobra.Command{
RunE: withClient(migrateAuthCmdF),
}
var PreferenceCmd = &cobra.Command{
Use: "preference",
Aliases: []string{"pref"},
Short: "Manage user preferences",
}
var PreferenceListCmd = &cobra.Command{
Use: "list [--category category] [users]",
Short: "List user preferences",
Example: "preference list user@example.com",
Args: cobra.MinimumNArgs(1),
RunE: withClient(preferencesListCmdF),
}
var PreferenceGetCmd = &cobra.Command{
Use: "get --category [category] --name [name] [users]",
Short: "Get a specific user preference",
Example: "preference get --category display_settings --name use_military_time user@example.com",
Args: cobra.MinimumNArgs(1),
RunE: withClient(preferencesGetCmdF),
}
var PreferenceUpdateCmd = &cobra.Command{
Use: "set --category [category] --name [name] --value [value] [users]",
Aliases: []string{"update"},
Short: "Set a specific user preference",
Example: "preference set --category display_settings --name use_military_time --value true user@example.com",
Args: cobra.MinimumNArgs(1),
RunE: withClient(preferencesUpdateCmdF),
}
var PreferenceDeleteCmd = &cobra.Command{
Use: "delete --category [category] --name [name] [users]",
Short: "Delete a specific user preference",
Example: "preference delete --category display_settings --name use_military_time user@example.com",
Args: cobra.MinimumNArgs(1),
RunE: withClient(preferencesDeleteCmdF),
}
func init() {
UserCreateCmd.Flags().String("username", "", "Required. Username for the new user account")
_ = UserCreateCmd.MarkFlagRequired("username")
@@ -336,6 +376,22 @@ Global Flags:
{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}
`)
PreferenceListCmd.Flags().StringP("category", "c", "", "The optional category by which to filter")
PreferenceGetCmd.Flags().StringP("category", "c", "", "The category of the preference")
PreferenceGetCmd.Flags().StringP("name", "n", "", "The name of the preference")
_ = PreferenceGetCmd.MarkFlagRequired("category")
_ = PreferenceGetCmd.MarkFlagRequired("name")
PreferenceUpdateCmd.Flags().StringP("category", "c", "", "The category of the preference")
PreferenceUpdateCmd.Flags().StringP("name", "n", "", "The name of the preference")
PreferenceUpdateCmd.Flags().StringP("value", "v", "", "The value of the preference")
_ = PreferenceUpdateCmd.MarkFlagRequired("category")
_ = PreferenceUpdateCmd.MarkFlagRequired("name")
_ = PreferenceUpdateCmd.MarkFlagRequired("value")
PreferenceDeleteCmd.Flags().StringP("category", "c", "", "The category of the preference")
PreferenceDeleteCmd.Flags().StringP("name", "n", "", "The name of the preference")
_ = PreferenceDeleteCmd.MarkFlagRequired("category")
_ = PreferenceDeleteCmd.MarkFlagRequired("name")
UserCmd.AddCommand(
UserActivateCmd,
UserDeactivateCmd,
@@ -355,6 +411,13 @@ Global Flags:
MigrateAuthCmd,
PromoteGuestToUserCmd,
DemoteUserToGuestCmd,
PreferenceCmd,
)
PreferenceCmd.AddCommand(
PreferenceListCmd,
PreferenceGetCmd,
PreferenceUpdateCmd,
PreferenceDeleteCmd,
)
RootCmd.AddCommand(UserCmd)
@@ -1000,3 +1063,179 @@ func demoteUserToGuestCmdF(c client.Client, _ *cobra.Command, userArgs []string)
return errs.ErrorOrNil()
}
type ByPreference model.Preferences
func (p ByPreference) Len() int { return len(p) }
func (p ByPreference) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func (p ByPreference) Less(i, j int) bool {
if p[i].UserId < p[j].UserId {
return true
}
if p[i].Category < p[j].Category {
return true
}
if p[i].Name < p[j].Name {
return true
}
return p[i].Value < p[j].Value
}
func preferencesListCmdF(c client.Client, cmd *cobra.Command, userArgs []string) error {
category, _ := cmd.Flags().GetString("category")
var errs *multierror.Error
for i, user := range getUsersFromUserArgs(c, userArgs) {
if user == nil {
err := fmt.Errorf("can't find user '%s'", userArgs[i])
errs = multierror.Append(errs, err)
printer.PrintError(err.Error())
continue
}
var preferences model.Preferences
var err error
if category == "" {
preferences, _, err = c.GetPreferences(context.TODO(), user.Id)
if err != nil {
err = fmt.Errorf("unable to list user preferences %s: %w", userArgs[i], err)
errs = multierror.Append(errs, err)
printer.PrintError(err.Error())
continue
}
} else {
preferences, _, err = c.GetPreferencesByCategory(context.TODO(), user.Id, category)
if err != nil {
err = fmt.Errorf("unable to list user preferences by category %s for %s: %w", category, userArgs[i], err)
errs = multierror.Append(errs, err)
printer.PrintError(err.Error())
continue
}
}
sort.Sort(ByPreference(preferences))
for j, preference := range preferences {
tpl := `user_id: {{.UserId}}
category: {{.Category}}
name: {{.Name}}
value: {{.Value}}`
if j > 0 {
tpl = "------------------------------\n" + tpl
}
printer.PrintT(tpl, preference)
}
}
return errs.ErrorOrNil()
}
func preferencesGetCmdF(c client.Client, cmd *cobra.Command, userArgs []string) error {
category, _ := cmd.Flags().GetString("category")
preferenceName, _ := cmd.Flags().GetString("name")
var errs *multierror.Error
for i, user := range getUsersFromUserArgs(c, userArgs) {
if user == nil {
err := fmt.Errorf("can't find user '%s'", userArgs[i])
errs = multierror.Append(errs, err)
printer.PrintError(err.Error())
continue
}
preference, _, err := c.GetPreferenceByCategoryAndName(context.TODO(), user.Id, category, preferenceName)
if err != nil {
err = fmt.Errorf("unable to get user preference %s %s for %s: %w", category, preferenceName, userArgs[i], err)
errs = multierror.Append(errs, err)
printer.PrintError(err.Error())
continue
}
tpl := `user_id: {{.UserId}}
category: {{.Category}}
name: {{.Name}}
value: {{.Value}}`
printer.PrintT(tpl, preference)
}
return errs.ErrorOrNil()
}
func preferencesUpdateCmdF(c client.Client, cmd *cobra.Command, userArgs []string) error {
category, _ := cmd.Flags().GetString("category")
preferenceName, _ := cmd.Flags().GetString("name")
value, _ := cmd.Flags().GetString("value")
var errs *multierror.Error
for i, user := range getUsersFromUserArgs(c, userArgs) {
if user == nil {
err := fmt.Errorf("can't find user '%s'", userArgs[i])
errs = multierror.Append(errs, err)
printer.PrintError(err.Error())
continue
}
preferences := model.Preferences{
model.Preference{
UserId: user.Id,
Category: category,
Name: preferenceName,
Value: value,
},
}
_, err := c.UpdatePreferences(context.TODO(), user.Id, preferences)
if err != nil {
err = fmt.Errorf("unable to update user preference %s %s for %s: %w", category, preferenceName, userArgs[i], err)
errs = multierror.Append(errs, err)
printer.PrintError(err.Error())
continue
}
printer.Print(fmt.Sprintf("Preference %s %s for %s updated successfully", category, preferenceName, userArgs[i]))
}
return errs.ErrorOrNil()
}
func preferencesDeleteCmdF(c client.Client, cmd *cobra.Command, userArgs []string) error {
category, _ := cmd.Flags().GetString("category")
preferenceName, _ := cmd.Flags().GetString("name")
var errs *multierror.Error
for i, user := range getUsersFromUserArgs(c, userArgs) {
if user == nil {
err := fmt.Errorf("can't find user '%s'", userArgs[i])
errs = multierror.Append(errs, err)
printer.PrintError(err.Error())
continue
}
preferences := model.Preferences{
model.Preference{
UserId: user.Id,
Category: category,
Name: preferenceName,
},
}
_, err := c.DeletePreferences(context.TODO(), user.Id, preferences)
if err != nil {
err = fmt.Errorf("unable to delete user preference %s %s for %s: %w", category, preferenceName, userArgs[i], err)
errs = multierror.Append(errs, err)
printer.PrintError(err.Error())
continue
}
printer.Print(fmt.Sprintf("Preference %s %s for %s deleted successfully", category, preferenceName, userArgs[i]))
}
return errs.ErrorOrNil()
}

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

@@ -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)
})
}