mirror of
https://github.com/mattermost/focalboard.git
synced 2024-12-24 13:43:12 +02:00
252 lines
6.7 KiB
Go
252 lines
6.7 KiB
Go
|
package model
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
|
||
|
"github.com/stretchr/testify/require"
|
||
|
|
||
|
"github.com/mattermost/mattermost-server/v6/shared/mlog"
|
||
|
)
|
||
|
|
||
|
func TestIsValidBoardsAndBlocks(t *testing.T) {
|
||
|
t.Run("no boards", func(t *testing.T) {
|
||
|
bab := &BoardsAndBlocks{
|
||
|
Blocks: []Block{
|
||
|
{ID: "block-id-1", BoardID: "board-id-1", Type: TypeCard},
|
||
|
{ID: "block-id-2", BoardID: "board-id-2", Type: TypeCard},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
require.ErrorIs(t, bab.IsValid(), ErrNoBoardsInBoardsAndBlocks)
|
||
|
})
|
||
|
|
||
|
t.Run("no blocks", func(t *testing.T) {
|
||
|
bab := &BoardsAndBlocks{
|
||
|
Boards: []*Board{
|
||
|
{ID: "board-id-1", Type: BoardTypeOpen},
|
||
|
{ID: "board-id-2", Type: BoardTypePrivate},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
require.ErrorIs(t, bab.IsValid(), ErrNoBlocksInBoardsAndBlocks)
|
||
|
})
|
||
|
|
||
|
t.Run("block that doesn't belong to the boards", func(t *testing.T) {
|
||
|
bab := &BoardsAndBlocks{
|
||
|
Boards: []*Board{
|
||
|
{ID: "board-id-1", Type: BoardTypeOpen},
|
||
|
{ID: "board-id-2", Type: BoardTypePrivate},
|
||
|
},
|
||
|
Blocks: []Block{
|
||
|
{ID: "block-id-1", BoardID: "board-id-1", Type: TypeCard},
|
||
|
{ID: "block-id-3", BoardID: "board-id-3", Type: TypeCard},
|
||
|
{ID: "block-id-2", BoardID: "board-id-2", Type: TypeCard},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
require.ErrorIs(t, bab.IsValid(), BlockDoesntBelongToAnyBoardErr{"block-id-3"})
|
||
|
})
|
||
|
|
||
|
t.Run("valid boards and blocks", func(t *testing.T) {
|
||
|
bab := &BoardsAndBlocks{
|
||
|
Boards: []*Board{
|
||
|
{ID: "board-id-1", Type: BoardTypeOpen},
|
||
|
{ID: "board-id-2", Type: BoardTypePrivate},
|
||
|
},
|
||
|
Blocks: []Block{
|
||
|
{ID: "block-id-1", BoardID: "board-id-1", Type: TypeCard},
|
||
|
{ID: "block-id-3", BoardID: "board-id-2", Type: TypeCard},
|
||
|
{ID: "block-id-2", BoardID: "board-id-2", Type: TypeCard},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
require.NoError(t, bab.IsValid())
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func TestGenerateBoardsAndBlocksIDs(t *testing.T) {
|
||
|
logger, err := mlog.NewLogger()
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
getBlockByType := func(blocks []Block, blockType BlockType) Block {
|
||
|
for _, b := range blocks {
|
||
|
if b.Type == blockType {
|
||
|
return b
|
||
|
}
|
||
|
}
|
||
|
return Block{}
|
||
|
}
|
||
|
|
||
|
getBoardByTitle := func(boards []*Board, title string) *Board {
|
||
|
for _, b := range boards {
|
||
|
if b.Title == title {
|
||
|
return b
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
t.Run("invalid boards and blocks", func(t *testing.T) {
|
||
|
bab := &BoardsAndBlocks{
|
||
|
Blocks: []Block{
|
||
|
{ID: "block-id-1", BoardID: "board-id-1", Type: TypeCard},
|
||
|
{ID: "block-id-2", BoardID: "board-id-2", Type: TypeCard},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
rBab, err := GenerateBoardsAndBlocksIDs(bab, logger)
|
||
|
require.Error(t, err)
|
||
|
require.Nil(t, rBab)
|
||
|
})
|
||
|
|
||
|
t.Run("correctly generates IDs for all the boards and links the blocks to them, with new IDs too", func(t *testing.T) {
|
||
|
bab := &BoardsAndBlocks{
|
||
|
Boards: []*Board{
|
||
|
{ID: "board-id-1", Type: BoardTypeOpen, Title: "board1"},
|
||
|
{ID: "board-id-2", Type: BoardTypePrivate, Title: "board2"},
|
||
|
{ID: "board-id-3", Type: BoardTypeOpen, Title: "board3"},
|
||
|
},
|
||
|
Blocks: []Block{
|
||
|
{ID: "block-id-1", BoardID: "board-id-1", Type: TypeCard},
|
||
|
{ID: "block-id-2", BoardID: "board-id-2", Type: TypeView},
|
||
|
{ID: "block-id-3", BoardID: "board-id-2", Type: TypeText},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
rBab, err := GenerateBoardsAndBlocksIDs(bab, logger)
|
||
|
require.NoError(t, err)
|
||
|
require.NotNil(t, rBab)
|
||
|
|
||
|
// all boards and blocks should have refreshed their IDs, and
|
||
|
// blocks should be correctly linked to the new board IDs
|
||
|
board1 := getBoardByTitle(rBab.Boards, "board1")
|
||
|
require.NotNil(t, board1)
|
||
|
require.NotEmpty(t, board1.ID)
|
||
|
require.NotEqual(t, "board-id-1", board1.ID)
|
||
|
board2 := getBoardByTitle(rBab.Boards, "board2")
|
||
|
require.NotNil(t, board2)
|
||
|
require.NotEmpty(t, board2.ID)
|
||
|
require.NotEqual(t, "board-id-2", board2.ID)
|
||
|
board3 := getBoardByTitle(rBab.Boards, "board3")
|
||
|
require.NotNil(t, board3)
|
||
|
require.NotEmpty(t, board3.ID)
|
||
|
require.NotEqual(t, "board-id-3", board3.ID)
|
||
|
|
||
|
block1 := getBlockByType(rBab.Blocks, TypeCard)
|
||
|
require.NotNil(t, block1)
|
||
|
require.NotEmpty(t, block1.ID)
|
||
|
require.NotEqual(t, "block-id-1", block1.ID)
|
||
|
require.Equal(t, board1.ID, block1.BoardID)
|
||
|
block2 := getBlockByType(rBab.Blocks, TypeView)
|
||
|
require.NotNil(t, block2)
|
||
|
require.NotEmpty(t, block2.ID)
|
||
|
require.NotEqual(t, "block-id-2", block2.ID)
|
||
|
require.Equal(t, board2.ID, block2.BoardID)
|
||
|
block3 := getBlockByType(rBab.Blocks, TypeText)
|
||
|
require.NotNil(t, block3)
|
||
|
require.NotEmpty(t, block3.ID)
|
||
|
require.NotEqual(t, "block-id-3", block3.ID)
|
||
|
require.Equal(t, board2.ID, block3.BoardID)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func TestIsValidPatchBoardsAndBlocks(t *testing.T) {
|
||
|
newTitle := "new title"
|
||
|
newDescription := "new description"
|
||
|
var schema int64 = 1
|
||
|
|
||
|
t.Run("no board ids", func(t *testing.T) {
|
||
|
pbab := &PatchBoardsAndBlocks{
|
||
|
BoardIDs: []string{},
|
||
|
BlockIDs: []string{"block-id-1"},
|
||
|
BlockPatches: []*BlockPatch{
|
||
|
{Title: &newTitle},
|
||
|
{Schema: &schema},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
require.ErrorIs(t, pbab.IsValid(), ErrNoBoardsInBoardsAndBlocks)
|
||
|
})
|
||
|
|
||
|
t.Run("missmatch board IDs and patches", func(t *testing.T) {
|
||
|
pbab := &PatchBoardsAndBlocks{
|
||
|
BoardIDs: []string{"board-id-1", "board-id-2"},
|
||
|
BoardPatches: []*BoardPatch{
|
||
|
{Title: &newTitle},
|
||
|
},
|
||
|
BlockIDs: []string{"block-id-1"},
|
||
|
BlockPatches: []*BlockPatch{
|
||
|
{Title: &newTitle},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
require.ErrorIs(t, pbab.IsValid(), ErrBoardIDsAndPatchesMissmatchInBoardsAndBlocks)
|
||
|
})
|
||
|
|
||
|
t.Run("missmatch block IDs and patches", func(t *testing.T) {
|
||
|
pbab := &PatchBoardsAndBlocks{
|
||
|
BoardIDs: []string{"board-id-1", "board-id-2"},
|
||
|
BoardPatches: []*BoardPatch{
|
||
|
{Title: &newTitle},
|
||
|
{Description: &newDescription},
|
||
|
},
|
||
|
BlockIDs: []string{"block-id-1"},
|
||
|
BlockPatches: []*BlockPatch{
|
||
|
{Title: &newTitle},
|
||
|
{Schema: &schema},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
require.ErrorIs(t, pbab.IsValid(), ErrBlockIDsAndPatchesMissmatchInBoardsAndBlocks)
|
||
|
})
|
||
|
|
||
|
t.Run("valid", func(t *testing.T) {
|
||
|
pbab := &PatchBoardsAndBlocks{
|
||
|
BoardIDs: []string{"board-id-1", "board-id-2"},
|
||
|
BoardPatches: []*BoardPatch{
|
||
|
{Title: &newTitle},
|
||
|
{Description: &newDescription},
|
||
|
},
|
||
|
BlockIDs: []string{"block-id-1"},
|
||
|
BlockPatches: []*BlockPatch{
|
||
|
{Title: &newTitle},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
require.NoError(t, pbab.IsValid())
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func TestIsValidDeleteBoardsAndBlocks(t *testing.T) {
|
||
|
/*
|
||
|
TODO fix this
|
||
|
t.Run("no board ids", func(t *testing.T) {
|
||
|
dbab := &DeleteBoardsAndBlocks{
|
||
|
TeamID: "team-id",
|
||
|
Blocks: []string{"block-id-1"},
|
||
|
}
|
||
|
|
||
|
require.ErrorIs(t, dbab.IsValid(), NoBoardsInBoardsAndBlocksErr)
|
||
|
})
|
||
|
|
||
|
t.Run("no block ids", func(t *testing.T) {
|
||
|
dbab := &DeleteBoardsAndBlocks{
|
||
|
TeamID: "team-id",
|
||
|
Boards: []string{"board-id-1", "board-id-2"},
|
||
|
}
|
||
|
|
||
|
require.ErrorIs(t, dbab.IsValid(), NoBlocksInBoardsAndBlocksErr)
|
||
|
})
|
||
|
|
||
|
t.Run("valid", func(t *testing.T) {
|
||
|
dbab := &DeleteBoardsAndBlocks{
|
||
|
TeamID: "team-id",
|
||
|
Boards: []string{"board-id-1", "board-id-2"},
|
||
|
Blocks: []string{"block-id-1"},
|
||
|
}
|
||
|
|
||
|
require.NoError(t, dbab.IsValid())
|
||
|
})
|
||
|
*/
|
||
|
}
|