github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/store/storetest/preference_store.go (about)

     1  // Copyright (c) 2015-present Xenia, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package storetest
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"github.com/xzl8028/xenia-server/model"
    13  	"github.com/xzl8028/xenia-server/store"
    14  )
    15  
    16  func TestPreferenceStore(t *testing.T, ss store.Store) {
    17  	t.Run("PreferenceSave", func(t *testing.T) { testPreferenceSave(t, ss) })
    18  	t.Run("PreferenceGet", func(t *testing.T) { testPreferenceGet(t, ss) })
    19  	t.Run("PreferenceGetCategory", func(t *testing.T) { testPreferenceGetCategory(t, ss) })
    20  	t.Run("PreferenceGetAll", func(t *testing.T) { testPreferenceGetAll(t, ss) })
    21  	t.Run("PreferenceDeleteByUser", func(t *testing.T) { testPreferenceDeleteByUser(t, ss) })
    22  	t.Run("IsFeatureEnabled", func(t *testing.T) { testIsFeatureEnabled(t, ss) })
    23  	t.Run("PreferenceDelete", func(t *testing.T) { testPreferenceDelete(t, ss) })
    24  	t.Run("PreferenceDeleteCategory", func(t *testing.T) { testPreferenceDeleteCategory(t, ss) })
    25  	t.Run("PreferenceDeleteCategoryAndName", func(t *testing.T) { testPreferenceDeleteCategoryAndName(t, ss) })
    26  	t.Run("PreferenceCleanupFlagsBatch", func(t *testing.T) { testPreferenceCleanupFlagsBatch(t, ss) })
    27  }
    28  
    29  func testPreferenceSave(t *testing.T, ss store.Store) {
    30  	id := model.NewId()
    31  
    32  	preferences := model.Preferences{
    33  		{
    34  			UserId:   id,
    35  			Category: model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW,
    36  			Name:     model.NewId(),
    37  			Value:    "value1a",
    38  		},
    39  		{
    40  			UserId:   id,
    41  			Category: model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW,
    42  			Name:     model.NewId(),
    43  			Value:    "value1b",
    44  		},
    45  	}
    46  	if err := ss.Preference().Save(&preferences); err != nil {
    47  		t.Fatal("saving preference returned error")
    48  	}
    49  
    50  	for _, preference := range preferences {
    51  		if data, _ := ss.Preference().Get(preference.UserId, preference.Category, preference.Name); preference.ToJson() != data.ToJson() {
    52  			t.Fatal("got incorrect preference after first Save")
    53  		}
    54  	}
    55  
    56  	preferences[0].Value = "value2a"
    57  	preferences[1].Value = "value2b"
    58  	if err := ss.Preference().Save(&preferences); err != nil {
    59  		t.Fatal("saving preference returned error")
    60  	}
    61  
    62  	for _, preference := range preferences {
    63  		if data, _ := ss.Preference().Get(preference.UserId, preference.Category, preference.Name); preference.ToJson() != data.ToJson() {
    64  			t.Fatal("got incorrect preference after second Save")
    65  		}
    66  	}
    67  }
    68  
    69  func testPreferenceGet(t *testing.T, ss store.Store) {
    70  	userId := model.NewId()
    71  	category := model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW
    72  	name := model.NewId()
    73  
    74  	preferences := model.Preferences{
    75  		{
    76  			UserId:   userId,
    77  			Category: category,
    78  			Name:     name,
    79  		},
    80  		{
    81  			UserId:   userId,
    82  			Category: category,
    83  			Name:     model.NewId(),
    84  		},
    85  		{
    86  			UserId:   userId,
    87  			Category: model.NewId(),
    88  			Name:     name,
    89  		},
    90  		{
    91  			UserId:   model.NewId(),
    92  			Category: category,
    93  			Name:     name,
    94  		},
    95  	}
    96  
    97  	err := ss.Preference().Save(&preferences)
    98  	require.Nil(t, err)
    99  
   100  	if data, err := ss.Preference().Get(userId, category, name); err != nil {
   101  		t.Fatal(err)
   102  	} else if data.ToJson() != preferences[0].ToJson() {
   103  		t.Fatal("got incorrect preference")
   104  	}
   105  
   106  	// make sure getting a missing preference fails
   107  	if _, err := ss.Preference().Get(model.NewId(), model.NewId(), model.NewId()); err == nil {
   108  		t.Fatal("no error on getting a missing preference")
   109  	}
   110  }
   111  
   112  func testPreferenceGetCategory(t *testing.T, ss store.Store) {
   113  	userId := model.NewId()
   114  	category := model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW
   115  	name := model.NewId()
   116  
   117  	preferences := model.Preferences{
   118  		{
   119  			UserId:   userId,
   120  			Category: category,
   121  			Name:     name,
   122  		},
   123  		// same user/category, different name
   124  		{
   125  			UserId:   userId,
   126  			Category: category,
   127  			Name:     model.NewId(),
   128  		},
   129  		// same user/name, different category
   130  		{
   131  			UserId:   userId,
   132  			Category: model.NewId(),
   133  			Name:     name,
   134  		},
   135  		// same name/category, different user
   136  		{
   137  			UserId:   model.NewId(),
   138  			Category: category,
   139  			Name:     name,
   140  		},
   141  	}
   142  
   143  	err := ss.Preference().Save(&preferences)
   144  	require.Nil(t, err)
   145  
   146  	if preferencesByCategory, err := ss.Preference().GetCategory(userId, category); err != nil {
   147  		t.Fatal(err)
   148  	} else if len(preferencesByCategory) != 2 {
   149  		t.Fatal("got the wrong number of preferences")
   150  	} else if !((preferencesByCategory[0] == preferences[0] && preferencesByCategory[1] == preferences[1]) || (preferencesByCategory[0] == preferences[1] && preferencesByCategory[1] == preferences[0])) {
   151  		t.Fatal("got incorrect preferences")
   152  	}
   153  
   154  	// make sure getting a missing preference category doesn't fail
   155  	if preferencesByCategory, err := ss.Preference().GetCategory(model.NewId(), model.NewId()); err != nil {
   156  		t.Fatal(err)
   157  	} else if len(preferencesByCategory) != 0 {
   158  		t.Fatal("shouldn't have got any preferences")
   159  	}
   160  }
   161  
   162  func testPreferenceGetAll(t *testing.T, ss store.Store) {
   163  	userId := model.NewId()
   164  	category := model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW
   165  	name := model.NewId()
   166  
   167  	preferences := model.Preferences{
   168  		{
   169  			UserId:   userId,
   170  			Category: category,
   171  			Name:     name,
   172  		},
   173  		// same user/category, different name
   174  		{
   175  			UserId:   userId,
   176  			Category: category,
   177  			Name:     model.NewId(),
   178  		},
   179  		// same user/name, different category
   180  		{
   181  			UserId:   userId,
   182  			Category: model.NewId(),
   183  			Name:     name,
   184  		},
   185  		// same name/category, different user
   186  		{
   187  			UserId:   model.NewId(),
   188  			Category: category,
   189  			Name:     name,
   190  		},
   191  	}
   192  
   193  	err := ss.Preference().Save(&preferences)
   194  	require.Nil(t, err)
   195  
   196  	if result, err := ss.Preference().GetAll(userId); err != nil {
   197  		t.Fatal(err)
   198  	} else if len(result) != 3 {
   199  		t.Fatal("got the wrong number of preferences")
   200  	} else {
   201  		for i := 0; i < 3; i++ {
   202  			if result[0] != preferences[i] && result[1] != preferences[i] && result[2] != preferences[i] {
   203  				t.Fatal("got incorrect preferences")
   204  			}
   205  		}
   206  	}
   207  }
   208  
   209  func testPreferenceDeleteByUser(t *testing.T, ss store.Store) {
   210  	userId := model.NewId()
   211  	category := model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW
   212  	name := model.NewId()
   213  
   214  	preferences := model.Preferences{
   215  		{
   216  			UserId:   userId,
   217  			Category: category,
   218  			Name:     name,
   219  		},
   220  		// same user/category, different name
   221  		{
   222  			UserId:   userId,
   223  			Category: category,
   224  			Name:     model.NewId(),
   225  		},
   226  		// same user/name, different category
   227  		{
   228  			UserId:   userId,
   229  			Category: model.NewId(),
   230  			Name:     name,
   231  		},
   232  		// same name/category, different user
   233  		{
   234  			UserId:   model.NewId(),
   235  			Category: category,
   236  			Name:     name,
   237  		},
   238  	}
   239  
   240  	err := ss.Preference().Save(&preferences)
   241  	require.Nil(t, err)
   242  
   243  	if err := ss.Preference().PermanentDeleteByUser(userId); err != nil {
   244  		t.Fatal(err)
   245  	}
   246  }
   247  
   248  func testIsFeatureEnabled(t *testing.T, ss store.Store) {
   249  	feature1 := "testFeat1"
   250  	feature2 := "testFeat2"
   251  	feature3 := "testFeat3"
   252  
   253  	userId := model.NewId()
   254  	category := model.PREFERENCE_CATEGORY_ADVANCED_SETTINGS
   255  
   256  	features := model.Preferences{
   257  		{
   258  			UserId:   userId,
   259  			Category: category,
   260  			Name:     store.FEATURE_TOGGLE_PREFIX + feature1,
   261  			Value:    "true",
   262  		},
   263  		{
   264  			UserId:   userId,
   265  			Category: category,
   266  			Name:     model.NewId(),
   267  			Value:    "false",
   268  		},
   269  		{
   270  			UserId:   userId,
   271  			Category: model.NewId(),
   272  			Name:     store.FEATURE_TOGGLE_PREFIX + feature1,
   273  			Value:    "false",
   274  		},
   275  		{
   276  			UserId:   model.NewId(),
   277  			Category: category,
   278  			Name:     store.FEATURE_TOGGLE_PREFIX + feature2,
   279  			Value:    "false",
   280  		},
   281  		{
   282  			UserId:   model.NewId(),
   283  			Category: category,
   284  			Name:     store.FEATURE_TOGGLE_PREFIX + feature3,
   285  			Value:    "foobar",
   286  		},
   287  	}
   288  
   289  	err := ss.Preference().Save(&features)
   290  	require.Nil(t, err)
   291  
   292  	if data, err := ss.Preference().IsFeatureEnabled(feature1, userId); err != nil {
   293  		t.Fatal(err)
   294  	} else if !data {
   295  		t.Fatalf("got incorrect setting for feature1, %v=%v", true, data)
   296  	}
   297  
   298  	if data, err := ss.Preference().IsFeatureEnabled(feature2, userId); err != nil {
   299  		t.Fatal(err)
   300  	} else if data {
   301  		t.Fatalf("got incorrect setting for feature2, %v=%v", false, data)
   302  	}
   303  
   304  	// make sure we get false if something different than "true" or "false" has been saved to database
   305  	if data, err := ss.Preference().IsFeatureEnabled(feature3, userId); err != nil {
   306  		t.Fatal(err)
   307  	} else if data {
   308  		t.Fatalf("got incorrect setting for feature3, %v=%v", false, data)
   309  	}
   310  
   311  	// make sure false is returned if a non-existent feature is queried
   312  	if data, err := ss.Preference().IsFeatureEnabled("someOtherFeature", userId); err != nil {
   313  		t.Fatal(err)
   314  	} else if data {
   315  		t.Fatalf("got incorrect setting for non-existent feature 'someOtherFeature', %v=%v", false, data)
   316  	}
   317  }
   318  
   319  func testPreferenceDelete(t *testing.T, ss store.Store) {
   320  	preference := model.Preference{
   321  		UserId:   model.NewId(),
   322  		Category: model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW,
   323  		Name:     model.NewId(),
   324  		Value:    "value1a",
   325  	}
   326  
   327  	err := ss.Preference().Save(&model.Preferences{preference})
   328  	require.Nil(t, err)
   329  
   330  	preferences, err := ss.Preference().GetAll(preference.UserId)
   331  	require.Nil(t, err)
   332  	assert.Len(t, preferences, 1, "should've returned 1 preference")
   333  
   334  	if err = ss.Preference().Delete(preference.UserId, preference.Category, preference.Name); err != nil {
   335  		t.Fatal(err)
   336  	}
   337  	preferences, err = ss.Preference().GetAll(preference.UserId)
   338  	require.Nil(t, err)
   339  	assert.Len(t, preferences, 0, "should've returned no preferences")
   340  
   341  }
   342  
   343  func testPreferenceDeleteCategory(t *testing.T, ss store.Store) {
   344  	category := model.NewId()
   345  	userId := model.NewId()
   346  
   347  	preference1 := model.Preference{
   348  		UserId:   userId,
   349  		Category: category,
   350  		Name:     model.NewId(),
   351  		Value:    "value1a",
   352  	}
   353  
   354  	preference2 := model.Preference{
   355  		UserId:   userId,
   356  		Category: category,
   357  		Name:     model.NewId(),
   358  		Value:    "value1a",
   359  	}
   360  
   361  	err := ss.Preference().Save(&model.Preferences{preference1, preference2})
   362  	require.Nil(t, err)
   363  
   364  	preferences, err := ss.Preference().GetAll(userId)
   365  	require.Nil(t, err)
   366  	assert.Len(t, preferences, 2, "should've returned 2 preferences")
   367  
   368  	if err = ss.Preference().DeleteCategory(userId, category); err != nil {
   369  		t.Fatal(err)
   370  	}
   371  
   372  	preferences, err = ss.Preference().GetAll(userId)
   373  	require.Nil(t, err)
   374  	assert.Len(t, preferences, 0, "should've returned no preferences")
   375  }
   376  
   377  func testPreferenceDeleteCategoryAndName(t *testing.T, ss store.Store) {
   378  	category := model.NewId()
   379  	name := model.NewId()
   380  	userId := model.NewId()
   381  	userId2 := model.NewId()
   382  
   383  	preference1 := model.Preference{
   384  		UserId:   userId,
   385  		Category: category,
   386  		Name:     name,
   387  		Value:    "value1a",
   388  	}
   389  
   390  	preference2 := model.Preference{
   391  		UserId:   userId2,
   392  		Category: category,
   393  		Name:     name,
   394  		Value:    "value1a",
   395  	}
   396  
   397  	err := ss.Preference().Save(&model.Preferences{preference1, preference2})
   398  	require.Nil(t, err)
   399  
   400  	preferences, err := ss.Preference().GetAll(userId)
   401  	require.Nil(t, err)
   402  	assert.Len(t, preferences, 1, "should've returned 1 preference")
   403  
   404  	preferences, err = ss.Preference().GetAll(userId2)
   405  	require.Nil(t, err)
   406  	assert.Len(t, preferences, 1, "should've returned 1 preference")
   407  
   408  	if err = ss.Preference().DeleteCategoryAndName(category, name); err != nil {
   409  		t.Fatal(err)
   410  	}
   411  
   412  	preferences, err = ss.Preference().GetAll(userId)
   413  	require.Nil(t, err)
   414  	assert.Len(t, preferences, 0, "should've returned no preference")
   415  
   416  	preferences, err = ss.Preference().GetAll(userId2)
   417  	require.Nil(t, err)
   418  	assert.Len(t, preferences, 0, "should've returned no preference")
   419  }
   420  
   421  func testPreferenceCleanupFlagsBatch(t *testing.T, ss store.Store) {
   422  	category := model.PREFERENCE_CATEGORY_FLAGGED_POST
   423  	userId := model.NewId()
   424  
   425  	o1 := &model.Post{}
   426  	o1.ChannelId = model.NewId()
   427  	o1.UserId = userId
   428  	o1.Message = "zz" + model.NewId() + "AAAAAAAAAAA"
   429  	o1.CreateAt = 1000
   430  	o1, err := ss.Post().Save(o1)
   431  	require.Nil(t, err)
   432  
   433  	preference1 := model.Preference{
   434  		UserId:   userId,
   435  		Category: category,
   436  		Name:     o1.Id,
   437  		Value:    "true",
   438  	}
   439  
   440  	preference2 := model.Preference{
   441  		UserId:   userId,
   442  		Category: category,
   443  		Name:     model.NewId(),
   444  		Value:    "true",
   445  	}
   446  
   447  	err = ss.Preference().Save(&model.Preferences{preference1, preference2})
   448  	require.Nil(t, err)
   449  
   450  	_, err = ss.Preference().CleanupFlagsBatch(10000)
   451  	assert.Nil(t, err)
   452  
   453  	_, err = ss.Preference().Get(userId, category, preference1.Name)
   454  	assert.Nil(t, err)
   455  
   456  	_, err = ss.Preference().Get(userId, category, preference2.Name)
   457  	assert.NotNil(t, err)
   458  }