| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- package dept
- import (
- "database/sql"
- "errors"
- "testing"
- "time"
- userModel "perms-system-server/internal/model/user"
- "perms-system-server/internal/response"
- "perms-system-server/internal/svc"
- "perms-system-server/internal/testutil"
- "perms-system-server/internal/testutil/ctxhelper"
- "perms-system-server/internal/types"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- )
- // TC-0106: 正常删除(无子部门)
- func TestDeleteDept_NoChildren(t *testing.T) {
- ctx := ctxhelper.SuperAdminCtx()
- svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
- conn := testutil.GetTestSqlConn()
- id, err := insertDeptRaw(ctx, svcCtx, 0, "del_"+testutil.UniqueId(), "/")
- require.NoError(t, err)
- t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_dept`", id) })
- l := NewDeleteDeptLogic(ctx, svcCtx)
- err = l.DeleteDept(&types.DeleteDeptReq{Id: id})
- require.NoError(t, err)
- _, err = svcCtx.SysDeptModel.FindOne(ctx, id)
- assert.Error(t, err)
- }
- // TC-0108: 不存在的部门 (audit 修复后:放入事务 + SELECT ... FOR UPDATE,不存在时返回 404)
- func TestDeleteDept_NonExistentDept(t *testing.T) {
- ctx := ctxhelper.SuperAdminCtx()
- svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
- l := NewDeleteDeptLogic(ctx, svcCtx)
- err := l.DeleteDept(&types.DeleteDeptReq{Id: 999999999})
- require.Error(t, err, "删除不存在的部门应当显式返回 NotFound,而非静默成功")
- var ce *response.CodeError
- require.True(t, errors.As(err, &ce))
- assert.Equal(t, 404, ce.Code())
- assert.Contains(t, ce.Error(), "部门不存在")
- }
- // TC-0107: 有子部门
- func TestDeleteDept_HasChildren(t *testing.T) {
- ctx := ctxhelper.SuperAdminCtx()
- svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
- conn := testutil.GetTestSqlConn()
- parentId, err := insertDeptRaw(ctx, svcCtx, 0, "del_par_"+testutil.UniqueId(), "/")
- require.NoError(t, err)
- parent, _ := svcCtx.SysDeptModel.FindOne(ctx, parentId)
- childId, err := insertDeptRaw(ctx, svcCtx, parentId, "del_child_"+testutil.UniqueId(), parent.Path)
- require.NoError(t, err)
- t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_dept`", childId, parentId) })
- l := NewDeleteDeptLogic(ctx, svcCtx)
- err = l.DeleteDept(&types.DeleteDeptReq{Id: parentId})
- require.Error(t, err)
- var ce *response.CodeError
- require.True(t, errors.As(err, &ce))
- assert.Equal(t, 400, ce.Code())
- assert.Contains(t, ce.Error(), "该部门下存在子部门,无法删除")
- _, err = svcCtx.SysDeptModel.FindOne(ctx, parentId)
- assert.NoError(t, err)
- }
- // TC-0109: 部门下有关联用户
- func TestDeleteDept_HasAssociatedUsers(t *testing.T) {
- ctx := ctxhelper.SuperAdminCtx()
- svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
- conn := testutil.GetTestSqlConn()
- deptId, err := insertDeptRaw(ctx, svcCtx, 0, "has_users_"+testutil.UniqueId(), "/")
- require.NoError(t, err)
- t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_dept`", deptId) })
- now := time.Now().Unix()
- userRes, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{
- Username: "dept_user_" + testutil.UniqueId(),
- Password: testutil.HashPassword("pass123456"),
- Nickname: "test",
- Avatar: sql.NullString{},
- DeptId: deptId,
- IsSuperAdmin: 2,
- MustChangePassword: 2,
- Status: 1,
- CreateTime: now,
- UpdateTime: now,
- })
- require.NoError(t, err)
- userId, _ := userRes.LastInsertId()
- t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_user`", userId) })
- l := NewDeleteDeptLogic(ctx, svcCtx)
- err = l.DeleteDept(&types.DeleteDeptReq{Id: deptId})
- require.Error(t, err)
- var ce *response.CodeError
- require.True(t, errors.As(err, &ce))
- assert.Equal(t, 400, ce.Code())
- assert.Equal(t, "该部门下仍有关联用户,无法删除", ce.Error())
- _, err = svcCtx.SysDeptModel.FindOne(ctx, deptId)
- assert.NoError(t, err)
- }
- // TC-0534: deleteDept非超管拒绝
- func TestDeleteDept_NonSuperAdminRejected(t *testing.T) {
- ctx := ctxhelper.AdminCtx("test_product")
- svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
- l := NewDeleteDeptLogic(ctx, svcCtx)
- err := l.DeleteDept(&types.DeleteDeptReq{Id: 1})
- require.Error(t, err)
- var ce *response.CodeError
- require.True(t, errors.As(err, &ce))
- assert.Equal(t, 403, ce.Code())
- }
|