diff --git a/api4/preference_test.go b/api4/preference_test.go index d5b7ff1568..8f70c00445 100644 --- a/api4/preference_test.go +++ b/api4/preference_test.go @@ -49,8 +49,8 @@ func TestGetPreferences(t *testing.T) { prefs, _, err := client.GetPreferences(user1.Id) require.NoError(t, err) - // 5 because we have 2 initial preferences tutorial_step and recommended_next_steps added when creating a new user - require.Equal(t, len(prefs), 5, "received the wrong number of preferences") + // 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), 6, "received the wrong number of preferences") for _, preference := range prefs { require.Equal(t, preference.UserId, th.BasicUser.Id, "user id does not match") diff --git a/app/plugin_api_test.go b/app/plugin_api_test.go index f6acee6f00..bd7833b554 100644 --- a/app/plugin_api_test.go +++ b/app/plugin_api_test.go @@ -177,17 +177,22 @@ func TestPluginAPIGetUserPreferences(t *testing.T) { preferences, err := api.GetPreferencesForUser(user1.Id) 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, model.PreferenceRecommendedNextSteps, preferences[0].Category) - assert.Equal(t, "hide", preferences[0].Name) - assert.Equal(t, "false", preferences[0].Value) + assert.Equal(t, model.PreferenceCategoryInsights, preferences[0].Category) + assert.Equal(t, model.PreferenceNameInsights, preferences[0].Name) + assert.Equal(t, "{\"insights_modal_viewed\":false}", preferences[0].Value) assert.Equal(t, user1.Id, preferences[1].UserId) - assert.Equal(t, model.PreferenceCategoryTutorialSteps, preferences[1].Category) - assert.Equal(t, user1.Id, preferences[1].Name) - assert.Equal(t, "0", preferences[1].Value) + assert.Equal(t, model.PreferenceRecommendedNextSteps, preferences[1].Category) + assert.Equal(t, "hide", preferences[1].Name) + 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) { @@ -205,7 +210,7 @@ func TestPluginAPIDeleteUserPreferences(t *testing.T) { preferences, err := api.GetPreferencesForUser(user1.Id) require.Nil(t, err) - assert.Equal(t, 2, len(preferences)) + assert.Equal(t, 3, len(preferences)) err = api.DeletePreferencesForUser(user1.Id, preferences) require.Nil(t, err) @@ -232,15 +237,16 @@ func TestPluginAPIDeleteUserPreferences(t *testing.T) { preferences, err = api.GetPreferencesForUser(user2.Id) require.Nil(t, err) - assert.Equal(t, 3, len(preferences)) + assert.Equal(t, 4, len(preferences)) err = api.DeletePreferencesForUser(user2.Id, []model.Preference{preference}) require.Nil(t, err) preferences, err = api.GetPreferencesForUser(user2.Id) require.Nil(t, err) - assert.Equal(t, 2, len(preferences)) - assert.Equal(t, model.PreferenceRecommendedNextSteps, preferences[0].Category) - assert.Equal(t, model.PreferenceCategoryTutorialSteps, preferences[1].Category) + assert.Equal(t, 3, len(preferences)) + assert.Equal(t, model.PreferenceCategoryInsights, preferences[0].Category) + assert.Equal(t, model.PreferenceRecommendedNextSteps, preferences[1].Category) + assert.Equal(t, model.PreferenceCategoryTutorialSteps, preferences[2].Category) } func TestPluginAPIUpdateUserPreferences(t *testing.T) { @@ -258,17 +264,22 @@ func TestPluginAPIUpdateUserPreferences(t *testing.T) { preferences, err := api.GetPreferencesForUser(user1.Id) 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, model.PreferenceRecommendedNextSteps, preferences[0].Category) - assert.Equal(t, "hide", preferences[0].Name) - assert.Equal(t, "false", preferences[0].Value) + assert.Equal(t, model.PreferenceCategoryInsights, preferences[0].Category) + assert.Equal(t, model.PreferenceNameInsights, preferences[0].Name) + assert.Equal(t, "{\"insights_modal_viewed\":false}", preferences[0].Value) assert.Equal(t, user1.Id, preferences[1].UserId) - assert.Equal(t, model.PreferenceCategoryTutorialSteps, preferences[1].Category) - assert.Equal(t, user1.Id, preferences[1].Name) - assert.Equal(t, "0", preferences[1].Value) + assert.Equal(t, model.PreferenceRecommendedNextSteps, preferences[1].Category) + assert.Equal(t, "hide", preferences[1].Name) + 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{ Name: user1.Id, @@ -283,8 +294,8 @@ func TestPluginAPIUpdateUserPreferences(t *testing.T) { preferences, err = api.GetPreferencesForUser(user1.Id) require.Nil(t, err) - assert.Equal(t, 3, len(preferences)) - expectedCategories := []string{model.PreferenceCategoryTutorialSteps, model.PreferenceCategoryTheme, model.PreferenceRecommendedNextSteps} + assert.Equal(t, 4, len(preferences)) + expectedCategories := []string{model.PreferenceCategoryTutorialSteps, model.PreferenceCategoryTheme, model.PreferenceRecommendedNextSteps, model.PreferenceCategoryInsights} for _, pref := range preferences { assert.Contains(t, expectedCategories, pref.Category) assert.Equal(t, user1.Id, pref.UserId) diff --git a/app/user.go b/app/user.go index 408ce457a6..27bdb20558 100644 --- a/app/user.go +++ b/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"} 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)) } diff --git a/app/user_test.go b/app/user_test.go index 0c5839b912..34dcb6e0e6 100644 --- a/app/user_test.go +++ b/app/user_test.go @@ -1729,36 +1729,72 @@ func TestCreateUserWithInitialPreferences(t *testing.T) { defer th.TearDown() 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() defer th.App.PermanentDeleteUser(th.Context, testUser) preferences, appErr := th.App.GetPreferencesForUser(testUser.Id) require.Nil(t, appErr) - tutorialStepPref := preferences[1] - recommendedNextStepsPref := preferences[0] + 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\":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) { + 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() defer th.App.PermanentDeleteUser(th.Context, testUser) preferences, appErr := th.App.GetPreferencesForUser(testUser.Id) 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, model.PreferenceCategoryTutorialSteps, preferences[1].Category) - assert.Equal(t, testUser.Id, preferences[1].Name) - assert.Equal(t, "0", preferences[1].Value) + assert.Equal(t, model.PreferenceRecommendedNextSteps, preferences[1].Category) + assert.Equal(t, "hide", preferences[1].Name) + 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) }) } diff --git a/model/preference.go b/model/preference.go index 41a5823528..ed683e9f58 100644 --- a/model/preference.go +++ b/model/preference.go @@ -19,6 +19,7 @@ const ( PreferenceCategoryFlaggedPost = "flagged_post" PreferenceCategoryFavoriteChannel = "favorite_channel" PreferenceCategorySidebarSettings = "sidebar_settings" + PreferenceCategoryInsights = "insights" PreferenceCategoryDisplaySettings = "display_settings" PreferenceNameCollapsedThreadsEnabled = "collapsed_reply_threads" @@ -28,6 +29,7 @@ const ( PreferenceNameNameFormat = "name_format" PreferenceNameUseMilitaryTime = "use_military_time" PreferenceRecommendedNextSteps = "recommended_next_steps" + PreferenceNameInsights = "insights_tutorial_state" PreferenceCategoryTheme = "theme" // the name for theme props is the team id