backend/pkg/permission/usecase/permission_tree_test.go

160 lines
5.4 KiB
Go

package usecase
import (
"backend/pkg/permission/domain"
"backend/pkg/permission/domain/entity"
"backend/pkg/permission/domain/permission"
"testing"
"github.com/stretchr/testify/assert"
"go.mongodb.org/mongo-driver/v2/bson"
)
func TestPermissionTree_Build(t *testing.T) {
permissions := []*entity.Permission{
{ID: bson.NewObjectID(), ParentID: bson.ObjectID{}, Name: "user", State: domain.RecordActive},
{ID: bson.NewObjectID(), ParentID: bson.NewObjectID(), Name: "user.list", State: domain.RecordActive},
{ID: bson.NewObjectID(), ParentID: bson.NewObjectID(), Name: "user.create", State: domain.RecordActive},
{ID: bson.NewObjectID(), ParentID: bson.NewObjectID(), Name: "user.list.detail", State: domain.RecordActive},
}
// 設定正確的父子關係
permissions[1].ParentID = permissions[0].ID
permissions[2].ParentID = permissions[0].ID
permissions[3].ParentID = permissions[1].ID
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.GetNodeByObjectID(permissions[3].ID)
assert.NotNil(t, node)
assert.Equal(t, 2, len(node.PathIDs))
}
func TestPermissionTree_ExpandPermissions(t *testing.T) {
permissions := []*entity.Permission{
{ID: bson.NewObjectID(), ParentID: bson.ObjectID{}, Name: "user", State: domain.RecordActive},
{ID: bson.NewObjectID(), ParentID: bson.NewObjectID(), Name: "user.list", State: domain.RecordActive},
{ID: bson.NewObjectID(), ParentID: bson.NewObjectID(), Name: "user.create", State: domain.RecordActive},
{ID: bson.NewObjectID(), ParentID: bson.NewObjectID(), Name: "user.list.detail", State: domain.RecordActive},
}
// 設定正確的父子關係
permissions[1].ParentID = permissions[0].ID
permissions[2].ParentID = permissions[0].ID
permissions[3].ParentID = permissions[1].ID
tree := NewPermissionTree(permissions)
input := permission.Permissions{
"user.list.detail": permission.Open,
}
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: bson.NewObjectID(), ParentID: bson.ObjectID{}, Name: "user", State: domain.RecordActive},
{ID: bson.NewObjectID(), ParentID: bson.NewObjectID(), Name: "user.list", State: domain.RecordActive},
{ID: bson.NewObjectID(), ParentID: bson.NewObjectID(), Name: "user.create", State: domain.RecordActive},
}
// 設定正確的父子關係
permissions[1].ParentID = permissions[0].ID
permissions[2].ParentID = permissions[0].ID
tree := NewPermissionTree(permissions)
input := permission.Permissions{
"user.list": permission.Open,
}
ids, err := tree.GetPermissionIDs(input)
assert.NoError(t, err)
// 應該包含 user.list 和 user
assert.Contains(t, ids, permissions[0].ID)
assert.Contains(t, ids, permissions[1].ID)
assert.NotContains(t, ids, permissions[2].ID)
}
func TestPermissionTree_BuildPermissionsFromIDs(t *testing.T) {
permissions := []*entity.Permission{
{ID: bson.NewObjectID(), ParentID: bson.ObjectID{}, Name: "user", State: domain.RecordActive},
{ID: bson.NewObjectID(), ParentID: bson.NewObjectID(), Name: "user.list", State: domain.RecordActive},
{ID: bson.NewObjectID(), ParentID: bson.NewObjectID(), Name: "user.create", State: domain.RecordActive},
}
// 設定正確的父子關係
permissions[1].ParentID = permissions[0].ID
permissions[2].ParentID = permissions[0].ID
tree := NewPermissionTree(permissions)
perms := tree.BuildPermissionsFromIDs([]bson.ObjectID{permissions[1].ID})
// 應該包含 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: bson.NewObjectID(), ParentID: bson.ObjectID{}, Name: "user", State: domain.RecordActive},
{ID: bson.NewObjectID(), ParentID: bson.NewObjectID(), Name: "user.list", State: domain.RecordActive},
{ID: bson.NewObjectID(), ParentID: bson.NewObjectID(), Name: "user.create", State: domain.RecordActive},
}
// 設定正確的父子關係
permissions[1].ParentID = permissions[0].ID
permissions[2].ParentID = permissions[0].ID
tree := NewPermissionTree(permissions)
// 只開啟父節點,沒有開啟子節點
input := permission.Permissions{
"user": permission.Open,
}
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: bson.NewObjectID(), ParentID: bson.ObjectID{}, Name: "user", State: domain.RecordActive},
{ID: bson.NewObjectID(), ParentID: bson.NewObjectID(), Name: "user.list", State: domain.RecordActive},
}
// 設定正確的父子關係
permissions[1].ParentID = permissions[0].ID
tree := NewPermissionTree(permissions)
err := tree.DetectCircularDependency()
assert.NoError(t, err)
}