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-0074: 正常删除(无子部门) 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-0076: 不存在的部门 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}) assert.NoError(t, err) } // TC-0075: 有子部门 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-0522: 部门下有关联用户 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-0483: 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()) }