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  }