131 lines
3.9 KiB
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)
|
|
}
|