backend/tmp/reborn/usecase/permission_tree_test.go

131 lines
3.9 KiB
Go

package usecase
import (
"permission/reborn/domain/entity"
"testing"
"github.com/stretchr/testify/assert"
)
func TestPermissionTree_Build(t *testing.T) {
permissions := []*entity.Permission{
{ID: 1, ParentID: 0, Name: "user", Status: entity.StatusActive},
{ID: 2, ParentID: 1, Name: "user.list", Status: entity.StatusActive},
{ID: 3, ParentID: 1, Name: "user.create", Status: entity.StatusActive},
{ID: 4, ParentID: 2, Name: "user.list.detail", Status: entity.StatusActive},
}
tree := NewPermissionTree(permissions)
// 檢查節點數量
assert.Equal(t, 4, len(tree.nodes))
// 檢查根節點
assert.Equal(t, 1, len(tree.roots))
assert.Equal(t, "user", tree.roots[0].Permission.Name)
// 檢查子節點
assert.Equal(t, 2, len(tree.roots[0].Children))
// 檢查路徑
node := tree.GetNode(4)
assert.NotNil(t, node)
assert.Equal(t, []int64{1, 2}, node.PathIDs)
}
func TestPermissionTree_ExpandPermissions(t *testing.T) {
permissions := []*entity.Permission{
{ID: 1, ParentID: 0, Name: "user", Status: entity.StatusActive},
{ID: 2, ParentID: 1, Name: "user.list", Status: entity.StatusActive},
{ID: 3, ParentID: 1, Name: "user.create", Status: entity.StatusActive},
{ID: 4, ParentID: 2, Name: "user.list.detail", Status: entity.StatusActive},
}
tree := NewPermissionTree(permissions)
input := entity.Permissions{
"user.list.detail": entity.PermissionOpen,
}
expanded, err := tree.ExpandPermissions(input)
assert.NoError(t, err)
// 應該包含自己和所有父節點
assert.True(t, expanded.HasPermission("user"))
assert.True(t, expanded.HasPermission("user.list"))
assert.True(t, expanded.HasPermission("user.list.detail"))
assert.False(t, expanded.HasPermission("user.create"))
}
func TestPermissionTree_GetPermissionIDs(t *testing.T) {
permissions := []*entity.Permission{
{ID: 1, ParentID: 0, Name: "user", Status: entity.StatusActive},
{ID: 2, ParentID: 1, Name: "user.list", Status: entity.StatusActive},
{ID: 3, ParentID: 1, Name: "user.create", Status: entity.StatusActive},
}
tree := NewPermissionTree(permissions)
input := entity.Permissions{
"user.list": entity.PermissionOpen,
}
ids, err := tree.GetPermissionIDs(input)
assert.NoError(t, err)
// 應該包含 user.list(2) 和 user(1)
assert.Contains(t, ids, int64(1))
assert.Contains(t, ids, int64(2))
assert.NotContains(t, ids, int64(3))
}
func TestPermissionTree_BuildPermissionsFromIDs(t *testing.T) {
permissions := []*entity.Permission{
{ID: 1, ParentID: 0, Name: "user", Status: entity.StatusActive},
{ID: 2, ParentID: 1, Name: "user.list", Status: entity.StatusActive},
{ID: 3, ParentID: 1, Name: "user.create", Status: entity.StatusActive},
}
tree := NewPermissionTree(permissions)
perms := tree.BuildPermissionsFromIDs([]int64{2})
// 應該包含 user 和 user.list
assert.True(t, perms.HasPermission("user"))
assert.True(t, perms.HasPermission("user.list"))
assert.False(t, perms.HasPermission("user.create"))
}
func TestPermissionTree_ParentNodeWithChildren(t *testing.T) {
permissions := []*entity.Permission{
{ID: 1, ParentID: 0, Name: "user", Status: entity.StatusActive},
{ID: 2, ParentID: 1, Name: "user.list", Status: entity.StatusActive},
{ID: 3, ParentID: 1, Name: "user.create", Status: entity.StatusActive},
}
tree := NewPermissionTree(permissions)
// 只開啟父節點,沒有開啟子節點
input := entity.Permissions{
"user": entity.PermissionOpen,
}
expanded, err := tree.ExpandPermissions(input)
assert.NoError(t, err)
// 父節點沒有子節點開啟時,不應該被展開
assert.Equal(t, 0, len(expanded))
}
func TestPermissionTree_DetectCircularDependency(t *testing.T) {
permissions := []*entity.Permission{
{ID: 1, ParentID: 0, Name: "user", Status: entity.StatusActive},
{ID: 2, ParentID: 1, Name: "user.list", Status: entity.StatusActive},
}
tree := NewPermissionTree(permissions)
err := tree.DetectCircularDependency()
assert.NoError(t, err)
}