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 }