1// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
2// See LICENSE.txt for license information.
3
4package sqlstore
5
6import (
7	"testing"
8
9	"github.com/stretchr/testify/require"
10
11	"github.com/mattermost/mattermost-server/v6/model"
12	"github.com/mattermost/mattermost-server/v6/store"
13	"github.com/mattermost/mattermost-server/v6/store/storetest"
14)
15
16func TestPreferenceStore(t *testing.T) {
17	StoreTest(t, storetest.TestPreferenceStore)
18}
19
20func TestDeleteUnusedFeatures(t *testing.T) {
21	StoreTest(t, func(t *testing.T, ss store.Store) {
22		userId1 := model.NewId()
23		userId2 := model.NewId()
24		category := model.PreferenceCategoryAdvancedSettings
25		feature1 := "feature1"
26		feature2 := "feature2"
27
28		features := model.Preferences{
29			{
30				UserId:   userId1,
31				Category: category,
32				Name:     store.FeatureTogglePrefix + feature1,
33				Value:    "true",
34			},
35			{
36				UserId:   userId2,
37				Category: category,
38				Name:     store.FeatureTogglePrefix + feature1,
39				Value:    "false",
40			},
41			{
42				UserId:   userId1,
43				Category: category,
44				Name:     store.FeatureTogglePrefix + feature2,
45				Value:    "false",
46			},
47			{
48				UserId:   userId2,
49				Category: category,
50				Name:     store.FeatureTogglePrefix + feature2,
51				Value:    "true",
52			},
53		}
54
55		err := ss.Preference().Save(features)
56		require.NoError(t, err)
57
58		ss.Preference().(*SqlPreferenceStore).deleteUnusedFeatures()
59
60		//make sure features with value "false" have actually been deleted from the database
61		if val, err := ss.Preference().(*SqlPreferenceStore).GetReplica().SelectInt(`SELECT COUNT(*)
62                            FROM Preferences
63                    WHERE Category = :Category
64                    AND Value = :Val
65                    AND Name LIKE '`+store.FeatureTogglePrefix+`%'`, map[string]interface{}{"Category": model.PreferenceCategoryAdvancedSettings, "Val": "false"}); err != nil {
66			require.NoError(t, err)
67		} else if val != 0 {
68			require.Fail(t, "Found %d features with value 'false', expected all to be deleted", val)
69		}
70		//
71		// make sure features with value "true" remain saved
72		if val, err := ss.Preference().(*SqlPreferenceStore).GetReplica().SelectInt(`SELECT COUNT(*)
73                            FROM Preferences
74                    WHERE Category = :Category
75                    AND Value = :Val
76                    AND Name LIKE '`+store.FeatureTogglePrefix+`%'`, map[string]interface{}{"Category": model.PreferenceCategoryAdvancedSettings, "Val": "true"}); err != nil {
77			require.NoError(t, err)
78		} else if val == 0 {
79			require.Fail(t, "Found %d features with value 'true', expected to find at least %d features", val, 2)
80		}
81	})
82}
83