From 1092c60bc6ba00db150d6fb34ebf1e74031caa6c Mon Sep 17 00:00:00 2001 From: Vishal Date: Thu, 12 May 2022 12:03:59 +0530 Subject: [PATCH] [MM-32692] Add two more CRT options (#20088) * MM-32692 Add two more CRT options deafult_on and always_on Co-authored-by: Mattermod --- app/channel.go | 8 +++- app/channel_test.go | 81 +++++++++++++++++++++++++++++++++++++ app/email/email_batching.go | 7 ++-- model/config.go | 2 + model/config_test.go | 11 +++++ 5 files changed, 104 insertions(+), 5 deletions(-) diff --git a/app/channel.go b/app/channel.go index 888ee52bc1..0250cb75c0 100644 --- a/app/channel.go +++ b/app/channel.go @@ -2550,10 +2550,14 @@ func (a *App) SetActiveChannel(userID string, channelID string) *model.AppError } func (a *App) IsCRTEnabledForUser(userID string) bool { - if *a.Config().ServiceSettings.CollapsedThreads == model.CollapsedThreadsDisabled { + appCRT := *a.Config().ServiceSettings.CollapsedThreads + if appCRT == model.CollapsedThreadsDisabled { return false } - threadsEnabled := *a.Config().ServiceSettings.CollapsedThreads == model.CollapsedThreadsDefaultOn + if appCRT == model.CollapsedThreadsAlwaysOn { + return true + } + threadsEnabled := appCRT == model.CollapsedThreadsDefaultOn // check if a participant has overridden collapsed threads settings if preference, err := a.Srv().Store.Preference().Get(userID, model.PreferenceCategoryDisplaySettings, model.PreferenceNameCollapsedThreadsEnabled); err == nil { threadsEnabled = preference.Value == "on" diff --git a/app/channel_test.go b/app/channel_test.go index 57f42625fc..0ee2a3cdd1 100644 --- a/app/channel_test.go +++ b/app/channel_test.go @@ -2447,6 +2447,87 @@ func TestMarkUnreadWithThreads(t *testing.T) { }) } +func TestIsCRTEnabledForUser(t *testing.T) { + type preference struct { + val string + err error + } + + testCases := []struct { + desc string + appCRT string + pref preference + expected bool + }{ + { + desc: "Returns false when system config is disabled", + appCRT: model.CollapsedThreadsDisabled, + expected: false, + }, + { + desc: "Returns true when system config is always_on", + appCRT: model.CollapsedThreadsAlwaysOn, + expected: true, + }, + { + desc: "Returns true when system config is default_on and user has no preference", + appCRT: model.CollapsedThreadsDefaultOn, + pref: preference{"test", errors.New("err")}, + expected: true, + }, + { + desc: "Returns false when system config is default_off and user has no preference", + appCRT: model.CollapsedThreadsDefaultOff, + pref: preference{"qwe", errors.New("err")}, + expected: false, + }, + { + desc: "Returns true when system config is default_on and user has on preference", + appCRT: model.CollapsedThreadsDefaultOn, + pref: preference{"on", nil}, + expected: true, + }, + { + desc: "Returns false when system config is default_on and user has off preference", + appCRT: model.CollapsedThreadsDefaultOn, + pref: preference{"off", nil}, + expected: false, + }, + { + desc: "Returns true when system config is default_off and user has on preference", + appCRT: model.CollapsedThreadsDefaultOff, + pref: preference{"on", nil}, + expected: true, + }, + { + desc: "Returns false when system config is default_off and user has off preference", + appCRT: model.CollapsedThreadsDefaultOff, + pref: preference{"off", nil}, + expected: false, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.desc, func(t *testing.T) { + t.Parallel() + th := SetupWithStoreMock(t) + defer th.TearDown() + + th.App.Config().ServiceSettings.CollapsedThreads = &tc.appCRT + + mockStore := th.App.Srv().Store.(*mocks.Store) + mockPreferenceStore := mocks.PreferenceStore{} + mockPreferenceStore.On("Get", mock.Anything, model.PreferenceCategoryDisplaySettings, model.PreferenceNameCollapsedThreadsEnabled).Return(&model.Preference{Value: tc.pref.val}, tc.pref.err) + mockStore.On("Preference").Return(&mockPreferenceStore) + + res := th.App.IsCRTEnabledForUser(mock.Anything) + + assert.Equal(t, tc.expected, res) + }) + } +} + func TestGetTopChannelsForTeamSince(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() diff --git a/app/email/email_batching.go b/app/email/email_batching.go index ae7d3cc174..cfd641e7f0 100644 --- a/app/email/email_batching.go +++ b/app/email/email_batching.go @@ -241,9 +241,10 @@ func (es *Service) sendBatchedEmailNotification(userID string, notifications []* } // check if user has CRT set to ON - threadsEnabled := false - if *es.config().ServiceSettings.CollapsedThreads != model.CollapsedThreadsDisabled { - threadsEnabled = *es.config().ServiceSettings.CollapsedThreads == model.CollapsedThreadsDefaultOn + appCRT := *es.config().ServiceSettings.CollapsedThreads + threadsEnabled := appCRT == model.CollapsedThreadsAlwaysOn + if !threadsEnabled && appCRT != model.CollapsedThreadsDisabled { + threadsEnabled = appCRT == model.CollapsedThreadsDefaultOn // check if a participant has overridden collapsed threads settings if preference, errCrt := es.store.Preference().Get(userID, model.PreferenceCategoryDisplaySettings, model.PreferenceNameCollapsedThreadsEnabled); errCrt == nil { threadsEnabled = preference.Value == "on" diff --git a/model/config.go b/model/config.go index c3c6a5b737..93db2af25b 100644 --- a/model/config.go +++ b/model/config.go @@ -86,6 +86,7 @@ const ( CollapsedThreadsDisabled = "disabled" CollapsedThreadsDefaultOn = "default_on" CollapsedThreadsDefaultOff = "default_off" + CollapsedThreadsAlwaysOn = "always_on" EmailBatchingBufferSize = 256 EmailBatchingInterval = 30 @@ -3657,6 +3658,7 @@ func (s *ServiceSettings) isValid() *AppError { if *s.CollapsedThreads != CollapsedThreadsDisabled && *s.CollapsedThreads != CollapsedThreadsDefaultOn && + *s.CollapsedThreads != CollapsedThreadsAlwaysOn && *s.CollapsedThreads != CollapsedThreadsDefaultOff { return NewAppError("Config.IsValid", "model.config.is_valid.collapsed_threads.app_error", nil, "", http.StatusBadRequest) } diff --git a/model/config_test.go b/model/config_test.go index afad3e060b..b0d6aea75b 100644 --- a/model/config_test.go +++ b/model/config_test.go @@ -1491,6 +1491,17 @@ func TestConfigServiceSettingsIsValid(t *testing.T) { err = cfg.ServiceSettings.isValid() require.NotNil(t, err) require.Equal(t, "model.config.is_valid.collapsed_threads.autofollow.app_error", err.Id) + + *cfg.ServiceSettings.CollapsedThreads = CollapsedThreadsAlwaysOn + err = cfg.ServiceSettings.isValid() + require.NotNil(t, err) + require.Equal(t, "model.config.is_valid.collapsed_threads.autofollow.app_error", err.Id) + + *cfg.ServiceSettings.ThreadAutoFollow = true + *cfg.ServiceSettings.CollapsedThreads = "test_status" + err = cfg.ServiceSettings.isValid() + require.NotNil(t, err) + require.Equal(t, "model.config.is_valid.collapsed_threads.app_error", err.Id) } func TestConfigDefaultCallsPluginState(t *testing.T) {