deptTreeLogic_test.go 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package dept
  2. import (
  3. "context"
  4. "testing"
  5. "perms-system-server/internal/svc"
  6. "perms-system-server/internal/testutil"
  7. "perms-system-server/internal/types"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/stretchr/testify/require"
  10. )
  11. // TC-0098: 正常获取
  12. func TestDeptTree_Normal(t *testing.T) {
  13. ctx := context.Background()
  14. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  15. conn := testutil.GetTestSqlConn()
  16. rootId, err := insertDeptRaw(ctx, svcCtx, 0, "tree_root_"+testutil.UniqueId(), "/")
  17. require.NoError(t, err)
  18. root, _ := svcCtx.SysDeptModel.FindOne(ctx, rootId)
  19. c1Id, err := insertDeptRaw(ctx, svcCtx, rootId, "tree_c1_"+testutil.UniqueId(), root.Path)
  20. require.NoError(t, err)
  21. c2Id, err := insertDeptRaw(ctx, svcCtx, rootId, "tree_c2_"+testutil.UniqueId(), root.Path)
  22. require.NoError(t, err)
  23. t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_dept`", c1Id, c2Id, rootId) })
  24. treeLogic := NewDeptTreeLogic(ctx, svcCtx)
  25. tree, err := treeLogic.DeptTree()
  26. require.NoError(t, err)
  27. require.NotNil(t, tree)
  28. var rootNode *types.DeptItem
  29. for _, node := range tree {
  30. if node.Id == rootId {
  31. rootNode = node
  32. break
  33. }
  34. }
  35. require.NotNil(t, rootNode, "should find the test root node in tree")
  36. assert.Equal(t, int64(0), rootNode.ParentId)
  37. assert.Equal(t, "NORMAL", rootNode.DeptType)
  38. require.Len(t, rootNode.Children, 2)
  39. childIds := []int64{rootNode.Children[0].Id, rootNode.Children[1].Id}
  40. assert.ElementsMatch(t, []int64{c1Id, c2Id}, childIds)
  41. }
  42. // TC-0099: 空数据
  43. func TestDeptTree_Empty(t *testing.T) {
  44. ctx := context.Background()
  45. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  46. treeLogic := NewDeptTreeLogic(ctx, svcCtx)
  47. tree, err := treeLogic.DeptTree()
  48. require.NoError(t, err)
  49. assert.NotNil(t, tree)
  50. // Known limitation: shared integration DB may hold rows from other tests or packages,
  51. // so we cannot assert len(tree)==0 here without isolating or truncating sys_dept.
  52. }
  53. // TC-0100: 孤儿节点
  54. func TestDeptTree_OrphanBecomesRoot(t *testing.T) {
  55. ctx := context.Background()
  56. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  57. conn := testutil.GetTestSqlConn()
  58. parentId, err := insertDeptRaw(ctx, svcCtx, 0, "orphan_p_"+testutil.UniqueId(), "/")
  59. require.NoError(t, err)
  60. parent, _ := svcCtx.SysDeptModel.FindOne(ctx, parentId)
  61. childId, err := insertDeptRaw(ctx, svcCtx, parentId, "orphan_c_"+testutil.UniqueId(), parent.Path)
  62. require.NoError(t, err)
  63. testutil.CleanTable(ctx, conn, "`sys_dept`", parentId)
  64. t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_dept`", childId) })
  65. treeLogic := NewDeptTreeLogic(ctx, svcCtx)
  66. tree, err := treeLogic.DeptTree()
  67. require.NoError(t, err)
  68. var orphanNode *types.DeptItem
  69. for _, node := range tree {
  70. if node.Id == childId {
  71. orphanNode = node
  72. break
  73. }
  74. }
  75. require.NotNil(t, orphanNode, "orphan node should appear as root")
  76. assert.Equal(t, parentId, orphanNode.ParentId)
  77. }