[MM-43785] Hide insights feature intro for new users (#20214)
* tools updates * Revert "tools updates" This reverts commit 6293297b55803c5a263e200ebd80192899666ae9. * hide insights modal by default for new users * updating feature flag for test * updating preference tests * fixing lint * fixing comment Co-authored-by: Benjamin Cooke <benjamincooke@Benjamins-MacBook-Pro.local> Co-authored-by: Benjamin Cooke <benjamincooke@Benjamins-MBP.ht.home> Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
@@ -49,8 +49,8 @@ func TestGetPreferences(t *testing.T) {
|
|||||||
prefs, _, err := client.GetPreferences(user1.Id)
|
prefs, _, err := client.GetPreferences(user1.Id)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// 5 because we have 2 initial preferences tutorial_step and recommended_next_steps added when creating a new user
|
// 6 because we have 3 initial preferences insights, tutorial_step and recommended_next_steps added when creating a new user
|
||||||
require.Equal(t, len(prefs), 5, "received the wrong number of preferences")
|
require.Equal(t, len(prefs), 6, "received the wrong number of preferences")
|
||||||
|
|
||||||
for _, preference := range prefs {
|
for _, preference := range prefs {
|
||||||
require.Equal(t, preference.UserId, th.BasicUser.Id, "user id does not match")
|
require.Equal(t, preference.UserId, th.BasicUser.Id, "user id does not match")
|
||||||
|
|||||||
@@ -177,17 +177,22 @@ func TestPluginAPIGetUserPreferences(t *testing.T) {
|
|||||||
|
|
||||||
preferences, err := api.GetPreferencesForUser(user1.Id)
|
preferences, err := api.GetPreferencesForUser(user1.Id)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 2, len(preferences))
|
assert.Equal(t, 3, len(preferences))
|
||||||
|
|
||||||
assert.Equal(t, user1.Id, preferences[0].UserId)
|
assert.Equal(t, user1.Id, preferences[0].UserId)
|
||||||
assert.Equal(t, model.PreferenceRecommendedNextSteps, preferences[0].Category)
|
assert.Equal(t, model.PreferenceCategoryInsights, preferences[0].Category)
|
||||||
assert.Equal(t, "hide", preferences[0].Name)
|
assert.Equal(t, model.PreferenceNameInsights, preferences[0].Name)
|
||||||
assert.Equal(t, "false", preferences[0].Value)
|
assert.Equal(t, "{\"insights_modal_viewed\":false}", preferences[0].Value)
|
||||||
|
|
||||||
assert.Equal(t, user1.Id, preferences[1].UserId)
|
assert.Equal(t, user1.Id, preferences[1].UserId)
|
||||||
assert.Equal(t, model.PreferenceCategoryTutorialSteps, preferences[1].Category)
|
assert.Equal(t, model.PreferenceRecommendedNextSteps, preferences[1].Category)
|
||||||
assert.Equal(t, user1.Id, preferences[1].Name)
|
assert.Equal(t, "hide", preferences[1].Name)
|
||||||
assert.Equal(t, "0", preferences[1].Value)
|
assert.Equal(t, "false", preferences[1].Value)
|
||||||
|
|
||||||
|
assert.Equal(t, user1.Id, preferences[2].UserId)
|
||||||
|
assert.Equal(t, model.PreferenceCategoryTutorialSteps, preferences[2].Category)
|
||||||
|
assert.Equal(t, user1.Id, preferences[2].Name)
|
||||||
|
assert.Equal(t, "0", preferences[2].Value)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPluginAPIDeleteUserPreferences(t *testing.T) {
|
func TestPluginAPIDeleteUserPreferences(t *testing.T) {
|
||||||
@@ -205,7 +210,7 @@ func TestPluginAPIDeleteUserPreferences(t *testing.T) {
|
|||||||
|
|
||||||
preferences, err := api.GetPreferencesForUser(user1.Id)
|
preferences, err := api.GetPreferencesForUser(user1.Id)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 2, len(preferences))
|
assert.Equal(t, 3, len(preferences))
|
||||||
|
|
||||||
err = api.DeletePreferencesForUser(user1.Id, preferences)
|
err = api.DeletePreferencesForUser(user1.Id, preferences)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
@@ -232,15 +237,16 @@ func TestPluginAPIDeleteUserPreferences(t *testing.T) {
|
|||||||
|
|
||||||
preferences, err = api.GetPreferencesForUser(user2.Id)
|
preferences, err = api.GetPreferencesForUser(user2.Id)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 3, len(preferences))
|
assert.Equal(t, 4, len(preferences))
|
||||||
|
|
||||||
err = api.DeletePreferencesForUser(user2.Id, []model.Preference{preference})
|
err = api.DeletePreferencesForUser(user2.Id, []model.Preference{preference})
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
preferences, err = api.GetPreferencesForUser(user2.Id)
|
preferences, err = api.GetPreferencesForUser(user2.Id)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 2, len(preferences))
|
assert.Equal(t, 3, len(preferences))
|
||||||
assert.Equal(t, model.PreferenceRecommendedNextSteps, preferences[0].Category)
|
assert.Equal(t, model.PreferenceCategoryInsights, preferences[0].Category)
|
||||||
assert.Equal(t, model.PreferenceCategoryTutorialSteps, preferences[1].Category)
|
assert.Equal(t, model.PreferenceRecommendedNextSteps, preferences[1].Category)
|
||||||
|
assert.Equal(t, model.PreferenceCategoryTutorialSteps, preferences[2].Category)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPluginAPIUpdateUserPreferences(t *testing.T) {
|
func TestPluginAPIUpdateUserPreferences(t *testing.T) {
|
||||||
@@ -258,17 +264,22 @@ func TestPluginAPIUpdateUserPreferences(t *testing.T) {
|
|||||||
|
|
||||||
preferences, err := api.GetPreferencesForUser(user1.Id)
|
preferences, err := api.GetPreferencesForUser(user1.Id)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 2, len(preferences))
|
assert.Equal(t, 3, len(preferences))
|
||||||
|
|
||||||
assert.Equal(t, user1.Id, preferences[0].UserId)
|
assert.Equal(t, user1.Id, preferences[0].UserId)
|
||||||
assert.Equal(t, model.PreferenceRecommendedNextSteps, preferences[0].Category)
|
assert.Equal(t, model.PreferenceCategoryInsights, preferences[0].Category)
|
||||||
assert.Equal(t, "hide", preferences[0].Name)
|
assert.Equal(t, model.PreferenceNameInsights, preferences[0].Name)
|
||||||
assert.Equal(t, "false", preferences[0].Value)
|
assert.Equal(t, "{\"insights_modal_viewed\":false}", preferences[0].Value)
|
||||||
|
|
||||||
assert.Equal(t, user1.Id, preferences[1].UserId)
|
assert.Equal(t, user1.Id, preferences[1].UserId)
|
||||||
assert.Equal(t, model.PreferenceCategoryTutorialSteps, preferences[1].Category)
|
assert.Equal(t, model.PreferenceRecommendedNextSteps, preferences[1].Category)
|
||||||
assert.Equal(t, user1.Id, preferences[1].Name)
|
assert.Equal(t, "hide", preferences[1].Name)
|
||||||
assert.Equal(t, "0", preferences[1].Value)
|
assert.Equal(t, "false", preferences[1].Value)
|
||||||
|
|
||||||
|
assert.Equal(t, user1.Id, preferences[2].UserId)
|
||||||
|
assert.Equal(t, model.PreferenceCategoryTutorialSteps, preferences[2].Category)
|
||||||
|
assert.Equal(t, user1.Id, preferences[2].Name)
|
||||||
|
assert.Equal(t, "0", preferences[2].Value)
|
||||||
|
|
||||||
preference := model.Preference{
|
preference := model.Preference{
|
||||||
Name: user1.Id,
|
Name: user1.Id,
|
||||||
@@ -283,8 +294,8 @@ func TestPluginAPIUpdateUserPreferences(t *testing.T) {
|
|||||||
preferences, err = api.GetPreferencesForUser(user1.Id)
|
preferences, err = api.GetPreferencesForUser(user1.Id)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
|
||||||
assert.Equal(t, 3, len(preferences))
|
assert.Equal(t, 4, len(preferences))
|
||||||
expectedCategories := []string{model.PreferenceCategoryTutorialSteps, model.PreferenceCategoryTheme, model.PreferenceRecommendedNextSteps}
|
expectedCategories := []string{model.PreferenceCategoryTutorialSteps, model.PreferenceCategoryTheme, model.PreferenceRecommendedNextSteps, model.PreferenceCategoryInsights}
|
||||||
for _, pref := range preferences {
|
for _, pref := range preferences {
|
||||||
assert.Contains(t, expectedCategories, pref.Category)
|
assert.Contains(t, expectedCategories, pref.Category)
|
||||||
assert.Equal(t, user1.Id, pref.UserId)
|
assert.Equal(t, user1.Id, pref.UserId)
|
||||||
|
|||||||
12
app/user.go
12
app/user.go
@@ -273,7 +273,17 @@ func (a *App) createUserOrGuest(c *request.Context, user *model.User, guest bool
|
|||||||
|
|
||||||
recommendedNextStepsPref := model.Preference{UserId: ruser.Id, Category: model.PreferenceRecommendedNextSteps, Name: "hide", Value: "false"}
|
recommendedNextStepsPref := model.Preference{UserId: ruser.Id, Category: model.PreferenceRecommendedNextSteps, Name: "hide", Value: "false"}
|
||||||
tutorialStepPref := model.Preference{UserId: ruser.Id, Category: model.PreferenceCategoryTutorialSteps, Name: ruser.Id, Value: "0"}
|
tutorialStepPref := model.Preference{UserId: ruser.Id, Category: model.PreferenceCategoryTutorialSteps, Name: ruser.Id, Value: "0"}
|
||||||
if err := a.Srv().Store.Preference().Save(model.Preferences{recommendedNextStepsPref, tutorialStepPref}); err != nil {
|
|
||||||
|
preferences := model.Preferences{recommendedNextStepsPref, tutorialStepPref}
|
||||||
|
|
||||||
|
if a.Config().FeatureFlags.InsightsEnabled {
|
||||||
|
// We don't want to show the insights intro modal for new users
|
||||||
|
preferences = append(preferences, model.Preference{UserId: ruser.Id, Category: model.PreferenceCategoryInsights, Name: model.PreferenceNameInsights, Value: "{\"insights_modal_viewed\":true}"})
|
||||||
|
} else {
|
||||||
|
preferences = append(preferences, model.Preference{UserId: ruser.Id, Category: model.PreferenceCategoryInsights, Name: model.PreferenceNameInsights, Value: "{\"insights_modal_viewed\":false}"})
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := a.Srv().Store.Preference().Save(preferences); err != nil {
|
||||||
mlog.Warn("Encountered error saving user preferences", mlog.Err(err))
|
mlog.Warn("Encountered error saving user preferences", mlog.Err(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1729,36 +1729,72 @@ func TestCreateUserWithInitialPreferences(t *testing.T) {
|
|||||||
defer th.TearDown()
|
defer th.TearDown()
|
||||||
|
|
||||||
t.Run("successfully create a user with initial tutorial and recommended steps preferences", func(t *testing.T) {
|
t.Run("successfully create a user with initial tutorial and recommended steps preferences", func(t *testing.T) {
|
||||||
|
th.Server.configStore.SetReadOnlyFF(false)
|
||||||
|
defer th.Server.configStore.SetReadOnlyFF(true)
|
||||||
|
th.App.UpdateConfig(func(cfg *model.Config) { cfg.FeatureFlags.InsightsEnabled = true })
|
||||||
testUser := th.CreateUser()
|
testUser := th.CreateUser()
|
||||||
defer th.App.PermanentDeleteUser(th.Context, testUser)
|
defer th.App.PermanentDeleteUser(th.Context, testUser)
|
||||||
|
|
||||||
preferences, appErr := th.App.GetPreferencesForUser(testUser.Id)
|
preferences, appErr := th.App.GetPreferencesForUser(testUser.Id)
|
||||||
require.Nil(t, appErr)
|
require.Nil(t, appErr)
|
||||||
|
|
||||||
tutorialStepPref := preferences[1]
|
tutorialStepPref := preferences[2]
|
||||||
recommendedNextStepsPref := preferences[0]
|
recommendedNextStepsPref := preferences[1]
|
||||||
|
insightsPref := preferences[0]
|
||||||
|
|
||||||
assert.Equal(t, tutorialStepPref.Name, testUser.Id)
|
assert.Equal(t, tutorialStepPref.Name, testUser.Id)
|
||||||
assert.Equal(t, recommendedNextStepsPref.Category, model.PreferenceRecommendedNextSteps)
|
assert.Equal(t, recommendedNextStepsPref.Category, model.PreferenceRecommendedNextSteps)
|
||||||
assert.Equal(t, recommendedNextStepsPref.Name, "hide")
|
assert.Equal(t, recommendedNextStepsPref.Name, "hide")
|
||||||
assert.Equal(t, recommendedNextStepsPref.Value, "false")
|
assert.Equal(t, recommendedNextStepsPref.Value, "false")
|
||||||
|
assert.Equal(t, insightsPref.Name, "insights_tutorial_state")
|
||||||
|
assert.Equal(t, insightsPref.Value, "{\"insights_modal_viewed\":true}")
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("successfully create a user with insights feature flag disabled", func(t *testing.T) {
|
||||||
|
th.Server.configStore.SetReadOnlyFF(false)
|
||||||
|
defer th.Server.configStore.SetReadOnlyFF(true)
|
||||||
|
th.App.UpdateConfig(func(cfg *model.Config) { cfg.FeatureFlags.InsightsEnabled = false })
|
||||||
|
testUser := th.CreateUser()
|
||||||
|
defer th.App.PermanentDeleteUser(th.Context, testUser)
|
||||||
|
|
||||||
|
preferences, appErr := th.App.GetPreferencesForUser(testUser.Id)
|
||||||
|
require.Nil(t, appErr)
|
||||||
|
|
||||||
|
tutorialStepPref := preferences[2]
|
||||||
|
recommendedNextStepsPref := preferences[1]
|
||||||
|
insightsPref := preferences[0]
|
||||||
|
|
||||||
|
assert.Equal(t, tutorialStepPref.Name, testUser.Id)
|
||||||
|
assert.Equal(t, recommendedNextStepsPref.Category, model.PreferenceRecommendedNextSteps)
|
||||||
|
assert.Equal(t, recommendedNextStepsPref.Name, "hide")
|
||||||
|
assert.Equal(t, recommendedNextStepsPref.Value, "false")
|
||||||
|
assert.Equal(t, insightsPref.Name, "insights_tutorial_state")
|
||||||
|
assert.Equal(t, insightsPref.Value, "{\"insights_modal_viewed\":false}")
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("successfully create a guest user with initial tutorial and recommended steps preferences", func(t *testing.T) {
|
t.Run("successfully create a guest user with initial tutorial and recommended steps preferences", func(t *testing.T) {
|
||||||
|
th.Server.configStore.SetReadOnlyFF(false)
|
||||||
|
defer th.Server.configStore.SetReadOnlyFF(true)
|
||||||
|
th.App.UpdateConfig(func(cfg *model.Config) { cfg.FeatureFlags.InsightsEnabled = true })
|
||||||
testUser := th.CreateGuest()
|
testUser := th.CreateGuest()
|
||||||
defer th.App.PermanentDeleteUser(th.Context, testUser)
|
defer th.App.PermanentDeleteUser(th.Context, testUser)
|
||||||
|
|
||||||
preferences, appErr := th.App.GetPreferencesForUser(testUser.Id)
|
preferences, appErr := th.App.GetPreferencesForUser(testUser.Id)
|
||||||
require.Nil(t, appErr)
|
require.Nil(t, appErr)
|
||||||
|
|
||||||
assert.Equal(t, testUser.Id, preferences[0].UserId)
|
|
||||||
assert.Equal(t, model.PreferenceRecommendedNextSteps, preferences[0].Category)
|
|
||||||
assert.Equal(t, "hide", preferences[0].Name)
|
|
||||||
assert.Equal(t, "false", preferences[0].Value)
|
|
||||||
|
|
||||||
assert.Equal(t, testUser.Id, preferences[1].UserId)
|
assert.Equal(t, testUser.Id, preferences[1].UserId)
|
||||||
assert.Equal(t, model.PreferenceCategoryTutorialSteps, preferences[1].Category)
|
assert.Equal(t, model.PreferenceRecommendedNextSteps, preferences[1].Category)
|
||||||
assert.Equal(t, testUser.Id, preferences[1].Name)
|
assert.Equal(t, "hide", preferences[1].Name)
|
||||||
assert.Equal(t, "0", preferences[1].Value)
|
assert.Equal(t, "false", preferences[1].Value)
|
||||||
|
|
||||||
|
assert.Equal(t, testUser.Id, preferences[2].UserId)
|
||||||
|
assert.Equal(t, model.PreferenceCategoryTutorialSteps, preferences[2].Category)
|
||||||
|
assert.Equal(t, testUser.Id, preferences[2].Name)
|
||||||
|
assert.Equal(t, "0", preferences[2].Value)
|
||||||
|
|
||||||
|
assert.Equal(t, testUser.Id, preferences[0].UserId)
|
||||||
|
assert.Equal(t, model.PreferenceCategoryInsights, preferences[0].Category)
|
||||||
|
assert.Equal(t, model.PreferenceNameInsights, preferences[0].Name)
|
||||||
|
assert.Equal(t, "{\"insights_modal_viewed\":true}", preferences[0].Value)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ const (
|
|||||||
PreferenceCategoryFlaggedPost = "flagged_post"
|
PreferenceCategoryFlaggedPost = "flagged_post"
|
||||||
PreferenceCategoryFavoriteChannel = "favorite_channel"
|
PreferenceCategoryFavoriteChannel = "favorite_channel"
|
||||||
PreferenceCategorySidebarSettings = "sidebar_settings"
|
PreferenceCategorySidebarSettings = "sidebar_settings"
|
||||||
|
PreferenceCategoryInsights = "insights"
|
||||||
|
|
||||||
PreferenceCategoryDisplaySettings = "display_settings"
|
PreferenceCategoryDisplaySettings = "display_settings"
|
||||||
PreferenceNameCollapsedThreadsEnabled = "collapsed_reply_threads"
|
PreferenceNameCollapsedThreadsEnabled = "collapsed_reply_threads"
|
||||||
@@ -28,6 +29,7 @@ const (
|
|||||||
PreferenceNameNameFormat = "name_format"
|
PreferenceNameNameFormat = "name_format"
|
||||||
PreferenceNameUseMilitaryTime = "use_military_time"
|
PreferenceNameUseMilitaryTime = "use_military_time"
|
||||||
PreferenceRecommendedNextSteps = "recommended_next_steps"
|
PreferenceRecommendedNextSteps = "recommended_next_steps"
|
||||||
|
PreferenceNameInsights = "insights_tutorial_state"
|
||||||
|
|
||||||
PreferenceCategoryTheme = "theme"
|
PreferenceCategoryTheme = "theme"
|
||||||
// the name for theme props is the team id
|
// the name for theme props is the team id
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user