github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/store/storetest/bot_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 "net/http" 8 "testing" 9 "time" 10 11 "github.com/stretchr/testify/require" 12 13 "github.com/xzl8028/xenia-server/model" 14 "github.com/xzl8028/xenia-server/store" 15 ) 16 17 func makeBotWithUser(ss store.Store, bot *model.Bot) (*model.Bot, *model.User) { 18 user := store.Must(ss.User().Save(model.UserFromBot(bot))).(*model.User) 19 20 bot.UserId = user.Id 21 bot, err := ss.Bot().Save(bot) 22 if err != nil { 23 time.Sleep(time.Second) 24 panic(err) 25 } 26 27 return bot, user 28 } 29 30 func TestBotStore(t *testing.T, ss store.Store) { 31 t.Run("Get", func(t *testing.T) { testBotStoreGet(t, ss) }) 32 t.Run("GetAll", func(t *testing.T) { testBotStoreGetAll(t, ss) }) 33 t.Run("Save", func(t *testing.T) { testBotStoreSave(t, ss) }) 34 t.Run("Update", func(t *testing.T) { testBotStoreUpdate(t, ss) }) 35 t.Run("PermanentDelete", func(t *testing.T) { testBotStorePermanentDelete(t, ss) }) 36 } 37 38 func testBotStoreGet(t *testing.T, ss store.Store) { 39 deletedBot, _ := makeBotWithUser(ss, &model.Bot{ 40 Username: "deleted_bot", 41 Description: "A deleted bot", 42 OwnerId: model.NewId(), 43 }) 44 deletedBot.DeleteAt = 1 45 deletedBot, err := ss.Bot().Update(deletedBot) 46 require.Nil(t, err) 47 defer func() { require.Nil(t, ss.Bot().PermanentDelete(deletedBot.UserId)) }() 48 defer func() { require.Nil(t, ss.User().PermanentDelete(deletedBot.UserId)) }() 49 50 permanentlyDeletedBot, _ := makeBotWithUser(ss, &model.Bot{ 51 Username: "permanently_deleted_bot", 52 Description: "A permanently deleted bot", 53 OwnerId: model.NewId(), 54 DeleteAt: 0, 55 }) 56 require.Nil(t, ss.Bot().PermanentDelete(permanentlyDeletedBot.UserId)) 57 defer func() { require.Nil(t, ss.User().PermanentDelete(permanentlyDeletedBot.UserId)) }() 58 59 b1, _ := makeBotWithUser(ss, &model.Bot{ 60 Username: "b1", 61 Description: "The first bot", 62 OwnerId: model.NewId(), 63 }) 64 defer func() { require.Nil(t, ss.Bot().PermanentDelete(b1.UserId)) }() 65 defer func() { require.Nil(t, ss.User().PermanentDelete(b1.UserId)) }() 66 67 b2, _ := makeBotWithUser(ss, &model.Bot{ 68 Username: "b2", 69 Description: "The second bot", 70 OwnerId: model.NewId(), 71 }) 72 defer func() { require.Nil(t, ss.Bot().PermanentDelete(b2.UserId)) }() 73 defer func() { require.Nil(t, ss.User().PermanentDelete(b2.UserId)) }() 74 75 t.Run("get non-existent bot", func(t *testing.T) { 76 _, err := ss.Bot().Get("unknown", false) 77 require.NotNil(t, err) 78 require.Equal(t, http.StatusNotFound, err.StatusCode) 79 }) 80 81 t.Run("get deleted bot", func(t *testing.T) { 82 _, err := ss.Bot().Get(deletedBot.UserId, false) 83 require.NotNil(t, err) 84 require.Equal(t, http.StatusNotFound, err.StatusCode) 85 }) 86 87 t.Run("get deleted bot, include deleted", func(t *testing.T) { 88 bot, err := ss.Bot().Get(deletedBot.UserId, true) 89 require.Nil(t, err) 90 require.Equal(t, deletedBot, bot) 91 }) 92 93 t.Run("get permanently deleted bot", func(t *testing.T) { 94 _, err := ss.Bot().Get(permanentlyDeletedBot.UserId, false) 95 require.NotNil(t, err) 96 require.Equal(t, http.StatusNotFound, err.StatusCode) 97 }) 98 99 t.Run("get bot 1", func(t *testing.T) { 100 bot, err := ss.Bot().Get(b1.UserId, false) 101 require.Nil(t, err) 102 require.Equal(t, b1, bot) 103 }) 104 105 t.Run("get bot 2", func(t *testing.T) { 106 bot, err := ss.Bot().Get(b2.UserId, false) 107 require.Nil(t, err) 108 require.Equal(t, b2, bot) 109 }) 110 } 111 112 func testBotStoreGetAll(t *testing.T, ss store.Store) { 113 OwnerId1 := model.NewId() 114 OwnerId2 := model.NewId() 115 116 deletedBot, _ := makeBotWithUser(ss, &model.Bot{ 117 Username: "deleted_bot", 118 Description: "A deleted bot", 119 OwnerId: OwnerId1, 120 }) 121 deletedBot.DeleteAt = 1 122 deletedBot, err := ss.Bot().Update(deletedBot) 123 require.Nil(t, err) 124 defer func() { require.Nil(t, ss.Bot().PermanentDelete(deletedBot.UserId)) }() 125 defer func() { require.Nil(t, ss.User().PermanentDelete(deletedBot.UserId)) }() 126 127 permanentlyDeletedBot, _ := makeBotWithUser(ss, &model.Bot{ 128 Username: "permanently_deleted_bot", 129 Description: "A permanently deleted bot", 130 OwnerId: OwnerId1, 131 DeleteAt: 0, 132 }) 133 require.Nil(t, ss.Bot().PermanentDelete(permanentlyDeletedBot.UserId)) 134 defer func() { require.Nil(t, ss.User().PermanentDelete(permanentlyDeletedBot.UserId)) }() 135 136 b1, _ := makeBotWithUser(ss, &model.Bot{ 137 Username: "b1", 138 Description: "The first bot", 139 OwnerId: OwnerId1, 140 }) 141 defer func() { require.Nil(t, ss.Bot().PermanentDelete(b1.UserId)) }() 142 defer func() { require.Nil(t, ss.User().PermanentDelete(b1.UserId)) }() 143 144 b2, _ := makeBotWithUser(ss, &model.Bot{ 145 Username: "b2", 146 Description: "The second bot", 147 OwnerId: OwnerId1, 148 }) 149 defer func() { require.Nil(t, ss.Bot().PermanentDelete(b2.UserId)) }() 150 defer func() { require.Nil(t, ss.User().PermanentDelete(b2.UserId)) }() 151 152 t.Run("get original bots", func(t *testing.T) { 153 bot, err := ss.Bot().GetAll(&model.BotGetOptions{Page: 0, PerPage: 10}) 154 require.Nil(t, err) 155 require.Equal(t, []*model.Bot{ 156 b1, 157 b2, 158 }, bot) 159 }) 160 161 b3, _ := makeBotWithUser(ss, &model.Bot{ 162 Username: "b3", 163 Description: "The third bot", 164 OwnerId: OwnerId1, 165 }) 166 defer func() { require.Nil(t, ss.Bot().PermanentDelete(b3.UserId)) }() 167 defer func() { require.Nil(t, ss.User().PermanentDelete(b3.UserId)) }() 168 169 b4, _ := makeBotWithUser(ss, &model.Bot{ 170 Username: "b4", 171 Description: "The fourth bot", 172 OwnerId: OwnerId2, 173 }) 174 defer func() { require.Nil(t, ss.Bot().PermanentDelete(b4.UserId)) }() 175 defer func() { require.Nil(t, ss.User().PermanentDelete(b4.UserId)) }() 176 177 deletedUser := model.User{ 178 Email: MakeEmail(), 179 Username: model.NewId(), 180 } 181 if err := (<-ss.User().Save(&deletedUser)).Err; err != nil { 182 t.Fatal("couldn't save user", err) 183 } 184 deletedUser.DeleteAt = model.GetMillis() 185 if _, err := ss.User().Update(&deletedUser, true); err != nil { 186 t.Fatal("couldn't delete user", err) 187 } 188 defer func() { require.Nil(t, ss.User().PermanentDelete(deletedUser.Id)) }() 189 ob5, _ := makeBotWithUser(ss, &model.Bot{ 190 Username: "ob5", 191 Description: "Orphaned bot 5", 192 OwnerId: deletedUser.Id, 193 }) 194 defer func() { require.Nil(t, ss.Bot().PermanentDelete(b4.UserId)) }() 195 defer func() { require.Nil(t, ss.User().PermanentDelete(b4.UserId)) }() 196 197 t.Run("get newly created bot stoo", func(t *testing.T) { 198 bots, err := ss.Bot().GetAll(&model.BotGetOptions{Page: 0, PerPage: 10}) 199 require.Nil(t, err) 200 require.Equal(t, []*model.Bot{ 201 b1, 202 b2, 203 b3, 204 b4, 205 ob5, 206 }, bots) 207 }) 208 209 t.Run("get orphaned", func(t *testing.T) { 210 bots, err := ss.Bot().GetAll(&model.BotGetOptions{Page: 0, PerPage: 10, OnlyOrphaned: true}) 211 require.Nil(t, err) 212 require.Equal(t, []*model.Bot{ 213 ob5, 214 }, bots) 215 }) 216 217 t.Run("get page=0, per_page=2", func(t *testing.T) { 218 bots, err := ss.Bot().GetAll(&model.BotGetOptions{Page: 0, PerPage: 2}) 219 require.Nil(t, err) 220 require.Equal(t, []*model.Bot{ 221 b1, 222 b2, 223 }, bots) 224 }) 225 226 t.Run("get page=1, limit=2", func(t *testing.T) { 227 bots, err := ss.Bot().GetAll(&model.BotGetOptions{Page: 1, PerPage: 2}) 228 require.Nil(t, err) 229 require.Equal(t, []*model.Bot{ 230 b3, 231 b4, 232 }, bots) 233 }) 234 235 t.Run("get page=5, perpage=1000", func(t *testing.T) { 236 bots, err := ss.Bot().GetAll(&model.BotGetOptions{Page: 5, PerPage: 1000}) 237 require.Nil(t, err) 238 require.Equal(t, []*model.Bot{}, bots) 239 }) 240 241 t.Run("get offset=0, limit=2, include deleted", func(t *testing.T) { 242 bots, err := ss.Bot().GetAll(&model.BotGetOptions{Page: 0, PerPage: 2, IncludeDeleted: true}) 243 require.Nil(t, err) 244 require.Equal(t, []*model.Bot{ 245 deletedBot, 246 b1, 247 }, bots) 248 }) 249 250 t.Run("get offset=2, limit=2, include deleted", func(t *testing.T) { 251 bots, err := ss.Bot().GetAll(&model.BotGetOptions{Page: 1, PerPage: 2, IncludeDeleted: true}) 252 require.Nil(t, err) 253 require.Equal(t, []*model.Bot{ 254 b2, 255 b3, 256 }, bots) 257 }) 258 259 t.Run("get offset=0, limit=10, creator id 1", func(t *testing.T) { 260 bots, err := ss.Bot().GetAll(&model.BotGetOptions{Page: 0, PerPage: 10, OwnerId: OwnerId1}) 261 require.Nil(t, err) 262 require.Equal(t, []*model.Bot{ 263 b1, 264 b2, 265 b3, 266 }, bots) 267 }) 268 269 t.Run("get offset=0, limit=10, creator id 2", func(t *testing.T) { 270 bots, err := ss.Bot().GetAll(&model.BotGetOptions{Page: 0, PerPage: 10, OwnerId: OwnerId2}) 271 require.Nil(t, err) 272 require.Equal(t, []*model.Bot{ 273 b4, 274 }, bots) 275 }) 276 277 t.Run("get offset=0, limit=10, include deleted, creator id 1", func(t *testing.T) { 278 bots, err := ss.Bot().GetAll(&model.BotGetOptions{Page: 0, PerPage: 10, IncludeDeleted: true, OwnerId: OwnerId1}) 279 require.Nil(t, err) 280 require.Equal(t, []*model.Bot{ 281 deletedBot, 282 b1, 283 b2, 284 b3, 285 }, bots) 286 }) 287 288 t.Run("get offset=0, limit=10, include deleted, creator id 2", func(t *testing.T) { 289 bots, err := ss.Bot().GetAll(&model.BotGetOptions{Page: 0, PerPage: 10, IncludeDeleted: true, OwnerId: OwnerId2}) 290 require.Nil(t, err) 291 require.Equal(t, []*model.Bot{ 292 b4, 293 }, bots) 294 }) 295 } 296 297 func testBotStoreSave(t *testing.T, ss store.Store) { 298 t.Run("invalid bot", func(t *testing.T) { 299 bot := &model.Bot{ 300 UserId: model.NewId(), 301 Username: "invalid bot", 302 Description: "description", 303 } 304 305 _, err := ss.Bot().Save(bot) 306 require.NotNil(t, err) 307 require.Equal(t, "model.bot.is_valid.username.app_error", err.Id) 308 }) 309 310 t.Run("normal bot", func(t *testing.T) { 311 bot := &model.Bot{ 312 Username: "normal_bot", 313 Description: "description", 314 OwnerId: model.NewId(), 315 } 316 317 user := store.Must(ss.User().Save(model.UserFromBot(bot))).(*model.User) 318 defer func() { require.Nil(t, ss.User().PermanentDelete(user.Id)) }() 319 bot.UserId = user.Id 320 321 returnedNewBot, err := ss.Bot().Save(bot) 322 require.Nil(t, err) 323 defer func() { require.Nil(t, ss.Bot().PermanentDelete(bot.UserId)) }() 324 325 // Verify the returned bot matches the saved bot, modulo expected changes 326 require.NotEqual(t, 0, returnedNewBot.CreateAt) 327 require.NotEqual(t, 0, returnedNewBot.UpdateAt) 328 require.Equal(t, returnedNewBot.CreateAt, returnedNewBot.UpdateAt) 329 bot.UserId = returnedNewBot.UserId 330 bot.CreateAt = returnedNewBot.CreateAt 331 bot.UpdateAt = returnedNewBot.UpdateAt 332 bot.DeleteAt = 0 333 require.Equal(t, bot, returnedNewBot) 334 335 // Verify the actual bot in the database matches the saved bot. 336 actualNewBot, err := ss.Bot().Get(bot.UserId, false) 337 require.Nil(t, err) 338 require.Equal(t, bot, actualNewBot) 339 }) 340 } 341 342 func testBotStoreUpdate(t *testing.T, ss store.Store) { 343 t.Run("invalid bot should fail to update", func(t *testing.T) { 344 existingBot, _ := makeBotWithUser(ss, &model.Bot{ 345 Username: "existing_bot", 346 OwnerId: model.NewId(), 347 }) 348 defer func() { require.Nil(t, ss.Bot().PermanentDelete(existingBot.UserId)) }() 349 defer func() { require.Nil(t, ss.User().PermanentDelete(existingBot.UserId)) }() 350 351 bot := existingBot.Clone() 352 bot.Username = "invalid username" 353 _, err := ss.Bot().Update(bot) 354 require.NotNil(t, err) 355 require.Equal(t, "model.bot.is_valid.username.app_error", err.Id) 356 }) 357 358 t.Run("existing bot should update", func(t *testing.T) { 359 existingBot, _ := makeBotWithUser(ss, &model.Bot{ 360 Username: "existing_bot", 361 OwnerId: model.NewId(), 362 }) 363 defer func() { require.Nil(t, ss.Bot().PermanentDelete(existingBot.UserId)) }() 364 defer func() { require.Nil(t, ss.User().PermanentDelete(existingBot.UserId)) }() 365 366 bot := existingBot.Clone() 367 bot.OwnerId = model.NewId() 368 bot.Description = "updated description" 369 bot.CreateAt = 999999 // Ignored 370 bot.UpdateAt = 999999 // Ignored 371 bot.DeleteAt = 100000 // Allowed 372 373 returnedBot, err := ss.Bot().Update(bot) 374 require.Nil(t, err) 375 376 // Verify the returned bot matches the updated bot, modulo expected timestamp changes 377 require.Equal(t, existingBot.CreateAt, returnedBot.CreateAt) 378 require.NotEqual(t, bot.UpdateAt, returnedBot.UpdateAt, "update should have advanced UpdateAt") 379 require.True(t, returnedBot.UpdateAt > bot.UpdateAt, "update should have advanced UpdateAt") 380 require.NotEqual(t, 99999, returnedBot.UpdateAt, "should have ignored user-provided UpdateAt") 381 bot.CreateAt = returnedBot.CreateAt 382 bot.UpdateAt = returnedBot.UpdateAt 383 384 // Verify the actual (now deleted) bot in the database 385 actualBot, err := ss.Bot().Get(bot.UserId, true) 386 require.Nil(t, err) 387 require.Equal(t, bot, actualBot) 388 }) 389 390 t.Run("deleted bot should update, restoring", func(t *testing.T) { 391 existingBot, _ := makeBotWithUser(ss, &model.Bot{ 392 Username: "existing_bot", 393 OwnerId: model.NewId(), 394 }) 395 defer func() { require.Nil(t, ss.Bot().PermanentDelete(existingBot.UserId)) }() 396 defer func() { require.Nil(t, ss.User().PermanentDelete(existingBot.UserId)) }() 397 398 existingBot.DeleteAt = 100000 399 existingBot, err := ss.Bot().Update(existingBot) 400 require.Nil(t, err) 401 402 bot := existingBot.Clone() 403 bot.DeleteAt = 0 404 405 returnedBot, err := ss.Bot().Update(bot) 406 require.Nil(t, err) 407 408 // Verify the returned bot matches the updated bot, modulo expected timestamp changes 409 require.EqualValues(t, 0, returnedBot.DeleteAt) 410 bot.UpdateAt = returnedBot.UpdateAt 411 412 // Verify the actual bot in the database 413 actualBot, err := ss.Bot().Get(bot.UserId, false) 414 require.Nil(t, err) 415 require.Equal(t, bot, actualBot) 416 }) 417 } 418 419 func testBotStorePermanentDelete(t *testing.T, ss store.Store) { 420 b1, _ := makeBotWithUser(ss, &model.Bot{ 421 Username: "b1", 422 OwnerId: model.NewId(), 423 }) 424 defer func() { require.Nil(t, ss.Bot().PermanentDelete(b1.UserId)) }() 425 defer func() { require.Nil(t, ss.User().PermanentDelete(b1.UserId)) }() 426 427 b2, _ := makeBotWithUser(ss, &model.Bot{ 428 Username: "b2", 429 OwnerId: model.NewId(), 430 }) 431 defer func() { require.Nil(t, ss.Bot().PermanentDelete(b2.UserId)) }() 432 defer func() { require.Nil(t, ss.User().PermanentDelete(b2.UserId)) }() 433 434 t.Run("permanently delete a non-existent bot", func(t *testing.T) { 435 err := ss.Bot().PermanentDelete("unknown") 436 require.Nil(t, err) 437 }) 438 439 t.Run("permanently delete bot", func(t *testing.T) { 440 err := ss.Bot().PermanentDelete(b1.UserId) 441 require.Nil(t, err) 442 443 _, err = ss.Bot().Get(b1.UserId, false) 444 require.NotNil(t, err) 445 require.Equal(t, http.StatusNotFound, err.StatusCode) 446 }) 447 }