160 lines
5.4 KiB
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)
|
|
}
|
|
|