deleteDeptLogic_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package dept
  2. import (
  3. "database/sql"
  4. "errors"
  5. "testing"
  6. "time"
  7. userModel "perms-system-server/internal/model/user"
  8. "perms-system-server/internal/response"
  9. "perms-system-server/internal/svc"
  10. "perms-system-server/internal/testutil"
  11. "perms-system-server/internal/testutil/ctxhelper"
  12. "perms-system-server/internal/types"
  13. "github.com/stretchr/testify/assert"
  14. "github.com/stretchr/testify/require"
  15. )
  16. // TC-0106: 正常删除(无子部门)
  17. func TestDeleteDept_NoChildren(t *testing.T) {
  18. ctx := ctxhelper.SuperAdminCtx()
  19. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  20. conn := testutil.GetTestSqlConn()
  21. id, err := insertDeptRaw(ctx, svcCtx, 0, "del_"+testutil.UniqueId(), "/")
  22. require.NoError(t, err)
  23. t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_dept`", id) })
  24. l := NewDeleteDeptLogic(ctx, svcCtx)
  25. err = l.DeleteDept(&types.DeleteDeptReq{Id: id})
  26. require.NoError(t, err)
  27. _, err = svcCtx.SysDeptModel.FindOne(ctx, id)
  28. assert.Error(t, err)
  29. }
  30. // TC-0108: 不存在的部门 (audit M-11 修复后:放入事务 + SELECT ... FOR UPDATE,不存在时返回 404)
  31. func TestDeleteDept_NonExistentDept(t *testing.T) {
  32. ctx := ctxhelper.SuperAdminCtx()
  33. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  34. l := NewDeleteDeptLogic(ctx, svcCtx)
  35. err := l.DeleteDept(&types.DeleteDeptReq{Id: 999999999})
  36. require.Error(t, err, "删除不存在的部门应当显式返回 NotFound,而非静默成功")
  37. var ce *response.CodeError
  38. require.True(t, errors.As(err, &ce))
  39. assert.Equal(t, 404, ce.Code())
  40. assert.Contains(t, ce.Error(), "部门不存在")
  41. }
  42. // TC-0107: 有子部门
  43. func TestDeleteDept_HasChildren(t *testing.T) {
  44. ctx := ctxhelper.SuperAdminCtx()
  45. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  46. conn := testutil.GetTestSqlConn()
  47. parentId, err := insertDeptRaw(ctx, svcCtx, 0, "del_par_"+testutil.UniqueId(), "/")
  48. require.NoError(t, err)
  49. parent, _ := svcCtx.SysDeptModel.FindOne(ctx, parentId)
  50. childId, err := insertDeptRaw(ctx, svcCtx, parentId, "del_child_"+testutil.UniqueId(), parent.Path)
  51. require.NoError(t, err)
  52. t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_dept`", childId, parentId) })
  53. l := NewDeleteDeptLogic(ctx, svcCtx)
  54. err = l.DeleteDept(&types.DeleteDeptReq{Id: parentId})
  55. require.Error(t, err)
  56. var ce *response.CodeError
  57. require.True(t, errors.As(err, &ce))
  58. assert.Equal(t, 400, ce.Code())
  59. assert.Contains(t, ce.Error(), "该部门下存在子部门,无法删除")
  60. _, err = svcCtx.SysDeptModel.FindOne(ctx, parentId)
  61. assert.NoError(t, err)
  62. }
  63. // TC-0109: 部门下有关联用户
  64. func TestDeleteDept_HasAssociatedUsers(t *testing.T) {
  65. ctx := ctxhelper.SuperAdminCtx()
  66. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  67. conn := testutil.GetTestSqlConn()
  68. deptId, err := insertDeptRaw(ctx, svcCtx, 0, "has_users_"+testutil.UniqueId(), "/")
  69. require.NoError(t, err)
  70. t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_dept`", deptId) })
  71. now := time.Now().Unix()
  72. userRes, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{
  73. Username: "dept_user_" + testutil.UniqueId(),
  74. Password: testutil.HashPassword("pass123456"),
  75. Nickname: "test",
  76. Avatar: sql.NullString{},
  77. DeptId: deptId,
  78. IsSuperAdmin: 2,
  79. MustChangePassword: 2,
  80. Status: 1,
  81. CreateTime: now,
  82. UpdateTime: now,
  83. })
  84. require.NoError(t, err)
  85. userId, _ := userRes.LastInsertId()
  86. t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_user`", userId) })
  87. l := NewDeleteDeptLogic(ctx, svcCtx)
  88. err = l.DeleteDept(&types.DeleteDeptReq{Id: deptId})
  89. require.Error(t, err)
  90. var ce *response.CodeError
  91. require.True(t, errors.As(err, &ce))
  92. assert.Equal(t, 400, ce.Code())
  93. assert.Equal(t, "该部门下仍有关联用户,无法删除", ce.Error())
  94. _, err = svcCtx.SysDeptModel.FindOne(ctx, deptId)
  95. assert.NoError(t, err)
  96. }
  97. // TC-0534: deleteDept非超管拒绝
  98. func TestDeleteDept_NonSuperAdminRejected(t *testing.T) {
  99. ctx := ctxhelper.AdminCtx("test_product")
  100. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  101. l := NewDeleteDeptLogic(ctx, svcCtx)
  102. err := l.DeleteDept(&types.DeleteDeptReq{Id: 1})
  103. require.Error(t, err)
  104. var ce *response.CodeError
  105. require.True(t, errors.As(err, &ce))
  106. assert.Equal(t, 403, ce.Code())
  107. }