* create ChannelBookmarks table * ChannelBookmark model * channel bookamrks Store layer * add GetBookmarksForAllChannelByIdSince * add channel bookmarks to test store * Add channel bookmarks to app layer * remove index for createAt in channel bookmarks migrations * remove createAt from select channel bookmark query and enable store delete bookmark test * update reponse of UpdateBookmark * rename db migration files * channel bookmarks store update sort order * channel bookmarks app layer update sort order * fix lint & tests * Fix lint and introduce util functions to insert / remove from slice * remove model etag * i18n * defer remove file info after test run * Fix tests passing the request context * fix migrations * fix TestRetry * Add bookmark permissions (#25560) * Adds channel bookmarks permissions * Fix linter * Remove unnecessary empty lines * Remove scss change as it's not necessary anymore * Fix mock store * Fix mock store and add role entry * Fix test * Adds cypress test and update permissions migration to update admin roles * Adds channel bookmarks roles to default admin roles * Adds bookmark permissions to default role permissions constant in webapp * Update mmctl test * Update permission test after normalising the roles * fix store tests * fix app layer tests * Add new bookmark endpoint (#25624) * Adds channel bookmarks api scaffold and create endpoint * Applies review comments to the API docs * Adds websocket test to create channel bookmark --------- Co-authored-by: Mattermost Build <build@mattermost.com> * MM-54426 exclude Channel Bookmarks files from data retention (#25656) * Augment channel APIs to include bookmarks (#25567) * update files docs for server 9.4 * Adds update channel bookmark endpoint (#25653) * Adds update channel bookmark sort order endpoint (#25686) * Adds update channel bookmark endpoint * Updates edit app method to return the right deleted bookmark and adds tests * Adds the update channel bookmark sort order endpoint * Fix repeated test after merge * Assign right permissions to each test * Update store and app layer to return specific errors and add tests * Adds delete channel bookmark endpoint (#25693) * Updates edit app method to return the right deleted bookmark and adds tests * Fix repeated test after merge * Updates edit app method to return the right deleted bookmark and adds tests * Adds delete channel bookmark endpoint * Adds list channel bookmarks endpoint (#25700) * Add channel moderation to bookmarks (#25716) * fix migrations index * fix getChannelsForTeamForUser * fix getChannelsForTeamForUser * fix bad merge client4 * fix file api with bookmark permission * add ChannelBookmarks feature flag * add missing translations * Set DB column for type as enum * use custom type for bookmark query using sqlx * use transaction when saving bookmark * return NewErrNotFound instead of Sql.ErrNoRows * use squirrel for IN query * add a limit of 1K for records in GetBookmarksForAllChannelByIdSince * UpdateSortOrder with one single query instead of multiple updates * fix shadow declaration * fix channel bookmarks permission string definition in admin console * fix another shadow declaration * Fix model conversion * add SplitSliceInChunks * remove include bookmarks in channels api * Cap amount of bookmarks per channel * add etag back to get channels * feedback review * update file info when replacing a bookmark file * return 501 not implemented when the license is not available * add detail message when getting channel member on bookmark api * start audit before permission check on create bookmark api * use require.Eventuallyf for testing WS events * remove unnecessary log in app layer * use require instead of assert to avoid panics * enforce limit when querying bookmarks since * prevent to create/update bookmark if file is already attached * fix lint * delete file when a bookmark is deleted * Dot allow to set a fileId and a url at the same time to a bookmark * fix query to delete a file that belongs to a bookmark * do not patch the bookmark type * Server side FeatureFlag check (#26145) * use ff in server, set ff to false * turn on FF for unit tests * defer unset FF for unit tests * turn ff on for testing * only allow attaching files that were uploaded for bookmark * Set feature flag off as default * fix lint * update email templates as PR failed * revert templates * force the assignment of ID when creating a bookmark * Fix unit tests --------- Co-authored-by: Miguel de la Cruz <miguel@mcrx.me> Co-authored-by: Mattermost Build <build@mattermost.com> Co-authored-by: Caleb Roseland <caleb@calebroseland.com> Co-authored-by: Scott Bishel <scott.bishel@mattermost.com>
499 строки
17 KiB
Go
499 строки
17 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package app
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/mattermost/mattermost/server/public/model"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func find_bookmark(slice []*model.ChannelBookmarkWithFileInfo, id string) *model.ChannelBookmarkWithFileInfo {
|
|
for _, element := range slice {
|
|
if element.Id == id {
|
|
return element
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func createBookmark(name string, bookmarkType model.ChannelBookmarkType, channelId string, fileId string) *model.ChannelBookmark {
|
|
bookmark := &model.ChannelBookmark{
|
|
ChannelId: channelId,
|
|
DisplayName: name,
|
|
LinkUrl: "https://mattermost.com",
|
|
Type: bookmarkType,
|
|
Emoji: ":smile:",
|
|
FileId: fileId,
|
|
}
|
|
|
|
return bookmark
|
|
}
|
|
|
|
func TestCreateBookmark(t *testing.T) {
|
|
th := Setup(t).InitBasic()
|
|
defer th.TearDown()
|
|
|
|
t.Run("create a channel bookmark", func(t *testing.T) {
|
|
th.Context.Session().UserId = th.BasicUser.Id // set the user for the session
|
|
|
|
bookmark1 := createBookmark("Link bookmark test", model.ChannelBookmarkLink, th.BasicChannel.Id, "")
|
|
bookmarkResp, err := th.App.CreateChannelBookmark(th.Context, bookmark1, "")
|
|
require.Nil(t, err)
|
|
require.NotNil(t, bookmarkResp)
|
|
|
|
assert.Equal(t, bookmarkResp.ChannelId, th.BasicChannel.Id)
|
|
assert.NotEmpty(t, bookmarkResp.Id)
|
|
|
|
bookmark2 := createBookmark("File bookmark test", model.ChannelBookmarkFile, th.BasicChannel.Id, "")
|
|
|
|
bookmarkResp, err = th.App.CreateChannelBookmark(th.Context, bookmark2, "")
|
|
assert.Nil(t, bookmarkResp)
|
|
assert.NotNil(t, err)
|
|
})
|
|
|
|
t.Run("Cannot create more than MaxBookmarksPerChannel", func(t *testing.T) {
|
|
th.Context.Session().UserId = th.BasicUser.Id // set the user for the session
|
|
|
|
for i := 1; i < model.MaxBookmarksPerChannel; i++ {
|
|
bookmark := createBookmark(fmt.Sprintf("Link bookmark test %d", i), model.ChannelBookmarkLink, th.BasicChannel.Id, "")
|
|
bookmarkResp, err := th.App.CreateChannelBookmark(th.Context, bookmark, "")
|
|
require.Nil(t, err)
|
|
require.NotNil(t, bookmarkResp)
|
|
assert.Equal(t, bookmarkResp.ChannelId, th.BasicChannel.Id)
|
|
assert.NotEmpty(t, bookmarkResp.Id)
|
|
}
|
|
|
|
bookmark := createBookmark("Bookmark that should not be added", model.ChannelBookmarkLink, th.BasicChannel.Id, "")
|
|
bookmarkResp, err := th.App.CreateChannelBookmark(th.Context, bookmark, "")
|
|
assert.Nil(t, bookmarkResp)
|
|
assert.NotNil(t, err)
|
|
})
|
|
}
|
|
|
|
func TestUpdateBookmark(t *testing.T) {
|
|
th := Setup(t).InitBasic()
|
|
defer th.TearDown()
|
|
|
|
var updateBookmark *model.ChannelBookmarkWithFileInfo
|
|
|
|
var testUpdateAnotherFile = func(th *TestHelper, t *testing.T) {
|
|
file := &model.FileInfo{
|
|
Id: model.NewId(),
|
|
CreatorId: model.BookmarkFileOwner,
|
|
Path: "somepath",
|
|
ThumbnailPath: "thumbpath",
|
|
PreviewPath: "prevPath",
|
|
Name: "test file",
|
|
Extension: "png",
|
|
MimeType: "images/png",
|
|
Size: 873182,
|
|
Width: 3076,
|
|
Height: 2200,
|
|
HasPreviewImage: true,
|
|
}
|
|
|
|
th.App.Srv().Store().FileInfo().Save(th.Context, file)
|
|
defer th.App.Srv().Store().FileInfo().PermanentDelete(th.Context, file.Id)
|
|
|
|
bookmark2 := createBookmark("File to be updated", model.ChannelBookmarkFile, th.BasicChannel.Id, file.Id)
|
|
bookmarkResp, err := th.App.CreateChannelBookmark(th.Context, bookmark2, "")
|
|
require.Nil(t, err)
|
|
require.NotNil(t, bookmarkResp)
|
|
|
|
file2 := &model.FileInfo{
|
|
Id: model.NewId(),
|
|
CreatorId: model.BookmarkFileOwner,
|
|
Path: "somepath",
|
|
ThumbnailPath: "thumbpath",
|
|
PreviewPath: "prevPath",
|
|
Name: "test file",
|
|
Extension: "png",
|
|
MimeType: "images/png",
|
|
Size: 873182,
|
|
Width: 3076,
|
|
Height: 2200,
|
|
HasPreviewImage: true,
|
|
}
|
|
|
|
th.App.Srv().Store().FileInfo().Save(th.Context, file2)
|
|
th.App.Srv().Store().FileInfo().AttachToPost(th.Context, file2.Id, model.NewId(), th.BasicChannel.Id, model.BookmarkFileOwner)
|
|
defer th.App.Srv().Store().FileInfo().PermanentDelete(th.Context, file2.Id)
|
|
|
|
bookmark2.FileId = file2.Id
|
|
bookmarkResp, err = th.App.CreateChannelBookmark(th.Context, bookmark2, "")
|
|
require.NotNil(t, err)
|
|
require.Nil(t, bookmarkResp)
|
|
}
|
|
|
|
t.Run("same user update a channel bookmark", func(t *testing.T) {
|
|
bookmark1 := &model.ChannelBookmark{
|
|
ChannelId: th.BasicChannel.Id,
|
|
DisplayName: "Link bookmark test",
|
|
LinkUrl: "https://mattermost.com",
|
|
Type: model.ChannelBookmarkLink,
|
|
Emoji: ":smile:",
|
|
}
|
|
|
|
th.Context.Session().UserId = th.BasicUser.Id // set the user for the session
|
|
bookmarkResp, err := th.App.CreateChannelBookmark(th.Context, bookmark1, "")
|
|
require.Nil(t, err)
|
|
require.NotNil(t, bookmarkResp)
|
|
|
|
updateBookmark = bookmarkResp.Clone()
|
|
updateBookmark.DisplayName = "New name"
|
|
time.Sleep(1 * time.Millisecond) // to avoid collisions
|
|
response, _ := th.App.UpdateChannelBookmark(th.Context, updateBookmark, "")
|
|
require.NotNil(t, response)
|
|
assert.Greater(t, response.Updated.UpdateAt, response.Updated.CreateAt)
|
|
|
|
testUpdateAnotherFile(th, t)
|
|
})
|
|
|
|
t.Run("another user update a channel bookmark", func(t *testing.T) {
|
|
updateBookmark2 := updateBookmark.Clone()
|
|
updateBookmark2.DisplayName = "Another new name"
|
|
th.Context.Session().UserId = th.BasicUser2.Id
|
|
response, _ := th.App.UpdateChannelBookmark(th.Context, updateBookmark2, "")
|
|
require.NotNil(t, response)
|
|
assert.Equal(t, response.Updated.OriginalId, response.Deleted.Id)
|
|
assert.Equal(t, response.Updated.DeleteAt, int64(0))
|
|
assert.Greater(t, response.Deleted.DeleteAt, int64(0))
|
|
assert.Equal(t, "Another new name", response.Updated.DisplayName)
|
|
assert.Equal(t, "New name", response.Deleted.DisplayName)
|
|
|
|
testUpdateAnotherFile(th, t)
|
|
})
|
|
|
|
t.Run("update an already deleted channel bookmark", func(t *testing.T) {
|
|
bookmark1 := &model.ChannelBookmark{
|
|
ChannelId: th.BasicChannel.Id,
|
|
DisplayName: "Link bookmark test",
|
|
LinkUrl: "https://mattermost.com",
|
|
Type: model.ChannelBookmarkLink,
|
|
Emoji: ":smile:",
|
|
}
|
|
|
|
th.Context.Session().UserId = th.BasicUser.Id // set the user for the session
|
|
bookmarkResp, err := th.App.CreateChannelBookmark(th.Context, bookmark1, "")
|
|
require.Nil(t, err)
|
|
require.NotNil(t, bookmarkResp)
|
|
|
|
updateBookmark = bookmarkResp.Clone()
|
|
_, err = th.App.DeleteChannelBookmark(updateBookmark.Id, "")
|
|
assert.Nil(t, err)
|
|
|
|
updateBookmark.DisplayName = "New name"
|
|
_, err = th.App.UpdateChannelBookmark(th.Context, updateBookmark, "")
|
|
assert.NotNil(t, err)
|
|
})
|
|
|
|
t.Run("update a nonexisting channel bookmark", func(t *testing.T) {
|
|
updateBookmark := &model.ChannelBookmark{
|
|
Id: model.NewId(),
|
|
ChannelId: th.BasicChannel.Id,
|
|
DisplayName: "Link bookmark test",
|
|
LinkUrl: "https://mattermost.com",
|
|
Type: model.ChannelBookmarkLink,
|
|
Emoji: ":smile:",
|
|
}
|
|
_, err := th.App.UpdateChannelBookmark(th.Context, updateBookmark.ToBookmarkWithFileInfo(nil), "")
|
|
assert.NotNil(t, err)
|
|
assert.Equal(t, "app.channel.bookmark.get_existing.app_err", err.Id)
|
|
})
|
|
}
|
|
|
|
func TestDeleteBookmark(t *testing.T) {
|
|
th := Setup(t).InitBasic()
|
|
defer th.TearDown()
|
|
|
|
t.Run("delete a channel bookmark", func(t *testing.T) {
|
|
bookmark1 := &model.ChannelBookmark{
|
|
ChannelId: th.BasicChannel.Id,
|
|
DisplayName: "Link bookmark test",
|
|
LinkUrl: "https://mattermost.com",
|
|
Type: model.ChannelBookmarkLink,
|
|
Emoji: ":smile:",
|
|
}
|
|
|
|
th.Context.Session().UserId = th.BasicUser.Id // set the user for the session
|
|
bookmarkResp, err := th.App.CreateChannelBookmark(th.Context, bookmark1, "")
|
|
require.Nil(t, err)
|
|
require.NotNil(t, bookmarkResp)
|
|
|
|
bookmarkResp, err = th.App.DeleteChannelBookmark(bookmarkResp.Id, "")
|
|
require.Nil(t, err)
|
|
require.NotNil(t, bookmarkResp)
|
|
assert.Greater(t, bookmarkResp.DeleteAt, int64(0))
|
|
})
|
|
}
|
|
|
|
func TestGetChannelBookmarks(t *testing.T) {
|
|
th := Setup(t).InitBasic()
|
|
defer th.TearDown()
|
|
|
|
th.Context.Session().UserId = th.BasicUser.Id // set the user for the session
|
|
|
|
bookmark1 := &model.ChannelBookmark{
|
|
ChannelId: th.BasicChannel.Id,
|
|
DisplayName: "Bookmark 1",
|
|
LinkUrl: "https://mattermost.com",
|
|
Type: model.ChannelBookmarkLink,
|
|
Emoji: ":smile:",
|
|
}
|
|
|
|
th.App.CreateChannelBookmark(th.Context, bookmark1, "")
|
|
|
|
file := &model.FileInfo{
|
|
Id: model.NewId(),
|
|
CreatorId: model.BookmarkFileOwner,
|
|
Path: "somepath",
|
|
ThumbnailPath: "thumbpath",
|
|
PreviewPath: "prevPath",
|
|
Name: "test file",
|
|
Extension: "png",
|
|
MimeType: "images/png",
|
|
Size: 873182,
|
|
Width: 3076,
|
|
Height: 2200,
|
|
HasPreviewImage: true,
|
|
}
|
|
|
|
th.App.Srv().Store().FileInfo().Save(th.Context, file)
|
|
defer th.App.Srv().Store().FileInfo().PermanentDelete(th.Context, file.Id)
|
|
|
|
bookmark2 := &model.ChannelBookmark{
|
|
ChannelId: th.BasicChannel.Id,
|
|
DisplayName: "Bookmark 2",
|
|
FileId: file.Id,
|
|
Type: model.ChannelBookmarkFile,
|
|
Emoji: ":smile:",
|
|
}
|
|
|
|
th.App.CreateChannelBookmark(th.Context, bookmark2, "")
|
|
|
|
t.Run("get bookmarks of a channel", func(t *testing.T) {
|
|
bookmarks, err := th.App.GetChannelBookmarks(th.BasicChannel.Id, 0)
|
|
require.Nil(t, err)
|
|
require.NotNil(t, bookmarks)
|
|
assert.Len(t, bookmarks, 2)
|
|
})
|
|
|
|
t.Run("get bookmarks of a channel after one is deleted (aka only return the changed bookmarks)", func(t *testing.T) {
|
|
now := model.GetMillis()
|
|
th.App.DeleteChannelBookmark(bookmark1.Id, "")
|
|
|
|
bookmarks, err := th.App.GetChannelBookmarks(th.BasicChannel.Id, 0)
|
|
require.Nil(t, err)
|
|
require.NotNil(t, bookmarks)
|
|
assert.Len(t, bookmarks, 1)
|
|
|
|
bookmarks, err = th.App.GetChannelBookmarks(th.BasicChannel.Id, now)
|
|
require.Nil(t, err)
|
|
require.NotNil(t, bookmarks)
|
|
assert.Len(t, bookmarks, 1)
|
|
|
|
deleted := false
|
|
for _, b := range bookmarks {
|
|
if b.DeleteAt > 0 {
|
|
deleted = true
|
|
break
|
|
}
|
|
}
|
|
assert.Equal(t, deleted, true)
|
|
})
|
|
}
|
|
|
|
func TestUpdateChannelBookmarkSortOrder(t *testing.T) {
|
|
th := Setup(t).InitBasic()
|
|
defer th.TearDown()
|
|
|
|
channelId := th.BasicChannel.Id
|
|
th.Context.Session().UserId = th.BasicUser.Id // set the user for the session
|
|
|
|
bookmark0 := &model.ChannelBookmark{
|
|
ChannelId: channelId,
|
|
DisplayName: "Bookmark 0",
|
|
LinkUrl: "https://mattermost.com",
|
|
Type: model.ChannelBookmarkLink,
|
|
Emoji: ":smile:",
|
|
}
|
|
|
|
file := &model.FileInfo{
|
|
Id: model.NewId(),
|
|
CreatorId: model.BookmarkFileOwner,
|
|
Path: "somepath",
|
|
ThumbnailPath: "thumbpath",
|
|
PreviewPath: "prevPath",
|
|
Name: "test file",
|
|
Extension: "png",
|
|
MimeType: "images/png",
|
|
Size: 873182,
|
|
Width: 3076,
|
|
Height: 2200,
|
|
HasPreviewImage: true,
|
|
}
|
|
|
|
bookmark1 := &model.ChannelBookmark{
|
|
ChannelId: channelId,
|
|
DisplayName: "Bookmark 1",
|
|
FileId: file.Id,
|
|
Type: model.ChannelBookmarkFile,
|
|
Emoji: ":smile:",
|
|
}
|
|
|
|
_, err := th.App.Srv().Store().FileInfo().Save(th.Context, file)
|
|
require.NoError(t, err)
|
|
defer th.App.Srv().Store().FileInfo().PermanentDelete(th.Context, file.Id)
|
|
|
|
bookmark2 := &model.ChannelBookmark{
|
|
ChannelId: channelId,
|
|
DisplayName: "Bookmark 2",
|
|
LinkUrl: "https://mattermost.com",
|
|
Type: model.ChannelBookmarkLink,
|
|
}
|
|
|
|
bookmark3 := &model.ChannelBookmark{
|
|
ChannelId: channelId,
|
|
DisplayName: "Bookmark 3",
|
|
LinkUrl: "https://mattermost.com",
|
|
Type: model.ChannelBookmarkLink,
|
|
}
|
|
|
|
bookmark4 := &model.ChannelBookmark{
|
|
ChannelId: channelId,
|
|
DisplayName: "Bookmark 4",
|
|
LinkUrl: "https://mattermost.com",
|
|
Type: model.ChannelBookmarkLink,
|
|
}
|
|
|
|
bookmarkResp, appErr := th.App.CreateChannelBookmark(th.Context, bookmark0, "")
|
|
require.Nil(t, appErr)
|
|
require.NotNil(t, bookmarkResp)
|
|
bookmark0 = bookmarkResp.ChannelBookmark.Clone()
|
|
|
|
bookmarkResp, appErr = th.App.CreateChannelBookmark(th.Context, bookmark1, "")
|
|
require.Nil(t, appErr)
|
|
require.NotNil(t, bookmarkResp)
|
|
bookmark1 = bookmarkResp.ChannelBookmark.Clone()
|
|
|
|
bookmarkResp, appErr = th.App.CreateChannelBookmark(th.Context, bookmark2, "")
|
|
require.Nil(t, appErr)
|
|
require.NotNil(t, bookmarkResp)
|
|
bookmark2 = bookmarkResp.ChannelBookmark.Clone()
|
|
|
|
bookmarkResp, appErr = th.App.CreateChannelBookmark(th.Context, bookmark3, "")
|
|
require.Nil(t, appErr)
|
|
require.NotNil(t, bookmarkResp)
|
|
bookmark3 = bookmarkResp.ChannelBookmark.Clone()
|
|
|
|
bookmarkResp, appErr = th.App.CreateChannelBookmark(th.Context, bookmark4, "")
|
|
require.Nil(t, appErr)
|
|
require.NotNil(t, bookmarkResp)
|
|
bookmark4 = bookmarkResp.ChannelBookmark.Clone()
|
|
|
|
t.Run("change order of bookmarks first to last", func(t *testing.T) {
|
|
bookmarks, sortErr := th.App.UpdateChannelBookmarkSortOrder(bookmark0.Id, channelId, int64(4), "")
|
|
require.Nil(t, sortErr)
|
|
require.NotNil(t, bookmarks)
|
|
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark1.Id).SortOrder, int64(0))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark2.Id).SortOrder, int64(1))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark3.Id).SortOrder, int64(2))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark4.Id).SortOrder, int64(3))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark0.Id).SortOrder, int64(4))
|
|
})
|
|
|
|
t.Run("change order of bookmarks last to first", func(t *testing.T) {
|
|
bookmarks, sortErr := th.App.UpdateChannelBookmarkSortOrder(bookmark0.Id, channelId, int64(0), "")
|
|
require.Nil(t, sortErr)
|
|
require.NotNil(t, bookmarks)
|
|
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark0.Id).SortOrder, int64(0))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark1.Id).SortOrder, int64(1))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark2.Id).SortOrder, int64(2))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark3.Id).SortOrder, int64(3))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark4.Id).SortOrder, int64(4))
|
|
})
|
|
|
|
t.Run("change order of bookmarks first to third", func(t *testing.T) {
|
|
bookmarks, sortErr := th.App.UpdateChannelBookmarkSortOrder(bookmark0.Id, channelId, int64(2), "")
|
|
require.Nil(t, sortErr)
|
|
require.NotNil(t, bookmarks)
|
|
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark1.Id).SortOrder, int64(0))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark2.Id).SortOrder, int64(1))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark0.Id).SortOrder, int64(2))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark3.Id).SortOrder, int64(3))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark4.Id).SortOrder, int64(4))
|
|
|
|
// now reset order
|
|
th.App.UpdateChannelBookmarkSortOrder(bookmark0.Id, channelId, int64(0), "")
|
|
})
|
|
|
|
t.Run("change order of bookmarks second to third", func(t *testing.T) {
|
|
bookmarks, sortErr := th.App.UpdateChannelBookmarkSortOrder(bookmark1.Id, channelId, int64(2), "")
|
|
require.Nil(t, sortErr)
|
|
require.NotNil(t, bookmarks)
|
|
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark0.Id).SortOrder, int64(0))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark2.Id).SortOrder, int64(1))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark1.Id).SortOrder, int64(2))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark3.Id).SortOrder, int64(3))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark4.Id).SortOrder, int64(4))
|
|
})
|
|
|
|
t.Run("change order of bookmarks third to second", func(t *testing.T) {
|
|
bookmarks, sortErr := th.App.UpdateChannelBookmarkSortOrder(bookmark1.Id, channelId, int64(1), "")
|
|
require.Nil(t, sortErr)
|
|
require.NotNil(t, bookmarks)
|
|
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark0.Id).SortOrder, int64(0))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark1.Id).SortOrder, int64(1))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark2.Id).SortOrder, int64(2))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark3.Id).SortOrder, int64(3))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark4.Id).SortOrder, int64(4))
|
|
})
|
|
|
|
t.Run("change order of bookmarks last to previous last", func(t *testing.T) {
|
|
bookmarks, sortErr := th.App.UpdateChannelBookmarkSortOrder(bookmark4.Id, channelId, int64(3), "")
|
|
require.Nil(t, sortErr)
|
|
require.NotNil(t, bookmarks)
|
|
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark0.Id).SortOrder, int64(0))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark1.Id).SortOrder, int64(1))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark2.Id).SortOrder, int64(2))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark4.Id).SortOrder, int64(3))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark3.Id).SortOrder, int64(4))
|
|
})
|
|
|
|
t.Run("change order of bookmarks last to second", func(t *testing.T) {
|
|
bookmarks, sortErr := th.App.UpdateChannelBookmarkSortOrder(bookmark3.Id, channelId, int64(1), "")
|
|
require.Nil(t, sortErr)
|
|
require.NotNil(t, bookmarks)
|
|
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark0.Id).SortOrder, int64(0))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark3.Id).SortOrder, int64(1))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark1.Id).SortOrder, int64(2))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark2.Id).SortOrder, int64(3))
|
|
assert.Equal(t, find_bookmark(bookmarks, bookmark4.Id).SortOrder, int64(4))
|
|
})
|
|
|
|
t.Run("change order of bookmarks error when new index is out of bounds", func(t *testing.T) {
|
|
_, appErr = th.App.UpdateChannelBookmarkSortOrder(bookmark3.Id, channelId, int64(-1), "")
|
|
assert.Error(t, appErr)
|
|
_, appErr = th.App.UpdateChannelBookmarkSortOrder(bookmark3.Id, channelId, int64(5), "")
|
|
assert.Error(t, appErr)
|
|
})
|
|
|
|
t.Run("change order of bookmarks error when bookmark not found", func(t *testing.T) {
|
|
_, appErr = th.App.UpdateChannelBookmarkSortOrder(model.NewId(), channelId, int64(0), "")
|
|
assert.Error(t, appErr)
|
|
})
|
|
}
|