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) }